· 有关 D/A,A/D的基本概念
DAC及其接口
ADC及其接口
A/D,D/A应用举例本章内容
了解微机控制系统的一般组成
了解 D/A,A/D的基本原理
了解 DAC,ADC的主要性能指标
掌握 DAC,ADC与 CPU的接口及其应用学习目的
13.1 D/A与 A/D接口概述一、一个典型的计算机自动控制系统数 /模( D/A) 和模 /数( A/D) 转换技术主要用于计算机实时控制和自动测量系统中。在工业控制和参数测量时,经常会遇到如温度、压力、流量等连续变化的物理量(通称模拟量)。用计算机处理这些模拟量必须先将其转换为电信号,然后再经 A/D转换器将其转换为数字量。对于大多数的被控对象,计算机加工处理后输出的数字形式控制信号还应经 D/A转换变成模拟量。才能推动执行机构工作。
一个包含 A/D和 D/A转换的计算机闭环自动控制系统如下图所示生产过程传感器执行机构
A/D
转换器
I/O
接口 计算机
D/A
转换器
I/O
接口图 13.1 典型的计算机自动控制系统二、模 /数转换器 (ADC)的主要性能参数
1,分辨率 ( Resolution)
它表明 A/D对模拟信号的分辨能力,由它确定能被
A/D辨别的最小模拟量变化 。
2,量化误差( Quantizing error)
在 A/D转换中由于整量化产生的固有误差。量化误差在± 1/2LSB( 最低有效位)之间。
一个 8位的 A/D转换器,它把输入电压信号分成 28=256层,
若它的量程为 0~5V,那么,量化单位 q为:
q = = ≈0.0195V=19.5mV
n2
电压量程范围 2560.5 V
例如
3,转换时间( Conversion time)
转换时间是 A/D完成一次转换所需要的时间。一般转换速度越快越好,常见有高速(转换时间 <1us),中速(转换时间 <1ms) 和低速(转换时间 <1s) 等。
4,绝对精度对于 A/D,指的是对应于一个给定量,A/D转换器的误差,其误差大小由实际模拟量输入值与理论值之差来度量。
5,相对精度对于 A/D,指的是满度值校准以后,任一数字输出所对应的实际模拟输入值(中间值)与理论值(中间值)之差。
例如,对于一个 8位 0~+5V的 A/D转换器,如果其相对误差为 1LSB,则其绝对误差为 19.5mV,相对误差为 0.39%。
三、数 /模转换器 (DAC)的主要性能参数
1,分辨率 ( Resolution)
分辨率表明 DAC对模拟量的分辨能力,它是最低有效位( LSB) 所对应的模拟量,它确定了能由 D/A产生的最小模拟量的变化。通常用二进制数的位数表示 DAC
的分辨率,如分辨率为 8位的 D/A能给出满量程电压的
1/28的分辨能力,显然 DAC的位数越多,则分辨率越高。
2,线性误差( Linearity error)
D/A的实际转换值偏离理想转换特性的最大偏差与满量程之间的百分比称为线性误差。
3,建立时间( Setting time)
这是 D/A的一个重要性能参数,定义为:在数字输入端发生满量程码的变化以后,D/A的模拟输出稳定到最终值
± 1/2LSB时所需要的时间。
4,温度灵敏度它是指数字输入不变的情况下,模拟输出信号随温度的变化。一般 D/A转换器的温度灵敏度为± 50PPM/℃ 。
PPM为百万分之一。
5,输出电平不同型号的 D/A转换器的输出电平相差较大,一般为
5V~10V,有的高压输出型的输出电平高达 24V~30V。
13.2 DAC0832数 /模转换器一,DAC0832的内部结构与引脚图图 13.2 给出了 DAC0832的内部结构。
图 13.3 给出了 DAC0832的引脚图。
DAC0832是一种相当普遍且成本较低的数 /
模转换器。该器件是一个 8位转换器,它将一个
8位的二进制数转换成模拟电压。
ILE
CS
WR1
XFER
WR2
D0 Q0
D1 Q1
D2 Q2
D3 Q3
D4 Q4
D5 Q5
D6 Q6
D7 Q7
G
D0 Q0
D1 Q1
D2 Q2
D3 Q3
D4 Q4
D5 Q5
D6 Q6
D7 Q7
G
D/AD0
D1
D2
D3
D4
D5
D6
D7
VREF
IOUT2
IOUT1
RFB
锁存器 1 锁存器 2 转换器图 13.2 DAC0832的内部结构图 13.3 DAC0832引脚图
7
20
3
12
11
81
CS VREF
WR1
RFB
D0
D1
D2
D3
D4
D5
D6
D7
XFER
ILE VCC
DGND AGND
2
18
9
6
5
4
16
15
14
13
19
10
17
IOUT2
IOUT1
DAC0832
WR2
各引脚的功能如下:
D0~D7,8位数据输入端 。
CS,片选信号输入端 。
WR1,WR2,两个写入命令输入端,低电平有效 。
XFER,传送控制信号,低电平有效 。
IOUT1和 IOUT2,互补的电流输出端 。
RFB,反馈电阻,被制作在芯片内,与外接的运算放大器配合构成电流 /电压转换电路。
VREF,转换器的基准电压。
VCC,工作电源输入端。
AGND,模拟地,模拟电路接地点。
DGND,数字地,数字电路接地点 。
,反馈电阻,被制作在芯片内,与外接的运电压转换电路。
,转换器的基准电压。
,工作电源输入端。
,模拟地,模拟电路接地点。
:,数字电路接地点 。
(1) 直通方式二,DAC0832 的工作方式
DAC0832可工作在三种不同的工作模式,
当 ILE接高电平,CS,WR1,WR2和
XFER都接数字地时,DAC处于直通方式,
8位数字量一旦到达 D0~D7输入端,就立即加到 D/A转换器,被转换成模拟量。
(2)单缓冲方式单缓冲方式是将一个锁存器处于缓冲方式,
另一个锁存器处于直通方式,输入数据经过一级缓冲送入 D/A转换器 。
(3) 双缓冲方式即数据通过两个寄存器锁存后再送入 D/A转换电路,执行两次写操作才能完成一次 D/A转换。
三,DAC0832与 CPU的连接由于 DAC0832内部含有数据锁存器,在与 CPU相连时,使其可直接挂在数据总线上。
DAC0832采用单缓冲方式与 CPU的连接如图 13.4所示。
I1
I2
I3
I4
I5
I6
I7
I8
I9
I10
O1
O2
O3
O4
O5
O6
O7
O8
GAL16V8
WR
A0
A1
A2
A3
A4
A5
A6
A7
M/IO
+5V 10K
20H
CS
WR1
WR2
DGND
D0~D7 D0~D7
ILE
XFER
VREF
IOUT1
IOUT2A
GND
_
+
RFB
LM741
+5V
U0
DAC0832
图 13.4 DAC0832与 CPU的单缓冲方式连接电路下面举例说明如何编写 D/A转换程序。
例编写图 13.4中 DAC0832输出三角波的汇编程序,要求三角波的最低电压为 0V,
最高电压为 2.5V。
分析,三角波电压范围 0~2.5V,对应的数字量
00H~7FH。 三角波的下降部分,从 7FH
减 1,直到数字量降为 00H; 上升部分则从 00H加 1,直到 7FH。
相应的程序如下:
MOV AL,7FH ;设 2.5V初值
DOWN,OUT 20H,AL ;输出模拟信号到端口 20H,三角波下降;段
DEC AL ;输出值减 1
CMP AL,00H ;输出值到达 0V?
JNZ DOWN ;输出值未达到 0V,则跳到 DOWN
UP,OUT 20H,AL ;输出模拟量到端口 20H,三角波上升段
INC AL ;输出值加 1
CMP AL,7FH ;判别输出值是否到达 2.5V
JNZ UP ;输出值未达到 2.5V则跳到 UP
JMP DOWN ;输出值达到 2.5V则跳到 DOWN循环。
本例中 DAC0832输出的三角波如图 13.5所示。
若 8086的时钟频率为 5MHz,则可计算出该三角波的周期大约为 1.53ms,即频率约为 654Hz。 如果要进一步降低三角波的频率(增大其周期),
可在每次 D/A转换之后加入适当的延时。
图 13.5 DAC0832输出的三角波形图
13.3 ADC0809模 /数转换器一,ADC0809的内部结构与引脚图
ADC0809是一种普遍使用且成本较低的
CMOS材料 A/D转换器。它具有 8个模拟量输入通道,可将模拟量转换为 8位二进制数字量。
图 13.6 给出了 ADC0809的内部结构。
图 13.7 给出了 ADC0809的引脚图。
图 13.6 ADC0809转换器的内部结构图
EOC OE
D0
D7
REF(+) REF(-)
ADDC
ADDB
ADDA
ALE
IN0
IN7
比较器通道选择开关 逐位逼近寄存器 (SAR)
开关树型
D/A
8位锁存和三态门定时和控制通道地址锁存及译码模拟输入数字输出
START
图 13.7 ADC0809的引脚图
10CLOCK
D0
D1
D2
D3
D4
D5
D6
D7
ADDA
ADDB
ADDC
EOC
OE
ALE
START
REF(+)
REF(-)
Vcc
GND
IN0
IN1
IN2
IN3
IN4
IN5
IN6
IN7
17
14
8
15
18
19
20
21
25
24
23
7
9
22
6
12
16
11
13
26
27
28
1
2
3
4
5
ADC0809
二,ADC0809与 CPU的连接
ADC0809与 CPU的连接,主要是正确处理数据输出线( D0~D7),启动信号 START
和转换结束信号 EOC与系统总线的连接问题。
图 13.8给出了 ADC0809与 CPU的典型连接图。
图 13.8 ADC0809与 CPU的连接图
300H~307H OE
ALE
START
IN0
IN7
ADDC
ADDB
ADDA
CLK
EOC
D7
D0
REF( -)
GND
500KHZ
REF +
Vcc
( )
+5V
A2
A1
8路模拟输入
IOR
IOW ADC0809
≥1
308H~30FH
D7
D0
A0
1
2

