基于AT89C1051/2051的低成本A/D转换方法

2018-01-25 19:41:49编辑:什么鱼 关键字:AT89C1051  2051  低成本  A  D转换

低成本智能仪表的设计过程中优先考虑的是成本问题,作为核心部件的 单片机 通常选用低档的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为:

    V c1 =V CC ×(1-e-(t/τ))

    其中τ=(R 1 +R w1 )C 1

    如果运放IC2:B将V c1 放大10倍,其输出为:

    Vo1=[1+(R 3 /R 2 )]V c1

    =10V cc (1-e-(t/τ))

    因为IC2:B的输出并不是线性锯齿波,所以增加一级IC2:A用作非线性补偿,其输出电压V o2 可表示为:

    V o2 =V i2 =(V o1 +V c3 )/2

    =[10V cc (1-e-(t/τ))+V o2 (1-e-(t/η)12)]/2

    式中:Vcc=5V;η=(R5+Rw2)C3

    上式经过整理可得:

    V o2 =50(1-e-(t/τ))/(1+e-(t/η))

    上式就是线性锯齿波的理论表达式,通过合理选择τ、η的值,就可以得到线性良好的锯齿波。

    在实际设计中,我们通过一段C语言程序可根据上式先从理论上求得最佳的τ、η的值,再根据实验结果进行调整。其程序如下:

    #i nclude

    #i nclude

    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)。


关键字:AT89C1051  2051  低成本  A  D转换

来源: eefocus 引用地址:http://www.eeworld.com.cn/mcu/article_2018012537491.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:51汇编 等周期脉宽调制pwm 子程序
下一篇:用AT89C2051设计的智能煤气表的思路与原理

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

C51IO口模拟I2C总线驱动AT24C16 (I2C协议部分)

/* 名称:C51IO口模拟I2C总线驱动EEPROM(AT24C16)说明:I2C总线是由Philips公司开发的一种简单、半双工同步串行总线。它只需要两根线(SCL、SDA)即可在连接于总线上的器件之间传送信息。其中SCL时钟总线用于同步数据,SDA数据总线用来发送数据(或地址)。和SPI总线不同的是,I2C总线通过在SDL上发送存储器的地址用来选中总线上对应的设备。关于具体的通信协议这里就不说了,无非是通过IO口模拟产生所需信号 (如通信开始信号是SCL为高时,SDA产生一个下降沿信号。) 驱动程序中有 具体的说明。 *///定义I2C相关变量sbit     SCL=P2
发表于 2018-07-21 13:01:29

C51IO口模拟I2C总线驱动AT24C16 (EEPROM部分)

/* 名称:C51IO口模拟I2C总线驱动AT24C16 说明:关于EEPROM,即这里的AT24C16是一个特殊形式的FLASH存储器,不过其容量一般较少。比较适合于存储少量的数据。AT24C16的通信接口是标准的I2C通信,即我们需要根据I2C通信协议来操纵EEPROM设备。 关于AT24C16的的各种操作,这里就不细讲了,简单介绍一下。(1)、主机向AT24C16写一个字节:首先需要发送设备地址,然后发送需要访问的存储器地址。然后在发送要写入的数据。这里省略了开始、结束和确认等信号的产生。(2)、指定页写入n个字节:和(1)的基本操作很类似。不同的是可以连续写入n个数据。这里要小注意一点的就是,写入的数据
发表于 2018-07-21 12:23:27

i2c子系统之at24c02简介

AT24C02存储规格总共32个page,每个page为8byte。总共256KB(2Kb),地址的长度需要使用8bit(刚好可以用来表示256个字节的地址)来表示。AT24CC02的地址设备的地址由8bit组成,前4 bit是固定的(1010);接着的3 bit是和A2 A1 A0的硬件连接相关,通过指定这3 bit可以在统一个I2C系统里面最多连接8个AT24C02设备;第8bit用来表示读/写选择,1表示读/0表示写。AT24C02会和总线上的设备地址进行比较,假如一直则AT24C02输出一个0,不一致则返回的是standby状态。TQ2440开发板的A2 A1 A0地址线全接地,所以此处AT24C02的读写地址格式为:读
发表于 2018-07-15 22:12:17
i2c子系统之at24c02简介

I2C子系统之at24c02读写测试

结合ioctl和at24c02的介绍,写了个at24c02的测试程序测试硬件平台:TQ2440、at24c02内核版本:linux-2.6.37.1读写单独分开成两个小程序。源码如下:写测试程序:#include <stdio.h>#include <fcntl.h>#include <stdlib.h>#include <string.h>#include <linux/i2c-dev.h>#include <errno.h> int main(int argc, char *argv[]){ int num, err, i, j; int fd
发表于 2018-07-15 22:11:32

单片机 I2C操作笔记——以 AT24C04为例

1.前言    对于大多数工程师而言,I2C永远是一个头疼的问题。相比UART和SPI而言,I2C的时序要复杂一些,I2C组合变化也丰富一些。在这里以AT24C04为例说明I2C使用过程中的一些注意点。2.AT24C04操作示意图图 AT24C04操作示意图示意图说明:示意图分阐述了4种不同的操作方式,例如写单个存储单元,写多个存储单元,读单个存储单元和写单个存储单元。对于单个操作而言,上部为MCU通过I2C输出的相关指令,下部为I2C设备的响应。例如写单个存储单元操作时,MCU发出I2C启动,设备地址,写标志位等,而I2C设备输出多个ACK。3.若干说明3.1 基本操作方式I2C设备的操作可分为写单个存储字节
发表于 2018-07-15 22:10:55

I2C器件的从设备地址的设置(以AT24C02为例)

1 AT24C02的硬件连接电路图2 从设备地址  在进行I2C通信时,主机发送启动信号后,再发送寻址信号。器件的地址有7位和10位,以7为地址寻址为例,寻址信号由一个字节构成,高7位为地址位,最低位为方向位,用来表示主机与从器件的数据传输方向,方向位0代表主机接下来对从器件进行写操作,方向位为1,表明主机接下来对器件进行读操作。   AT24C02的高4位是固定的,为1010b,低3位则由A0/A1/A2信号线的电平决定。按照我们此处的连接, A0/A1/A2 均为 0,所以 EEPROM 的 7 位设备地址是: 1010 000b ,即 0x50。由于 I2C 通讯
发表于 2018-07-15 22:09:33

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved