Atmega32有一个模数转换模块ADC,最高10位精度,支持8通道的输入,可通过编程选择输入通道。
ADC的初始化:
void ADC_init(void) { DDRA = 0x00; PORTA = 0x00; ADCSRA = (1<<ADEN)|0x06; }
读取指定通道的数据:
unsigned int ReadADC(unsigned int adc_input) { ADMUX = 0x60|adc_input; ADCSRA |= (1<<ADSC); loop_until_bit_is_set(ADCSRA,ADIF); ADCSRA |= (1<<ADIF); return ADCH; }
我的参考电压是AVCC,转换数据左对齐,所以对ADMUX写0x60,根据选择通道不同,ADMUX后5位根据需要改写,
我用的是单次转换模式,所以每次读取数据之前要对ADCSRA的ADSC位写1以启动一次转换,
并通过loop_until_bit_is_set(ADCSRA,ADIF);语句来确定转换是否完成。
由于对于数据精度要求不高,所以只读取ADCH的数据,如果要求10位精度,还可以读取ADCL的前两位以提高精度。