}
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引脚