… …

≥1
I/O
译码
A9
A3 ≥1
下面举例说明如何编写 A/D转换程序。
例编写图 13.8中的 A/D转换程序,具体要求如下:
① 顺序采样 IN0~IN7 8个输入通道的模拟信号 ;
② 结果依次保存在 ADDBUF开始的八个内存单元中 ;
③ 上述采样每隔 100ms循环一次。设 DELAY
是一延时 100ms子程序。
分析,( 1)模拟输入通道 IN0~IN7由 A0~A2决定其端口地址,分别为 300H~307H,与 IOW相配合,
可启动 ADC0809进行转换;
( 2)查询端口和读 A/D转换结果寄存器的地址分别为,308H和 300H。
相应的采集程序如下:
AD,MOV CX,0008H ;通道计数单元 CX赋初值
MOV DI,OFFSET ADDBUF ;寻址数据区,结果保存;在 ADDBUF存储区
START,MOV DX,300H ;取 IN0启动地址
LOOP1,OUT DX,AL ;启动 A/D转换,AL可为;任意值
PUSH DX ;保存通道地址
MOV DX,308H ;取查询 EOC状态的端口;地址
WAIT,IN AL,DX ;读 EOC状态
TEST AL,80H ;测试 A/D转换是否结束
JZ WAIT ;未结束,则跳到 WAIT;处
MOV DX,300H ;取读 A/D转换结果寄存器的;端口地址
IN AL,DX ;读 A/D转换结果
MOV [DI],AL ;保存转换结果
INC DI ;指向下一保存单元
POP DX ;恢复通道地址
INC DX ;指向下一个模拟通道
LOOP LOOP1 ;未完,转入下一通道采样
CALL DELAY ;延时 100ms
JMP AD ;进行下一次循环采样,跳至;AD处 。
13.4 D/A与 A/D应用举例给出一个使用 ADC0809和 DAC0832来捕获和重放语音信号 的实例。
本例要求 ADC0809采样大约 1秒钟语音信号并保存到相应存储单元,D/A将此语音信号经扬声器重放 10次,然后循环进行上述采样和重放,直到系统关闭。
图 13.9 给出了相应得电路。
18
19
20
21
2
3
4
5
6
7
9
10
11
12
13
17
27
2F7H
2F6H
2F5H
2F0H
I1
I2
I3
I4
I5
I6
I7
I8
I9
I10
I11
I12
I13
O1
O2
O3
O4
AEN
IOW
IOR
A9
A8
A7
A6
A5
A4
A3
A2
A1
A0
U3
GAL20V8
11 12
24
25
23
16
7
6
22
9
2F6H
26
27
28
1
2
3
4
5
10
U2
VCC REF(+)
IN0
IN1
IN2
IN3
IN4
IN5
IN6
IN7
CLK
+5V
EOC
ADDA
ADDB
ADDC
OE
ALE
START

