微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > D/A: 基于STC89C52与DAC0832的D/A设计详解

D/A: 基于STC89C52与DAC0832的D/A设计详解

时间:11-22 来源:互联网 点击:
一. 硬件设计详解


1) D/A转换原理

数字量是用二进制代码按数位组合起来表示的,对于有权码,每位代码都有一定的权。为了将数字量转换

成模拟量,必须将每1位的代码按其权的大小转换成相应的模拟量,然后将这些模拟量相加,即可以得到与

数字量成正比的总模拟量,从而实现数模转换

2) D/A转换器类型

D/A转换器包括权电阻网络D/A转换器,倒T形电阻网络D/A转换器,具有双极性输出的D/A转换器。

3) D/A转换器的参数指标

a. 分辨率

D/A转换器模拟输出电压可能被分离的等级数。n位D/A转换器的分辨率可表示为1/(2的n次方-1)

b. 转换误差

表示D/A转换器实际输出的模拟量与理论输出模拟量之间的差别。

c. 建立时间

输入数字量变化时,输出电压变化到相应稳定电压值所需时间。

d. 转换速率

大信号工作状态下模拟电压的变化率。

e. 温度系数

输入不变的情况下,输出模拟电压随温度变化产生的变化量。

一般用满刻度输出条件下温度每升高1度,输出电压变化的百分数作为温度系数。

4) DAC0832说明

a. 引脚图


/CS - 片选信号输入端,低电平有效

/WR1 - 输入寄存器的写选通输入端,负脉冲有效(脉冲宽度应大于500ns). 当CS为0,ILE为1,WR1有效时

DI0~DI7状态被锁存到输入寄存器。

DI0~DI7 - 数据输入端,TTL电平,有效时间应大于90ns.

Vref - 基准电压输入端,电压范围为-10V~+10V

Rrb - 反馈电阻端,芯片内部此端与Iout1接有一个15k欧姆的电阻。

Iout1 - 电流输出端,当输入全1时,其电流最大。

Iout2 - 电路输出端,其值与Iout1端电流之和为一常数。

/XFER - 数据传输控制信号输入端,低电平有效

/WR2 - DAC寄存器的写选通输入端,负脉冲有效(脉冲宽度应大于500ns).当XEFR为0且WR2有效时,

输入寄存器的状态被传到DAC寄存器中。

ILE - 数据锁存允许信号输入端,高电平有效。

Vcc - 电源电压端,电压范围+5V~+15V

GND - 模拟地和数字地,模拟地为模拟信号与基准电源参考地;数字地为工作电源地与数字逻辑地

(两地最好在基准电源处一点共地)

b. dac0832操作时序图


/cs为低电平后,数据总线上数据才开始保持有效,然后再将/WR置低,从Iout1线上可看出,在/WR置地ts后

D/A转换结束,Iout输出稳定。若只控制完成一次转换的话,接下来将/WR和/CS拉高即可,若连续转换则

只需要改变数字端输入数据。

二. 实例详解

实例1:用单片机控制DAC0832芯片输出电流,让发光二极管D12(D12与数据输出接口相连,

即DA转换的结果可以通过D12反应出来)由灭均匀变到最亮,再由最亮均匀熄灭,完成这个周期时间控制在5s左右,循环变化。

程序模块说明:

DA

程序源码:

#include

#define uchar unsigned char

#define uint unsigned int

sbit dula = P2 ^ 6;

sbit wela = P2 ^ 7;

sbit dawr = P3 ^ 6;

sbit dacs = P3 ^ 2;

void delayms(uint xms);

void main()

{

uchar val, flag;

dula = 0;

wela = 0;

dacs = 0;

dawr = 0;

P0 = 0;

while (1)

{

if (flag == 0)

{

val += 5;

P0 = val;

if (val == 255)

{

flag = 1;

}

delayms(50);

}

else

{

val -= 5;

P0 = val;

if (val == 0)

{

flag = 0;

}

delayms(50);

}

}

}

void delayms(uint xms)

{

uint i, j;

for (i = xms; i > 0; i--)

for (j = 110; j > 0; j--)

;

}

程序小结:

1)标志位flag判断单片机执行灯变亮程序还是变暗。

2) val += 5; val -= 5 实现数据的均匀变化。

3) 延时计数, 255共有51个5,每次延时50ms,共计50*51=2551ms,即半个周期为2.5s, 那么一个周期刚好约5s.

4) P0用于向DAC0832送入数据。

5) dula = 0; wela = 0关闭数码管段选,位选,防止P0送入的数据影响到数码管。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top