DA转换原理及实现
时间:2023-05-21 13:07:00
这一篇介绍D/A转换原理以及在TX-1C用另一个例子加深对接线方法(实现方法)的理解
D/A转换原理及参数指标
1.基本原理
数字量是二进制代码数位的组合,每个人都有一定的权重D/A如何以适当的方式表达这些权重是转换的关键
为了将数字量转换为模拟量,每个代码必须根据其权重大小转换为相应的模拟量,然后添加这些模拟量。D/A转换示意图如下:
也就是说,输入相应的二进制数来获得模拟量的输出,模拟量和数字量之间的对应关系作为三位转换可以用下图来表示。在右图中,D对应于相应的 V 0 V_0 V0
以下是集中介绍D/A转换器的思路大致相同,常用的有以下几类:
1.权电阻D/A转换
如果是n位二进制数 D n = d n ? 1 d n ? 2 d n ? 3 … d 1 d 0 D_n=d_{n-1}d_{n-2}d_{n-3}\dots d_1d_0 Dn=dn?1dn?2dn?…d1d0 来表示,那它从高位到低位的权重分别为 2 n − 1 2^{n-1} 2n−1 , 2 n − 2 … 2^{n-2}\dots 2n−2… 如果可以通过电阻阻值的不同来对各支路进行处理最后加和,应该是可以达到预期效果的。下来展示一个4位的权网络转换电路
这其中 d i d_i di 的值可以为0或1,表示开关的打开与闭合,之后通过一个求和放大器输出相应的模拟量
因为是反相放大器,故推导过程如下:
从推导过程可发现当 V R E F V_{REF} VREF 为正电压时最后导出的结果为负值。故在运用中向 V R E F V_{REF} VREF 导入负值就可。
这个电路的问题是电阻的值之间相差可能过大,可能会引起误差,另外开关应该也是有阻值的,也会带来分压的问题。下面是基于此问题的改进版电路
2.倒T形电阻D/A
这里只用了两种电阻R/2R,但通过并联分流同样实现了电流的加和
且此电路中的2R电阻均接地或虚地,这样做的的好处是流经2R电阻的电流与开关位置无关,是一个确定的值。通过进一步推导可得:
注意也要对模拟开关导通电阻的阻值做限制,不然会出现电流不准确的情况
3.权电流D/A(利用电流源)
倒T型D/A中一旦开关或电阻的阻值没有保持二倍关系,电流关系就会随之变化,不太稳定。采取进一步的改进方案
采用恒流源就可以避免电阻阻值对电路的影响
相应分析如下,可发现输出量是正比于输入的数字量的
4.双极性输出D/A
考虑到在实际情况中常把二进制数转换为补码的形式,则若把原码输入后对应的数再转换为转化为补码时偏移的输出就更完善了。对应关系如下
且由于之前的电路只能单极输出,不满足现在的需求,可通过在运放负极加一个带有 V B ( + ) V_B(+) VB(+)和R的偏置电路解决。下面引出的 V R E F ( − ) V_{REF}(-) VREF(−) 当然是负的,这样就能实现原码转化为补码并双极输出
电路图如下:
D/A的参数指标与A/D相差不大,在此不作赘述
DAC0832的工作原理以及实现方法
因采取电流输出方式,有 I o u t 1 I_{out1} Iout1 和 I O U T 2 I_{OUT2} IOUT2 两个输出接口,引脚分布图如下:
出现了两个新的引脚 X F E R ‾ \overline{XFER} XFER 和 I L E ‾ \overline{ILE} ILE
X F E R ‾ \overline{XFER} XFER 为数据传输控制信号输入端, I L E ILE ILE 为锁存允许段,另外 R f b R_{fb} Rfb 为反馈电阻端,与 I o u t 1 I_{out1} Iout1 端接有一电阻。看看手册上的接线,大概清楚除了数据总线外还要把哪些端口与控制总线相连
其内部结构如下图,可看到 C S ‾ \overline{CS} CS 和 W R 1 ‾ \overline{WR1} WR1 相与后再和ILE相与接至锁存器,故这个输入锁存器应当拥有三态功能,且三个接口都有效时才能传送数据。关注DAC寄存器上的连接线, X F E R ‾ \overline{XFER} XFER 起到了控制另外一个写入端的作用。
TX-1C实验板上将DAC外围电路接为直通方式(其可以双缓冲,单缓冲或者直通),同样的道理,我们需要研究它的接线以及操作时序图
操作时序图相较于A/D的改变就是将 V 0 V_0 V0 换为了 I o u t I_{out} Iout ,且多了ILE锁存允许的引脚,其余相同
现用一道例题来融会贯通所学知识
分析:1.需要用sbit定义蜂鸣器,dula,wela,以及 W R ‾ \overline{WR} WR , C S ‾ \overline{CS} CS 的引脚
2.蜂鸣器的警报用高低电平控制,则发光二极管D12流程为灭 → \rightarrow →亮 → \rightarrow →灭 两个过程各需要2.5s
3.又说是均匀点亮/熄灭,则考虑找一个步进,定义好中间变量且将系统初始化后,用大循环分别对这两种情况进行处理(灭 → \rightarrow →亮/亮 → \rightarrow →灭 )
4.对于步进n要有一个计算,之后需要delayms(2500ms/n)
具体程序如下:
#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;//CS端口
sbit beep=P2^3;//蜂鸣器端口
void delayms(uint xms)
{
uchar i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void main()//用标志位简化问题
/*一来一回5s 说明单程2.5s 用50ms*51刚好可以解决。 故由灭变亮变量一次+5 延时50ms 由亮变灭变量一次-5 延时50ms*/
{
uchar flag,val;
dula=0;
wela=0;
dacs=0;
dawr=0;
P0=0;
while(1)//构造大循环
{
if(flag==0)
{
val+=5;
P0=val;//通过P0给DA数据口赋值
if(val==255)
{
flag=0;
beep=0;
delayms(100);
beep=1;
}
delayms(50);
}
else{
val-=5;
P0=val;
if(val==0)
{
flag=1;
beep=0;
delayms(100);
beep=1;
}
delayms(50);
}
}
}
``
今天就到这里,下午上课。加油!