接上篇:http://www.51hei.com/mcu/2117.html
一、AVR单片机片内ADC简介
模数转换器即A/D转换器,或简称ADC(Analog Digital Converter),它是一种将输入模拟量转变为输出数字量的器件,是连接模拟和数字的桥梁。通常是指一个将模拟信号转变为数字信号的电子元件。 通常的模数转换器是将一个输入电压信号转换为一个输出的数字信号。由于数字信号本身不具有实际意义,仅仅表示一个相对大小。故任何一个模数转换器都需要一个参考模拟量作为转换的标准,比较常见的参考标准为最大的可转换信号大小。而输出的数字量则表示输入信号相对于参考信号的大小。 模数转换器最重要的参数是转换的精度,通常用输出的数字信号的位数的多少表示。转换器能够准确输出的数字信号的位数越多,表示转换器能够分辨输入信号的能力越强,转换器的性能也就越好。 A/D转换一般要经过采样、保持、量化及编码4个过程。在实际电路中,有些过程是合并进行的,如采样和保持,量化和编码在转换过程中是同时实现的。 模数转换器的分类
A/D转换器的种类很多,并且有多种分类方法,下面做简单介绍: 1)从原理上通常可分为以下4种:计数式A/D转换器、双积分式A/D转换器、逐次逼近式A/D转换器和并行A/D转换器。
计数式A/D转换器结构很简单,转换速度很慢,现在很少采用。 双积分式A/D转换器抗干扰能力强,转换精度高,但转换速度不够快,一般用于数字式测量仪表中。 逐次逼近式A/D转换器结构不太复杂,转换速度很高,一般应用于微机接口电路中。并行A/D转换器的转换速度最快,但结构复杂,成本高,一般只应用于那些转换速度极高的场合。 2)从输出代码的有效位数可分为8位,10位,12位,14位,16位,24位及BCD码输出的3  位,4  位,5  位等多种不同的位数。 3)从数据输出的接口类型可分为并行接口型和串行接口型 二、 ATmega16单片机集成了一个10位的逐次逼近型A/D转换器,A/D转化器与一个8通道的模拟多路复用器连接,能对来自端口A的8路单端输入电压进行采样。 特点:
8路可选的单端输入通道,占用PA0 – PA7引脚,由于只有一个ADC核,所以只能一次采集一路通道; 7路差分输入通道; ADC转换结果的读取可以设置左端对齐(默认右端对齐),因为该ADC是十位的,需要两个寄存器才能存储完整的转换过后的数据; 在最高精度下可达到15KPS/s的采样速率; 可选择的ADC内部2.56V的ADC参考电压源; 自由连续转换模式和单次转换模式; ADC自动选择转换触发模式选择; ADC转换完成可触发中断; 二、ADC的供电和参考电压
ADC功能单元由独立的专用模拟电源引脚AVCC(第30引脚)供电,AVCC与VCC的电压差别要小于或等于0.3V。 ADC转换的参考电源可采用芯片内部的2.56V参考电源,或采用AVCC,也可采用外部参考电源。使用外部参考电源时,外部参考电源有引脚AREF接入。使用内部电压参考电源时,可以通过在AREF引脚外部并接一个电容提高ADC的抗噪性能。 三、与ADC有关的寄存器
1、ADC多路复用器选择寄存器ADMUX
ADC多路复用器选择寄存器ADMUX | 位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 名称 | REFS1 | REFS0 | ADLAR | MUX4 | MUX3 | MUX2 | MUX1 | MUX0 | 读/写 | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W | 初始值 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 功能 | 参考电源选择 | 对齐方式 | 指定使用通道及增益 | | | | | | | | | |
位【7-6】— REFS[1-0] :ADC参考电源选择位。是用来指定ADC的参考电源采用
何种参考电源,有三种参考电源:内部2.56V、AREF、AVCC。如果在转换过程中改变了设置,则只有等到当前转换结束后新的设置才会起作用。内、外部参考电压不能同时被选择,否则会短路损坏芯片。 具体设置表: ADC参考电源选择位设置表 | REFS1 | REFS0 | 参考电压选择 | 0 | 0 | 选择AREF,内部基准源关闭 | 0 | 1 | 选择AVCC,AREF外接滤波电容 | 1 | 0 | 保留 | 1 | 1 | 2.56V内部基准电压源,AVREF外接滤波电容 |
位【5】— ADLAR:ADC转换结果对齐选择位。这一位可以选择ADC转换的结果在ADC数据寄存器中存放形式。ADLAR置位时(为1)转换结果位左对齐,否则右对齐(默认)。一般左对齐是在只需要8位精度的情况下才设置,这样只需要读取一次ADCH就OK了。 ADLAR = 0 ADC以右端对齐的方式存储数据(默认)【只读,初始值全0】 | ADCH | | | | | | | ADC9 | ADC8 | ADCL | ADC7 | ADC6 | ADC5 | ADC4 | ADC3 | ADC2 | ADC1 | ADC0 |
ADLAR = 1 ADC以左端对齐的方式存储数据 【只读,初始值全0】 | ADCH | ADC9 | ADC8 | ADC7 | ADC6 | ADC5 | ADC4 | ADC3 | ADC2 | ADCL | ADC1 | ADC0 | | | | | | |
位【4-0】— MUX[4-0]:模拟通道与增益选择位。这几位选择 当前要使用的ADC模拟输入通道,也可以对差分通道增益进行设置。如果在转换过程中改变了设置,则只有等到当期转换结束之后新的设置才会生效。 2、ADC控制和状态寄存器ADCSRA
ADC控制和状态寄存器ADCSRA | 位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 名称 | ADEN | ADSC | ADATE | ADIF | ADIE | ADPS2 | ADPS1 | ASPS0 | 读/写 | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W | 初始值 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 功能 | AD
使能 | 启动
转换 | 自动
触发 | 中断
标志 | 中断
使能 | ADC预分频设置 | | | | | | | | | |
位【7】— ADEN:ADC使能位。启用ADC功能,否则关闭ADC功能。相当于ADC的总开关。 位【6】— ADSC:ADC开始转换。在单次转换模式下,ADSC置位将启动一次ADC转换。在连续转换模式下ADSC置位将启动首次转换。 位【5】— ADATE:ADC自动触发使能。ADATE置位将启动ADC自动触发转换功能,触发信号的上升沿启动ADC转换。 位【4】— ADIF:ADC中断标志位。ADC转换结束且数据寄存器被更新后,ADIF将被硬件置位。如果ADIE及SREG寄存器中的全局中断使能位I被置位,则ADC转换结束中断服务程序将被执行,同时ADIF硬件清零,也可以通过软件写“1”清零。当没有启用中断(ADIE)时,可以通过不停的查询此位获知ADC是否转换完毕好读取数据,此时应当软件将ADIF清零。 位【3】— ADIE:ADC中断使能位。若ADIE及SREG中的I置位,则ADC转换结束、数据寄存器被更新后会将ADIF中断标志位置位,同时会产生中断从而执行中断服务函数,进入中断服务函数后ADIF中断标志位将被硬件清零。 位【2-0】— ADPS[2-0]:ADC预分频器选择位。这3位决定ADC输入时钟与CPU时钟之间的分频系数,如分频系数为2,则表示是CPU时钟频率的1/2。
ADC分频系数如下表: ADC分频系数设置表 (ADCSRA) | ADPS2 | ADPS1 | ADPS0 | 分频系数 | 0 | 0 | 0 | 2 | 0 | 0 | 1 | 2 | 0 | 1 | 0 | 4 | 0 | 1 | 1 | 8 | 1 | 0 | 0 | 16 | 1 | 0 | 1 | 32 | 1 | 1 | 0 | 64 | 1 | 1 | 1 | 128 |
3、ADC数据寄存器ADCL及ADCH
ADC转换结束后,转换结果将储存在ADCL/ADCH这两个寄存器中。因为一个寄存器只有8位,而ADC是10位,所以需要两个寄存器才能存储完整的10位结果。
因为需要用到两个寄存器,为了防止在上一次转换结果还没有完全被读走,下一次的转换结果就将其覆盖掉,造成数据错乱,AVR的ADC采取了一个保护策略:当程序语句读取ADCL寄存器时,ADCH的值将被锁定,直到程序读取了ADCH寄存器后,AD转化器硬件才能将下一次的转换数据更新到这两个寄存器中。因此,如果转换结果为左对齐而且只需要8位精度,那么仅需要读取ADCH就足够了。 4、特殊功能IO寄存器SFIOR
特殊功能IO寄存器SFIOR | 位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 名称 | ADTS2 | ADTS1 | ADTS0 | - | ACME | PUD | PSR2 | PSR0 | 权限 | R/W | R/W | R/W | R | R/W | R/W | R/W | R/W | 初始值 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
位【7-5】— ADTS[2-0]:ADC自动触发源选择。可以选择多种触发ADC转换的方式。
与ADC有关的只有高三位。
ADC自动触发源选择设置表(SFIOR) | ADTS2 | ADTS1 | ADTS0 | 触发源 | 0 | 0 | 0 | 连续转换模式 | 0 | 0 | 1 | 模拟比较器 | 0 | 1 | 0 | 外部中断请求0 | 0 | 1 | 1 | 定时器/计数器0比较匹配 | 1 | 0 | 0 | 定时器/计数器0溢出 | 1 | 0 | 1 | 定时器/计数器比较溢出B | 1 | 1 | 0 | 定时器/计数器1溢出 | 1 | 1 | 1 | 定时器/计数器1捕捉事件 |
四、代码流程。
1、ADC输入端口初始化。
2、基准电压设置,数据对齐方式,通道选择(寄存器ADMUX)。
3、AD使能,启动转换,及中断设置(寄存器ADCSRA)
4、触发源选择(寄存器SFIOR)
5、选择中断号,编写中断服务函数,读取ADC转换结果(ADCH,ADCL)。
从ADCH和ADCL中读到的数据是BCD码格式,实际上就是十进制存储。
================= 待续 ===================
|