Stap 3: De volgende stap is de codering van dit ATMEGA128 om te lezen van ADC
Ik gecompileerd het met AVR Studio 6 en geüpload naar mijn bord met USBASP
VOID adc_init()
{
ADC in staat te stellen, selecteert u ADC klok = F_CPU / 128 (d.w.z. 125 kHz)
ADCSRA = (1 << ADEN | 1 << ADPS2 | 1 << ADPS1 | 1 << ADPS0);
Doen een conversie
ADMUX = (1 << REFS0 | ADC_0); Conversie op kanaal 0, thermistor input
Interne VCC referentiespanning
ADCSRA | = (1 << ADSC); Start conversie
loop_until_bit_is_clear (ADCSRA, ADSC); Wachten tot conversie voltooid
}
uint16_t read_adc(void)
{
ADMUX = (1 << REFS0) | (1 << ADLAR) | ADC_0; Conversie op kanaal 0, AVCC referentie, 10 bit-mode
ADCSRA | = (1 << ADSC); Start conversie
loop_until_bit_is_clear (ADCSRA, ADSC); Wachten tot conversie voltooid
Return(ADCH);
}
en het resultaat te converteren naar tekenreeks, zodat het kan worden weergegeven op uw LCD
dubbele ntc_get_temp (lange adcresistence, double A, double B, double C)
{
de Steinhart-Hart Thermistor vergelijking gebruiken
temperatuur (Kelvin) = 1 / (A + B*ln(R) + C*(ln(R)^3))
dubbele t;
t = log (adcresistence);
t = 1 / (A + (B * t) + (C * t * t * t));
t = -1 * (t - 273.15); converteren van Kelvin naar Celsius
t = (t * 9.0) / 5.0 + 32,0; Celsius converteren naar Fahrenheit
retourneren van t;
}
Als (adcA! = 0)
{
Itoa(adcA,volts,5);
sprintf(volts,"ADC=%.6fmV",adcA);
lcd_string(Volts);
_delay_ms(2000);
temperatuur van de maatregel
lcd_cmd (0x80); //put de cursor in de eerste rij
_delay_ms (10);
lcd_cmd (0x01); //Clear display
adcresistance = (long)(10230000/adc_result-10000);
d = ntc_get_temp (adcresistance, (dubbele) 0.947070725e-3, (dubbele) 2.450662058e-4, (dubbele) 1.853992838e-7);
d = ntc_get_temp (adcresistance, (dubbele) 0.947070725e-3, (dubbele) 2.450662058e-4, (dubbele) 2.059992838e-7);
sprintf(tempCelcius,"temp=%.6fC",d);
temp naar LCD weergeven
lcd_string ("Temp waarde");
lcd_cmd (0xC0), de tweede rij //goto
lcd_string ("waarde van de PF0");
_delay_ms(100);
lcd_string(tempCelcius);
_delay_ms(3000);
}
anders
{
lcd_string ("geen resultaat!");
_delay_ms(2000);
}