D0
D7 放大器 麦克风
500KHZ
D7
2F5H
D0
D1
D2
2F0H
GND REF(-)
13
+5V
D7
D0

74112
9
8
19
18
2
11

10 31 20
+12V
扬声器
-12V
+5V
2F7H
U1
17
DAC0832
ADC0809
CS
XFER
DGND AGND
RFB
IO UT2
VREF
WR2
WR1
ILE
IO UT1
D7
D0 -
+
图 13.9 A/D和 D/A与 CPU连接图分析
( 1) DAC0832的 I/O端口地址由 GAL20V8译码产生的地址是 2F7H; ADC0809的 EOC状态查询地址为
2F6H; 读 ADC0809转换结果端口地址为 2F5H; 启动 A/D转换端口地址为 2F0H。
( 2) 该程序读大约 1秒钟语音信号,然后重放 10次,
重复此进程直到系统被关闭 。 语音信号被采样存储在 VOICE存储区中,采样率为每秒钟采样 2048次 。
设 DELAY是延时 1/2048秒的子程序,且数据段中已申请 2048个单元给 VOICE。
相应的程序如下:
START,CALL READ ;调用 A/D采样语音子程序
MOV CX,0AH ;置为 10次
LOOP1,CALL WRITE ;调用 D/A放音子程序
LOOP LOOP1 ;重复放音 10次
JMP START ;进入下一次循环
READ PROC NEAR ;A/D语音采样子程序
MOV DI,OFFSET VOICE ;寻址数据区
MOV CX,0800H ;装入计数器 CX=2048
READA,MOV AL,00H ;选择 IN0通道,D2=0,;D1=0,D0=0
MOV DX,2F0H ;DX指向 A/D转换启动端口;地址
OUT DX,AL ;启动 A/D转换并选中 IN0通道
MOV DX,2F6H ;寻址 EOC状态端口地址
READB,IN AL,DX ;取 EOC状态
TEST AL,80H ;测试是否转换结束
JZ READB ;未完,则等待
MOV DX,2F5H ;寻址数据端口
IN AL,DX ;取 A/D转换结果
MOV [DI],AL ;存到数据区
INC DI ;寻址下一个单元
CALL DELAY ;等待 1/2048秒
LOOP READA ;重复 2048次
RET ;子程序返回
READ ENDP
WRITE PROC NEAR ;D/A语音重放子程序
PUSH CX ;CX压入堆栈
MOV DI,OFFSET VOICE ;寻址数据区
MOV CX,0800H ;装入计数器
MOV DX,2F7H ;寻址 DAC
WRITEA,MOV AL,[DI] ;从数据区取数据
OUT DX,AL ;发送到 DAC
INC DI ;寻址下一个单元
CALL DELAY ;等待 1/2048秒
LOOP WRITEA ;重复 2048次
POP CX ;CX弹出堆栈
RET ;子程序返回
WRITE ENDP