摘要:文章介绍了一种利用单片机内部模拟比较器来构成A/D转换器的方法,给出了它的具体电路设计,分析了电路原理、转换过程及误差原因。并提出了转换过程中的误差消除的实用办法。给出了整个工作过程的软件编程。
关键词:单片机;比较器;A/D转换器;定时计数器;恒流源
一般来说,内部带A/D转换器的单片机价格都比较昂贵,而且一般只有8到10位的分辨率,这在高分辨率要求的场合显然不适用;而普通的单片机则根本没有A/D转换器。随着现代电子技术的发展,出现了一些体积小、内含模拟比较器的单片机,如ATMAL的AT89C2051、ZILOG的Z86E04、MICROCHIP的PIC16C620等,这些单片机在使用时连接比较器的端口一般只作普通I/O使用,而对其内置的模拟比较器的应用却很少。下面以AT89C2051为例,谈谈利用单片机内置模拟比较器来构成A/D转换器的新方法。
1 硬件转换电路
AT89C2051是MCS51单片机系列中的一种,它虽然只有20个引脚,却集成了51系列单片机的标准内核,其中包括2k程序存储器、128字节数据存储器、2个16位定时计数器、一个标准全双工UART和一个的模拟比较器,而这个模拟比较器是以前产品所没有的。是利用AT89C2051的模拟比较器来构成双积分式A/D转换器的电路原理图。其中:内置模拟比较器的结构如图中虚线包围部分所示,比较器的正、反相输入端分别与P1.0、P1.1连接,这是两个漏极开路无上拉电阻的输出和输入端口,当向P1.0、P1.1写“1”时,M1、M2截止,相当于P1.0、P1.1对数字部分悬空,这时比较器的输入不受单片机端口输出的影响;由于P1.0、P1.1具有很强的灌电流能力,当写入“0”时,P1.0、P1.1能吸入20mA的灌电流,而且M1、M2的饱和电压很低,利用这一特点可为积分电容彻底放电。比较器输出端在单片机内部与P3.6连接,读P3.6就可得到比较器的输出结果。因此,利用AT89C2051这个内置的比较器,再加上少量的外围器件就可组成双积分式A/D转换器。中,I0为恒流源,其电流约为0.5~2mA,Cf是积分电容,Cf与I0的选择取决于A/D转换的位数,Vref为参考电压,一般取模拟输入电压值的一半,U2是一个模拟开关,其中通道0接参考电压,通道1至7接模拟输入,即该A/D转换器有7个输入通道。
500)this.style.width=500;" height=265>
2 转换过程
当恒流源对电容器积分时,积分电容上的电压与时间成线性比例关系,这样利用单片机内部的定时计数器就可分别测量参考电压及模拟输入电压的积分时间,再通过CPU的运算来得到转换的结果。单片机的端口P1.2至P1.4可用来输出模拟开关通道选择地址,定时计数器T0可设定为方式1,16位定时状态,用来测定积分时间。该转换过程可分5个步骤:
步为积分电容的放电,主要是向P1.1写“0”,利用其吸入灌电流大的特点为Cf放电,同时定时计数器T0清零。
第二步是参考电压积分,即模拟开关选择通道0,相当于Vref接至比较器的正输入端,并向P1.1写“1”,同时启动定时计数器,这样,I0开始对Cf积分;程序循环读P3.6状态,以检测比较器的输出结果,当积分电容上的积分电压稍大于(由于比较器有极高的增益,故可近似地看作等于)参考电压时,比较器的输出反转,P3.6发生由高至低的跳变。程序检测到这个跳变后,停止定时计数器,保存此时的定时计数器结果Tref,此时可由恒流源对电容积分的关系式得出:Vref=(I0 Tref)/Cf
第三步为积分电容放电,也就是重复步对Cf放电和定时计数器T0清零。
第四步为输入电压积分,此时模拟开关可选择通道1~7中的一个,相当于模拟输入电压Vx接至比较器的正输入端,重复第二步对输入电压积分,则可得到积分时间Tx,因此,Vx=(I0Tx)/Cf
以上4步积分电容Cf上的积分电压波形如所示。
500)this.style.width=500;" height=157>
第五步是通过CPU的运算来求得A/D转换的结果,由第二步结果除以第四步结果,可以得到:
Vref/Vx=Tref/Tx
变换后得:
Vx=(VrefTx)/Tref
上式即A/D转换的结果。
从上式可以看出:A/D转换结果Vx只与Vref、Tx、Tref有关而与I0、Cf无关。这一点非常重要。因为它意味着在转换过程中抑制了恒流源和积分电容温漂所造成的误差,从而保证了该A/D转换器工作的稳定性,这也正是积分式A/D转换器的优点。理论上,该A/D转换器的只取决于参考电压的稳定性和单片机定时计数器的度,而这两点都相对比较容易保证。当然,这是指在恒流源为理想恒流源的情况,实际上恒流源的特性决定了该A/D转换器的非线性误差,因此,在要求较高的场合,应选用线性好的恒流源集成电路,如LM334等,而在要求不高的情况下则可用所示的由分立元件组成的恒流源电路来实现A/D转换。这时积分电容可选择温度系数较小的涤纶电容等。
500)this.style.width=500;" height=195>
需要注意的是,由于单片机采用端口查询的方式来检测比较器的输出结果,MCS51系列单片机端口查询命令需要占用2个机器周期,而定时计数器则需要在每个机器周期上加1。因此,在使用时有可能在比较器的输出反转时,程序不能立刻停止定时计数器,而是要等到下一个机器周期运行到CLRTR0语句时才停止。这样,定时计数器的值总为偶数,这一问题如果不在程序中进行处理就会造成误差。解决的方法是增加I0、Cf的积分时间,即把积分时间加大一倍,再把定时计数器的读数即Tref和Tx除以2,这样就能把定时计数器多加了1的误差去掉而得到正确的结果。也就是说,如果要得到12位的分辨率,那么就需要有13位的定时计数器的读数。这种算法虽然牺牲了定时计数器的1位分辨率,加长了转换周期,但是确保了测量结果的准确性。对于有模拟比较器输出跳变中断的单片机如Z86E08等,上述过程处理起来会更简单,可用程序在比较器输出反转时来设定中断,并在中断子程序的开始时停止定时计数器,其读数减去从比较器中断到执行中断子程序之间的机器周期数即为实际积分时间。
由于AT89C2051的定时计数器为16位,所以该A/D转换器的分辨率实际上可以达到15位。调整I0和Cf的值就能改变A/D转换器的分辨率,I0和Cf的取值与分辨率和单片机时钟频率之间的关系,应满足下式:
12×2N+1/(f0 Vmax)≤Cf/IO≤12×216/(f0Vmax)
式中Vmax 为模拟输入电压,N为分辨率位数,f0为单片机的时钟频率。根据上式,在设计时应保证足够长的积分时间以保证分辩率的要求。同时还应保证积分时间不能超过单片机的定时值,以免引起定时计数器的溢出。
3 软件编程
整个工作过程的主要程序如下(该程序采用MCS51汇编语言编写)。除法子程序和20μs延时子程序分别为:
(1)初始化主程序:
500)this.style.width=500;" height=185>
500)this.style.width=500;" height=196>
500)this.style.width=500;" height=143>
500)this.style.width=500;" height=162>
500)this.style.width=500;" height=157>
500)this.style.width=500;" height=180>
4 结束语
上述所述,采用内部带模拟比较器的单片机加上少量的外国元件,并在程序上稍作处理,就能够构成一种新的A/D转换器,该方法可节约因扩展A/D而占用的大量I/O,而且这种A/D转换器能达到很高的分辩率和,并且有抗干扰能力强、分辩率可由程序调整的特点,从而增加了单片机的应用范围和使用灵活性,同时就应用系统的设计也显得简洁和不效。
参考文献
[7].AT89 系列单片机。爱迪尔电子有限公司
[8].Discrete Z8 Microcontrollers Databook.Zilong,Inc
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。