马伟力AVR笔记六模拟比较器和ADC实验.docx
- 文档编号:18285030
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:28
- 大小:122.24KB
马伟力AVR笔记六模拟比较器和ADC实验.docx
《马伟力AVR笔记六模拟比较器和ADC实验.docx》由会员分享,可在线阅读,更多相关《马伟力AVR笔记六模拟比较器和ADC实验.docx(28页珍藏版)》请在冰点文库上搜索。
马伟力AVR笔记六模拟比较器和ADC实验
AVR学习笔记六、模拟比较器和ADC实验
-------基于LT_Mini_M16
6.1模拟比较器实验
6.1.1实例功能
模拟比较器和模数转换ADC是单片机内部最常见的两种支持模拟信号输入的功能接口。
大部分AVR都具备这两种类型的接口。
本实例将以ATmage16芯片为例,介绍模拟比较器的使用方法,在下一个实例中介绍模数转换ADC。
使用模拟比较器可以实现单片机系统电源电压的检测,更巧妙的应用是利用模拟比较器和一些简单的外围电路,设计简单的模数转换ADC。
本实例实现利用模拟比较器比较某一点电压与内部模拟比较器参考电压的高低。
共有3个功能模块,分别描述如下:
●单片机系统:
使用ATmega16单片机的模拟比较器比较某一点的电压与参考电压的关系。
●外围电路:
利用电阻设计的分压电路。
●软件程序:
熟悉掌握ATmega16单片机的模拟比较器的使用。
通过本实例的学习,掌握相关电路设计,并掌握以下知识点:
●了解单片机的模拟比较器。
●了解单片机的模拟比较器的使用。
●掌握单片机模拟比较器的编程。
6.1.2、器件和原理
1、模拟比较器的介绍
ATmega16的模拟比较器可以实现对两个输入端:
正极AIN0和负极AIN1(分别对应于ATmage16的引脚PB2、PB3)的模拟输入电压进行比较。
当AIN0上的电压高于AIN1的电压时,模拟比较器输出ACO被设为“1”。
比较器的输出还可以被设置作为定时计数器1输入捕获功能的触发信号。
此外,比较器的输出可以触发一个独立的模拟比较器中断。
用户可以选择使用比较器输出的上升沿、下降沿或事件触发作为模拟比较器中断的触发信号。
2、与模拟比较器相关的寄存器
与模拟比较器相关的寄存器是SFIOR、ACSR。
用户通过这两个寄存器的相关位实现对模拟比较器的设置和控制。
1)特殊功能IO寄存器—SFIOR
寄存器SFIOR中的第3位ACME为模拟比较器多路使能控制位。
当该位为逻辑“1”,同时模数转换(ADC)功能被关闭(ADCSRA寄存器中的ADEN使能位为“0”)时,允许使用ADC多路复用器选择ADC的模拟输入端口作为模拟比较器反向端的输入信号源。
当该位为零时,AIN1引脚的信号将加到模拟比较器反向端。
本实例中我们使用ADC的模拟输入端口作为模拟比较器反向端的输入信号源,所以需要设置第3位ACME为1.
2)模拟比较器控制和状态寄存器—ACSR
ACSR是模拟比较器主要的控制寄存器,其中各个位的作用如下:
1.位7—ACD:
模拟比较器禁止
当该位设为“1”时,提供给模拟比较器的电源关闭。
该位可以在任何时候被置位,从而关闭模拟比较器。
在MCU闲置模式,且无需将模拟比较器作为唤醒源的情况下,关闭模拟比较器可以减少电源的消耗。
要改变ACD位的设置时,应该先将寄存器ACSR中的ACIE位清零,把模拟比较器中断禁止掉。
否则,在改变ADC位设置时会产生一个中断。
2.位6—ACBG:
模拟比较器的能隙参考源选择
当该位为“1”时,芯片内部一个固定的能隙(Bandgap)参考电源1.22V将代替AIN0的输入,作为模拟比较器的正极输入端。
当该位被清零时,AIN0的输入仍然作为模拟比较器的正极输入端。
3.位5—ACO:
模拟比较器输出
模拟比较器的输出信号经过同步处理后直接与ACO相连。
由于经过同步处理,ACO与模拟比较器的输出之间,会有1~2个时钟的延时。
4.位4—ACI:
模拟比较器中断标志位
当模拟比较器的输出事件符合中断触发条件时(中断触发条件由ACIS1和ACIS0定义),ACI由硬件置“1”。
若ACIE位置“1”,且状态寄存器中的I位为“1”时,MCU响应模拟比较器中断。
当转入模拟比较中断处理向量时,ACI被硬件自动清空。
此外,也可使用软件方式清零ACI:
对ACI标志位写入逻辑“1”来清零该位。
5.位3—ACIE:
模拟比较器中断允许
当ACIE位设为“1”,且状态寄存器中的I位被设为“1”时,允许模拟比较器中断触发。
当ACIE被清“0”时,模拟比较器中断被禁止。
6.位2—ACIC:
模拟比较器输入捕获允许
当该位设置为“1”时,定时计数器1的输入捕获功能将由模拟比较器的输出来触发。
在这种情况下,模拟比较器的输出直接连到输入捕获前端逻辑电路,从而能利用定时器/计数器1输入捕获中断的噪声消除和边缘选择的特性。
当该位被清零时,模拟比较器和输入捕获功能之间没有联系。
要使能比较器触发定时器/计数器1的输入捕获中断,定时器中断屏蔽寄存器(TIMSK)中的TICIE1位必须被设置。
7.位1、0—ACIS1、ACIS0:
模拟比较器中断模式选择
这2个位决定哪种模拟比较器的输出事件可以触发模拟比较器的中断。
不同的设置参见表6.1.1。
表6.1.1模拟比较器中断模式选择
ACIS1
ACIS0
中断模式
0
0
比较器输出的上升沿和下降沿都触发中断
0
1
保留
1
0
比较器输出的下降沿触发中断
1
1
比较器输出的上升沿触发中断
注意:
当要改变ACIS1、ACIS0时,必须先清除ACSR寄存器中的中断允许位,以禁止模拟比较器中断;否则,当这些位被改变时,会发生中断。
在本实例中,我们要使用模拟比较器,所以应当允许模拟比较器,即ACD应为0,选择芯片内部的固定能隙参考电源。
即ACBG设置为1,我们不使用中断和捕获,所以不必理会与此相关的各位。
3)模拟比较器的多路输入
用户可以选择ADC7..0引脚中的任一路的模拟信号代替AIN1引脚,作为模拟比较器的反向输入端。
模数转换的ADC多路复用器提供这种选择的能力,但此时必须关闭芯片的ADC功能。
当模拟比较器的多路选择使能位(SFIOR中的ACME位)置“1”,同时ADC被关闭时(ADCSRA中的ADEN位置“0”),由寄存器ADMUX中的MUX[2:
0]位所确定的引脚将代替AIN1作为模拟比较器的反向输入端,如表6.1.2所示。
如果ACME被清零,或ADEN被置1,则AIN1仍将为模拟比较器的反向输入端。
表6.1.2模拟比较器多路输入选择
ACME
ADEN
MUX2..0
模拟比较器反向输入端
0
x
xxx
AIN1
1
1
xxx
AIN1
1
0
000
ADC0
1
0
001
ADC1
1
0
010
ADC2
1
0
011
ADC3
1
0
100
ADC4
1
0
101
ADC5
1
0
110
ADC6
1
0
111
ADC7
本实例中我们采用ADC0作为模拟比较器的反向输入端,所以选择ADMUX寄存器中的MUX2:
0=0;
6.1.3、电路
本实例的电路包含分压电路,下面的电路是电阻分压电路,如下图所示。
1、电路原理
在本实例中利用电位器(即可调电阻)组成分压电路,单片机的PA0连接在电位器的动片引脚上,这个电路实际上相当于两个电阻组成的串联电路,只不过这两个电阻的阻值是可变的,改变动片的位置,就可以改变PA0与地之间的电阻值,根据串联电路分压的原理,当动片移动时,PA0处的电压就会发生变化。
2、电路连接
电路电位器的动片引脚连接到单片机的PA0口,作为模拟比较器的反向输入端。
6.1.4、程序设计
1、程序功能
程序的功能是使用单片机的模拟比较器比较PA0口的电压与单片机内部的固定能隙电压(1.22V)之间的高低,如果PA0的电压低于1.22V,则D1灯点亮,否则D2灯点亮。
2函数说明
本程序有两个功能函数,分别是:
●端口初始化函数,设置连接D1、D2两个LED的端口PB0、PB1为输出口,输出低电平,使两个LED都处于熄灭状态。
●模拟比较器初始化函数
设置与模拟比较器相关的寄存器,使模拟器按照一定的方式工作。
3、使用WINAVR开发环境,我们使用的是外部12M的晶振,所以需要将makefile文件中的时钟频率修改为12M。
另外在程序烧录到单片机的时候,熔丝位也要选择为外部12M晶振(注意是晶振,不是外部振荡器,一定不要选择错了,否则会导致单片机不能再烧写程序)。
4、程序代码
#include
#include
#include
//函数声明
voidPort_Init(void);//端口初始化配置
voidCompare_Init(void);//模拟比较器初始化设置
intmain(void)
{
Port_Init();
Compare_Init();
sei();//使能全局中断
while
(1)
{
if(ACSR&(1< { PORTB=0X01;//低于1.22V,D1点亮, } else { PORTB=0X02;//高于1.22V,D2点亮, } } } //端口状态初始化设置函数 voidPort_Init() { PORTB=0X00;// DDRB|=(1< } //模拟比较器初始化函数 voidCompare_Init() { SFIOR|=(1< //作为模拟比较器反向输入端的信号源。 //同时选择ADC的ADC0作为输入端,并且关闭AD转换的使能 ACSR|=(1< } 6.2模数转换的ADC实验 6.2.1、实例功能 AVR的模数转换器ADC具有下列特点: ●10位精度; ●0.5LSB积分非线形误差 ●±2LSB的绝对精度; ●13µs~260µs的转换时间; ●在最大精度下可达到每秒15kSPS的采样速率; ●8路可选的单端输入通道; ●7路差分输入通道; ●2路差分输入通道带有可选的10×和200×增益; ●ADC转换结果的读取可设置为左端对齐(LEFTADJUSTMENT); ●ADC的电压输入范围0~Vcc; ●可选择的内部2.56V的ADC参考电压源; ●自由连续转换模式和单次转换模式; ●ADC自动转换触发模式选择; ●ADC转换完成中断; ●休眠模式下的噪声抑制器(NOISECANCELER)。 在本实例中,我们将编写程序实现将模数转换后获得的电压值通过单片机的串口发送到计算机,然后通过计算机上的串口助手显示测量的电压值。 本实例共有3个功能模块,分别描述如下: ●单片机系统: 使用单片机的串口实现将模数转换后获得的电压值通过串口发送到计算机。 ●外围电路: RS232电平转换电路,DB9串行接口插座,模拟电压输入采集电路。 ●软件程序: 进一步熟悉单片机的串行通信,并掌握单片机的模数转换的方法。 6.2.2、器件和原理 关于串行接口的原理已接单片机与计算机的串口的连接在上一实例中进行了描述,在本实例中不再重复。 本实例只介绍ATmega16单片机如何通过内置的模数转换模块采集外界输入的模拟电压。 1、ATmega16单片机的模数转换器ADC介绍 由于单片机只能处理数字信号,所以外部的模拟信号量需要转变成数字量才能进一步的由单片机进行处理。 ATmega16内部集成有一个10位逐次比较(successiveapproximation)ADC电路。 因此使用AVR可以非常方便的处理输入的模拟信号量。 ATmega16的ADC与一个8通道的模拟多路选择器连接,能够对以PORTA作为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转换的参考电源可采用芯片内部的2.56V参考电源,或采用AVcc,也可使用外部参考电源。 使用外部参考电源时,外部参考电源由引脚ARFE接入。 使用内部电压参考源时,可以通过在AREF引脚外部并接一个电容来提高ADC的抗噪性能。 ADC功能单元包括采样保持电路,以确保输入电压在ADC转换过程中保持恒定。 ADC通过逐次比较(successiveapproximation)方式,将输入端的模拟电压转换成10位的数字量。 最小值代表地,最大值为AREF引脚上的电压值减1个LSB。 可以通过ADMUX寄存器中REFSn位的设置,选择将芯片内部参考电源(2.56V)或AVcc连接到AREF,作为A/D转换的参考电压。 这时,内部电压参考源可以通过外接于AREF引脚的电容来稳定,以改进抗噪特性。 模拟输入通道和差分增益的选择是通过ADMUX寄存器中的MUX位设定的。 任何一个ADC的输入引脚,包括地(GND)以及内部的恒定能隙(fixedbandgap)电压参考源,都可以被选择用来作为ADC的单端输入信号。 而ADC的某些输入引脚则可选择作为差分增益放大器的正、负极输入端。 当选定了差分输入通道后,差分增益放大器将两输入通道上的电压差按选定增益系数放大,然后输入到ADC中。 若选定使用单端输入通道,则增益放大器无效。 通过设置ADCSRA寄存器中的ADC使能位ADEN来使能ADC。 在ADEN没有置“1”前,参考电压源和输入通道的选定将不起作用。 当ADEN位清“0”后,ADC将不消耗能量,因此建议在进入节电休眠模式前将ADC关掉。 ADC将10位的转换结果放在ADC数据寄存器中(ADCH和ADCL)。 默认情况下,转换结果为右端对齐(RIGHTADJUSTED)的。 但可以通过设置ADMUX寄存器中ADLAR位,调整为左端对齐(LEFTADJUSTED)。 如果转换结果是左端对齐,并且只需要8位的精度,那么只需读取ADCH寄存器的数据作为转换结果就达到要求了。 否则,必须先读取ADCL寄存器,然后再读取ADCH寄存器,以保证数据寄存器中的内容是同一次转换的结果。 因为一旦ADCL寄存器被读取,就阻断了ADC对ADC数据寄存器的操作。 这就意味着,一旦指令读取了ADCL,那么必须紧接着读取一次ADCH;如果在读取ADCL和读取ADCH的过程中正好有一次ADC转换完成,ADC的2个数据寄存器的内容是不会被更新的,该次转换的结果将丢失。 只有当ADCH寄存器被读取后,ADC才可以继续对ADCL和ADCH寄存器操作更新。 ADC有自己的中断,当转换完成时中断将被触发。 尽管在顺序读取ADCL和ADCH寄存器过程中,ADC对ADC数据寄存器的更新被禁止,转换的结果丢失,但仍会触发ADC中断。 2、ATmwga16单片机的模数转换器ADC相关的I/O寄存器 1.ADC多路复用器选择寄存器—ADMUX 8.位7,6—REFS[1: 0]: ADC参考电源选择 REFS1、REFS2用于选择ADC的参考电压源,见表6.2.1。 如果这些位在ADC转换过程中被改变,新的选择将在该次ADC转换完成后(ADCSRA中的ADIF被置位)才生效。 一旦选择内部参考源(AVcc、2.56V)为ADC的参考电压后,AREF引脚上不得施加外部的参考电源,只能与GND之间并接抗干扰电容。 表6.2.1ADC参考电源选择 REFS1 REFS0 ADC参考电源 0 0 外部引脚AREF,断开内部参考源连接 0 1 AVcc,AREF外部并接电容 1 0 保留 1 1 内部2.56V,AREF外部并接电容 9.位5—ADLAR: ADC结果左对齐选择 ADLAR位决定转换结果在ADC数据寄存器中的存放形式。 写“1”到ADLAR位,将使转换结果左对齐(LEFTADJUST);否则,转换结果为右对齐(RIGHTADJUST)。 无论ADC是否正在进行转换,改变ADLAR位都将会立即影响ADC数据寄存器。 10.位4..0—MUX4: 0: 模拟通道和增益选择 这5个位用于对连接到ADC的输入通道和差分通道的增益进行选择设置,详见表6.2.2。 注意,只有转换结束后(ADCSRA的ADIF是“1”),改变这些位才会有效。 表6.2.2ADC输入通道和增益选择 MUX[4: 0] 单端输入 差分正极输入 差分负极输入 增益 00000 ADC0 N/A 00001 ADC1 00010 ADC2 00011 ADC3 00100 ADC4 00101 ADC5 00110 ADC6 00111 ADC7 01000 N/A ADC0 ADC0 10× 01001 ADC1 ADC0 10× 01010 ADC0 ADC0 200× 01011 ADC1 ADC0 200× 01100 ADC2 ADC2 10× 01101 ADC3 ADC2 10× 01110 ADC2 ADC2 200× 01111 ADC3 ADC2 200× 10000 ADC0 ADC1 1× 10001 ADC1 ADC1 1× 10010 ADC2 ADC1 1× 10011 ADC3 ADC1 1× 10100 ADC4 ADC1 1× 10101 ADC5 ADC1 1× 10110 ADC6 ADC1 1× 10111 ADC7 ADC1 1× 11000 ADC0 ADC2 1× 11001 ADC1 ADC2 1× 11010 ADC2 ADC2 1× 11011 ADC3 ADC2 1× 11100 ADC4 ADC2 1× 11101 ADC5 ADC2 1× 11110 1.22V(VBG) N/A 11111 0V(GND) 本实例中我们需要设置ADC的参考电压源为AVcc,即REFS0设置为1,ADC默认转换结果为右对齐,我们不需要改变,模拟通道选择ADC0通道单端输入,即MUX4: 0。 2.ADC控制和状态寄存器A—ADCSRA 11.位7—ADEN: ADC使能 该位写入“1”时使能ADC,写入“0”关闭ADC。 如在ADC转换过程中将ADC关闭,该次转换随即停止。 12.位6—ADSC: ADC转换开始 在单次转换模式下,置该位为“1”,将启动一次转换。 在自由连续转换模式下,该位写入“1”将启动第一次转换。 先置位ADEN位使能ADC,再置位ADSC;或置位ADSC的同时使能ADC,都会使能ADC开始进行第一次转换。 第一次ADC转换将需要25个ADC时钟周期,而不是常规转换的13个ADC时钟周期,这是因为第一次转换需要完成对ADC的初始化。 在ADC转换的过程中,ADSC将始终读出为“1”。 当转换完成时,它将转变为“0”。 强制写入“0”是无效的。 13.位5—ADATE: ADC自动转换触发允许 当该位被置为“1”时,允许ADC工作在自动转换触发工作模式下。 在该模式下,在触发信号的上升沿时ADC将自动开始一次ADC转换过程。 ADC的自动转换触发信号源由SFIOR寄存器中的ADTS位选择确定。 14.位4—ADIF: ADC中断标志位 当ADC转换完成并且ADC数据寄存器被更新后该位被置位。 如果ADIE位(ADC转换结束中断允许)和SREG寄存器中的I位被置“1”,ADC中断服务程序将被执行。 ADIF在执行相应的中断处理向量时被硬件自动清零。 此外,ADIF位可以通过写入逻辑“1”来清零。 15.位3—ADIE: ADC中断允许 当该位和SREG寄存器中的I位同时被置位时,允许ADC转换完成中断。 16.位2,0—ADPS[2: 0]: ADC预分频选择 这些位决定了XTAL时钟与输入到ADC的ADC时钟之间分频数,见表6.2.3。 表6.2.3ADC时钟分频 ADPS[2: 0] 分频系数 000 2 001 2 010 4 011 8 100 16 101 32 110 64 111 128 本实例中我们需要使能ADC,即ADEN设置为1,我们不用自动转换,也不需要中断,所以,ADTE、ADIE位不需要设置。 在通常情况下,ADC的逐次比较转换电路要达到最大精度时,需要50kHz~200kHz之间的采样时钟。 本例中使用的时钟是12M的,所以要将时钟64分频,分频后ADC频率为188KHz,即时钟分频选择ADPS[2: 0]=6。 3.ADC数据寄存器—ADCL和ADCH ●ADLAR=0,ADC转换结果右对齐时,ADC结果的保存方式 ●ADLAR=1,ADC转换结果左对齐时,ADC结果的保存方式 当ADC转换完成后,可以读取ADC寄存器的ADC0-ADC9得到ADC的转换的结果。 如果是差分输入,转换值为二进制的补码形式。 一旦开始读取ADCL后,ADC数据寄存器就不能被ADC更新,直到ADCH寄存器被读取为止。 因此,如果结果是左对齐(ADLAR=1),且不需要大于8位的精度的话,仅仅读取ADCH寄存器就足够了。 否则,必须先读取ADCL寄存器,再读取ADCH寄存器。 ADMUX寄存器中的ADLAR位决定了从ADC数据寄存器中读取结果的格式。 如果ADLAR位为“1”,结果将是左对齐;如果ADLAR位为“0”(默认情况),结果将是右对齐。 4.特殊功能I/O寄存器—SFIOR 17.位7..5—ADTS[2: 0]: ADC自动转换触发源选择 当ADCSRA寄存器中的ADATE为“1”,允许ADC工作在自动转换触发工作模式时,这3位的设置用于选择ADC的自动转换触发源。 如果禁止了ADC的自动转换触发(ADATE为“0”),这3个位的设置值将不起任何作用。 表10-6ADC自动转换触发源的选择 ADTS[2: 0] 触发源 000 连续自由转换 001 模拟比较器 010 外部中断0 011 T/C0比较匹配 100 T/C0溢出 101 T/C1比较匹配B 110 T/C1溢出 111 T/C1输入捕捉 本例中我们不使用自动转换功能,所以该寄存器可以不必设置。 6.2.3、电路 本实例的电路包括232电平转换电路和电阻分压电路,这两种电路在前面的实例中均做过介绍,这里不再重复。 1、电路原理 在本实例中利用MAX3232芯片使单片机输出的TTL电平转换为标准的RS232电平,从而使计算机能够识别。 同时将计算机输出的RS232电平转换为单片机可以识别的TTL电平。 利用电位器产生电阻分压电路,从而产生变化的模拟电压加到单片机的模拟信号采集端口,供单片机采集。 2、电路连接 电路中MAX3232芯片的9、10引脚
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 伟力 AVR 笔记 模拟 比较 ADC 实验