第6章ATmega单片机的模拟接口及使用方法第6章ATmega单片机的模拟接口及使用方法•模拟比较器•A/D转换器•PWM发生器•数字滤波方法第6章ATmega单片机的模拟接口及使用方法•6.1模拟比较器模拟比较器对正极AIN0的值与负极AIN1的值进行比较。当AIN0上的电压比负极AIN1上的电压要高时,模拟比较器的输出ACO即置位。比较器的输出可用来触发定时器/计数器1的输入捕捉功能。此外,比较器还可触发自己专有的、独立的中断。用户可以选择比较器是以上升沿、下降沿还是交替变化的边沿来触发中断。中断向量:ANA_COMP_vect第6章ATmega单片机的模拟接口及使用方法图6.1为比较器及其外围逻辑电路的框图。第6章ATmega单片机的模拟接口及使用方法1、特殊功能IO寄存器-SFIORBit3–ACME:模拟比较器多路复用器使能当此位为逻辑“1”,且ADC处于关闭状态(ADCSRA寄存器的ADEN为“0”)时,ADC多路复用器为模拟比较器选择负极输入。当此位为“0”时,AIN1连接到比较器的负极输入端。第6章ATmega单片机的模拟接口及使用方法第6章ATmega单片机的模拟接口及使用方法2、模拟比较器控制和状态寄存器(ACSR)•Bit7–ACD:模拟比较器禁用•Bit6–ACBG:选择模拟比较器的能隙基准源•Bit5–ACO:模拟比较器输出•Bit4–ACI:模拟比较器中断标志•Bit3–ACIE:模拟比较器中断使能•Bit2–ACIC:模拟比较器输入捕捉使能•Bits1,0–ACIS1,ACIS0:模拟比较器中断模式选择第6章ATmega单片机的模拟接口及使用方法需要改变ACIS1/ACIS0时,必须清零ACSR寄存器的中断使能位来禁止模拟比较器中断。否则有可能在改变这两位时产生中断。第6章ATmega单片机的模拟接口及使用方法模拟比较器的应用举例•如图所示:外部信号由模拟比较器的AIN0输入,AIN1接至VCC的分压,取R1=R2,则AIN1的电压为0.5VCC。•当AIN0的电压大于0.5VCC时,ACSR中的ACO置‘1’;低于时则清‘0’。当AIN0的电压大于0.5VCC时,LED灯亮,反之熄灭。第6章ATmega单片机的模拟接口及使用方法#include“avr/io.h”intmain(){unsignedcharmid;//定义变量DDRD=0xff;//设置PC口为输出PORTD=0xff;//设置PC口为输出为高电平(LED熄灭)ACSR=0x00;//启动模拟比较器while(1){mid=ACSR&0x20;//读出模拟比较器的输出值if(mid==0)//输出1熄灭LEDPORTD=1;elsePORTD=0;//输出0点亮LED}}第6章ATmega单片机的模拟接口及使用方法•6.2模数转换器•6.2.1主要特点ATmega16有一个10位的逐次逼近型ADC。ADC与一个8通道的模拟多路复用器连接,能对来自端口A的8路单端输入电压进行采样。器件还支持16路差分电压输入组合。两路差分输入(ADC1、ADC0与ADC3、ADC2)有可编程增益级,在A/D转换前给差分输入电压提供0dB(1x)、20dB(10x)或46dB(200x)的放大级。第6章ATmega单片机的模拟接口及使用方法七路差分模拟输入通道共享一个通用负端(ADC1),而其他任何ADC输入可做为正输入端。如果使用1x或10x增益,可得到8位分辨率。如果使用200x增益,可得到7位分辨率。ADC包括一个采样保持电路,以确保在转换过程中输入到ADC的电压保持恒定。ADC由AVCC引脚单独提供电源。AVCC与VCC之间的偏差不能超过±0.3V。标称值为2.56V的基准电压,以及AVCC,都位于器件之内。基准电压可以通过在AREF引脚上加一个电容进行解耦,以更好地抑制噪声。第6章ATmega单片机的模拟接口及使用方法图6.2模数转换器方框图第6章ATmega单片机的模拟接口及使用方法•6.2.2ADC的工作原理ADC通过逐次逼近的方法将输入的模拟电压转换成一个10位的数字量。最小值代表GND,最大值代表AREF引脚上的电压再减去1LSB。通过写ADMUX寄存器的REFSn位可以把AVCC或内部2.56V的参考电压连接到AREF引脚。在AREF上外加电容可以对片内参考电压进行解耦以提高噪声抑制性能。第6章ATmega单片机的模拟接口及使用方法•6.2.3启动ADC转换向ADC启动转换位ADSC位写“1”可以启动单次转换。在转换过程中此位保持为高,直到转换结束,然后被硬件清零。如果在转换过程中选择了另一个通道,那么ADC会在改变通道前完成这一次转换。第6章ATmega单片机的模拟接口及使用方法逻辑转换预标定器ADTS[2:0]ADIF中断源1中断源nADSC上升沿检测ADATE开始CLKADC图6.3ADC自动触发逻辑第6章ATmega单片机的模拟接口及使用方法•使用ADC中断标志作为触发源,可以在正在进行的转换结束后即开始下一次ADC转换。之后ADC便工作在连续转换模式,持续地进行采样并对ADC数据寄存器进行更新。第一次转换通过向ADCSRA寄存器的ADSC写1来启动。•如果使能了自动触发,置位ADCSRA寄存器的ADSC将启动单次转换。ADSC标志还可用来检测转换是否在进行之中。不论转换是如何启动的,在转换进行过程中ADSC一直为1。第6章ATmega单片机的模拟接口及使用方法•6.2.4预分频及ADC转换时序7位ADC分频选择器ADEN开始CK复位ADPS0ADPS1ADPS2ADC时钟源CK/2CK/4CK/8CK/16CK/32CK/64CK/128图6.4ADC预分频器第6章ATmega单片机的模拟接口及使用方法图6.5ADC时序图,第一次转换(单次转换模式)第6章ATmega单片机的模拟接口及使用方法图6.6ADC时序图,单次转换第6章ATmega单片机的模拟接口及使用方法图6.7ADC时序图,自动触发的转换第6章ATmega单片机的模拟接口及使用方法图6.8ADC时序图,连续转换第6章ATmega单片机的模拟接口及使用方法表6.3ADC转换时间13.5第6章ATmega单片机的模拟接口及使用方法•6.2.7ADC输入通道•选择模拟通道时请注意以下几个方面:•单次转换模式,总是在启动转换之前选定通道。在ADSC置位后的一个ADC时钟周期就可以选择新的模拟输入通道了。但是最简单的办法是等待转换结束后再改变通道。•在连续转换模式下,切换通道的方法同单次模式,若转换结束后再改变通道,此时新一次转换已经自动开始了,下一次的转换结果反映的是以前选定的模拟输入通道。以后的转换才是针对新通道的。•若切换到差分增益通道,由于自动偏移抵消电路需要沉积时间,第一次转换结果准确率很低,最好舍弃。第6章ATmega单片机的模拟接口及使用方法•6.2.8ADC基准电压源ADC参考电压源(VREF)反映了ADC的转换范围。若单端通道电平超过了VREF,其结果将接近0x3FF。VREF可以是AVCC、内部2.56V基准或外接于AREF引脚的电压。AVCC通过一个无源开关与ADC相连。片内2.56V参考电压由能隙基准源(VBG)通过内部放大器产生。AREF直接与ADC相连,通过在AREF与地之间外加电容可以提高参考电压的抗噪性。第6章ATmega单片机的模拟接口及使用方法•6.2.9ADC噪声抑制器ADC的噪声抑制器使其可以在睡眠模式下进行转换,从而降低由于CPU及外围I/O设备噪声引入的影响。噪声抑制器可在ADC降噪模式及空闲模式下使用。为了使用这一特性,应采用如下步骤:•1.确定ADC已经使能,且没有处于转换状态。工作模式应该为单次转换,并且ADC转换结束中断使能。•2.进入ADC降噪模式(或空闲模式)。一旦CPU被挂起,ADC便开始转换。第6章ATmega单片机的模拟接口及使用方法•3.如果在ADC转换结束之前没有其他中断产生,那么ADC中断将唤醒CPU并执行ADC转换结束中断服务程序。如果在ADC转换结束之前有其他的中断源唤醒了CPU,对应的中断服务程序得到执行。ADC转换结束后产生ADC转换结束中断请求。第6章ATmega单片机的模拟接口及使用方法•6.2.10模拟输入电路单端通道的模拟输入电路见图6.9。不论是否用作ADC的输入通道,输入到ADCn的模拟信号都受到引脚电容及输入泄露的影响。用作ADC的输入通道时,模拟信号源必须通过一个串联电阻(输入通道的组合电阻)驱动采样/保持(S/H)电容。第6章ATmega单片机的模拟接口及使用方法ADCnHL1..100kVcc/2CS/H=14pF图6.9模拟输入电路第6章ATmega单片机的模拟接口及使用方法•6.2.11ADC转换结果•转换结束后(ADIF为高),转换结果被存入ADC结果寄存器(ADCL,ADCH)。单次转换的结果如下:1024INREFVADCV式中,VIN为被选中引脚的输入电压,VREF为参考电压,0x000代表模拟地电平,0x3FF代表所选参考电压的数值减去1LSB。第6章ATmega单片机的模拟接口及使用方法•如果使用差分通道,结果是:()512POSNEGREFVVGAINADCV式中,VPOS为输入引脚正电压,VNEG为输入引脚负电压,GAIN为选定的增益因子,且VREF为参考电压。结果用2的补码形式表示,从0x200(-512d)到0x1FF(+511d)。如果用户希望对结果执行快速极性检测,判断MSB(ADCH中ADC9),如该位为1,结果为负;该位为0,结果为正。第6章ATmega单片机的模拟接口及使用方法•1、ADC多工选择寄存器(ADMUX)•Bit7:6–REFS1:0:参考电压选择ADC参考电压选择Bit5–ADLAR:ADC转换结果左对齐Bits4:0–MUX4:0:模拟通道与增益选择位第6章ATmega单片机的模拟接口及使用方法第6章ATmega单片机的模拟接口及使用方法•2、ADC控制和状态寄存器A(ADCSRA)•Bit7–ADEN:ADC使能•Bit6–ADSC:ADC开始转换•Bit5–ADATE:ADC自动触发使能•Bit4–ADIF:ADC中断标志•Bit3–ADIE:ADC中断使能•Bits2:0–ADPS2:0:ADC预分频器选择位第6章ATmega单片机的模拟接口及使用方法•3、ADC数据寄存器(ADCL及ADCH)ADLAR=0•ADLAR=1第6章ATmega单片机的模拟接口及使用方法•ADC转换结束后,转换结果存于这两个寄存器之中。如果采用差分通道,结果由2的补码形式表示。读取ADCL之后,ADC数据寄存器一直要等到ADCH也被读出才可以进行数据更新。因此,如果转换结果为左对齐,且要求的精度不高于8比特,那么仅需读取ADCH就足够了。否则必须先读出ADCL再读ADCH。第6章ATmega单片机的模拟接口及使用方法•4、特殊功能IO寄存器(SFIOR)•Bit7:5–ADTS2:0:ADC自动触发源若ADCSRA寄存器的ADATE置位,ADTS的值将确定触发ADC转换的触发源;否则,ADTS的设置没有意义。被选中的中断标志在其上升沿触发ADC转换。•Bit4–Res:保留位。这一位保留。为了与以后的器件相兼容,在写SFIOR时这一位应写0。第6章ATmega单片机的模拟接口及使用方法实例:测量和显示PA0引脚的电压。输入电压采用电位器5V的分压,电压变化范围为0-5V之间,大小可以调节。第6章ATmega单片机的模拟接口及使用方法•#includeavr/io.h•#includeutil/delay.h•#includemath.h•#includemax7219.c•floatlvboxishu,bilixishu;•longintdianya;•longintzhuanhuan(chartongdao)//AD转换函数•{•ADCSRA=0x86;//设置AD转换•ADMUX=0x40+tongd