datasheet

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

2018-01-25来源: eefocus 关键字: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转换

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

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

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

推荐阅读

单片机的两种型号区别 AT89C51和AT89C52的区别

单片机的两种型号。主要区别是容量不同。at89c51最多支持4KB的程序,at89c52则最多支持8KB的程序。AT89C51简介:AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,AT
发表于 2018-11-21

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

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

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

以AT24C02为例的IIC通信协议

,传输距离达到15m;兼容不同电压等级的器件,工作温度范围宽。1、主设备和从设备主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件,在总线上主和从、发和收的关系是不恒定的,而取决于此时数据传送方向。系统中的所有外围器件都具有一个7位的"从器件专用地址码",其中高4位为器件类型(比如说AT24C02就是1010),由生产厂家制定,低3位为器件引脚定义地址,由使用者定义。主控器件通过地址码建立多机通信的机制,因此I2C总线省去了外围器件的片选线,这样无论总线上挂接多少个器件,其系统仍然为简约的二线结构。2、数据传输发送到SDA上的每个字节必须的8位,每次传输可以发送的字节数量不受
发表于 2018-07-15

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

小广播

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved
pt type="text/javascript" src="//v3.jiathis.com/code/jia.js?uid=2113614" charset="utf-8">