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 ---
- 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 ---
Modérateur : Jérémy
Lecture simplifie temperature issue d'un LM35DZ
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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];
Version 1
Version 2
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
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)=k %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)=k %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
Retourner vers « Généralités sur les PICs »
Qui est en ligne
Utilisateurs parcourant ce forum : Bing [Bot] et 57 invités