1第8章D/A、A/D转换器的应用通过前面章节的了解可知,单片机是个强大的数字系统,所处理得数据都是0和1。但在实时控制和智能仪表等单片机应用系统中,实际的被控、被测对象往往是一些连续变化的模拟量,如温度、速度、压力等物理量。此时A/D、D/A转换器就发挥了极为重要的作用,它们在模拟世界与数字世界之间架起了一座桥梁。A/D转换器是一种能把模拟量转换成数字量的集成电路芯片;而D/A转换器则相反,它是一种能把数字量转换成模拟量的集成电路芯片。说明一点,我们将要介绍的A/D转换器是不能直接转化如温度、速度、压力等非电量的模拟量,而只能转换模拟电压信号。所以非电量的模拟量一般需要通过各种传感器将其转换成模拟电压信号后再送A/D转换器处理。传感器部分的内容将在后面的章节中叙述。D/A转换器也只能将数字量转换成模拟电压或电流等电量的模拟量。8.1D/A转换器由于D/A转换器比较简单,所以我们先介绍D/A转换器。8.1.1概述我们知道一个数字量是由二进制数字代码0和1按位组合而成,每一位都有不同的权值,数字代码与对应位的权值相乘后,再把全部数值相加,就是该数字量。而D/A转换器工作过程就是把数字量的每一位按其权值的大小转换为相应的模拟电压或电流分量,然后再经运算放大器把各模拟分量相加,其和就是D/A转换的结果,即一个模拟电压或电流信号。这个信号是与该数字量所代表的值成正比的。D/A转换器按数字量输入形式可分并行输入和串行输入。并行输入指单片机通过数据总线一次性把待转换的数据送给D/A转换器;而串行输入是指单片机通过一根线通常是串行口上的数据线一位一位地将数据送到D/A转换器中,这种方式的接口电路设计比较简单。按模拟信号输出形式分电压输出型和电流输出型。按转换的分辨率分8位、10位、12位、16位等。分辨率指输入给D/A转换器的单位数字量变化引起的模拟量输出的变化,是输出对输入量变化敏感程度的描述。通常定义为输出满刻度值与二的N次方之比(N为二进制位数)。显然,二进制位数越多,分辨率越高,既D/A转换器对输入量变化敏感程度越高。通常,我们首先是根据系统设计所要求的分辨率来选择D/A转换器的。再者,还要考虑转换速度,即D/A转换器的建立时间的数值大小。建立时间越小,表明其转换速度越快。说明一点,详细的转换器内部工作原理请参考相关著作,我们这里主要讲述的是各种转换器实用芯片本身的功能特点及与8位单片机的各种接口电路和程序的设计。8.1.2D/A芯片介绍下面我们将针对较常用的几款芯片介绍D/A转换器的特性、工作流程和使用时的注意事2项,从中了解D/A转换器的原理及应用。它们分别是美国TI(德州仪器)公司的TLC7226和美国国家半导体公司的DAC0832。1、TLC7226(1)特性a、分辨率为8位;b、属于电压输出型的;c、4路模拟信号转换输出;d、不需要任何外围器件即可构成单双极性模拟电压信号输出;e、需要多电源供电(2)逻辑结构及各封装引脚说明a、逻辑结构如图8-1所示从图中可知该芯片内部有四个锁存器(Latch),它们受A1、A0、WR三个引脚上的逻辑信号的控制,用于存储从数据总线上传来的数据。四个转换(DAC)实时转换来自锁存器中的数字量,转换后的模拟信号经电压跟随器输出。参考电压,即模拟信号的最大量程,从REF引脚输入。图8-1b、封装引脚分布如图8-2所示图8-23c、各引脚功能含义如下:引脚名称功能有效电平使用注意事项DB0~DB78位数字量输入端DB0为最低位,DB7为最高位OUTA~OUTD4路模拟转换输出都具有锁存功能,分时使用互不影响A0、A14路通道选择A1位高位WR数据锁存允许控制低电平有效REF参考电压输入端0REFVDD-4VDD正电源11.4VVDD16.5VVSS负电源VSS-5.5V,AGND模拟地直接接负电源可构成双极性输出DGAND数字地(3)极性设计a、单极性输出:如图的电路结构可使模拟信号输出端输出量程从0到+5V之间的模拟电压信号。图8-3b、双极性输出:下图可使模拟信号输出端输出量程从-5V到+5V之间的模拟电压信号。图8-442、DAC0832(1)特性a、分辨率为8位;b、属于电流输出型的,当转换结果需电压输出时,可在它的Iout1、Iout2输出端加接一个运算放大器,即可将电流信号变换成电压信号输出;c、稳定时间为1μS;d、有直接输入、单缓冲输入、双缓冲输入三种工作方式,实现不同功能;e、单电源供电(+5V~+15V);f、低功耗,20mW;(2)逻辑结构及各封装引脚说明a、逻辑结构如图8-3所示除逻辑控制电路外,主要由输入数据寄存器(INPUTREGISTER)、转换数据寄存器(DACREGISTER)和转换器(D/ACONVERTER)三部分组成。输入数据寄存器用于暂存芯片外数据总线上传来的数据,它受ILE、CS、WR1的逻辑控制;转换数据寄存器存储从输入数据寄存器传来的要送转换器转换的数据,受WR、XFER控制。与7226一样,转换器实时转换锁存在转换数据寄存器中的数字量。正因为0832有两个数据寄存器,所以就使它具有直接输入、单缓冲输入、双缓冲输入三种工作方式。由于0832是属于电流输出型的,而我们在应用中往往需要电压信号,这就需要将它的输出进行电流/电压转换。正好可利用其Iout1、Iout2、Rfb三个引脚外接一个运算放大器实现,具体电路见下面输出极性部分。图8-55b、封装引脚分布如图8-4所示图8-6c、各引脚功能含义如下:引脚名称功能有效电平使用注意事项DI0~DI78位数字量输入端DI0为最低位,DI7为最高位CS片选端低电平有效ILE数据锁存允许控制端高电平有效WR1数据寄存器写选通控制低电平有效WR2DAC寄存器写选通控制低电平有效XFER数据传送控制端低电平有效Iout1DAC电流输出1端当8位输入数字量全都为1时,此电流最大,当8位输入数字量全都为0时,此电流为0Iout2DAC电流输出2端Iout1、Iout2反向变化,Iout1+Iout2=常数Rfb外部反馈信号输入端内部已有反馈电阻Rfb,可根据需要外接反馈电阻VREF参考电压输入端可在-10~+10V范围内选择AGND、DGND模拟地和数字地两地应共接于一点VCC电源可在+5~+15V间选择(3)工作方式通过控制CS、ILE、WR1、WR2、XFER的不同接线方式,可以控制DAC0832工作在不同方式下。a、直接输入方式:当CS、ILE、WR1、WR2、XFER都接有效电平时,就工作在直接输入方式。这种工作方式下的DAC0832常用于不带微机控制的系统中。b、单缓冲方式:指两个输入寄存器中有一个处于直通方式,另一个处于受控锁存方式。常用于只有一路模拟信号输出或虽有几路模拟信号但不需要同步输出的场合。一般将CS作片选控制、ILE接高电平、WR1接单片机的WR引脚、WR2接地、XFER接地,即将DAC寄存器设置为直通方式,输入数据寄存器中的数据直接送D/A转换。6c、双缓冲方式:两个锁存器都接成受控锁存方式。常用于有多路模拟信号需要同步输出的场合。此种方式工作时,数字量的输入锁存和D/A转换输出是分两步完成的。单片机通过控制每片转换器的CS端来先把每一路的数据依次锁存到每一个数据锁存器中,再通过选通XFER端来同时启动D/A转换,达到同步输出的效果。实际电路图见课程设计部分。(4)输出极性a、单极性输出:输出电压信号256REFOUTVVB。VREF为参考电压值,B为数字量的值,与256对应,256即为8位全为1的数字量。这里负号表示模拟电压信号反向输出。下图可输出量程从-5V到0之间的模拟电压信号。图8-7b、双极性输出:电路结构如下图所示,由电路分析中基尔霍夫定律可知输出电压信号(128)128REFOUTVVB。VREF端的参考电压可正可负。输入的8位数字量中最高位为符号位,其余为数值位。当VREF为正时,符号位为1,则输出为正;符号位为0,则输出为负。VREF为负时反之。图8-878.1.3课程设计这部分内容主要介绍芯片与单片机的接口电路设计及程序设计。接口部分主要掌握片选地址的确认和分配。它们涉及到前面部分章节中三总线的知识和译码电路的知识。我们是把芯片当作外扩的一个RAM,只不过这个存储器的存储空间极小,即芯片内部有几个寄存器,它的空间就有几个字节,它就需要几个地址。由于所需地址数很少,我们基本上用的是线选法译码方式。这样也造成地址重叠问题,即一个寄存器往往对应了多个地址。但在程序设计中,我们只选用其中一个有效的且不与其它寄存器地址冲突的地址即可唯一表征某一个寄存器。程序部分主要掌握单片机控制外围芯片工作的基本方法和一些数据处理的常用算法。1、TLC7226任务:利用示波器的X-Y输入方式显示8位时序波形,如10011011设计思路:该片转换器中有四个寄存器,所以它需要四个地址。如下图接法可知地址的确定只由P2.7、P2.1、P2.0决定,也就是单片机十六位地址总线上只有三位起作用,其它位上的值不影响芯片工作状态,这就是造成地址重叠的原因。而在本设计中我们分别只取一个有效地址即可,即OUTA、OUTB、OUTC、OUTD分别为0000H、0100H、0200H、0300H。示波器的X-Y输入方式:示波器上的点就二维坐标上的点,完全由X-Y输入的电压决定。假设中心位置为原点,若要在第一象限显示,则X、Y都输入正电压既可;若要在第二象限显示,则X输入负电压,Y输入正电压既可;三四象限类似。我们这里由7226的OUTA控制X输入,OUTB控制Y输入,只要循环扫描时间足够快,则可在示波器上显示我们所需要的任意稳定波形。图中我们将TLC7226接成双极性输出,这样它的零电平输出时对应的数字量为#10H。电路原理图:图8-98参考程序:ORG0000HAJMPMAINORG0030HMAIN:MOV20H,#10011011B;要显示的8位数字量MOV30H,#10000000B;零电平线所处位置MOV31H,#00H;水平扫描起点MOVA,30HMOVC,20H.7;先送最高位,位寻址只能通过C来进行MOVACC.5,C;将逻辑电平值叠加到零电平线上MOVDPTR,#0100H;OUTB控制Y轴MOVX@DPTR,A;送D/A转换LCALLSAOMIAO;调用水平扫描子程序MOVA,30HMOVC,20H.6MOVACC.5,CMOVDPTR,#0100HMOVX@DPTR,ALCALLSAOMIAOMOVA,30HMOVC,20H.5MOVACC.5,CMOVDPTR,#0100HMOVX@DPTR,ALCALLSAOMIAOMOVA,30HMOVC,20H.4MOVACC.5,CMOVDPTR,#0100HMOVX@DPTR,ALCALLSAOMIAOMOVA,30HMOVC,20H.3MOVACC.5,CMOVDPTR,#0100HMOVX@DPTR,ALCALLSAOMIAO9MOVA,30HMOVC,20H.2MOVACC.5,CMOVDPTR,#0100HMOVX@DPTR,ALCALLSAOMIAOMOVA,30HMOVC,20H.1MOVACC.5,CMOVDPTR,#0100HMOVX@DPTR,ALCALLSAOMIAOMOVA,30HMOVC,20H.0MOVACC.5,CMOVDPTR,#0100HMOVX@DPTR,ALCALLSAOMIAOJMPMAIN;循环扫描SAOMIAO:;水平扫描子程序MOVDPTR,#0000H;OUTA控制X轴MOVR0,#20;每一位在示波器上打20个点MOVA,31H;取该位水平位置的起点SM:MOVX@DPTR,A;送D/A转换INCA;打下一个点DJNZR0,SMMOV31H,A;存显示的位置,以备下一位用RETEND2、DAC0832任务:双缓冲方式同步D/A转换输出,要求能从程序中判断出来是否实现了同步。设计思路:如下图所示,两片转换器,本来需要四个地址。但由于我们需要同步输出,即想同时启动两片的数据转