马伟力AVR笔记:六、模拟比较器和ADC实验.docx

上传人:小飞机 文档编号:1677211 上传时间:2022-12-13 格式:DOCX 页数:17 大小:104.77KB
返回 下载 相关 举报
马伟力AVR笔记:六、模拟比较器和ADC实验.docx_第1页
第1页 / 共17页
马伟力AVR笔记:六、模拟比较器和ADC实验.docx_第2页
第2页 / 共17页
马伟力AVR笔记:六、模拟比较器和ADC实验.docx_第3页
第3页 / 共17页
马伟力AVR笔记:六、模拟比较器和ADC实验.docx_第4页
第4页 / 共17页
马伟力AVR笔记:六、模拟比较器和ADC实验.docx_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《马伟力AVR笔记:六、模拟比较器和ADC实验.docx》由会员分享,可在线阅读,更多相关《马伟力AVR笔记:六、模拟比较器和ADC实验.docx(17页珍藏版)》请在三一办公上搜索。

1、AVR学习笔记六、模拟比较器和ADC实验 -基于LT_Mini_M166.1 模拟比较器实验6.1.1 实例功能模拟比较器和模数转换ADC是单片机内部最常见的两种支持模拟信号输入的功能接口。大部分AVR都具备这两种类型的接口。本实例将以ATmage16芯片为例,介绍模拟比较器的使用方法,在下一个实例中介绍模数转换ADC。使用模拟比较器可以实现单片机系统电源电压的检测,更巧妙的应用是利用模拟比较器和一些简单的外围电路,设计简单的模数转换ADC。本实例实现利用模拟比较器比较某一点电压与内部模拟比较器参考电压的高低。共有3个功能模块,分别描述如下: 单片机系统:使用ATmega16单片机的模拟比较器

2、比较某一点的电压与参考电压的关系。 外围电路:利用电阻设计的分压电路。 软件程序:熟悉掌握ATmega16单片机的模拟比较器的使用。通过本实例的学习,掌握相关电路设计,并掌握以下知识点: 了解单片机的模拟比较器。 了解单片机的模拟比较器的使用。 掌握单片机模拟比较器的编程。6.1.2、器件和原理1、模拟比较器的介绍ATmega16的模拟比较器可以实现对两个输入端:正极AIN0和负极AIN1(分别对应于ATmage16的引脚PB2、PB3)的模拟输入电压进行比较。当AIN0上的电压高于AIN1的电压时,模拟比较器输出ACO被设为“1”。比较器的输出还可以被设置作为定时计数器1输入捕获功能的触发信

3、号。此外,比较器的输出可以触发一个独立的模拟比较器中断。用户可以选择使用比较器输出的上升沿、下降沿或事件触发作为模拟比较器中断的触发信号。2、与模拟比较器相关的寄存器与模拟比较器相关的寄存器是SFIOR、ACSR。用户通过这两个寄存器的相关位实现对模拟比较器的设置和控制。1) 特殊功能IO寄存器SFIOR寄存器SFIOR中的第3位ACME为模拟比较器多路使能控制位。当该位为逻辑“1”,同时模数转换(ADC)功能被关闭(ADCSRA寄存器中的ADEN使能位为“0”)时,允许使用ADC多路复用器选择ADC的模拟输入端口作为模拟比较器反向端的输入信号源。当该位为零时,AIN1引脚的信号将加到模拟比较

4、器反向端。本实例中我们使用ADC的模拟输入端口作为模拟比较器反向端的输入信号源,所以需要设置第3位ACME为1.2) 模拟比较器控制和状态寄存器ACSRACSR是模拟比较器主要的控制寄存器,其中各个位的作用如下:1 位7ACD:模拟比较器禁止当该位设为“1”时,提供给模拟比较器的电源关闭。该位可以在任何时候被置位,从而关闭模拟比较器。在MCU闲置模式,且无需将模拟比较器作为唤醒源的情况下,关闭模拟比较器可以减少电源的消耗。要改变ACD位的设置时,应该先将寄存器ACSR中的ACIE位清零,把模拟比较器中断禁止掉。否则,在改变ADC位设置时会产生一个中断。2 位6ACBG:模拟比较器的能隙参考源选

