完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
这篇大概介绍一下A/D转换的原理以及相应的电路连接方法。
模拟信号的幅度一般随时间变化而连续变化。以下就是不同性质模拟量的波形 而单片机中一般运算用的是数字量(0/1的组合),这就涉及到了外围电路需要有一个模数转换的过程。顾名思义是把输入的模拟信号尽可能无失真地转化为数字量。 如果把数字量形容成是一个个分块储存信息的模块,那模拟量这种连续的信息在转换过程中要尽可能避免信息的丧失。处不来讲转换的思路就是把数字量分块,以数字的形式转换至数字量中。如数字量为有六位(000000-111111),那么就可以把模拟量均等分为64份,每份中储存着转换过来的相应信息。 但是这个只是我们的初步思路,从原理上讲,一般的A/D转换分为采样保持,量化和编码三个过程。采样的量一般是电压(电流不好取),通过一定的采样保持时间过后把采样的电压量转换为数字量,并按一定形式的0/1编码顺序给出转换结果,这就是得到了相应的数字信号。框图如下: 下面分别介绍相应的理论知识。 1.采样定理:(信号里面基本接触过,还可以参考无失真系统需要具备的条件等知识) 采样定理反映了采样信号频率与输入信号频率之间的制约关系,可理解为采样信号的频谱(低通滤波器)一定要包含输入信号频谱的全部内容。 因为每次将采样电压转化为数字量需要一定的时间,所以采样后也必须把采样电压保持一段时间,故在采样过程中最后反应出的Vi都是采样结束时候的值。 2.量化与编码 数字信号一定是在数值上离散的。且任何一个数字量都会是一个基础数字量的整数倍。 故选取一个最小的变量作为单位变量。将模拟电压与之相除后就能得出相应的数字二进制代码,经推算也可以得出对应的模拟电平。 上图的单位变量就为1/8V,量化误差(每两个单位间隔中可能出现的最大误差)也是1/8. 这其中有一个小知识点。怎么设计电路使其有采样和保持的功能。 简单的采样保持电路如下图所示,其将MOS管作为启动和停止的开关,将信号通过反相放大器后得出输出电压。 这里的场效应管也有反相截止的功能。即当输入由高转低时,电流无法通过场效应管。 对于这种采样速度低的电路,可以有以下改进 VL引脚控制着开关的闭合,当为高电平时开关打开。模拟电压可经过两级跟随器传至Vo 当VL由高变低时,还有电容Ch放电提供相应电压,电平得以维持。 当输入的电压比较大,超出了开关所能承受的最大电压时,引入一个二极管电路,通过单向导通的性质可以起到分压的作用,且当电压合适时该电路不起分压作用。 常用的A/D转换器有直接A/D转换器(并行型/反馈比较型)以及间接A/D(需要转成T,f等中间变量后再转换) 1.直接 (1)并行A/D:由电压比较器,寄存器以及编码器三部分组成 电压比较器是对输入电压进行分类,如图所示,运放的负极接模拟电平大小为2n-1/15(n=1,2,……7)的端口,分压电阻每两个电阻之间的节点都接在VI引出的这条总线上。进行电压比较后将比较结果数据传到寄存器。寄存器设置的目的是因为比较结果可能会有变化,待稳定后通过译码器部分对相应的结果转化为二进制数字变量。各种变量之间的对应关系如下 这种电路特点是传输速度较快,但缺点是随着二进制数字量位数的增加,需要比较器的数量呈指数型增长(2^n-1),且自带采样保持功能 (2)反馈比较型A/D 引入一个D/A转换器和一个计数器,计数器传送数字信号至D/A,转为模拟信号后在电压比较器这里与VI按位做比较,若一致就直接传送至计数器,不一致通过比较器后也会变为正确的那一项,按位比较重复多次后,计数器将数据传送至输出寄存器。因为在比较过程中数字不断变化,故设置了输出寄存器。这样就可以起到逐步逼近模拟量的功能。 (3)逐次比较器 为了进一步提升比较的速度,设计了逐次比较器。下图是三位逐次比较器的原理图 引入了具有锁存功能的d触发器,三位得出比较结果分别上接三个RS触发器,在比较器C的正极输入前又加入了累加器,减去了半个量化误差。当要输出的位数越小时,时钟端的频率就越高,处理速度就会越快 2.间接比较器 一般使用的是V-T比较和V-F比较两类 剩下一个问题是关于A/D转换的参数指标。 大致有分辨率(转换器对输入信号的分辨能力),转换误差(实际输出与理论输出之间的差别)转换精度及转换时间四类。主要介绍分辨率及转换时间 1.分辨率:输入位数越多,转换位数越多,分辨率就越高。 eg:5V是一个转换器的输入最大值,若要输入8位二进制数,则有分辨率5/2^8V=19.53mV 2.转换时间: 即在实际运用中,需要综合考虑选用哪一种转换器最为合适 eg: 每个热电偶平均1/16s的转换时间,上述比较器都能用。 从0.1°C可知该转换器要求的分辨率为1/4500 通过最大电压范围0.025/2^n<=1/4500就可得出位数。 接着介绍集成A/D转换器的工作原理及实现方法。 因为不同的集成方式下对接口可以有不同的处理方式,一般逐次性转换器用的比较多,常用型号是ADC0804,实物图如下 因为本人使用的是郭天祥老师的TX-1C增强版,现给出该开发板上ADC0804的接口方法 下图是写入数据时的过程 下面是读取数据的过程 下面是一道例题 分析:1.数码管三位显示,表明需要构造一个display()以及通过dula和wela传送段选和位选信息 具体代码如下 #include #include #define uchar unsigned char #define uint unsigned int ***it dula=P2^6; ***it wela=P2^7; ***it adwr=P3^6; //读写的端口定义 ***it adrd=P3^7; uchar code table[]= {0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x77, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71 }; void delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void display(uchar bai,uchar shi,uchar ge) { dula=1; P0=table[bai]; dula=0; wela=1; P0=0x7e;//从右到左,为0的位是所选中位 wela=0; delayms(5); dula=1; P0=table[ge]; dula=0; wela=1; P0=0x7d; wela=0; delayms(5); dula=1; P0=table[ge]; dula=0; wela=1; P0=0x7b; wela=0; delayms(5);//记得加延时 } void main() { uchar a,A1,A2,A3,adval;//A1-A3为三位显示在主函数中的变量名 //adval是中间变量 wela=1; P0=0x7f;//初值 wela=0; while(1) { adwr=1;//写的全过程(类似于波形) _nop_(); adwr=0; _nop_(); adwr=1; for(a=10;a>0;a--)//由于开发板频率较低,搞出点延时来 { display(A1,A2,A3); } P1=0xff;//初始化 adrd=1;//读过程 _nop_();//机器周期延时 adrd=0; _nop_(); adval=P1;//把P1的值读入 adrd=1;//高电平抬起 A1=adval/100; A2=adval%100/10; A3=adval%10; } } l=P1;//把P1的值读入 adrd=1;//高电平抬起 A1=adval/100; A2=adval%100/10; A3=adval%10; } } |
|
|
|
只有小组成员才能发言,加入小组>>
3310 浏览 9 评论
2991 浏览 16 评论
3492 浏览 1 评论
9057 浏览 16 评论
4086 浏览 18 评论
1175浏览 3评论
603浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
596浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2333浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 10:57 , Processed in 0.968507 second(s), Total 47, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号