ATMEAG16L中有8个十位精度的ADC(模/数转换器),它包括一个8通道的模拟开关、一个采样保持比较器、一个转换逻辑和4个控制/状态寄存器。其中,8通道10位模拟开关的输入端同PORTA口相连复用,用于输入模拟信号。模拟开关的输出则接至采样保持比较器的输入上,采样保持比较器可以确保模数转换逻辑的输入在转换过程中保持不变,它的输出接至模数转换逻辑
由于模拟开关的输入端同PORTA口相连复用,当一个应用系统不需要或者只需要少数的模/数转换器时,这个端口的其他引脚可以当作普通的1/0口使用。但是要注意,尽量不要在用到/VD转换器时,再将PORTA口作为普通I/O口使用,因为这会影响到A/D的转换精度。
模/数转换器可将输入的模拟电压信号转换成一个10位的数字量信号。它以某一个参考电压为基准(如内部标准参考电压2.56V或者外部输入电压源),将指定引脚上的输入电压量转换为数字信号量,写入到AVR处理器的ADC寄存器中。输入模拟电压的范围介于AGND和AVCC之间,ATMEAG16L的模,数转换器的精度最高为10位,当参考电压为5V时,最小的分辨电压是5V/2'o一0.o05v。另外,ATMEAG16L内部带有前置放大器,放大倍数为10倍和200倍,我们可将微弱的输入信号进行适当放大后再进行模/数转换。
模/数转换器相关寄存器
ATMEAG16L与模/数转换相关的寄存器主要有ADMUX、ADCSRA、ADCH和ADCLo1.ADMUX ADMUX负责控制模/数转换输入通道的选择以及参考电压源的选取。
MUX4—MUXO;控制选择A/D输入通道、放大倍数选取及差模输入方式选取。
ADLAR:ADCH和ADCL输出格式控制位,当该位置1时,输出结果左对齐;当该位置0时,输出结果右对齐。
REFS1、REFSO:为控制参考电压的选择。下表为REFS1、REFSO的设置及对应的参考电压。
REFS1
REFSO
ND转换器参考电压
0
O
外部引脚AREF,内部参考源断开
0
1
AVCC(AREF引脚需并联电容)
1
O
保留
1
1
内部2.56V电压源(AREF引脚需并联电容)
2.ADCSRA ADCSRA为ADC控制和状态寄存器。
ADPS2—ADPSO:ADC预分频选择,这3位决定ADC分频器的值,如下表所示。
ADPS2
ADPS1
ADPSO
分频数
0
0
0
2
O
O
1
2
0
1
0
4
0
1
1
8
1
0
O
16
1
O
1
32
1
1
0
64
1
1
1
128
ADIE;ADC中断使能。ADIE为“1”,则ADC转换结束中断即被使能;否则,中断禁止。
ADIF:.ADC中断标志。ADC转换完成,并且数据更新后,ADC中断标志(ADIF)置“1”。此时若ADC的中断使能位(ADIE)和全局中断使能位(SREG)都为“1”,则单片机产生一个ADC完成中断。当单片机执行相应的中断后,ADIF被清“O”。ADIF也可通过写入“0”来清除。
ADATE:ADC自动触发使能。ADATE置位将启动ADC自动触发功能。触发信号的上跳沿启动ADC转换。
触发信号源通过SFIOR寄存器的ADC触发信号源选择位ADTS设置。
ADSC:模数转换启动。当ADC工作于单次转换模式时,该位必须写入“1”才能启动每次转换过程;ADC工作于自由转换模式时,ADSC也必须在第一次转换时写入“1”。注意:ADC在上电后,必须首先进行一次初始化转换,这个转换值无效。
ADEN:模数转换使能。ADEN为“1”时,单片机的模数转换使能;否则禁止。
3.ADCH和ADCLADCH和ADCL两个寄存器用于存储ADC的转换结果。
为了确保数据读取的正确性,ADCL寄存器的内容应当首先被读取,一旦用户开始对ADCL读取,ADC对数据寄存器的写操作就被禁止,这就意味着,如果用户读取了ADCL,那么即便另一次ADC转换过程在读ADCH之前结束了,两个数据寄存器中的内容也不会被更新。当用户对ADCH的读操作完成后,ADC才可以更新ADCH和ADCL。
模/数转换器的使用ATMEAG16L单片机的ADC模块由ADCSRA寄存器中的ADEN位使能。当ADEN为“1”时,ADC功能有效,并且输入通道同模拟电压的输入引脚相连。此时,若ADSC置“1”,则ADC启动一次模数转换过程,这个模数转换过程用于初始化ADC(转换结果无效)。
当ADC模块被启动以后,用户可以通过ADATE位选择ADC的两种转换模式,即单次转换模式和自由转换模式。若ADATE为“0”时,则ADC工作在单次转换模式,此时,每个转换过程都需要置位ADSC,若ADATE为“1”时,则ADC工作在自由转换模式,此时,ADC连续采样模拟输入端并将转换得到的数据输出至ADC的数据寄存器ADCH和ADCL中。当一次转换过程结束后,ADIF位被置“1”,此时,若ADIE和全局中断使能位(SREG)都为“1”,则单片机产生一个ADC中断。
ATMEAG16L的模/数转换器编程实践1.简易数字式o~5v直流电压表实验用电位器RV1作模拟量的输入,右边4位数码管显示输入电压值。我们使用PA端口的第7位进行模拟量输入,而PA端口的第O—6位作数码管的段驱动,这样,显示的数字中小数点不能被点亮。因此,“千”位数码管相当于显示整数,而“个”、“十”、“百”位数码管相当于显示小数,例如:
显示3265相当于3.265V电压。
在我的文档中新建一个ac12的文件夹。建立一个ac12.prj的工程项目,最后建立源程序文件ac12.c。输入程序1:
编译通过后,将ac12.hex文件下载到AVR单片机综合试验板上。注意,标示“LEDMOD_COM”、“AD”的双排针应插上短路块,另外标示“LEDMOD_DISP”
的双排针的上面7位也应插上短路块(最下面1位不要2.“窗口”电压识别与控制实验在自动化控制中,有些设备需要在一定的条件下工作。超出此条件后,可以控制设备停机,也可以发出报警信号。现在我们使用ATmega16L单片机的ADC模块实现输入模拟量的监控,输入电压小于2.OOOV时灯D1点亮报警,输入电压大干插短路块)。我们用一枝小螺丝刀(或电笔)调节电位器RV1,改变输入的模拟电压,我们可看到数码管的显示从0000~5000(相当于o.000—5.ooov)会变化。
3.OOOV时灯D2点亮报警,输入电压在2,000—3.OOOV之间时报警灯不亮。
在我的文档中新建~个ac13的文件夹。建立一个ac13.prj的工程项目,最后建立源程序文件ac13.c。输入程序2:
编译通过后,将ac13.hex文件下载到AVR单片机综合试验板上。注意,标示“LEDMOD_COM”、“AD”的双排针应插上短路块,另外标示“LEDMOD_DISP”
的双排针的上面7位也应插上短路块(最下面1位不要插短路块)。我们用一枝小螺丝刀(或电笔)调节电位器RV1,改变输入的模拟电压,我们看到数码管显示小于2000时,灯Dl点亮;数码管显示大干3000时,灯D2点亮:数码管显示在2000—3000之间时,灯不亮。达到实验的目的。