原创 用普通单片机实现低成本高精度A/D转换(zz)

2008-2-22 11:41 4427 4 6 分类: MCU/ 嵌入式

用普通单片机实现低成本高精度A/D转换(之一)


目前单片机在电子产品中已得到广泛应用,许多类型的单片机内部已带有A/D转换电路,但此类单片机会比无A/D转换功能的单片机在价格上高几元甚至很多,本文给大家提供一种实用的用普通单片机实现的A/D转换电路,它只需要使用普通单片机的2个I/O脚与1个运算放大器即可实现,而且它可以很容易地扩展成带有4通道A/D转换功能,由于它占用资源很少,成本很低,其A/D转换精度可达到8位或更高,因此很具有实用价值。
其电路如图一所示:



1144027076.jpg

 

 

 

 

图一


 

 

其工作原理说明如下:


1、硬件说明:


        图一中“RA0”和“RA1”为单片机的两个I/O脚,分别将其设置为输出与输入状态,在进行A/D转换时,在程序中通过软件产生PWM,由RA0脚送出预设占空比的PWM波形。RA1脚用于检测比较器输出端的状态。


        R1、C1构成滤波电路,对RA0脚送出的PWM波形进行平滑滤波。RA0输出的PWM波形经过R1、C1滤波并延时后,在U1点产生稳定的电压值,其电压值U1=VDD*D1/(D1+D2),若单片机的工作电压为稳定的+5V,则U1=5V*D1/(D1+D2)。


       图一中的LM324作为比较器使用,其输入负端的U1电压与输入正端的模拟量电压值进行比较,当U1大于模拟量输入电压时,比较器的输出端为低电平,反之为高电平。


2、A/D转换过程:


        如果使RA0输出PWM波形,其占空比由小到大逐渐变化,则U1的电压会由小到大逐渐变化,当U1电压超过被测电压时,比较器的输出端由高电平变为低电平,因此可以认为在该变化的瞬间被测的模拟量与U1的电压相等。


        由于U1的电压值=VDD*D1/(D1+D2),当VDD固定时,其电压值取决于PWM波形的占空比,而PWM的占空比由单片机软件内部用于控制PWM输出的寄存器值决定,若软件中用1个8位寄存器A来存放RA0输出的PWM的占空比值D1,因此在RA1检测到由“1”变为“0”的瞬间,A寄存器的值D1即为被测电压的A/D转换值,其A/D转换结果为8位。如果用16位寄存器来作输出PWM的占空比,则A/D转换值可达到16位。


3、A/D转换误差分析及解决办法:


A/D转换的误差主要由以下几个方面决定,分别说明如下:


(1)单片机的电源电压VDD:在该A/D转换中,VDD电压是造成A/D转换误差的主要原因,如果使VDD电压精度做到较高,则A/D转换误差可以做到很小,在VDD电压精度为0.5%情况下,实际的A/D转换误差小于1%。


(2)软件产生的PWM占空比:若用于产生PWM的软件设计不良,会使存放占空比的寄存器值与实际输出的PWM占空比不一致,这会导致测量误差。


(3)比较器输入端的失调电压:该电压对A/D转换精度有一定影响,但影响较小。


(4)RC滤波电路的纹波:在R1、C1取值不当的情况下,U1处的电压纹波较大,并且延时时间不够,会使A/D转换产生误差,因此R1、C1取值不能太小,但太大又会影响A/D转换速度,推荐使用图一中所示的R1、C1参数,在纹波合理的情况下,其转换误差也可通过软件消除。


A/D转换误差的解决办法:


(1)对VDD造成的误差,只能通过提高VDD电压精度来解决,它相当于A/D转换的基准电压。


(2)对于软件中PWM设计不良导致的误差,可修改软件进行解决,本文提供了用软件产生PWM的程序流程图,实际使用中可按此流程设计程序。