5、择当该位为“1”时,芯片内部一个固定的能隙(Bandgap)参考电源1.22V将代替AIN0的输入,作为模拟比较器的正极输入端。当该位被清零时,AIN0的输入仍然作为模拟比较器的正极输入端。3 位5ACO:模拟比较器输出模拟比较器的输出信号经过同步处理后直接与ACO相连。由于经过同步处理,ACO与模拟比较器的输出之间,会有12个时钟的延时。4 位4ACI:模拟比较器中断标志位当模拟比较器的输出事件符合中断触发条件时(中断触发条件由ACIS1 和ACIS0 定义),ACI由硬件置“1”。若ACIE 位置“1”,且状态寄存器中的I位为“1”时,MCU响应模拟比较器中断。当转入模拟比较中断处理向量时

6、,ACI被硬件自动清空。此外,也可使用软件方式清零ACI:对ACI标志位写入逻辑“1”来清零该位。5 位3ACIE:模拟比较器中断允许当ACIE位设为“1”,且状态寄存器中的I位被设为“1”时,允许模拟比较器中断触发。当ACIE被清“0”时,模拟比较器中断被禁止。6 位2ACIC:模拟比较器输入捕获允许当该位设置为“1”时,定时计数器1的输入捕获功能将由模拟比较器的输出来触发。在这种情况下,模拟比较器的输出直接连到输入捕获前端逻辑电路,从而能利用定时器/计数器1输入捕获中断的噪声消除和边缘选择的特性。当该位被清零时,模拟比较器和输入捕获功能之间没有联系。要使能比较器触发定时器/计数器1的输入捕

7、获中断,定时器中断屏蔽寄存器(TIMSK)中 的TICIE1位必须被设置。7 位1、0ACIS1、ACIS0:模拟比较器中断模式选择这2个位决定哪种模拟比较器的输出事件可以触发模拟比较器的中断。不同的设置参见表6.1.1。表6.1.1 模拟比较器中断模式选择ACIS1ACIS0中 断 模 式00比较器输出的上升沿和下降沿都触发中断01保留10比较器输出的下降沿触发中断11比较器输出的上升沿触发中断注意:当要改变ACIS1、ACIS0时,必须先清除ACSR寄存器中的中断允许位,以禁止模拟比较器中断;否则,当这些位被改变时,会发生中断。在本实例中,我们要使用模拟比较器,所以应当允许模拟比较器,即A

8、CD应为0,选择芯片内部的固定能隙参考电源。即ACBG设置为1,我们不使用中断和捕获,所以不必理会与此相关的各位。3) 模拟比较器的多路输入用户可以选择ADC7.0引脚中的任一路的模拟信号代替AIN1引脚,作为模拟比较器的反向输入端。模数转换的ADC多路复用器提供这种选择的能力,但此时必须关闭芯片的ADC功能。当模拟比较器的多路选择使能位(SFIOR中的ACME位)置“1”,同时ADC被关闭时(ADCSRA中的ADEN位置“0”),由寄存器ADMUX中的MUX2:0位所确定的引脚将代替AIN1作为模拟比较器的反向输入端,如表6.1.2所示。如果ACME被清零,或ADEN被置1,则AIN1仍将为

9、模拟比较器的反向输入端。表6.1.2 模拟比较器多路输入选择ACMEADENMUX2.0模拟比较器反向输入端0xxxxAIN111xxxAIN110000ADC010001ADC110010ADC210011ADC310100ADC410101ADC510110ADC610111ADC7 本实例中我们采用ADC0作为模拟比较器的反向输入端,所以选择ADMUX寄存器中的MUX2:0=0;6.1.3、电路本实例的电路包含分压电路,下面的电路是电阻分压电路,如下图所示。1、电路原理在本实例中利用电位器(即可调电阻)组成分压电路,单片机的PA0连接在电位器的动片引脚上,这个电路实际上相当于两个电阻组成

