01缘起
1.为什么讨论电子电位器?
为什么要讨论使用一个DAC
来作为一个电位器呢?这里面主要原因如下:
- 使用电位器可以很方便在信号源的驱动下形成一个幅值可以调节的交流信号源。这比起使用通常的可编程直流电源,或者DAC输出电压来说,输出的是幅度可以变的交流信号源,可以用于很多的自动测量环节。
- 为什么不直接使用
机械电位器
来改变信号源的幅值呢?还是一个原因,那就是自动可编程改变信号的幅值。 - 现在有数字电位器,比如
X9C102,X9C103,X9C104
,AD5272
等,为什么不使用它们来实现对交流信号源
进行幅值改变呢?这里面一个主要原因就是器件的频带宽度1的问题。相比于机械电位器,这些电子电位器(变阻器)都具有相对较窄的工作频带宽度,对于高频信号不适合。
▲ 重要的人,不能够忘记的人,不想忘记的人,你是谁?
2.为什么使用DAC做电位器?
- DAC用作电位器改变交流信号原理是什么?
- 使用DAC来分压交流信号的优点是什么?
- 是否能够克服前面数字电位器的频带过窄的问题?
利用DAC当做电位器来改变交流信号的幅值,相关的讨论可以通过 What is the Multiplying DAC? 来看到。
写这些话的时候,我还不知道具体答案,下面就通过实验来验证一下吧。
02搭建基础实验电路
最近,刚刚购买了几片16bit的DAC芯片DAC8830IDR
(价格6.6),具有SPI接口,基于该DAC来验证一下前面的思路的可行性。
1.实验电路设计
由于DAC8830使用SPI接口来设置输出电压,使用STC8G1K(SOP16)作为控制器来完成对它的信号控制。
1)SCH 2
▲ 原理图设计
2)PCB
对于实验原理图进行LAYOUT,尽可以满足单面PCB板制作的工艺要求。快速制版之后得到对应的实验电路板。
▲ 实验电路板的PCB设计
2.MCU软件编程3
1) DA8830访问子程序
使用STC8G的SPI端口对DA8830进行访问。根据DA8830的SPI读写时序,相应的DAC8830写入转换(16bit)数据的子程序为:
void DAC8830Set(unsigned int nDAC) {
OFF(DAC8830_CS);
SPISendChar((unsigned char)(nDAC >> 8));
SPISendChar((unsigned char)nDAC);
ON(DAC8830_CS);
}
▲ DA8830的SPI读写时序
对应的DA8830的CS,SPK的波形为:
▲ 示波器观察到DA8830的CS,CLK的波形
从上面波形可以看出,DAC8830Set()函数的执行时间在STC8G1K17(35MHz)执行中的时间大约为3 。
在静态下,通过两个
电阻组成的参考电压分压电路,生成大约2.5V的参考电压。实际测量电压为:
。
根据DA8830数据手册,DAC8830的参考电压输入阻抗大约为:
。因此,理论计算所得到的参考电压为:
这个数值比起前面实际测量得到的
要大,这说明对应的DA8830的参考电压管脚的阻抗比起
还要小。
为了便于测量数据波形,调用DA8830Set()函数中的输入参数为
。那么输出电压计算值应该为:
实际测量DA8830的输出电压为:
。
2) 输出电压波形
▲ 每1ms写入DAC8830递增数据的CS,DI数据波形
写入递增的数据,输出波形。
for(;;) {
WaitTime(1);
//----------------------------------------------------------------------
DAC8830Set(nShowCount);
nShowCount += 0x200;
//----------------------------------------------------------------------
}
此时Dout输出递增的锯齿波形。
▲ 输出递增的锯齿波形
03参考电压对DAC输出信号的影响
下面经过几组实验,来验证DAC的参考电压对于输出信号的影响。
1.参考电压的有效范围
在DAC8830的数据手册中,对于参考电压的输入范围给定的是1.25V ~ Vpp。下面通过一组实验来测试实际的有效输入参考电压范围:
下面通过在某一给定的DAC8830的设置下,给定Vref,测量对应的实际输出。下面依次在给定0x7fff(半量程),0xffff(全量程)以及0xfff下输出电压与参考电压之间的关系。
▲ DAC8830Set(0x7fff)时的Vref与Vout之间的关系
ref=[0.00,0.10,0.21,0.31,0.41,0.51,0.61,0.72,0.82,0.92,1.02,1.12,1.22,1.33,1.43,1.53,1.63,1.73,1.84,1.94,2.04,2.14,2.24,2.35,2.45,2.55,2.65,2.75,2.85,2.95,3.06,3.16,3.26,3.36,3.46,3.56,3.66,3.77,3.87,3.97,4.07,4.17,4.28,4.38,4.48,4.58,4.68,4.78,4.89,4.99]
out=[0.00,0.05,0.10,0.16,0.21,0.26,0.31,0.36,0.41,0.46,0.51,0.56,0.61,0.66,0.71,0.77,0.82,0.87,0.92,0.97,1.02,1.07,1.12,1.17,1.22,1.27,1.32,1.37,1.42,1.47,1.53,1.58,1.63,1.68,1.73,1.78,1.83,1.88,1.93,1.98,2.03,2.08,2.13,2.18,2.23,2.29,2.34,2.39,2.44,2.49]
▲ DAC8830Set(0xffff)时的Vref与Vout之间的关系
ref=[0.00,0.10,0.21,0.31,0.41,0.51,0.61,0.72,0.82,0.92,1.02,1.12,1.22,1.33,1.43,1.53,1.63,1.73,1.84,1.94,2.04,2.14,2.24,2.34,2.44,2.55,2.65,2.75,2.85,2.95,3.05,3.15,3.25,3.36,3.46,3.56,3.66,3.76,3.86,3.96,4.07,4.17,4.27,4.37,4.47,4.57,4.68,4.78,4.88,4.98]
out=[0.01,0.11,0.21,0.31,0.41,0.51,0.62,0.72,0.82,0.92,1.02,1.12,1.22,1.33,1.43,1.53,1.63,1.73,1.83,1.93,2.04,2.14,2.24,2.34,2.44,2.54,2.64,2.74,2.84,2.94,3.04,3.15,3.25,3.35,3.45,3.55,3.65,3.75,3.85,3.96,4.05,4.16,4.26,4.36,4.46,4.56,4.66,4.76,4.87,4.97]
▲ DAC8830Set(0xfff)时的Vref与Vout之间的关系
ref=[0.00,0.10,0.21,0.31,0.41,0.51,0.61,0.72,0.82,0.92,1.02,1.12,1.23,1.33,1.43,1.53,1.63,1.74,1.84,1.94,2.04,2.14,2.24,2.35,2.45,2.55,2.65,2.75,2.85,2.95,3.05,3.15,3.25,3.36,3.46,3.56,3.66,3.76,3.86,3.97,4.07,4.17,4.27,4.37,4.47,4.57,4.68,4.78,4.88,4.98]
out=[0.00,0.01,0.01,0.02,0.03,0.03,0.04,0.05,0.05,0.06,0.07,0.07,0.08,0.08,0.09,0.10,0.10,0.11,0.12,0.12,0.13,0.13,0.14,0.15,0.15,0.16,0.17,0.17,0.18,0.19,0.19,0.20,0.20,0.21,0.22,0.22,0.23,0.24,0.24,0.25,0.26,0.26,0.27,0.27,0.28,0.29,0.29,0.30,0.31,0.31]
下面是将前面三种不同设置下的输出电压与参考电压之间的关系绘制在一起。从图中可以看到,实际上,DA8830的参考电压对于输出电压的等比例的影响范围是在整个的工作电压(0~5V)之内都有效。
▲ 将三种不同设置下的参考电压与输出电压绘制在一起
2.输入交变的参考电压
1)在Vref加入交流电压波形
在Vref中加入100Hz左右正弦波,设置DAC8830转换值为0x7fff,输出的电压波形如下图所示。可以看到输出(Blue)的电压波形等于Vref(Cyan)的一半。
▲ DAC8830的Dout(Cyan)与Vref(Blue)的波形
当设置为0xffff的时候,输入的波形就与输入一致了。
▲ DAC8830的Dout(Cyan)与Vref(Blue)的波形
2)输入高频方波波形
为了测试从Vref到Vout之间的频带宽度,在Vref中加入高频方波信号,观察输出的Vout的信号。
▲ 加入高频方波信号Vref(Blue)观察输出信号Vout(Cyan)
将波形再次展开,观察输出的过渡过程。
展开波形,对比输入输出波形,可以观察到Vref到Vout之间的带宽应该超过1MHz。按照DAC8830数据手册上关于参考电压 -3dB带宽的参数,典型值为1.3MHz。
▲ 加入高频方波信号Vref(Blue)与输出信号Vout(Cyan)波形
3.使用DAC对交流信号进行调幅
下面将固定的交流电压(有直流分量,使得信号始终大于零)施加在Vref,测量Vout随着DAC8830的设置值的变化情况。
施加的电压频率
,幅值
。
输出电压值如设置数值之间的关系为:
▲ 输出电压值与设置值之间的关系
可以看到整体上输出与设置值之间的关系呈现非常好的线性关系。
注意到在曲线的一开始似乎有一些略微的非线性。下面重新采集设置值范围在(0,0x3ff)范围内的输出电压与设置值之间的关系曲线。
▲ 输出电压值与设置值之间的关系
可以看到在起始的时候,由于系统存在噪声,使得输出的电流电压与设定值之间存在一定的非线性。当理论输出电压小于系统地线上的噪声电压时,使用交流万用表测量得到的数值就会偏大。
下面重新对频率为 的信号测量输出电压与设定值之间的关系。结果与1kHz的情形相同。只是输出整体的增益下降了。
▲ 输出电压值与设置值之间的关系
增益变化了9%左右。
4.信号超量程
当输入信号的幅值超过DAC8830d的工作电压,或者低于0V,输出都会出现截止。
▲ 输入信号超过+5V,低于0V的情况
结论
通过前面的实验,可以看到,使用DAC8830来当做电位器获得幅度可变的交流信号源是可行的。它具有很宽的信号带宽,并且输出信号的幅值与设置信号之间具有非常好的线性关系,只是在信号比较小的时候输出会受到系统和芯片本身的噪声影响。
当输入信号超出了DAC8830的工作电压,或者低于0V时,输出信号都会截止。所以在使用的时候,需要通过一定的信号偏置的方式将交流信号平移到始终在0~5V(DAC8830工作电压)范围之后进行调试,然后可以再通过隔直电容去掉信号中的偏移量。