基于单片机的高精度AD转换器
2011-03-17李玉俊
李玉俊,黄 琪
(中国矿业大学 江苏 徐州 221116)
对于很多的电子爱好者来说,经常使用的A/D转换器是8位和12位的,尤其对于参加全国电子设计大赛的学生来说,基本上使用的都是ADC0808或ADC0809。对于一般的电子设计,8位的A/D转换器已经足够,但在某些场合就需要使用更高精度的A/D转换器,由于A/D转换器随着其转换精度的提高价格会成倍上升,所以在某些要求转换精度高但对转换时间要求不高的场合,可以搭建一些较为简单的电路来提高A/D转换器的精度。笔者介绍两种提高A/D转换精度的方法。在某些特定的场合,8位A/D转换器的转换精度堪比12位的A/D转换器[1]。
1 转换原理简介
目前使用较多的是8位逐次比较型A/D转换器,其相应的工作原理[2]可以使用如图1所示。
图1 逐次比较性AD转换器结构原理图Fig.1 Structure principle diagram of AD converter
当启动信号作用后,时钟信号先通过逻辑控制电路使N位寄存器的最高位DN-1为1,以下各位为0,此二进制代码经D/A转换器转换成电压U0送到比较器与输入的模拟电压Ux比较。 若 Ux>U0,则保留这一位;若 Ux<U0,则 DN-1位置 0。DN-1位比较完毕后,再对DN-2位进行比较,控制电路使寄存器DN-2为1,其以下各位仍为0,然后再与上一次DN-1结果一起经过D/A转换后再次送到比较器与Ux相比较。 如此一位一位地比较下去,直至最后一位D0比较完毕为止。 最后,发出EOC信号表示转换结束。进而使用单片机控制下一次的A/D转换。经N次比较后,N位寄存器保留的状态就是转换后的数字量数据。(注:EOC:转换结束标志位,“0”表示正在转换,“1”表示A/D转换的结束。OE:输出允许信号,当向OE端输入一个高电平时,这时便可读取结果。这些位都可由单片机连实现精确的控制。)
通常来说当选用的A/D转换器确定后,相应的分辨率也就确定了,相应的转换精度也同时确定了[3]。此时,提高A/D转换芯片的精度通常有两种方法,一种方法是将量程进行动态转换,即根据输入信号VIN的大小,将其放大,然后再进行A/D转换;另一种方法是实时控制参考电压VREF,即根据VIN的大小,实时改变A/D转换器的参考电压VREF。以上两种方法都可以达到提高AD转换精度的目标。
方法一:动态转换量程
图2 动态改变量程电路图Fig.2 Circuit diagram of changing the range dygnamically
假设ADC的分辨率为8位,电源电压V=5 V,那么在输入信号在 0~5 V 变化范围内, 其分辨率=5 V/(28-1)=19.6mV,也就是说A/D的分辨率为19.6 mV。但是当输入信号在0~2.5 V 时,此时将信号放大一倍,即 9.80mV 放大到 19.6 mV,其分辨率提高了1倍。
在量程扩大后,对其进行电压补偿,保持量程不变,可以提高A/D转换的位数。例如,在输入电压为0~1.25 V之间时,此时不引入补偿电压;当信号在1.25~2.5 V之间变化时,这时引入 1.25 V 的补偿电压,使用差分放大器将在 1.25~2.5 V之间的电压编程在0~1.25 V之间的电压,并将其放大4倍,再进行A/D转换。这样就能使8位A/D转换器变为10位A/D转换器。本方法是用4个电阻进行分压,故可以将位数提高两位,若使用8个电阻进行分压可以将位数提高3位。使用的分压电阻越多,理论上提高的精度越高,但是同样电路就会更加复杂,程序同样也会复杂,建议将AD转换芯片的精度2-3位即可。
方法二:实时改变参考电压VREF
假设ADC的分辨率为8位,参考电压为5 V,输入信号的变化范围为 0~5V, 此时 ADC 的分辨率=5V/(28-1)=19.6mV。当输入电压在0~2.5 V之间时,通过使用软件的方法将参考电压改为 2.5 V,这样,分辨率就为=5 V/(28-1)=9.80 mV,从而使分辨率提高1倍。笔者着重讨论方法一,方法二不做详细介绍。
图3 实时改变参考电压电路图Fig.3 Circuit diagram of changing the voltage in real-time
电压的选择标准如表1所示。
2 应用实例——数字电压表的设计
1)实现两次转换的电路连接:8个精密等值的电阻R2~R9,将0-5 V的电压分为 8档,则每档电压为0.625 V,从各档引出的线接8通道模拟开关74HC4051,模拟开关的控制端 CBA 分别接 P3.6,P3.5,P3.4 口。 LM324A 构成电压跟随器,LM324B构成差分放大器。
表1 电压选择参考Tab.1 Reference of voltage choice
图4 系统原理框图Fig.4 Block diagram of system principle
2)ADC0808的接口连接:START是A/D转换启动信号,为上升沿时,所有内部寄存器清0,为下降沿时,启动A/D转换。ALE为地址锁存允许信号输入端。START,ALE都接单片机的P3.0口。OE为输出允许控制端,接单片机的P3.1口。EOC为转换结束信号输出引脚。EOC=0时开始转换,EOC=1时转换结束,接单片机P3.2口。CLK为时钟信号输入端,要求时钟频率<<750 kHz, 接单片机的 P3.3 口。 ADDA,ADDB,ADDC为地址线,用来进行通道的选择。ADDB,ADDC接地。选择如表2所示。
表2 通道选择Tab.2 Choose the passageway
3)现实模块的连接:单片机的 P1.0,P1.1,P1.2,P1.3 分别接共阴极数码管的位选端的 1,2,3,4。单片机的 P2.0~P2.7 接数码管的 A,B,C,D,E,F,G,DP 接口。
3 模型分析
11位A/D转换器的实现是通过2次8位A/D转换完成的[5]。这些模拟量是输入通道复用1个采样保持器进入A/D转换器。参考电压VREF可以来自外部也可以来自于内部VDD。A/D转换器采用逐次逼近式,转换结果(8位)存入寄存器。在A/D转换前必然选择适当的通道,设置足够的采样时间。可以通过设置A/D控制寄存器来控制A/D转换过程,同时A/D转换的状态也会在IN0中体现出来。先将待转换的电压Vi送到IN0通道做一次A/D转换。根据转换所得的数字量由软件算出Vi在哪档中。再将Vi减去Vi所在档的电压,将所得差值放大8倍,使之变为0~5 V的电压信号,将其在送入IN1通道在积分一次,所得的8位数字量就是11位A/D转换的低8位,而档位CBA就是高3位。下面举个例子进行说明:
假设输入的电压Vi是4 V,先通过IN0通道做一次A/D转换,所得的结果是204,即4/5×255=204,对应8位数字量位11001100[6]。将低5位屏蔽掉,即得11000000,循环右移5次的到00000110,这时低三位对应的就是Vi=4 V电压所对的档位,即第6档,CBA=110。通过程序将CBA从P3口输出,用来控制8选1模拟通道开关,是74HC4051输出3.75 V。该电压经LM324A跟随,再经LM324B放大。调整电阻,使放大倍数为 8 倍。则 LM324B 的输出电压为 Vo=8×(4-3.75)=2 V,选择IN1通道进行第二次A/D转换,所得的结果01100110,这就是11位A/D转换结果的低8位。档位110为11位A/D转换的高3位,合起来就是11位A/D转换的结果11001100110。
4 误差比较分析
将只进行一次A/D转换所引起的理论误差与进行两次A/D转换所引起的理论误差进行比较,比较结果如表3所示。(表3只列出典型的电压值)
表3 (8位精度与11位精度)误差理论比较Tab.3 Error com parison(eight precision and eleven precision)
从上表中可以看出提高后的转换误差要比提高前地转换误差小很多,从而说明了该方案的可行性。
可以看出转换精度的提高是以牺牲转换时间为代价的,本来只需转换一次的时间变成现在需要转化两次的时间,转换时间明显上升了。所以对于一些需要快速进行A/D转换的场合,本方法并不适用,建议不要选择本方法。那时就需要选择高速度,高精度的A/D转换芯片。
5 结束语
笔者将提高A/D转换精度的方法与单片机相结合,简单明了,并且有很大的实用性。对于单片机爱好者和参加电子设计竞赛的学生来说具有比较好的参考价值[7]。
笔者创新点:说明了两种提高A/D转换精度的方法,并将提高精度的具体的方法实际应用到数字电压表中,并对其提高前和提高后的转换精度进行了对比,说明了该方案的可行性。
该方案的适合场合:对A/D转换精度的要求超过8位的A/D转换器所能满足的要求,同时对转换时间的要求不太高的场合,文中所论述的两种方法有很实际的用途。
[1]杨峰.一种简易提高A/D转换器分辨率的方法[J].微计算机信息,2007(23):282-283.
YANG Feng.One easily method of increase resolving power of A/D converter[J].Micro computer information,2007(23):282-283.
[2]赵茂泰,智能仪器原理及应用[M].3版.北京:电子工业出版社,2009.
[3]纪宗南.单片机外围器件实用手册—输入通道器件分册[M].北京:北京航空航天大学出版社,2005.
[4]张毅刚.MCS-51单片机应用设计[M].哈尔滨:哈尔滨工业大学出版社,2007.
[5]马艳玲,赵战民,李明亮.高精度两次采样AD转换[J],电子设计,2008,24(14):311-312.
MA Yan-ling,ZHAO Zhan-min,LIMing-liang.Realize twice sample A/D conversion[J].Electronic design,2008,24(14):311-312.
[6]谭浩强.C++程序设计[M].北京:清华大学出版社,2004,6.
[7]林志琦.基于Proteus的单片机可视化软硬件仿真[M].北京:北京航空航天大学出版社,2006.