模拟信号的幅度一般随时间变化而连续变化。以下就是不同性质模拟量的波形 而单片机中一般运算用的是数字量(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的接口方法 引入了74HC573锁存器,他的Q7端(12引脚)接了AD芯片的片选端口,则可通过控制锁存器来控制AD ADIN与AD芯片之间连接要加限流电阻,以免因为电流过大烧毁芯片 而引入R和C,在CLK,CLKR以及GND之间构建振荡电路,是为芯片提供工作所需的脉冲 也要记住WR¯¯¯¯¯¯\overline{WR} WR 与RD¯¯¯¯¯\overline{RD} RD 分别接了单片机的P3.6和P3.7接口,这个在编程中定义端口时要用到 在这里十分重要的是芯片启动的时序图,在编程中需要对图中的先后次序以及涉及到机器周期方面的细节有所体现,这才算告诉编译器一个时序变化的全过程 下图是写入数据时的过程 我们在写单片机程序启动AD时应该遵循上面的时序 下面是读取数据的过程 具体代码如下 #include《reg52.h》 #include《intrins.h》 #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; sbit adwr=P3^6; //读写的端口定义 sbit 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; } } 责任编辑:gt (责任编辑:admin) |