Bonjour , j'ai un petit problème avec le A/D du 18F458.
Câblage:
entrée sortie LM35DZ 5V (0°-150°C) 10mv/°C
sortie du LM35 sur AN4
VREF+ sur AN3 pont diviseur 1,5V
VREF- sur AN2 0V cablé
Code :
Code:void initCadTemp(void) { /* 000 = Channel 0 (AN0) patte 2 001 = Channel 1 (AN1) patte 3 010 = Channel 2 (AN2) patte 4 011 = Channel 3 (AN3) patte 5 100 = Channel 4 (AN4) patte 7 101 = Channel 5 (AN5)(1) 110 = Channel 6 (AN6)(1) 111 = Channel 7 (AN7)(1) Vref- ==>patte 4 Vref+==>patte 5 */ //AN4 ADCON0bits.CHS0=0; ADCON0bits.CHS1=0; ADCON0bits.CHS2=1; //CLOCK //FOSC/2 ADCON1bits.ADCS2=0; ADCON0bits.ADCS1=0; ADCON0bits.ADCS0=0; /* ADCON1 ADCON0 <ADCS2> <ADCS1:ADCS0> Clock Conversion 0 00 FOSC/2 0 01 FOSC/8 0 10 FOSC/32 0 11 FRC (clock derived from the internal A/D RC oscillator) 1 00 FOSC/4 1 01 FOSC/16 1 10 FOSC/64 1 11 FRC (clock derived from the internal A/D RC oscillator) */ //control //AN3 Vref+ 1,5V ADCON1bits.PCFG0=0; ADCON1bits.PCFG1=0; ADCON1bits.PCFG2=1; ADCON1bits.PCFG3=1; ADCON1bits.ADFM=1; //aligner à droite //000000000 ADRESSH:ADRESSL //ON ADCON0bits.ADON=1; } float getTemp(void) { //GO ADCON0bits.GO=1; while(ADCON0bits.GO); //calcul de la température en fonction du CAN temp=(ADRES*VREFH); temp=temp/RESOLUTION; temp=(1000/COEF_LINEAR)*temp; return(temp); }
tension au borne du LM35 => 209,5mV==>20,95°C
résultat d'une demande de température toute les secondes:
ADRESH:ADRESL=>0xC0 ,192
1500mv->1023
x ->192
x=(192/1023)*1500=281mv==>28,1°C
en utilisant la masse ou une entrée pareil toujours 28,1°C
la précision de quelque dizième de degrès, pour quoi cette équart???
merci de répondre
sa serai sympa
si vous avez des questions.
-----