10、的串联电路,只不过这两个电阻的阻值是可变的,改变动片的位置,就可以改变PA0与地之间的电阻值,根据串联电路分压的原理,当动片移动时,PA0处的电压就会发生变化。2、电路连接电路电位器的动片引脚连接到单片机的PA0口,作为模拟比较器的反向输入端。6.1.4、程序设计1、程序功能程序的功能是使用单片机的模拟比较器比较PA0口的电压与单片机内部的固定能隙电压(1.22V)之间的高低,如果PA0的电压低于1.22V,则D1灯点亮,否则D2灯点亮。2函数说明本程序有两个功能函数,分别是: 端口初始化函数,设置连接D1、D2两个LED的端口PB0、PB1为输出口,输出低电平,使两个LED都处于熄灭状态。

11、模拟比较器初始化函数设置与模拟比较器相关的寄存器,使模拟器按照一定的方式工作。 3、使用WINAVR开发环境,我们使用的是外部12M的晶振,所以需要将makefile文件中的时钟频率修改为12M。另外在程序烧录到单片机的时候,熔丝位也要选择为外部12M晶振(注意是晶振,不是外部振荡器,一定不要选择错了,否则会导致单片机不能再烧写程序)。 4、程序代码#include #include #include /中断函数头文件/函数声明void Port_Init(void); /端口初始化配置void Compare_Init(void); /模拟比较器初始化设置int main(void) Por

