资源描述
广西大学电气工程学院 海涛,第6章 ATmega单片机的模拟接口及使用方法,第6章 ATmega单片机的,模拟接口及使用方法,主讲:海涛,广西大学电气工程学院,内容提要,本章描述ATmega单片机A/D转换器和PWM发生器的基本原理和应用。在A/D转换器中,首先说明原理、结构、控制和相应特殊寄存器的用法,然后介绍软件设计及应用实例。在PWM发生器中,分别介绍结构原理和实际应用。此外本章还介绍几种滤波方法。,模拟比较器对正极AIN0 的值与负极AIN1 的值进行比较。当AIN0 上的电压比负极AIN1上的电压要高时,模拟比较器的输出ACO 即置位。比较器的输出可用来触发定时器/计数器1 的输入捕捉功能。,此外,比较器还可触发自己专有的、独立的中断。用户可以选择比较器是以上升沿、下降沿还是交替变化的边沿来触发中断。,图6.1为比较器及其外围逻辑电路的框图。,1、特殊功能IO寄存器SFIOR,Bit3ACME:模拟比较器多路复用器使能,当此位为逻辑“1”,且ADC处于关闭状态(ADCSRA 寄存器的ADEN为“0”)时,ADC多路复用器为模拟比较器选择负极输入。当此位为“0”时,AIN1连接到比较器的负极输入端。,2、模拟比较器控制和状态寄存器(ACSR),例如ACSR0 xXX;/可根据下面的引脚功能,来设置相应的值。,Bit7ACD:模拟比较器禁用,Bit6ACBG:选择模拟比较器的能隙基准源,Bit5 ACO:模拟比较器输出,Bit4ACI:模拟比较器中断标志,Bit 3 ACIE:模拟比较器中断使能,Bit 2 ACIC:模拟比较器输入捕捉使能,Bits 1,0 ACIS1,ACIS0:模拟比较器中断模式选择,需要改变ACIS1/ACIS0 时,必须清零ACSR 寄存器的中断使能位来禁止模拟比较器中断。否则有可能在改变这两位时产生中断。,6.2 模数转换器,6.2.1 主要特点,ATmega16有一个10位的逐次逼近型ADC。ADC与一个8通道的模拟多路复用器连接,能对来自端口A的8路单端输入电压进行采样。单端电压输入以0V(GND)为基准。,器件还支持16 路差分电压输入组合。两路差分输入(ADC1、ADC0 与ADC3、ADC2)有可编程增益级,在A/D 转换前给差分输入电压提供0dB(1x)、20dB(10 x)或46dB(200 x)的放大级。,七路差分模拟输入通道共享一个通用负端(ADC1),而其他任何ADC 输入可做为正输入端。如果使用1x 或10 x 增益,可得到8 位分辨率。如果使用200 x 增益,可得到7 位分辨率。,ADC 包括一个采样保持电路,以确保在转换过程中输入到ADC 的电压保持恒定。,ADC 由AVCC 引脚单独提供电源。AVCC 与VCC 之间的偏差不能超过 0.3V。标称值为2.56V 的基准电压,以及AVCC,都位于器件之内。基准电压可以通过在AREF引脚上加一个电容进行解耦,以更好地抑制噪声。,图6.2 模数转换器方框图,6.2.2 ADC的工作原理,ADC 通过逐次逼近的方法将输入的模拟电压转换成一个10 位的数字量。最小值代表GND,最大值代表AREF引脚上的电压再减去1 LSB。通过写ADMUX寄存器的REFSn位可以把AVCC 或内部2.56V 的参考电压连接到AREF 引脚。在AREF 上外加电容可以对片内参考电压进行解耦以提高噪声抑制性能。,6.2.3 启动ADC转换,向ADC 启动转换位ADSC 位写“1”可以启动单次转换。在转换过程中此位保持为高,直到转换结束,然后被硬件清零。如果在转换过程中选择了另一个通道,那么ADC 会在改变通道前完成这一次转换。,图6.3,ADC 自动触发逻辑,使用ADC 中断标志作为触发源,可以在正在进行的转换结束后即开始下一次ADC 转换。之后ADC 便工作在连续转换模式,持续地进行采样并对ADC 数据寄存器进行更新。第一次转换通过向ADCSRA 寄存器的ADSC 写1 来启动。,如果使能了自动触发,置位ADCSRA 寄存器的ADSC 将启动单次转换。ADSC 标志还可用来检测转换是否在进行之中。不论转换是如何启动的,在转换进行过程中ADSC 一直为1。,6.2.4 预分频及ADC 转换时序,图6.4 ADC 预分频器,图6.5,ADC 时序图,第一次转换(单次转换模式),ADC 时序图,单次转换,图6.7,ADC 时序图,自动触发的转换,ADC 时序图,连续转换,表6.3 ADC转换时间,6.2.5 差分增益信道,当使用差分增益通道,需要考虑转换的确定特征。,差分转换与内部时钟CKADC2 同步等于ADC 时钟的一半。同步是当ADC 接口在CKADC2边沿出现采样与保持时自动实现的。,如果使用差分增益通道且通过自动触发启动转换,在转换时ADC 必须关闭。当使用自动触发时,ADC 预分频器在转换启动前复位。由于在转换前的增益级依靠稳定的ADC 时钟,该转换无效。,6.2.6 通道或基准源的选择,ADMUX寄存器中的MUXn及REFS1:0通过临时寄存器实现了单缓冲。CPU可对此临时寄存器进行随机访问。这保证了在转换过程中通道和基准源的切换发生于安全的时刻。,在转换启动之前通道及基准源的选择可随时进行。一旦转换开始就不允许再选择通道和基准源了,从而保证ADC 有充足的采样时间。,6.2.7 ADC 输入通道,选择模拟通道时请注意以下几个方面:,工作于单次转换模式时,总是在启动转换之前选定通道。在ADSC 置位后的一个ADC 时钟周期就可以选择新的模拟输入通道了。但是最简单的办法是等待转换结束后再改变通道。,在连续转换模式下,总是在第一次转换开始之前选定通道。在ADSC 置位后的一个ADC时钟周期就可以选择新的模拟输入通道了。但是最简单的办法是等待转换结束后再改变通道。,然而,此时新一次转换已经自动开始了,下一次的转换结果反映的是以前选定的模拟输入通道。以后的转换才是针对新通道的。,6.2.8 ADC 基准电压源,ADC的参考电压源(VREF)反映了ADC的转换范围。若单端通道电平超过了VREF,其结果将接近0 x3FF。VREF 可以是AVCC、内部2.56V 基准或外接于AREF 引脚的电压。,AVCC通过一个无源开关与ADC相连。片内的2.56V参考电压由能隙基准源(VBG)通过内部放大器产生。无论是哪种情况,AREF 都直接与ADC 相连,通过在AREF 与地之间外加电容可以提高参考电压的抗噪性。,6.2.9 ADC 噪声抑制器,ADC的噪声抑制器使其可以在睡眠模式下进行转换,从而降低由于CPU及外围I/O设备噪声引入的影响。噪声抑制器可在ADC 降噪模式及空闲模式下使用。为了使用这一特性,应采用如下步骤:,1.确定ADC 已经使能,且没有处于转换状态。工作模式应该为单次转换,并且ADC 转换结束中断使能。,2.进入ADC 降噪模式(或空闲模式)。一旦CPU 被挂起,ADC 便开始转换。,3.如果在ADC转换结束之前没有其他中断产生,那么ADC中断将唤醒CPU并执行ADC 转换结束中断服务程序。如果在ADC 转换结束之前有其他的中断源唤醒了CPU,对应的中断服务程序得到执行。ADC 转换结束后产生ADC 转换结束中断请求。CPU 将工作到新的休眠指令得到执行。,6.2.10 模拟输入电路,单端通道的模拟输入电路见图6.9。不论是否用作ADC 的输入通道,输入到ADCn的模拟信号都受到引脚电容及输入泄露的影响。用作ADC 的输入通道时,模拟信号源必须通过一个串联电阻(输入通道的组合电阻)驱动采样/保持(S/H)电容。,模拟输入电路,图6.10所示为一通用的模拟信号输入电路。它对模拟输入信号进行偏移和增益处理,使输入到模拟引脚(ADC0ADC7)的电压为05V,偏移细调通过R2实现。增益范围由调整R5完成。,图6.10 偏移和增益整定电路,例6.1 电压采集,通道ADC2,ADC3。,ADMUX=0 xED(ADC3-ADC2,10 x增益,2.56V参考电压,左对齐),ADC3上电压为300mV,ADC2电压为500mV。,ADCR=512*10*(300-500)/2560=-400=0 x270,ADCL将读为0 x00,且ADCH 读为0 x9C。给ADLAR写0右对齐:ADCL=0 x70,,ADCH=0 x02。,6.2.11 ADC 转换结果,转换结束后(ADIF 为高),转换结果被存入ADC 结果寄存器(ADCL,ADCH)。单次转换的结果如下:,式中,VIN 为被选中引脚的输入电压,VREF 为参考电压,0 x000 代表模拟地电平,0 x3FF 代表所选参考电压的数值减去1LSB。,如果使用差分通道,结果是:,式中,VPOS 为输入引脚正电压,VNEG 为输入引脚负电压,GAIN 为选定的增益因子,且VREF 为参考电压。结果用2 的补码形式表示,从0 x200(-512d)到0 x1FF(+511d)。如果用户希望对结果执行快速极性检测,判断MSB(ADCH 中ADC9),如该位为1,结果为负;该位为0,结果为正。,表6.4 给出当选定的增益为GAIN且参考电压为VREF 的差分输入对(ADCn-ADCm)的输入码结果。,下表6.4 输入电压与输出码的相互关系,1、ADC多工选择寄存器(ADMUX),Bit 7:6 REFS1:0:参考电压选择,表6.5 ADC参考电压选择,Bit5ADLAR:ADC转换结果左对齐,Bits 4:0 MUX4:0:模拟通道与增益选择位,细节见表6.6。,2、ADC控制和状态寄存器A(ADCSRA),例如:ADCSRA0 xXX;/根据使用情况,对所需要的功能标志位置位即可,ADPS20是用来选择几分频,Bit7ADEN:ADC使能,Bit 6 ADSC:ADC 开始转换,Bit 5 ADATE:ADC 自动触发使能,Bit 4 ADIF:ADC 中断标志,Bit 3 ADIE:ADC 中断使能,Bits 2:0 ADPS2:0:ADC 预分频器选择位,表6.7 ADC预分选择,3、ADC数据寄存器(ADCL及ADCH)ADLAR=0,ADLAR=1,ADC 转换结束后,转换结果存于这两个寄存器之中。如果采用差分通道,结果由2 的补码形式表示。,读取ADCL 之后,ADC 数据寄存器一直要等到ADCH 也被读出才可以进行数据更新。因此,如果转换结果为左对齐,且要求的精度不高于8 比特,那么仅需读取ADCH 就足够了。否则必须先读出ADCL 再读ADCH。,Bit 7:5 ADTS2:0:ADC 自动触发源,若ADCSRA寄存器的ADATE置位,ADTS的值将确定触发ADC 转换的触发源;否则,ADTS的设置没有意义。被选中的中断标志在其上升沿触发ADC转换。,表6.8 ADC自动触发选择,Bit 4Res:保留位,这一位保留。为了与以后的器件相兼容,在写SFIOR 时这一位应写0。,图6.11是以ATmage16为核心构成多路电力参数数据采集系统,UN1UN6是精密运放,ADC选择片内2.56为基准电压,64分频时钟源,将采集数值在数码管上显示出来,控制数码管74LS595从上到下排列顺序为:c、b、a。,1、电力参数数据采集系统原理图,图6.11 ATmage16构成多路数据采集系统原理图,2、电力参数数据采集流 程框图,图6.12 电力参数数据采集流程框图,6.3脉冲宽度调制输出 PWM(DA)功能特点及功能,1、脉冲宽度调制输出 PWM的结构和工作原理,将某个要转换的数字量(例512)写入到OCR0(输出比较寄存器)中,其值不断与8位循环记数器的内容比较。二者相等时,比较输出正脉冲,RS触发器复位,使PWM/PB3端变为低电位。,OCR0中数据为80H时,PWM/PB3端输出波形如图6.13所示。,图6.13 当数据512时的输出波形,从上述可知,输出波形的周期固定为1024T(状态周期),当晶振为8MHz时,1024T=10243/8=384s。占空比=OCR0中数据/256,如上例占空比=512/1024=50%。,复位时OCR0清0,,占空比=00H1024=0%,即PWMPB3端始终为低电平。图6.14给出了几种 典型的PWM输出波形图,若将这些波形积分,则可得到10位分辨率的模拟信号。,图6.14 PWM输出波形,2、PWM应用举例,例6.3 产生 PWM波形,占空比参数值由a控制,频率为CPU主频确定。,void timers_init(char a)/输入参数:占空比由a控制,sbi(DDRD,5);/输出比较器A定义为输出,OCR1A=1024-10.24*a;/定时器1的输出比较器A,比较匹配预定值,OCR1B=0 x00;/定时器1的输出比较器B,TCNT1=0 x00;/T1的计数器,计数当前值,TCCR1A=0 xc3;/T1的控制字,比较匹配时置位OC1A/OC1B,在TOP时清零,TCCR1B=0 x09;/T1的控制字,无预分频,clkI/O/1 TOP(计数上限值),int main(void),timers_init(25);/参数a为25,产生占空比为25的PWM波形,PWM引脚输出的脉冲信号经滤波后可变为模拟信号。为了获得较高精度的8位DA输出,在滤波前先通过缓冲器将PWM脉冲信号摆幅转化为05V,再经滤波、放大输出。DA缓冲器电路如图6-13所示。,图6.15 D/A缓冲器电路,6.4 数字滤波方法,单片机系统面对的现场往往比较恶劣,因此所采集信号中总会混杂有各类干扰。除了采用硬件进行滤波(如阻容滤波)外,对输入计算机的信号进行数字滤波也是十分必要的。,所谓数字滤波,就是通过一定的计算程序,对采集的数据进行处理,以提高有用信号在采集值中的比例,减少各种干扰和噪声。,与阻容滤波相比,数字滤波具有如下一些优点:,1、可以根据干扰的类型,设计出相应类型的数字滤波器。,2、滤波范围宽,特别是对于低频信号(如0.001Hz及以下)更为有效,而模拟滤波器由于电容容量的限制,频率不能太低。,3、可靠性高。,4、数字滤波程序可以多路共享。,下面介绍几种常用的数字滤波方法。,1算术平均值滤波,设测量值为,则每采集了N个数据后,进行一次算术平均。其计算方法如式(6.1)所示:,(6 1),根据数理统计的理论,上式的算术平均值实际上是这样一个值,它与各采样值间的误差的平方和最小。得到后即可计算出偏差值:,从上面可以看出,每计算一次控制器输出值,就必须采样N次。因此,N的取值不能太大。算术平均值法主要对压力,流量等含有周期性脉动的信号有效。而对突发性的脉冲干扰,这种滤波方法的效果则不理想。,(6 2),式中,VPOS 为输入引脚正电压,VNEG 为输入引脚负电压,GAIN 为选定的增益因子,且VREF 为参考电压。,2、ADC控制和状态寄存器A(ADCSRA),当此位为“0”时,AIN1连接到比较器的负极输入端。,从上面可以看出,每计算一次控制器输出值,就必须采样N次。,10 偏移和增益整定电路,VREF 可以是AVCC、内部2.,d1=d2;d2=d3;d3=d_new;,两路差分输入(ADC1、ADC0 与ADC3、ADC2)有可编程增益级,在A/D 转换前给差分输入电压提供0dB(1x)、20dB(10 x)或46dB(200 x)的放大级。,2、电力参数数据采集流 程框图,当AIN0 上的电压比负极AIN1上的电压要高时,模拟比较器的输出ACO 即置位。,0 xff,0 xbf,0 x64,0 xdf,0 xa1,0 x68,0 x34,0 xf4,0 xa5;/数码管编码,由于在转换前的增益级依靠稳定的ADC 时钟,该转换无效。,1、模拟比较器:主要用于对正极AIN0 的值与负极AIN1 的值进行比较。,led_outbyt(led2ledi);,Bits 2:0 ADPS2:0:ADC 预分频器选择位,2中值滤波,所谓中值滤波法是连续采样n次,首先要做的工作是先采集n个参数并按大小排序,即有,或者从大到小排序。,如果当N为偶数时,,如果当N为奇数时,,中值滤波既可以去掉由于偶然因数引起的干扰,同时对与脉动干扰也比较有效。但是这种方法由于计算量比较大,对于一些需要快速采样的参数就不十分合适。,中值滤波的关键所在是形成按大小顺序排列的一组数。假设采样N次,如果使用高级语言,首先将N个采样值按从大到小(或从小到大)排列,然后将其放在一个数组X(N)里,此时X(N+1)/2)则为采样值。,3表决滤波,首先要做的工作是先采集N个参数并按大小排序,即有,x1x2xn-10;则,xn=xn 1,若 xn-xn-1=0;则xn=xn,若 xn-xn-10;则xn=xn +1,这种滤波方式非常简单,运算也很节省时间,可以很有效地使采样到的参数处理得很平滑,但只能用于惯性较大的系统。,这种滤波方式非常简单,运算也很节省时间,可以很有效地使采样到的参数处理得很平滑,但只能用于惯性较大的系统。,5去最老值滤波,先将采样到的参数按时间次序排序,x1、x,2,、,xn,其中x1 最老,xn最新,,当再采集一个参数xn+1后作如下变化:,x1=x2,、,x2=x3,,,,,xn-1=xn,,,xn=xn+1,然后进行一次算术平均。,6程序判断滤波,如果我们事先就知道,所采样的信号,其在两个采样点之间不可能有很大的变化,则可以根据现场的经验确定一个最大偏差m。每次采样后都将其与前一个采样值进行比较,一旦两个值的差超出了m,则表明采集的信号中包含有较大的干扰,应该去掉;如果未超出m,可将该数据作为本次采样值。这种方法对于一些突发性的干扰,如大功率用电设备的启停或其他冲击性负载带来的电流尖峰干扰比较有效。,图6.17是ATmega16进行电压采集进行后,经中值滤波后并用数码管显示程序。,图6.17 电压采集和数码管显示原理图,uchar led241=,0 x60,0 x7e,0 x31,0 x32,0 x2e,0 xa2,0 xa0,0 x7a,0 x20,0 x22,0 x28,0 xa4,0 xe1,0 x34,0 xa1,0 xa9,0 x40,0 x5e,0 x11,0 x12,0 x0e,0 x82,0 x80,0 x5a,0 x00,0 x02,0 x08,0 x84,0 xc1,0 x14,0 x81,0 x89,0 xff,0 xbf,0 x64,0 xdf,0 xa1,0 x68,0 x34,0 xf4,0 xa5;/数码管编码,AD转换程序:,#include JL_f1.h,#include JL_f1ADC.h,extern uchar ub;,void adc_init(void),/WIZARD_MAP(ADC),/ADC Voltage Reference:AVCC,/ADC Noise Canceler Disabled,SFIOR|=0 x0;/特殊功能I/O寄存器,ADMUX=0 x40;/ADC多工选择寄存器,AVCC,AREF 引脚外加滤波电容,ADCSRA=0 x86;/ADC控制和状态寄存器A,0 x86为ADC使能,预分频为64分频,/WIZARD_MAP(ADC),unsigned int read_adc(unsigned char adc_input),/Set ADC input,ADMUX,ADMUX|=adc_input;/设置AD通道,/Start ADC conversion,sbi(ADCSRA,ADSC);/开始AD转换,/Waiting for ADC conversion completed,loop_until_bit_is_set(ADCSRA,ADIF);/等待AD转换结束,sbi(ADCSRA,ADIF);/关闭AD,ub=1;/标志位设为1,return ADCW;,/电压获取程序,uint get_u(void),double in=0;,static double d1,d2,d3,d_new,m1,m2,m3;,d_new=read_adc(0);,d1=d2;d2=d3;d3=d_new;,m1=m2;m2=m3;,if(d1d3)|(d1d2),m3=d1;,else if(d2d3)|(d2d1),m3=d2;,else m3=d3;/三个AD转换后的值中取中间值,in=(0*m1+0*m2+3.0*m3)/3.0;/三个中间值加权平均,in*=5;,return(uint)in;,/电压显示程序,void lcd_u(void),ad1=get_u();,if(ub=1),ub=0;,else ad1=0;,led19=(ad1/1000)%10;,led18=(ad1/100)%10;,led17=(ad1/10)%10;,led16=39;,/数码管显示程序,/RCK=PA5 SCK=PA6 SER=PA7,void led_outbyt(char a)/显示一个字符,char i,d;,for(i=0;i8;i+),cbi(PORTA,6);/595,移位寄存器使能,d=a,if(d),sbi(PORTA,7);/595,串行输入使能,else,cbi(PORTA,7);,a=1;,sbi(PORTA,6);,void led_list(void)/,循环显示,uchar i,j;,j=1;,for(i=0;i8;i+),led_outbyt(led2ledi);,led_outbyt(j);,led_outbyt(led2ledi+8);,led_outbyt(j);,led_outbyt(led2ledi+16);,led_outbyt(j);,cbi(PORTA,5);/数据锁存,sbi(PORTA,5);/数据锁存,delay(8,1000);,j=1;,led_outbyt(0);led_outbyt(0);led_outbyt(0);led_outbyt(0);led_outbyt(0);led_outbyt(0);,cbi(PORTA,5);/数据锁存,sbi(PORTA,5);/数据锁存,delay(1,1000);,小 结,ATmega16有一个10位的逐次逼近型ADC。ADC与一个8通道的模拟多路复用器连接,能对来自端口A 的8 路单端输入电压进行采样。单端电压输入以0V(GND)为基准。,1、模拟比较器:主要用于对正极AIN0 的值与负极AIN1 的值进行比较。当AIN0 上的电压比负极AIN1上的电压要高时,模拟比较器的输出ACO 即置位。,2、模拟比较器控制和状态寄存器ACSR。,ADC转换时间,4、脉冲宽度调制输出PWM:将某个要转换的数字量(例80H)写入到OCR0(输出比较寄存器)中,其值不断与8位循环记数器的内容比较。二者相等时,比较输出正脉冲,RS触发器复位,使PWM/PB3端变为低电位。,5、数字滤波方法,通过一定的计算程序,对采集的数据进行处理,以提高有用信号在采集值中的比例,减少各种干扰和噪声。数字滤波方法主要有:算术平均值滤波、中值滤波、表决滤波、限幅滤波。,习 题,1、ATmega单片机与模拟比较器相关的有几种寄存器,如何正确使用这些寄存器?,2、OCR1A(T1输出比较寄存器)寄存器中数据为40H,求PWM输出波形的占空比。,3、模拟比较寄存器的特点。,4、编程实现PWM端输出正向锯齿波。,5、设VREF为5V,当输入模拟电压为1.5V时,求AD转换的结果数据。,6、模数转换器的主要特点。,7、在什么情况下可以安全地对ADMUX 进行更新?,8、选择模拟通道时需注意哪些方面?,9、ADC 转换结果的公式是什么?,10、与模数转换器相关的有几种寄存器,如何正确使用这些寄存器?,11、脉冲宽度调制输出 PWM的特点和工作原理,12、试说明常用的数字滤波算法及特点。,13、滤波的几种方式。,
展开阅读全文