1、AD/DA 转换AD/DA conversion本章将主要对AD/DA转换原理进行介绍及说明相应的应用实例2单片机是数字芯片,能够直接处理的只有数字信号,但单片机常用来控制外部对象(如电动机),为了准确地控制外部对象的工作,往往先要知道控制对象当前的运行情况,也就是说控制对象应该先告诉单片机它现在的情况是怎么样的。从信号的角度上来说,控制对象给出的信号有些是模拟信号,这是就需要先转换成数字信号后,再给单片机,这样单片机才能识别,此时需要用到AD转换芯片,如ADC0808/0809等;转换后的数字信号经过单片机分析、加工,最后给出控制思路,但控制对象(如有些电机)通常是模拟型器件,要控制它,只能
2、为其提供模拟信号,此时单片机就需要借助于D/A转换芯片(如DAC0832等)将数字信号转换成模拟信号。3目 录12.1 基于单片机的AD数据采集12.2 基于单片机的DA转换412.1.1ADC0808芯片工作原理12.1.2ADC0808应用硬件电路图12.1.3程序设计5ADC0808和ADC0809除精度略有差别外(前者精度为8位、后者精度为7位),其余各方面完全相同。它们都是CMOS器件,不仅包括一个8位的逐次逼近型的ADC部分,而且还提供一个8通道的模拟多路开关和通道寻址逻辑,因而有理由把它作为简单的“数据采集系统”。利用它可直接输入8个单端的模拟信号分时进行A/D转换,在多点巡回检
3、测和过程控制、运动控制中应用十分广泛。6 分辨率:8位。总的不可调误差:ADC0808为1/2LSB,ADC0809为1LSB。转换时间:取决于芯片时钟频率,如CLK=500kHz时,TCONV=128ms。单一电源:+5V。模拟输入电压范围:单极性05V;双极性5V,10V(需外加一定电路)。具有可控三态输出缓存器。启动转换控制为脉冲式(正脉冲),上升沿使所有内部寄存器清零,下降沿使A/D转换开始。使用时不需进行零点和满刻度调节。1主要技术指标和特性72内部结构和外部引脚ADC0808的内部结构如图12-1所示,外部引脚如图12-2所示。图12-1 ADC0808内部结构图图12-2 ADC
4、0808外部引脚图8内部各部分的作用和工作原理在内部结构图中已一目了然,在此就不再赘述,下面仅对各引脚定义分述如下:IN0IN78路模拟输入,通过3根地址译码线ADDA、ADDB、ADDC来选通一路。D7D0A/D转换后的数据输出端,为三态可控输出,故可直接和微处理器数据线连接。8位排列顺序是D7为最高位,D0为最低位。ADDA、ADDB、ADDC模拟通道选择地址信号,ADDA为低位,ADDC为高位。地址信号与选中通道对应关系如表12-1所示。表12-1 通道与地址的关系地址选中通道ADDCADDBADDA000011110011001101010101IN0IN1IN2IN3IN4IN5IN
5、6IN79 VR(+)、VR(-)正、负参考电压输入端,用于提供片内DAC电阻网络的基准电压。在单极性输入时,VR(+)=5V,VR(-)=0V;双极性输入时,VR(+)、VR(-)分别接正、负极性的参考电压。ALE地址锁存允许信号,高电平有效。当此信号有效时,A、B、C三位地址信号被锁存,译码选通对应模拟通道。在使用时,该信号常和START信号连在一起,以便同时锁存通道地址和启动A/D转换。STARTA/D转换启动信号,正脉冲有效。加于该端的脉冲的上升沿使逐次逼近寄存器清零,下降沿开始A/D转换。如正在进行转换时又接到新的启动脉冲,则原来的转换进程被中止,重新从头开始转换。10 EOC转换结
6、束信号,高电平有效。该信号在A/D转换过程中为低电平,其余时间为高电平。该信号可作为被CPU查询的状态信号,也可作为对CPU的中断请求信号。在需要对某个模拟量不断采样、转换的情况下,EOC也可作为启动信号反馈接到START端,但在刚加电时需由外电路第一次启动。OE输出允许信号,高电平有效。当微处理器送出该信号时,ADC0808/0809的输出三态门被打开,使转换结果通过数据总线被读走。在中断工作方式下,该信号往往是CPU发出的中断请求响应信号。113工作时序与使用说明ADC0808/0809的工作时序如图12-3所示。当通道选择地址有效时,ALE信号一出现,地址便马上被锁存,这时转换启动信号紧
7、随ALE之后(或与ALE同时)出现。START的上升沿将逐次逼近寄存器SAR复位,在该上升沿之后的2us+8个时钟周期内(不定),EOC信号将变低电平,以指示转换操作正在进行中,直到转换完成后EOC再变高电平。微处理器收到变为高电平的EOC信号后,便立即送出OE信号,打开三态门,读取转换结果。图12-3 ADC0808工作时序12模拟输入通道的选择可以相对于转换开始操作独立地进行(当然,不能在转换过程中进行),实际中通常是将通道选择和启动转换结合起来完成(因为ADC0808的时间特性允许这样做),这样可以用一条写指令既选择模拟通道又启动转换。在与微机接口时,输入通道的选择可有两种方法:一种是通
8、过地址总线选择,一种是通过数据总线选择。如用EOC信号去产生中断请求,要特别注意EOC的变低相对于启动信号有2us+8个时钟周期的延迟,要设法使它不致产生虚假的中断请求。为此,最好利用EOC上升沿产生中断请求,而不是靠高电平产生中断请求。13ADC0808应用硬件电路如图12-4所示。D0D7D1D6D5D2D4D3D3D4D2D5D1D6D0D7XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P2.7/A1528P2
9、.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427P1.0/T21P1.1/T2EX2P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115U180C52OUT121ADD B24ADD A25ADD C23VREF(+)12VREF(-)16IN31IN42IN53IN64IN75START6OUT58EOC7OE9CLOCK10OUT220OUT71
10、4OUT615OUT817OUT418OUT319IN228IN127IN026ALE22U2ADC080838%RV11kVolts+1.90U2(CLOCK)图12-4 ADC0808/0809仿真图 在Protues仿真中,ADC0808中的输出OUT1对应单片机的数据位的D7,OUT7对应D0。说 明14程序代码如下:/*/ADC0808/0809进行A/D转换程序/*#include#define uchar unsigned char/sbit OE=P00;sbit EOC=P01;sbit START=P02;/=共阳极数码管驱动数组=const char num_displa
11、y=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf87,0 x80,0 x90;/=毫秒级延时函数=void delay(int i)int j;for(j=0;j0;c-)for(b=142;b0;b-)for(a=2;a0;a-);/=微秒级延时函数=void delay1us(int i)while(i-);/=void display(int adc_num)/注意,传入参数如果超过255,/则不能用unchar/变量类型进行声明,否则就会发/生数据丢失情况P3=0 xf1;/数码管共阳极,位驱动高电平有效P2=num_display(ad
12、c_num/1000)&0 x7f;/显示千位,其中将结果与上0 x7f的/目的是让千位后显示一个小数点adc_num=adc_num%1000;delay(3);P3=0 xf2;/数码管共阳极,位驱动高电平有效P2=num_display(adc_num/100);/显示百位,其中将结果与上0 x7f的/目的是/让百位后显示一个小数点adc_num=adc_num%100;delay(3);P3=0 xf4;P2=num_displayadc_num/10;/显示十位adc_num=adc_num%10;delay(3);P3=0 xf8;P2=num_displayadc_num;/显示
13、个位delay(3);/=void main(void)/要让LED数码管正确显示相应的/数据数据类型的定义非常重要float x;int result;while(1)START=1;/在上升沿的时候,所有的内部/寄存器全部清零 delay1us(5);START=0;/在下降沿的时候,/开始进行AD转换 while(EOC!=1);/等待转换结束,/当EOC=1,表示转换结束,/EOC=0表示正在转换result=P1;/将结果保存到变量result当中/x=result*(5/255)*1000;/处理运算结果,/让LED数码管显示4位数据,/3位小数 x=result*19.6;/将结
14、果乘以19.6的目的是/根据上一行被注释的形式,/*放大1000倍,从而可以取到4位数据,整数1位,小数3位。但不能直接按x=result*(5/255)*1000;表达式书写,不然在5/255过程中就被当成了0来处理*/display(x);delay(3);15目 录12.1 基于单片机的AD数据采集12.2 基于单片机的DA转换1612.2.1DAC0832芯片工作原理12.2.2DAC0832应用硬件电路图12.2.3DAC0832正弦波发生程序12.2.4DAC0832三角波发生程序12.2.5DAC0832矩形波发生程序17DAC0832是双列直插式8位D/A转换器。能完成数字量输
15、入到模拟量(电流)输出的转换。其主要参数如下:分辨率为8位,转换时间为1ms,满量程误差为1LSB,供电电源为(+5+15)V,逻辑电平输入与TTL兼容。图12-5为DAC0832的引脚图。图12-5 DAC0832引脚图18DAC0832中各引脚的功能定义如下:DI7DI0:8位的数据输入端,DI7为最高位。IOUT1:模拟电流输出端1,当DAC寄存器中数据全为1时,输出电流最大,当DAC寄存器中数据全为0时,输出电流为0。IOUT2:模拟电流输出端2,IOUT2与IOUT1的和为一个常数,即IOUT1IOUT2常数。RFB:反馈电阻引出端,DAC0832内部已经有反馈电阻,所以RFB端可以
16、直接接到外部运算放大器的输出端,这样相当于将一个反馈电阻接在运算放大器的输出端和输入端之间。VREF:参考电压输入端,此端可接一个正电压,也可接一个负电压,它决定0至255的数字量转化出来的模拟量电压值的幅度,VREF范围为(+10-10)V。VREF端与D/A内部T形电阻网络相连。Vcc:芯片供电电压,范围为(+515)V。AGND:模拟量地,即模拟电路接地端。DGND:数字量地。19DAC0832内部结构如图12-6所示,在DAC0832中有两级锁存器,第一级锁存器称为输入寄存器,它的允许锁存信号为ILE;第二级锁存器称为DAC寄存器,它的锁存信号也称为通道控制信号/XFER。图12-6
17、DAC0832内部结构WR1当ILE为高电平,片选信号 和写信号 为低电平时,输入寄存器控制信号为1,这种情况下,输入寄存器的输出随输入而变化。此后,当 由低电平变高时,控制信号成为低电平,此时,数据被锁存到输入寄存器中,寄存器的输出端不再随外部数据DB的变化而变化。对第二级锁存来说,传送控制信号/XFER和写信号/WR2同时为低电平时,二级锁存控制信号为高电平,8位的DAC寄存器的输出随输入而变化,此后,当/WR2由低电平变高时,控制信号变为低电平,于是将输入寄存器的信息锁存到DAC寄存器中。CSWR120第一种方法使输入寄存器工作在锁存状态而DAC寄存器工作在直通状态。具体地说就是使/WR
18、2和/XFER都为低电平,DAC寄存器的锁存选通端得不到有效电平而直通,此外使输入寄存器的控制信号ILE处于高电平、/CS处于低电平,这样当/WR1端来一个负脉冲时就可以完成1次转换第二种方法使输入寄存器工作在直通状态而DAC寄存器工作在锁存状态。就是使/WR1和/CS为低电平,且ILE为高电平,这样输入寄存器的锁存选通信号处于无效状态而直通;当/WR2和/XFER端输入1个负脉冲时,使得DAC寄存器工作在锁存状态,提供锁存数据进行转换。DAC0832进行D/A转换量可以采用两种方法对数据进行锁存。21 单缓冲方式 单缓冲方式是控制输入寄存器和DAC寄存器同时接收数据,或者只用输入寄存器而把D
19、AC寄存器接成直通方式。此方式适用只有一路模拟量输出或几路模拟量异步输出的情形。双缓冲方式 双缓冲方式是先使输入寄存器接收数据,再控制输入寄存器的输出数据到DAC寄存器,即分两次锁存输入数据。此方式适用于多个D/A转换同步输出的情节。根据上述对DAC0832的输入寄存器和DAC寄存器不同的控制方法,DAC0832有如下3种工作方式:直通方式直通方式是数据不经两级锁存器锁存,即/WR1、/WR2、/XFER和/CS均接地,ILE接高电平。此方式适用于连续反馈控制线路,不过在使用时,必须通过另加I/O接口与CPU连接,以匹配CPU与D/A转换。22DAC0832应用硬件电路如图12-7所示。该电路
20、主要由单片机、DAC0832以及信号产生电路三部分组成。单片机的数字信号由P0口输出,分别接到DAC0832的数字输入端DI0DI7,工作状态控制端/CS、/WR1、/WR2、/XFER由单片机的P2.0、P2.1来控制,参考电压电路由R4、R5、RV1组成,运算放大器U3:A与U3:B与DAC0832的电流输出端组成输出信号产生电路,将电流信号变换为电压信号。图12-7 DAC0832与单片机连接电路23产生正弦波波形程序如下:/*/利用DAC0832产生正选波,正弦波波形产生数据在数组sin_tab256中/*#include#define uchar unsigned char#defi
21、ne uint unsigned int#define DAdata P0sbit DA_S1=P20;/控制DAC0832的8位输入寄存器,仅当都为0时,/可以输出数据(处于直通状态),否则,输出将被锁存sbit DA_S2=P21;/控制DAC0832的8位DAC寄存器,仅当都为0时,/可以输出数据(处于直通状态),否则,输出将被锁存/=画正弦波需要的数组=uchar code sine_tab256=/*输出电压从0到最大值(正弦波1/4部分)0 x80,0 x83,0 x86,0 x89,0 x8d,0 x90,0 x93,0 x96,0 x99,0 x9c,0 x9f,0 xa2,0
22、 xa5,0 xa8,0 xab,0 xae,0 xb1,0 xb4,0 xb7,0 xba,0 xbc,0 xbf,0 xc2,0 xc5,0 xc7,0 xca,0 xcc,0 xcf,0 xd1,0 xd4,0 xd6,0 xd8,0 xda,0 xdd,0 xdf,0 xe1,0 xe3,0 xe5,0 xe7,0 xe9,0 xea,0 xec,0 xee,0 xef,0 xf1,0 xf2,0 xf4,0 xf5,0 xf6,0 xf7,0 xf8,0 xf9,0 xfa,0 xfb,0 xfc,0 xfd,0 xfd,0 xfe,0 xff,0 xff,0 xff,0 xff,0
23、 xff,0 xff,/*输出电压从最大值到0(正弦波1/4部分)0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xfe,0 xfd,0 xfd,0 xfc,0 xfb,0 xfa,0 xf9,0 xf8,0 xf7,0 xf6,0 xf5,0 xf4,0 xf2,0 xf1,0 xef,0 xee,0 xec,0 xea,0 xe9,0 xe7,0 xe5,0 xe3,0 xe1,0 xde,0 xdd,0 xda,0 xd8,0 xd6,0 xd4,0 xd1,0 xcf,0 xcc,0 xca,0 xc7,0 xc5,0 xc2,0 xbf,0 xbc,0 x
24、ba,0 xb7,0 xb4,0 xb1,0 xae,0 xab,0 xa8,0 xa5,0 xa2,0 x9f,0 x9c,0 x99,0 x96,0 x93,0 x90,0 x8d,0 x89,0 x86,0 x83,0 x80,/*输出电压从0到最小值(正弦波1/4部分)0 x80,0 x7c,0 x79,0 x76,0 x72,0 x6f,0 x6c,0 x69,0 x66,0 x63,0 x60,0 x5d,0 x5a,0 x57,0 x55,0 x51,0 x4e,0 x4c,0 x48,0 x45,0 x43,0 x40,0 x3d,0 x3a,0 x38,0 x35,0 x33
25、,0 x30,0 x2e,0 x2b,0 x29,0 x27,0 x25,0 x22,0 x20,0 x1e,0 x1c,0 x1a,0 x18,0 x16,0 x15,0 x13,0 x11,0 x10,0 x0e,0 x0d,0 x0b,0 x0a,0 x09,0 x08,0 x07,0 x06,0 x05,0 x04,0 x03,0 x02,0 x02,0 x01,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,/*输出电压从最小值到0(正弦波1/4部分)0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x01,0 x02,0 x02,0
26、 x03,0 x04,0 x05,0 x06,0 x07,0 x08,0 x09,0 x0a,0 x0b,0 x0d,0 x0e,0 x10,0 x11,0 x13,0 x15,0 x16,0 x18,0 x1a,0 x1c,0 x1e,0 x20,0 x22,0 x25,0 x27,0 x29,0 x2b,0 x2e,0 x30,0 x33,0 x35,0 x38,0 x3a,0 x3d,0 x40,0 x43,0 x45,0 x48,0 x4c,0 x4e,0 x51,0 x55,0 x57,0 x5a,0 x5d,0 x60,0 x63,0 x66,0 x69,0 x6c,0 x6f,0
27、 x72,0 x76,0 x79,0 x7c,0 x80;/=DA输出子函数=void DAout(uchar temp)DAdata=temp;DA_S1=0;/打开8位输入寄存器DA_S1=1;/关闭8位输入寄存器void main()uchar i,k;i=0;DAdata=0;DA_S1=0;/打开8位输入寄存器DA_S2=0;/使DAC寄存器处于直通状态while(1)for(i=0;i256;i+)/下面四个for循环,可输出正弦波 k=sine_tabi;P0=k;24将上述正弦波信号产生程序经编译后生产的HEX文件装载到图12-7中的单片机中,进行仿真后在虚拟示波器上出现如图1
28、2-8所示的正弦波。图12-8 示波器显示正弦波图形25产生三角波波形程序如下:/*/利用DAC0832产生三角波/三角波主要由上升沿与下降沿组成/利用函数循环产生上升沿与下降沿即可产生三角波/*#include#define uchar unsigned char#define uint unsigned int#define DAdata P0sbit DA_S1=P20;/控制DAC0832的8位输入寄存器,仅当都为0时,/可以输出数据(处于直通状态);否则,输出将被锁存sbit DA_S2=P21;/控制DAC0832的8位DAC寄存器,仅当都为0时,/可以输出数据(处于直通状态);否
29、则,输出将被锁存/=DA输出子函数=void DAout(uchar temp)DAdata=temp;DA_S1=0;/打开8位输入寄存器DA_S1=1;/关闭8位输入寄存器void main()uchar i,k;i=0;DAdata=0;DA_S1=0;/打开8位输入寄存器DA_S2=0;/使DAC寄存器处于直通状态while(1)/*产生三角波的上升斜边*for(i=0;i0;i-)DAout(i);26电路图如图12-7所示。图12-9 示波器显示三角波图形27产生矩形波波形程序如下:/*/利用DAC0832产生矩形波,矩形波由高电平与低电平组成/*#include#define u
30、char unsigned char#define uint unsigned int#define DAdata P0sbit DA_S1=P20;/控制DAC0832的8位输入寄存器,仅当都为0时,/可以输出数据(处于直通状态);否则,输出将被锁存sbit DA_S2=P21;/控制DAC0832的8位DAC寄存器,仅当都为0时,/可以输出数据(处于直通状态);否则,输出将被锁存/=1ms延时子函数=void delay(int x)int k;for(k=0;k0;c-)for(b=142;b0;b-)for(a=2;a0;a-);/=DA输出子函数=void DAout(uchar temp)DAdata=temp;DA_S1=0;/打开8位输入寄存器DA_S1=1;/关闭8位输入寄存器void main()uchar i;i=0;DAdata=0;DA_S1=0;/打开8位输入寄存器DA_S2=0;/使DAC寄存器处于直通状态/*矩形波发生函数*while(1)i=0 xff;DAout(i);delay();i=0 x00;DAout(i);delay();28产生矩形波电路如图12-7所示图12-10 示波器显示矩形图形29