Étape 3: La prochaine étape est codant cette ATMEGA128 pour lire ADC
J’ai compilé avec AVR Studio 6 et téléchargés sur ma planche avec USBASP
Sub adc_init()
{
Enable ADC, sélectionnez horloge ADC = F_CPU / 128 (c.-à-d. 125 kHz)
ADCSRA = (1 << ADEN | 1 << ADPS2 | 1 << ADPS1 | 1 << ADPS0) ;
Faire une conversion
ADMUX = (1 << REFS0 | ADC_0) ; Conversion sur le canal 0, entrée thermistance
Référence de tension VCC interne
ADCSRA | = (1 << ADSC) ; Lancer la conversion
loop_until_bit_is_clear (ADCSRA, ADSC) ; Attendez de conversion complete
}
uint16_t read_adc(void)
{
ADMUX = (1 << REFS0) | (1 << ADLAR) | ADC_0 ; Conversion sur le canal 0, référence AVCC, mode 10 bits
ADCSRA | = (1 << ADSC) ; Lancer la conversion
loop_until_bit_is_clear (ADCSRA, ADSC) ; Attendez de conversion complete
Return(ADCH) ;
}
et convertir le résultat en chaîne, donc il peut être affiché sur votre écran LCD
ntc_get_temp double (long adcresistence, double A, double B, double C)
{
utiliser l’équation de thermistance de Steinhart-Hart
température (Kelvin) = 1 / (A + B*ln(R) + C*(ln(R)^3))
double t ;
t = log (adcresistence) ;
t = 1 / (A + (B * t) + (C * t * t * t)) ;
t = -1 * (t - 273.15) ; convertir Kelvin en Celcius
t = (t * 9.0) / 5,0 + 32.0 ; convertir les degrés Celsius en degrés Fahrenheit
retour t ;
}
Si (adcA! = 0)
{
ITOA(adcA,volts,5) ;
sprintf(volts,"ADC=%.6fmV",adcA) ;
lcd_string(volts) ;
_delay_ms(2000) ;
mesurer la température
lcd_cmd (0 x 80); //put le curseur dans la première rangée
_delay_ms (10) ;
lcd_cmd (0 x 01); //Clear affichage
adcresistance = (long)(10230000/adc_result-10000) ;
d = ntc_get_temp (adcresistance, 0.947070725e (double)-3, 2.450662058e (double)-4, (double) 1.853992838e-7) ;
d = ntc_get_temp (adcresistance, 0.947070725e (double)-3, 2.450662058e (double)-4, (double) 2.059992838e-7) ;
sprintf(tempCelcius,"Temp=%.6fC",d) ;
temp d’affichage à écran LCD
lcd_string ("valeur Temp") ;
lcd_cmd (0xC0); //goto deuxième rangée
lcd_string ("valeur de PF0") ;
_delay_ms(100) ;
lcd_string(tempCelcius) ;
_delay_ms(3000) ;
}
d’autre
{
lcd_string ("aucun résultat!") ;
_delay_ms(2000) ;
}