一、DA转换器的分类
权电阻网络D/A转换器
一个多位二进制数中每一位的1所代表的数值大小称为这一位的权。

对于N位的权电阻网络D/A转换器,当反馈电阻为Rf=R/2时,输出电压的计算公式为:
其中,V0为输出电压,VREF为参考电压,d为模拟量每位的值,2^n^为位权。
权电阻网络D/A转换器的优点:简单。
权电阻网络D/A转换器的缺点:电阻值相差大,难以保证精度,且不宜于集成在IC内部。
倒T形电阻网络D/A转换器

倒T形电阻网络D/A转换器较为常用,ADC0832就是采用了倒T形电阻网络。
倒T形电阻网络D/A转换器的优点:有较高的转换速度。
倒T形电阻网络D/A转换器的缺点:转换误差较大,转换精度较低。
具有双极性输出的D/A转换器

通过偏移电流可以获得双极性输出的D/A转换器。
二、D/A转换器主要参数指标
1.分辨率
分辨率为D/A转换器模拟输出电压可能被分离的等级数。
n位的D/A转换器分辨率为:
2.误差
与A/D转换器类似,分为非线性误差,绝对精度等。
3.建立时间
指输入数字量变化时,输出电压变化到相应稳定电压值所需要时间。
4.转换速率
大信号工作状态下模拟电压的变化率。
5.温度系数
输入不变时,输出模拟电压与温度的变化量。
三、DAC0832
概况
DAC0832是采用T型解码网络的8位D/A转换器,转换时间为1μs,工作电压为+5V~+15V,共有20个引脚。
1.引脚详情

| 引脚 |
名称 |
解释 |
| 1 |
|
片选信号输入端,低电平有效 |
| 2 |
|
输入寄存器的写选通输入端,负脉冲有效 |
| 3 |
AGND |
模拟地 |
| 4-7 |
DI3-DI0 |
数据输入端 |
| 8 |
VREF |
基准电压输入端 |
| 9 |
Rfb |
反馈电阻端 |
| 10 |
DGND |
数字地 |
| 11 |
IOUT1 |
电流输出端,,当输入全为1时Iout1最大 |
| 12 |
IOUT2 |
电流输出端,与IOUT1端电流和为常数 |
| 13-16 |
DI7-DI14 |
数据输入端 |
| 17 |
|
数据传输控制信号输入端,低电平有效 |
| 18 |
|
DAC寄存器的写选通输入端,负脉冲有效 |
| 19 |
ILE |
数据锁存允许信号输入端,高电平有效 |
| 20 |
Vcc |
电源电压端口 |
2.时序图

3.例程:D/A转换制作呼吸灯
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| #include <reg52.h> typedef unsigned int u16; typedef unsigned char u8;
sbit dula=P2^6; sbit wela=P2^7; sbit dawr=P3^6; sbit dacs=P3^2; sbit beep=P2^3;
u8 val = 0,flag = 0;
void DA_Init(); void DA_led(); void delay(u16);
void main() { DA_Init(); while(1) { DA_led(); } } void DA_Init() { dula=0; wela=0; dacs=0; dawr=0; P0=0x00; } void DA_led() { if(flag==0) { val+=5; P0=val; if(val==255) { flag=1; beep=0; delay(100); beep=1; } delay(50); } else { val-=5; P0=val; if(val==0) { flag=0; beep=0; delay(100); beep=1; } delay(50); } } void delay(u16 ms) { u16 i,j; for(i=ms;i>0;--) for(j=110;j>0;j--); }
|
三、PWM
含义
- PWM一种以数字方式控制模拟电路的方式。
- 占空比是指在一个脉冲循环内,通电时间相对于总时间所占的比例。

例程:定时器制作呼吸灯
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| #include "reg52.h" typedef unsigned int u16; typedef unsigned char u8;
sbit PWM=P2^1; bit DIR = 1000;
u16 value,time,count;
void Timer1_Init(); void breatheLED();
void main() { Timer1_Init(); while(1) { breatheLED(); } }
void Timer1_Init() { TMOD|=0X10; TH1 = 0xff; TL1 = 0xff; ET1=1; EA=1; TR1=1; }
void breatheLED() { if(count>100) { count=0; if(DIR==1) { value++; } if(DIR==0) { value--; } }
if(value==1000) { DIR=0; } if(value==0) { DIR=1; } if(time < value) { PWM=1; } else if(time > 1000) { time = 0; } else { PWM=0; } }
void Time1(void) interrupt 3 { TH1 = 0xff; TL1 = 0xff; time++; count++; }
|