Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
On parle des Pics, sans rapport avec le langage ou la programmation

Modérateur : Jérémy

Lecture simplifie temperature issue d'un LM35DZ
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » mer. 14 juin 2017 20:10 lien vers la Data-Sheet : Cliquez ici

bonsoir,


Avec un 16F1847, possibilité d'utiliser la +VREF de 1,024V pour l'ADC
=> 1024 points pour 1,024V => 1mv/point

ATTENTION : problemo avec usage de ADC_Read(chn);
voir forum mikroE .. demande de revoir le fichier aide ADC librairie !

Le LM35DZ donne 10mV / °C => on a donc une resolution possible de +- 0,1°C directe
Pour l'affichage 2 solutions:
1°)
on utilise une chaine remplie de blancs pour recevoir la mesure ,affichée en "SIMILI "flottant,
exemple: strConstRamCpy(txt,"Temper= °C");
(pas d'usage de variable float, ni calcul..)
MAIS il faut GERER la presence des ZERO , soit avant la virgule, soit apres

2°) On initialise la chaine de caractere receptrice avec le bon Format
exemple : strConstRamCpy(txt,"Temper= 0.00°C");
on sait exactement où logger les differents poids decimaux de la valeur
On en profite pour moyenner sur 10 valeurs ,la mesure ADC , de sorte à ameliorer la resolution au dela de +-0,1°C
Dans ce cas là, on ne se preocupe pas des zeros à afficher ou non..

3°) usage de FloatToStr .. ou Sprintf ..
Oui, facile , mais voir la consommation espace RAM et ROM qui va avec ..

ci joint
- l'init ADC pour gamme 1,024V
- les 2 versions ..
*Nota: le pointeur txt est initialisé au prealable ( txt=&TEXTE[0]; et pointe sur le debut de la table TEXTE
unsigned char TEXTE[32];




Code : Tout sélectionner


void Init_ADC1_With_Vref1024
()
 {
  // Configuration de ADCON0
  ADCON0 = 0b00000100;  // 00001 = AN1 est selectionné, ADC NOT enable
  // Configuration de ADCON1
  // Right jsutified, 110 Fosc/64, ref du moins=GND,  REF+ par FVR reglé sur 2.048V
  ADCON1=0;
  ADCON1.ADFM=1; // Right justied
  //  bit 6-4 ADCS<2:0>: A/D Conversion Clock Select bits
  ADCON1.ADCS2=1; //110 = FOSC/64
  ADCON1.ADCS1=1;
  ADCON1.ADCS0=0;
  ADNREF_bit=0;
  ADPREF1_bit=1;    // +VFR 2.048V buffer  selectionné
  ADPREF0_bit=1;
  
  
// Configuration de Vref
//REGISTER 14-1: FVRCON: FIXED VOLTAGE REFERENCE CONTROL REGISTER
  FVREN_bit = 1;  // Activation du Vref
  TSEN_bit = 0;  //0 = Temperature Indicator is disabled
  TSRNG_bit = 0;   //TSRNG: Temperature Indicator Range Selection bi
//CDAFVR<1:0>: Comparator Fixed Voltage Reference Selection bit
//01 = Comparator  Fixed Voltage Reference Peripheral output is 1x (1.024V)
  CDAFVR1_bit = 0; // 1,024V
  CDAFVR0_bit = 1;
//ADFVR<1:0>: ADC Fixed Voltage Reference Selection bit
//  ADFVR1_bit = 1;    // Mise du Vref à 2.048V
//  ADFVR0_bit = 0;    // ADFVR = 0b10
  ADFVR1_bit = 0;    // Mise du Vref à 1.024V
  ADFVR0_bit = 1;    // ADFVR = 0b01
  ADCON0.ADON=1;     // validation ADC
  EA1S=0;
  Temper=0.0;
}



Version 1

Code : Tout sélectionner


j
=0;
   k=0;
    while (1)
    {
          UART1_Write_CText(" Mesure  EA1 : ");
          EA1S=ADC_Get_Sample(1);
          //EA1S=514;
          WordToStr(EA1S,CRam1);
          UART1_Write_Text(CRam1);  UART1_Write_CText(" Pts");
          Space();
         // version avec VREF =1,024V
         //                 0123456789012345
          strConstRamCpy(txt,"Temper=       °C");
          k=k+EA1S;
          if ((j%10==0) && (j!=0))  // moyenné sur 10 valeurs
          {
          if (k>=10000)*(txt+8)=(k/10000)+48; else  *(txt+8)=' ';
          if (k>=1000)*(txt+9)=(k/1000)%10 +48;else  *(txt+9)=' ';
          if(k>=100)  *(txt+10)=(k/100)%10+48; else *(txt+10)='0';
           *(txt+11)=',';
           if (k>10) *(txt+12)=(k/10) %10 + 48;else  *(txt+12)='0';
           *(txt+13)=%10+48;
             LCD_Write_Text_At(2,1,txt);
             UART1_Write_Text(txt);
             k=0;
           }
         CRLF1();
         j++;
         Delay_ms(250);
    } 
   


Version 2

Code : Tout sélectionner


   j
=0;
   k=0;
    while (1)
    {
     UART1_Write_CText(" Mesure  EA1 : ");
    EA1S=ADC_Get_Sample(1);
     WordToStr(EA1S,CRam1);
     UART1_Write_Text(CRam1);  UART1_Write_CText(" Pts");
     Space();
    // version avec VREF =1,024V
    //                         0123456789012345
   strConstRamCpy(txt,"Temper=   0,00°C");
  k=k+EA1S;
  if ((j%10==0) && (j!=0))  // moyenné sur 10 valeurs
  {
   if (k>=10000)*(txt+8)=(k/10000)+48;
   if (k>=1000)*(txt+9)=(k/1000)%10 +48; 
   if
(k>=100)  *(txt+10)=(k/100)%10+48;
   if (k>10) *(txt+12)=(k/10) %10 + 48;
   *(txt+13)=%10+48;
    LCD_Write_Text_At(2,1,txt);
    UART1_Write_Text(txt);
    k=0;
    }
    CRLF1();
     j++;
        Delay_ms(250);
    }



Affichage terminal et LCD
Mesure EA1 : 246 Pts
Mesure EA1 : 246 Pts
Mesure EA1 : 250 Pts
Mesure EA1 : 253 Pts
Mesure EA1 : 249 Pts
Mesure EA1 : 246 Pts
Mesure EA1 : 250 Pts
Mesure EA1 : 251 Pts
Mesure EA1 : 251 Pts
Mesure EA1 : 245 Pts Temper= 24,87°C
Aide toi, le ciel ou FantasPic t'aidera

Retourner vers « Généralités sur les PICs »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 46 invités