(3)对比较器及RC滤波电路的纹波导致的误差,在软件中可通过上、下检测法进行消除,即先将PWM的占空比由小到大变化,使U1电压由低往高逐渐变化,在比较器输出端变化时记录其A/D转换值,再将PWM的占空比由大到小变化,使U1电压由高到低变化,在比较器输出端变化时记录其A/D转换值,将两次的A/D转换值进行平均,可有效地消除这两种误差。


(4)对A/D转换值进行数字滤波,如多次转换求平均值等。数字滤波消除误差的方法很多,在此不再赘述。


4、A/D转换速度及提高办法:


        由于该A/D转换是通过PWM滤波后再进行比较来完成的,其PWM的产生与滤波都需要一定的时间,因此其A/D转换速度较慢,适用于对A/D转换速度要求不高的产品中,其A/D转换速度取决于以下几个方面:


(1)单片机的运行速度:单片机的运行速度越高则PWM的频率可以越高, RC值就可以取得越小,其延时时间也可以更短,转换速度就更快。


(2)被测电压值的大小:由于U1电压时是由小到大逐渐加大的,当被测电压值较小时,U1电压上升到相应值的时间就越短,完成A/D转换的速度就越快。


(3)初始占空比:初始占空比越高,U1电压较大,其上升到被测电压值的时间也就会越短,完成A/D转换的速度也就越快。


        由上所述,A/D转换的速度可以通过提高单片机的工作频率,并在预知被测电压范围时尽可能地设置较高的初始占空比值来加快转换速度,如果所要求的 A/D转换精度要求不高,还可以在软件中缩短PWM输出的延时时间来提高A/D转换速度。若单片机带有外部电平变换中断和定时器中断,其A/D转换的精度和速度还可以得到提高。


5、输入电压的测量范围:


        A/D转换的输入电压测量范围为0V至单片机的电源电压(VDD),若需要提高被测电压范围,可将输入电压通过电阻分压后进行测量,但其A/D转换的误差会受分压电阻影响。


6、A/D转换通道的多路扩展:


        图中所用的运算放大器为LM324,该集成电路内部带有4个运放,其余3个运放的输入端可分别作为另外3个A/D转换通道,其输出端与单片机连接,在软件上略作修改,就可以在不增加成本的情况下实现4路A/D转换。


7、用同样的工作原理实现D/A转换:


        如图二所示,可使该电路很容易地只用单片机的一个I/O脚实现D/A转换功能。其输出的模拟量电压Vout="VDD"*D1/(D1+D2)。该输出电压带有纹波,当RC值足够大时,该纹波值几乎为零,可忽略不计。

1144027156.jpg


图二


8、单片机的A/D转换软件程序流程图:

1144027213.jpg

 

 

 

用普通单片机实现低成本A/D转换(二)

 

在此前笔者曾介绍了普通单片机实现低成本A/D转换的一种方法,在实际使用中还有其它的不少方法可以实现低成本A/D转换,在本文中我们继续为电子设计者们提供又一种A/D转换方法,该方法同样占用较少的单片机资源,成本也很低,仍然有很强的实用性,该电路曾在锂离子电池充电器中作A/D转换使用,效果良好。
其电路如图一所示:


1144028739.jpg
图一


其工作原理说明如下:


1、硬件电路说明:


        图一中的R1和N1(TL431)产生一个2.495V的稳定电压,作为A/D转换比较基准。R2、V1、VD1、VD2和R3构成一个恒流源电路给C1充电,C1上的电压与恒流源的电流大小及充电时间成正比。


        MC74HC4051为8选1模拟开关,其输入通道由单片机控制来选择。LM393作为比较器,当C1上的电压由低到高上升到超过模拟开关输出电压时,其输出端会从低电平转变为高电平。“RA0”、“RA1”和“RA2”为单片机的3个 I/O脚,RA0设置为输入状态,用于检测比较器输出电平变化,RA1和RA2设置为输出状态,RA1输出高电平时,V2导通,用于将C1上的电荷放空, RA2用于选择模拟开关的输入通道。


