ADC: 模数转换,将模拟电压转换为数字。
ATmega16 有一个10位精度的ADC转换器,具有8路外部模拟输入端,与PORTA口复用。使能AD转换功能后就不能作为I/O口使用。
输入模拟电压的范围介于AGND和AVcc之间,如AVcc为5v时,10位精度时转换后对应的数值为0-1023(0-0X3F),若为8位精度时,
转换后对应的数值为0-255。若采用内部标准的参考电压2.56V,则输入模拟电压的范围为0-2.56V,10位精度时,2.56V对应的数值为1023.
相关的寄存器有:ADCSRA:ADC控制和状态寄存器,ADMUX:多工选择寄存器,输入通道选择和参考电压源选取。
ADCH,ADCL:数据寄存器,存储转换后的结果,SFIOR:特殊功能寄存器,自动触发源的选择。
操作步骤:
一、 选择ADC的参考电压: ADMUX|=(0<<REFS1)|(1<<REFS0); //选择AVCC为ADC的参考电压
二、设置转换结果的对齐方式:ADMUX|=(1<<ADLAR); //转换结果左对齐
三、选择ADC输入通道:ADMUX|=(0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0); //选择通道ADC0
四、设置ADC的时钟分频系数:ADCSRA|=(1<<ADPS2)|(0<<ADPS1)|(1<<ADPS0); //时钟分频系数为64
五、使能A/D 转换: ADCSRA|=(1<<ADEN); 使能AD中断:ADCSRA|=(1<<ADIE);
六、中断总使能: SREG=0X80;
七、 启动AD转换: ADCSRA|=(1<<ADSC) /启动一次AD转换
八、等待转换完成: while(!ADCSRA&(1<<ADIF))); //ADIF 为1时表示AD转换完成
九、转换完成后手动清ADC中断标志位: ADCSRA|=(1<<ADIF);
十、读取AD转换结果 :从AD转换结果寄存器ADCH,ADCL读取结果。
读取ADCL 之后,ADC 数据寄存器一直要等到ADCH 也被读出才可以进行数据更新。因此,如果转换结果为左对齐,且要求的精度不高于8 比特,那么仅需读取ADCH 就足够了。否则必须先读出ADCL 再读ADCH。