12、t_Init();Compare_Init();sei(); /使能全局中断 while(1)if(ACSR & (1 ACO) /判断ADC0的电压是否大于1.22VPORTB = 0X01; /低于1.22V,D1点亮,elsePORTB = 0X02; /高于1.22V,D2点亮,/端口状态初始化设置函数void Port_Init()PORTB = 0X00; /DDRB |= (1 PB0) | (1 PB1); /PB0、PB1设置为输出/模拟比较器初始化函数void Compare_Init()SFIOR |= (1 ACME); /使用ADC多路复用器选择ADC的模拟输入端口

13、/作为模拟比较器反向输入端的信号源。/同时选择ADC的ADC0作为输入端,并且关闭AD转换的使能ACSR |= (1 ACBG); /允许模拟比较器,AIN0设置为内部固定能隙参考电源1.22V6.2 模数转换的ADC实验6.2.1、实例功能AVR的模数转换器ADC具有下列特点:l 10位精度;l 0.5LSB积分非线形误差l 2LSB的绝对精度;l 13s260s的转换时间;l 在最大精度下可达到每秒15kSPS的采样速率;l 8路可选的单端输入通道;l 7路差分输入通道;l 2路差分输入通道带有可选的10和200增益;l ADC转换结果的读取可设置为左端对齐(LEFT ADJUSTMENT

14、);l ADC的电压输入范围0Vcc;l 可选择的内部2.56V的ADC参考电压源;l 自由连续转换模式和单次转换模式;l ADC自动转换触发模式选择;l ADC转换完成中断;l 休眠模式下的噪声抑制器(NOISE CANCELER)。在本实例中,我们将编写程序实现将模数转换后获得的电压值通过单片机的串口发送到计算机,然后通过计算机上的串口助手显示测量的电压值。本实例共有3个功能模块,分别描述如下: 单片机系统:使用单片机的串口实现将模数转换后获得的电压值通过串口发送到计算机。 外围电路:RS232电平转换电路,DB9串行接口插座,模拟电压输入采集电路。 软件程序:进一步熟悉单片机的串行通信,

15、并掌握单片机的模数转换的方法。6.2.2、器件和原理关于串行接口的原理已接单片机与计算机的串口的连接在上一实例中进行了描述,在本实例中不再重复。本实例只介绍ATmega16单片机如何通过内置的模数转换模块采集外界输入的模拟电压。1、ATmega16单片机的模数转换器ADC介绍由于单片机只能处理数字信号,所以外部的模拟信号量需要转变成数字量才能进一步的由单片机进行处理。ATmega16内部集成有一个10位逐次比较(successive approximation)ADC电路。因此使用AVR可以非常方便的处理输入的模拟信号量。ATmega16的ADC与一个8通道的模拟多路选择器连接,能够对以POR

16、TA作为ADC输入引脚的8路单端模拟输入电压进行采样,单端电压输入以0V(GND)为参考。另外还支持16种差分电压输入组合,其中2种差分输入方式(ADC1,ADC0和ACD3,ADC2)带有可编程增益放大器,能在A/D转换前对差分输入电压进行0dB(1),20dB(10)或46dB(200)的放大。还有七种差分输入方式的模拟输入通道共用一个负极(ADC1),此时其它任意一个ADC引脚都可作为相应的正极。若增益为1或10,则可获得8位的精度。如果增益为200,那么转换精度为7位。AVR的ADC功能单元由独立的专用模拟电源引脚AVcc供电。AVcc和Vcc的电压差别不能大于0.3V。ADC转换的参

17、考电源可采用芯片内部的2.56V参考电源,或采用AVcc,也可使用外部参考电源。使用外部参考电源时,外部参考电源由引脚ARFE接入。使用内部电压参考源时,可以通过在AREF引脚外部并接一个电容来提高ADC的抗噪性能。ADC功能单元包括采样保持电路,以确保输入电压在ADC转换过程中保持恒定。ADC通过逐次比较(successive approximation)方式,将输入端的模拟电压转换成10位的数字量。最小值代表地,最大值为AREF引脚上的电压值减1个LSB。可以通过ADMUX寄存器中REFSn位的设置,选择将芯片内部参考电源(2.56V)或AVcc连接到AREF,作为A/D转换的参考电压。这

18、时,内部电压参考源可以通过外接于AREF引脚的电容来稳定,以改进抗噪特性。模拟输入通道和差分增益的选择是通过ADMUX寄存器中的MUX位设定的。任何一个ADC的输入引脚,包括地(GND)以及内部的恒定能隙(fixed bandgap)电压参考源,都可以被选择用来作为ADC的单端输入信号。而ADC的某些输入引脚则可选择作为差分增益放大器的正、负极输入端。当选定了差分输入通道后,差分增益放大器将两输入通道上的电压差按选定增益系数放大,然后输入到ADC中。若选定使用单端输入通道,则增益放大器无效。通过设置ADCSRA寄存器中的ADC使能位ADEN来使能ADC。在ADEN没有置“1”前,参考电压源和输

19、入通道的选定将不起作用。当ADEN位清“0”后,ADC将不消耗能量,因此建议在进入节电休眠模式前将ADC关掉。ADC将10位的转换结果放在ADC数据寄存器中(ADCH和ADCL)。默认情况下,转换结果为右端对齐(RIGHT ADJUSTED)的。但可以通过设置ADMUX寄存器中ADLAR位,调整为左端对齐(LEFT ADJUSTED)。如果转换结果是左端对齐,并且只需要8位的精度,那么只需读取ADCH寄存器的数据作为转换结果就达到要求了。否则,必须先读取ADCL寄存器,然后再读取ADCH寄存器,以保证数据寄存器中的内容是同一次转换的结果。因为一旦ADCL寄存器被读取,就阻断了ADC对ADC数据

20、寄存器的操作。这就意味着,一旦指令读取了ADCL,那么必须紧接着读取一次ADCH;如果在读取ADCL和读取ADCH的过程中正好有一次ADC转换完成,ADC的2个数据寄存器的内容是不会被更新的,该次转换的结果将丢失。只有当ADCH寄存器被读取后,ADC才可以继续对ADCL和ADCH寄存器操作更新。ADC有自己的中断,当转换完成时中断将被触发。尽管在顺序读取ADCL和ADCH寄存器过程中,ADC对ADC数据寄存器的更新被禁止,转换的结果丢失,但仍会触发ADC中断。2、ATmwga16单片机的模数转换器ADC相关的I/O寄存器1ADC多路复用器选择寄存器ADMUX8 位7,6REFS1:0:ADC参

21、考电源选择REFS1、REFS2用于选择ADC的参考电压源,见表6.2.1。如果这些位在ADC转换过程中被改变,新的选择将在该次ADC转换完成后(ADCSRA中的ADIF被置位)才生效。一旦选择内部参考源(AVcc、2.56V)为ADC的参考电压后,AREF引脚上不得施加外部的参考电源,只能与GND之间并接抗干扰电容。表6.2.1 ADC参考电源选择REFS1REFS0ADC参考电源00外部引脚AREF,断开内部参考源连接01AVcc,AREF外部并接电容10保留11内部2.56V,AREF外部并接电容9 位5ADLAR:ADC结果左对齐选择ADLAR位决定转换结果在ADC数据寄存器中的存放形

22、式。写“1”到ADLAR位,将使转换结果左对齐(LEFT ADJUST);否则,转换结果为右对齐(RIGHT ADJUST)。无论ADC是否正在进行转换,改变ADLAR位都将会立即影响ADC数据寄存器。10 位4.0MUX4:0:模拟通道和增益选择这5个位用于对连接到ADC的输入通道和差分通道的增益进行选择设置,详见表6.2.2。注意,只有转换结束后(ADCSRA的ADIF是“1”),改变这些位才会有效。表6.2.2 ADC输入通道和增益选择MUX4:0单端输入差分正极输入差分负极输入增益00000ADC0N/A00001ADC100010ADC200011ADC300100ADC400101

23、ADC500110ADC600111ADC701000N/AADC0ADC01001001ADC1ADC01001010ADC0ADC020001011ADC1ADC020001100ADC2ADC21001101ADC3ADC21001110ADC2ADC220001111ADC3ADC220010000ADC0ADC1110001ADC1ADC1110010ADC2ADC1110011ADC3ADC1110100ADC4ADC1110101ADC5ADC1110110ADC6ADC1110111ADC7ADC1111000ADC0ADC2111001ADC1ADC2111010ADC2AD

24、C2111011ADC3ADC2111100ADC4ADC2111101ADC5ADC21111101.22V(VBG)N/A111110V(GND) 本实例中我们需要设置ADC的参考电压源为AVcc,即REFS0设置为1,ADC默认转换结果为右对齐,我们不需要改变,模拟通道选择ADC0通道单端输入,即MUX4:0。2ADC控制和状态寄存器AADCSRA11 位7ADEN:ADC使能该位写入“1”时使能ADC,写入“0”关闭ADC。如在ADC转换过程中将ADC关闭,该次转换随即停止。12 位6ADSC:ADC转换开始在单次转换模式下,置该位为“1”,将启动一次转换。在自由连续转换模式下,该位写

25、入“1”将启动第一次转换。先置位ADEN位使能ADC,再置位ADSC;或置位ADSC的同时使能ADC,都会使能ADC开始进行第一次转换。第一次ADC转换将需要25个ADC时钟周期,而不是常规转换的13个ADC时钟周期,这是因为第一次转换需要完成对ADC的初始化。在ADC转换的过程中,ADSC将始终读出为“1”。当转换完成时,它将转变为“0”。强制写入“0”是无效的。13 位5ADATE:ADC自动转换触发允许当该位被置为“1”时,允许ADC工作在自动转换触发工作模式下。在该模式下,在触发信号的上升沿时ADC将自动开始一次ADC转换过程。ADC的自动转换触发信号源由SFIOR寄存器中的ADTS位

26、选择确定。14 位4ADIF:ADC中断标志位当ADC转换完成并且ADC数据寄存器被更新后该位被置位。如果ADIE位(ADC转换结束中断允许)和SREG寄存器中的I位被置“1”,ADC中断服务程序将被执行。ADIF在执行相应的中断处理向量时被硬件自动清零。此外,ADIF位可以通过写入逻辑“1”来清零。15 位3ADIE:ADC中断允许当该位和SREG寄存器中的I位同时被置位时,允许ADC转换完成中断。16 位2,0ADPS2:0:ADC预分频选择这些位决定了XTAL时钟与输入到ADC的ADC时钟之间分频数,见表6.2.3。表6.2.3 ADC时钟分频ADPS2:0分 频 系 数00020012

27、01040118100161013211064111128本实例中我们需要使能ADC,即ADEN设置为1,我们不用自动转换,也不需要中断,所以,ADTE、ADIE位不需要设置。在通常情况下,ADC的逐次比较转换电路要达到最大精度时,需要50kHz200kHz之间的采样时钟。本例中使用的时钟是12M的,所以要将时钟64分频,分频后ADC频率为188KHz,即时钟分频选择ADPS2:0=6。3ADC数据寄存器ADCL和ADCHl ADLAR = 0,ADC转换结果右对齐时,ADC结果的保存方式l ADLAR = 1,ADC转换结果左对齐时,ADC结果的保存方式当ADC转换完成后,可以读取ADC寄存

28、器的ADC0-ADC9得到ADC的转换的结果。如果是差分输入,转换值为二进制的补码形式。一旦开始读取ADCL后,ADC数据寄存器就不能被ADC更新,直到ADCH寄存器被读取为止。因此,如果结果是左对齐(ADLAR=1),且不需要大于8位的精度的话,仅仅读取ADCH寄存器就足够了。否则,必须先读取ADCL寄存器,再读取ADCH寄存器。ADMUX寄存器中的ADLAR位决定了从ADC数据寄存器中读取结果的格式。如果ADLAR位为“1”,结果将是左对齐;如果ADLAR位为“0”(默认情况),结果将是右对齐。4特殊功能I/O寄存器SFIOR17 位7.5ADTS2:0:ADC自动转换触发源选择当ADCS

29、RA寄存器中的ADATE为“1”,允许ADC工作在自动转换触发工作模式时,这3位的设置用于选择ADC的自动转换触发源。如果禁止了ADC的自动转换触发(ADATE为“0”),这3个位的设置值将不起任何作用。表10-6 ADC自动转换触发源的选择ADTS2:0触 发 源000连续自由转换001模拟比较器010外部中断0011T/C0比较匹配100T/C0溢出101T/C1比较匹配B110T/C1溢出111T/C1输入捕捉本例中我们不使用自动转换功能,所以该寄存器可以不必设置。6.2.3、电路本实例的电路包括232电平转换电路和电阻分压电路,这两种电路在前面的实例中均做过介绍,这里不再重复。1、电路

30、原理在本实例中利用MAX3232芯片使单片机输出的TTL电平转换为标准的RS232电平,从而使计算机能够识别。同时将计算机输出的RS232电平转换为单片机可以识别的TTL电平。利用电位器产生电阻分压电路,从而产生变化的模拟电压加到单片机的模拟信号采集端口,供单片机采集。2、电路连接电路中MAX3232芯片的9、10引脚分别连接单片机的PD0、PD1端口,MAX3232的13、14引脚分别连接计算机串口线的3、2脚。电位器RP2的动片引脚连接单片机的模拟信号采集通道PA0(ADC0)。3、特别说明本学习板采用的是串口插座是公头的,所以与计算机相连的串口连接线应该是交叉串口线,而不是串口延长线。5

31、.2.4、程序设计1、程序功能程序的功能是通过单片机的串行接口,将单片机采集到的模拟电压值发送到计算机中,通过计算机上的串口助手显示采集的电压值。 单片机串行接收中断的编程在本例中,我们用到了单片机的串行接收中断,需要编写串行接收中断服务程序,通过查询WINAVR(GCC)的中断库函数手册,可以查找到ATmega16单片机串行接收中断的中断向量为USART_RXC_vect。据此我们可以编写串行接收中断服务程序,如下:/接收中断函数ISR(USART_RXC_vect )unsigned char Rev;Rev = UDR; /从USART I/O数据寄存器UDR中读出数据Usart_Put

32、Char(Rev); /将接收到的数据发送在中断服务程序中,我们首先把单片机串口接收到的数据放入变量Rev中,然后调用上一实例中编写的串行接口字节发送函数将变量Rev中的数据发送到计算机。2、 单片机与计算机串行通信结果的观察在观察本例运行结果时,我们同样要用到串口助手,本例中,单片机发送串口数据采用的波特率是9600bps,数据格式是8位数据位,1位停止位,无奇偶校验。在串口助手里面,我们也要将波特率和数据格式设置成一样的。3、函数说明本实例用到了6个函数,分别是:void Port_Init(void); /端口初始化配置void Usart_Init(void); /USART寄存器设置

33、void AD_Init(void); /AD初始化void Usart_PutChar(unsigned char cTXData); /字节发送函数void Usart_PutString(unsigned char *pcString); / 字符串发送数据unsigned int AD_GetData(void); /AD转换函数 4、使用WINAVR开发环境,在本例中我们使用的是外部12M的晶振,所以需要将MAKEFILE文件中的时钟频率修改为12M。另外在程序烧录到单片机的时候,熔丝位也要选择为外部12M晶振(注意是晶振,不是外部振荡器,一定不要选择错了,否则会导致单片机不能再烧写

34、程序)。 5、程序代码#include #include #include /中断函数头文件/常量声明#define BAUD 9600 /波特率设置值/全局变量声明unsigned int ADData; /AD转换获得的数据/函数声明void Port_Init(void); /端口初始化配置void Usart_Init(void); /USART寄存器设置void AD_Init(void); /AD初始化void Usart_PutChar(unsigned char cTXData); /字节发送函数void Usart_PutString(unsigned char *pcStr

35、ing); / 字符串发送数据unsigned int AD_GetData(void); /AD转换函数int main(void) unsigned char Delay3s;Port_Init();Usart_Init();AD_Init();Usart_PutString(AD转换测试程序);Usart_PutString(测得ADC0通道的电压值为:);sei(); /使能全局中断 while(1)ADData = (int)(long)AD_GetData() * 5010 / 1024);/将获得的AD值转换为电压值 /单位为mv。Usart_PutChar(ADData / 1

36、000 + 0x30); /得到电压值的千位并发送Usart_PutChar(.); /发送小数点Usart_PutChar(ADData % 1000 / 100 + 0x30); /得到电压值的百位并发送Usart_PutChar(ADData % 100 / 10 + 0x30); /得到电压值的十位并发送Usart_PutChar(ADData % 10 + 0x30); /得到电压值的个位并发送Usart_PutChar(V); /发送电压符号“V”Usart_PutChar(0x0d); / Usart_PutChar(0x0a); / AD值发送结束,回车换行for(Delay3

37、s = 0;Delay3s 30;Delay3s+) /延时3S_delay_ms(90);/端口状态初始化设置函数void Port_Init()PORTA = 0X00; DDRA = 0x00; /ADC通道设置为输入口,高阻态/USART寄存器配置函数void Usart_Init()UCSRA = 0X00;UCSRC |= (1URSEL) | (1 UCSZ1) | (1 UCSZ0); /异步,数据格式8,N,1 /UCSRC寄存器与UBRRH寄存器共用相同的I/O地址,写 UCSRC 时, URSEL 应设置为 1。UBRRL = (F_CPU / BAUD / 16 - 1

38、) % 256; /波特率设置UBRRH = (F_CPU / BAUD / 16 - 1) / 256;UCSRB |= (1 RXCIE) | (1 RXEN) | (1 TXEN); /发送使能/字节发送函数void Usart_PutChar(unsigned char cTXData)while( !(UCSRA & (1 UDRE) ); /只有数据寄存器为空时才能发送数据UDR = cTXData; /发送数据送USART I/O数据寄存器UDR/接收中断函数ISR(USART_RXC_vect )unsigned char Rev;Rev = UDR; /从USART I/O数

39、据寄存器UDR中读出数据Usart_PutChar(Rev); /将接收到的数据发送void Usart_PutString(unsigned char *pcString)while (*pcString)Usart_PutChar(*pcString+); Usart_PutChar(0x0D);Usart_PutChar(0x0A); /结尾发送回车换行/AD转换初始化函数void AD_Init()ADMUX |= (1 REFS0); /ADC参考电压为AVcc,ADC结果右对齐,选择通道ADC0ADCSRA |= (1 ADEN) | (1 ADPS2) | (1 ADPS1);

40、/使能AD转换,ADC时钟64分频/AD转换函数unsigned int AD_GetData()ADCSRA |= (1 ADSC); /开始AD转换while(!(ADCSRA & (1 ADIF); /等待转换完成ADCSRA |= (1 ADIF); /清零ADC中断标志位return ADC; /返回ADC值附录:ADC应用设计要点1预分频与转换时间在通常情况下,ADC的逐次比较转换电路要达到最大精度时,需要50kHz200kHz之间的采样时钟。在要求转换精度低于10位的情况下,ADC的采样时钟可以高于200kHz,以获得更高的采样率。ADC模块中包含一个预分频器的ADC时钟源,它可

41、以对大于100KHz的系统时钟进行分频,以获得合适的ADC时钟提供ADC使用。预分频器的分频系数由ADCSRA寄存器中的ADPS位设置的。一旦寄存器ADCSRA中的ADEN位置“1”(ADC开始工作),预分频器就启动开始计数。ADEN位为“1”时,预分频器将一直工作;ADEN位为“0”时,预分频器一直处在复位状态。AVR的ADC完成一次转换的时间见表6.2.5。从表中可以看出,完成一次ADC转换通常需要13-14个ADC时钟。而启动ADC开始第一次转换到完成的时间需要25个ADC时钟,这是因为要对ADC单元的模拟电路部分进行初始化。表6.2.5 ADC转换和采样保持时间转 换 形 式采样保持时

42、间完 成 转 换 总 时 间启动ADC后的第一次转换13.5个ADC时钟25个ADC时钟正常转换,单端输入1.5个ADC时钟13个ADC时钟自动触发方式2个ADC时钟13.5个ADC时钟正常转换,差分输入1.5/2.5个ADC时钟13/14个ADC时钟当ADCSRA寄存器中的ADSC位置位,启动ADC转换时,A/D转换将在随后ADC时钟的上升沿开始。一次正常的A/D转换开始时,需要1.5个ADC时钟周期的采样保持时间(ADC首次启动后需要13.5个ADC时钟周期的采样保持时间)。当一次A/D转换完成后,转换结果写入ADC数据寄存器,ADIF(ADC中断标志位)将被置位。在单次转换模式下,ADSC也同时被清零。用户程序可以再次置位ADSC位,新的一次转换将在下一个ADC时钟的上升沿开始。当ADC设置为自动触发方式时,触发信号的上升沿将启动一次ADC转换。转换完成的结果将一直保持到下一次触发信号的上升沿出现,然后开始新的一次ADC转换。这就保证了使ADC每隔一定的时间间隔进行一次转换。在这种方式下,ADC需要2个ADC时钟周期的采样保持时间。在自由连续转换模式下,一次转换完毕后马上开始一次新的转换,此时,ADSC位一直保持为“1”。2ADC输入通道和参考电源的选择寄存器ADMUX中的MUXn和REFS1、REFS0位实际

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号