2、A/D转换过程


        首先RA2输出低电平,使模拟开关选择X0(基准电压)作为输入,RA1输出高电平,使V2导通将C1上的电量放完,然后使RA1输出低电平,使 V2截止,此时C1上的电容开始被充电,同时计数器开始计数,当C1上的电压不断上升,并达到比较器输入负端的电压(此时为基准电压Vref)时,比较器的输出端由低电平转为高电平,此时记录下计数器的计数值,为T1。


        接着RA2输出高电平,使模拟开关选择X1(被测电压)作为输入,RA1输出高电平,使V2导通将C1上的电量放完,然后使RA1输出低电平,使V2截止,此时C1上的电容又开始被充电,同时计数器开始计数,当C1上的电压不断上升,并达到比较器输入负端的电压(此时为基准电压)时,比较器的输出端由低电平转为高电平,此时记录下计数器的计数值,为T2。


        由于C1是被恒流充电,因此C1上的电压与充电时间成正比,即V="T"*k。当C1的容值与充电的恒流值不变时,k是一个固定不变的常数。由此可以得到:


                Vref/T1=V1/T2 ,即 V1=Vref*T2/T1


        由于Vref是基准电压(2.495V),因此只要利用单片机的定时器测出T1和T2,就可以计算出被测电压V1的值。


3、A/D转换误差分析及解决办法:


A/D转换的误差主要由以下几个方面决定,分别说明如下:


1、基准电压Vref:在该A/D转换中,Vref电压是造成A/D转换误差的主要原因,如果使Vref电压精度做到较高,则A/D转换误差可以做到很小,在Vref电压精度为0.5%情况下,实际的A/D转换误差小于1%。


2、定时器误差:若单片机对比较器输出端的电位变化反应慢,或定时器误差较大,则测量到的T1与T2值不准,也会导致测量误差。


3、比较器输入端的失调电压:该电压对A/D转换精度有一定影响,但影响较小。


4、运算误差:由于V1值要经过乘除法运算后得到,在进行运算过程中如果数据处理不当,如余数处理不当,也会产生误差。


5、干扰误差:当输入电压不稳时,恒流源的输出电流会有一定的影响,会产生干扰误差。


A/D转换误差的解决办法:


1、对Vref造成的误差,只能通过提高Vref电压精度来解决,它相当于A/D转换的基准电压。


2、对于定时器误差,在单片机中可使RA0口采用带电平变化中断功能的I/O口,以提高反应速度,同时减少恒流源的电流大小,或加大C1电容容量,可以增加T1、T2的测量时间,使计数值加大,达到提高A/D转换精度的目的。


3、选用灵敏度高的比较器可解决比较器输入端导致的误差问题。


4、对运算误差,可以通过软件上的改进来解决。


5、对于干扰造成的误差,可对A/D转换值进行数字滤波,如多次转换求平均值等方法来解决。数字滤波消除误差的方法很多,在此不再赘述。


4、A/D转换速度及提高办法:


        由于该A/D转换是通过恒流源对C1电容充电后再进行比较来完成的,C1电容的充电过程需要一定的时间,因此其A/D转换速度较慢,适用于对A/D转换速度要求不高的产品中,其A/D转换速度取决于以下几个方面:


1、恒流源的电流大小:恒流源的充电电流越大,C1上的电压上升速度就越快,到达被比较电压的时间也就更短,转换速度就更快。


2、C1电容的大小:其道理与前一点一样,当电容小时,电压上升速度就越快,到达被比较电压的时间也会越短,转换速度就越快。但由于计数值小,由定时器造成的测量误差也有可能加大。


3、单片机的工作频率:由于A/D转换值是经过乘除运算后完成的,因此单片机的运算速度也会对A/D转换速度有影响,尤其当计数器值为16位时。


        由上所述,A/D转换的速度可以通过提高单片机的工作频率,增大恒流源的输出电流,减小C1电容容值来加快A/D转换速度,但要注意当T1、T2 计数值太小时有可能使定时器因素造成的误差增大,因此在实际使用中要综合考虑,在提高转换速度时,保证A/D转换精度,选择最适用于产品的参数值。


