您的位置:网站首页 > 电器维修资料网 > 正文 >
AVR单片机入门----C语言高效设计实践(七)
来源: 日期:2013-11-1 14:21:40 人气:标签:
由于模拟开关的输入端同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的设置及对应的参考电压。
2.adcsra adcsra为adc控制和状态寄存器。
adps2—adpso:adc预分频选择,这3位决定adc分频器的值,如下表所示。
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之间时,灯不亮。达到实验的目的。
【看看这篇文章在百度的收录情况】