一种基于AT89C1051/2051的低成本A/D转换方法
摘要:介绍一种基于AT89C1051/2051的低成本A/D转换电路和方法。该电路采用通用、廉价的器件,利用线性锯齿波和单片机内部的定时器来获得A/D转换结果,与单片机接口简单。采用该方法除了能获得较快的转换速度以外,转换的分辨率也可灵活设置,具有一定的实用价值。关键词:A/D转换 线性锯齿波 模拟比较器 AT89C1051/2051
在低成本智能仪表的设计过程中优先考虑的是成本问题,作为核心部件的单片机通常选用低档的8位机或4位机。就目前的情况而言,自带A/D转换的低档单埏机价格昂贵,在需要进行数据采集要时往往通过外部A/D转换器件,这在很大程度上增加了系统的成本。例如,目前AT89C2051单片机的零售价仅7~8元,而中速A/D转换器件的价格大都在20元以上。本文介绍的低成本A/D转换方法仅使用两片通用、廉价的器件就能达到中速A/D转换的速度和低于16位的转换分辨率。
1 原理 有一线性良好的锯齿波信号,最大幅度为Vmax,正程(0~Vmax)的扫描时间为t2(如图1中的直线OB),
在正程扫描期间的某一时刻t所对应的电压Vt为Vmax(t/t2)。图1中的曲线CD为一待测模拟信号,两信号在A点相交,时间为t1,不难理解,线性锯齿波在A点的幅度就是待测的模拟信号的大小,其值Vt1可以表示为:Vt1=Vmax(t1/t2)。这就是说,可以采用一种方法将待测的模拟信号与线性锯齿波进行比较,当线性锯齿波在某一时刻的幅度超过待测模拟信号的幅度时就会引起比较器输出状态的改变。因此,测出比较器输出状态翻转的时间,就能通过计算得到待测模拟信号的大小。
2 电路及A/D转换的过程 图2给出了具有8位分辨率的A/D转换电路。图中,IC1为AT89C2051单片机,其P1.0和P1.1除了具有通用I/O口线的功能外,还是内部模拟比较器的同相输入端和反相输入端,比较器输出的结果在内部连接到P3.6。IC2和IC3为线性锯齿波产生电路,其正程开始扫描的时刻由单片机的P3.7控制。IC3为一双输入与非门缓冲驱动器,这里等效为一个开关。当P3.7=0时,开关断开,C1通过R1、W1充电,线性锯齿波开始正程扫描,同时单片机内部定时器0开始计数,计数脉冲为单片机内部时钟。待测的模拟信号从P1.1输入,因为线性锯齿波电压是从0开始线性递增的,所以在开始正程扫描的时刻,P3.6为0.当锯齿波的电压线性递增到超过待测模拟信号的电压时, 比较器的输出翻转,P3.6为1,此时定时器0的数值就是A/D转换的结果,也就是图1中所示的t1,通过前面的公式就可以得到待测模拟电压的值。其程序框图如图3所示。
3 线性锯齿波电路参数的确定 AT89C2051单片机的定时器0是一个16位计数器,因此这种方法所能达到的最高分辨率为16位,在最高时钟频率下(24MHz)完成一次A/D转换的最长时间约为33ms。在实际应用过程中不一定使用这么高的分辨率,在8位分辨率的情况下完成一次A/D转换的最长时间为128μs。下面以8位分辨率为例介绍锯齿波电路参数的确定方法。 对于图2电路,当P3.7输出为低时,锯齿波正程扫描开始,C1经R1、W1充是,其电压Vc1为: Vc1=Vcc×(1-e-(t/τ)) 其中τ=(R1+Rw1)C1 如果运放IC2:B将Vc1放大10倍,其输出为: Vo1=[1+(R3/R2)]Vc1 =10Vcc(1-e-(t/τ)) 因为IC2:B的输出并不是线性锯齿波,所以增加一级IC2:A用作非线性补偿,其输出电压Vo2可表示为: Vo2=Vi2=(Vo1+Vc3)/2 =[10Vcc(1-e-(t/τ))+Vo2(1-e-(t/η)12)]/2 式中:Vcc=5V;η=(R5+Rw2)C3 上式经过整理可得: Vo2=50(1-e-(t/τ))/(1+e-(t/η)) 上式就是线性锯齿波的理论表达式,通过合理选择τ、η的值,就可以得到线性良好的锯齿波。 在实际设计中,我们通过一段C语言程序可根据上式先从理论上求得最佳的τ、η的值,再根据实验结果进行调整。其程序如下: #include<stdio.h> #include<math.h> int main(void) { int τ=640, η=610; /*预置τ、η的值*/ double result,result-bak=0; double t,x,y; system(“cls”); /*清屏幕*/ for(t=0;t<=127;t+=0.5)/*8位分辨率时,锯齿波的正程为128微秒*/ { x=-t/τ; y=-t/η; result=50*(-exp(x))/(1+exp(y)); printf(“%4fmV”,(result-result-bak) 1000);/*每0.5微秒递增的电压(mv)*/ result-bak=result; } } 在τ=640μs、η=610μs时,通过上述编程处理,可使锯齿波非常接近线性,每μs的线性误差均在0.1mV以内,完全可达到8位分辨率A/D转换的要求。
4 误差分析及补偿 采用该方法进行A/D转换的误差来源主要有两个,第一是锯齿波的非线性此起的误差,根据上面的叙述,锯齿波的非线性基本上对A/D转换的结果不产生影响;第二是单片机在控制A/D转换的过程中引出的,这包括三个方面:其一是在“打开转换开关”和“定时器开始计数”这两个动作中单片机不可能同时完成;其二是单片机判断片内模拟比较器翻转的过程需要两个机器周期,而计数器最小的计数单位为1个机器周期;第三个原因是单片机确认模拟比较器输出状态翻转和关闭定时器不可能同时完成。对于第一和第三种情况引起的误差,由于它的确是指令执行所引起的,其误差的数值取决于指令执行的时间,因而在转换结束时将定时器0的值减去这个时间就可以了;而第二种情况引起的误差是无法进行补偿的。
5 结束语 采用本文所述的方法所设计的数据采集系统成本低廉,接口简单,具有较高的性能价格比。需要指出的是,为保证系统的长期稳定性,应采用高稳定的积分电容(C1、C3)。
|