5、输入电压的测量范围:


        A/D转换的输入电压测量范围为0V至4.5V,当C1被充电至大于4.5V时,恒流源输出将不再恒流,C1上的电压与时间将不成正比,因此测量范围只到4.5V。若要提高被测电压范围,可将输入电压通过电阻分压后进行测量,但其A/D转换的误差会受分压电阻影响。


6、A/D转换通道的多路扩展:


        图中的8选一模拟开关只用到其中的2路,实际应用中其它的6路也可使用,这样A/D转换的通道可扩展到7路,因此在用4个I/O口情况下,可实现3路A/D转换,在用5个I/O口情况下,可实现7路A/D转换。

 

用普通单片机实现低成本A/D转换(三)

在前面的文章中分别介绍了两种用普通单片机实现低成本A/D转换的方法,这两种方法中在单片机的外部都要使用到一个比较器,在本文中继续向大家介绍低成本的A/D转换的一种方法,只是这种方法成本会更低,而且外部无需使用比较器。此种方法的A/D转换精度不高,只有6~7bit,并且被测电压范围较为有限,但在某些精度要求不高,且被测电压值变化不大的场合也很有实用价值,比如温度测量方面。
其电路如图一所示:


59110.67571983.gif

其工作原理说明如下:


1、硬件说明:


        图一中的R1、R2和C1构成RC充电电路,被测量通过R1、R2对C1充电。N1为单片机,本电路中采用MICROCHIP的PIC12C508A来举例说明。C2为给电源供电用的滤波电路,VD1为保护用稳压二极管,以避免输入电压过高而损坏单片机。


2、A/D转换过程:


        首先GP5输出低电平,使电容C1上的电量完全放光,随后GP5即转变为输入状态,此时单片机开始计时,被测电压经过R1、R2电阻对电容C1进行充电,电容C1上的电压会逐渐升高,C1上的电压U满足以下公式:
1144658118.jpg 
        其中U为电容C1上的电压,E为输入电压(被测量),T=(R1+R2)*C1,t为时间。 


        当C1上的电压U达到单片机I/O脚的门嵌电压时,单片机的GP5由低电平状态转变为高电平状态。记录从充电开始至此时所经过的时间t。


        从上式可知,当单片机I/O脚的门嵌电压、R1、R2、C1值都固定不变时,被测量的电压值E与时间t呈一一对应关系。


        因此测量输入电压对C1电容充电到门嵌电压的时间,进行查表计算,就可以得到被测电压值,从而实现了A/D转换。


3、A/D转换误差分析及解决办法:


A/D转换的误差主要由以下几个方面决定,分别说明如下:


(1)单片机的电源电压VDD:在该A/D转换中,VDD电压变化较大时有可能造成I/O口的门嵌电压发生变化,不过其影响较小。


(2)单片机内部的定时器对C1电容上电压上升时间的测量偏差:该测量偏差是A/D转换误差的主要因素。


(3)电阻、电容不稳定导致的误差:当电阻R1、R2或电容C1的值发生变化时,也会使C1电容的电压上升至门嵌电压时间发生变化,这也将影响A/D转换结果。


(4)单片机I/O脚的输入阻抗:如果单片机的I/O脚输入阻抗较低,相当于使RC值发生变化,也会影响A/D转换结果。


(5)单片机的门嵌电压:对于不同的单片机,其门嵌电压可能略有相同,这也会导致测量误差。


A/D转换误差的解决办法:


(1)对VDD造成的误差,只能通过提高VDD电压精度来解决,VDD的电压最好能稳定在2%范围内,普通的7805就有2%的稳压精度。


(2)对单片机内部的定时器产生的误差,可以增加RC值,从而使C1电容上电压上升时间延长,计数器测得的值较大,误差会较小。不过R值若太大,受I/O口输入阻抗影响也会较大。


(3)R1、C1选用精度较高较稳定的电阻、电容,或增加一个微调电阻器来解决。


(4)若单片机I/O脚输入阻抗较低,可以减小R1、R2电阻,增加C1电容来解决。


4、A/D转换速度及提高办法:


        由于该A/D转换是通过被测值经过一个电阻对电容充电使电压到达门嵌电压后测量充电时间来得到A/D转换值的,因此其A/D转换速度会比较慢,它适用于对A/D转换速度要求不高的产品中,其A/D转换速度取决于以下几个方面:


(1)RC值:当RC值太大时,测量速度会较慢,减小RC值可以提高A/D转换速度,但由于计数时间较短,测量误差会增大。


(2)被测电压值的大小:由于C1上的电压U是由小到大逐渐加大的,当被测电压值较小时,U电压上升到门嵌值的时间就越长,完成A/D转换的速度就越慢。反之被测电压越高,测量速度越快。


        由上所述,A/D转换的速度可以通过减小RC值来提高。若单片机带有外部电平变换中断,其A/D转换的精度还可以得到提高。


5、输入电压的测量范围:


        A/D转换的输入电压测量范围为单片机门嵌电压至单片机的电源电压(VDD),若需要提高被测电压范围,可将输入电压通过电阻分压后进行测量,但其A/D转换的误差会受分压电阻影响。


6、单片机的A/D转换应用实例:


        下图为采用PIC12C508实现A/D转换的应用实例,图中用4个发光二极管来作相应的电压值范围指示。其电压测量范围为1.4V至2.55V,其测量精度为10mV。


        该应用实例与原程序可参考MICROCHIP公司的单片机应用笔记,该文件可从MICROCHIP网站上下载。

59141.7125127.gif
PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户138127 2008-5-5 19:01

楼主的想法不错

用户137991 2008-4-2 22:34

GOOD

用户63271 2007-5-17 23:42

图都没有

干!!

用户474022 2006-10-12 10:47

图呢?内容专业了,要是形式也专业一点就更好了

用户1053025 2006-10-11 13:29

支持博主!

相关推荐阅读
用户1597890 2009-09-07 10:23
朽而不锈看模拟应用设计之二电容很需要(转载)
 2.电容很需要,但不是放在哪里都有效―――门窗漏风盖被子依然冷前面已经讲过对于LDO的输出电容品种很重要,实际上数值,位置也很重要,包括TI等公司在自己的LDO芯片说明手册上都提出关键电容的布置图和...
用户1597890 2009-09-07 10:06
朽而不锈看模拟应用设计(转载)
第一章       电源设计到位要注意的―――固本1.  开关电源这5V输出有时还真不是东西,真扎手----。经常听兄弟们抱怨自己的设计的系统在实验室或生产车间里调试老化时一点问题都没有,可一到现查就...
用户1597890 2009-08-23 20:22
仪表放大器
三运放组成的仪表放大器电路分析      仪表放大器与运算放大器的区别是什么?仪表放大器是一种具有差分输入和相对参考端单端输出的闭环增益单元。大多数情况下,仪表放大器的两个输入端阻抗平衡并且阻值很高,...
用户1597890 2009-03-13 12:44
项目完成之感
             回味一下自己走过的技术之路,工作将近三年,独立完成小项目一个,为期一个月,包括制版、调试、成型、生产。另一个项目从07的5月开始到现在接近尾声,从一开始的负责显示模块到后来整...
用户1597890 2008-12-06 14:06
C语言,结构体(struct) 用法 (ZZ)
 转自:匠人百宝箱                                             C语言,结构体(struct) 用法结构(struct)      结构是由基本数据类型构成...
用户1597890 2008-10-24 15:26
浅谈单片机程序设计中的“分层思想”(zt)
浅谈单片机程序设计中的“分层思想”   随便写下的一点东西,本来打算去发表,不过想想还是算了,不是什么重要的东西,不过这个东西确实很有用。文章烂的去组织和修改了,随便看看吧。 分层的思想,并不是什么神...
我要评论
2
4
关闭 站长推荐上一条 /3 下一条