STM32Cubev6 PWM-DAC
工作环境:
STM32CubeMXv6
Keil5
有时候,单片机自带的DAC可能不够用,需要多路DAC外扩DAC成本又会高不少。此时,我们可以利用PWM+简单的无源RC滤波来实现DAC输出,从而节省成本。在精度要求不是很高的时候,PWM+无源RC滤波的DAC输出方式,是一种非常廉价的解决方案。PWM本质上其实就是是一种周期一定,而高低电平占空比可调的方波。PWM波的波形可以通过分段函数表示为公式1:

其中:T是单片机中计数脉冲的基本周期,也就是单片机定时器的计数频率的倒数。N是PWM波一个周期的计数脉冲个数,也就是单片机的ARR-1 的值。n是PWM波一个周期中高电平的计数脉冲个数,也就是单片机的CCRx的值。VH 和 VL 分别是 PWM 波的高低电平电压值,k为谐波次数,t为时间。我们将1式展开成傅里叶级数,得到公式2:

从2式可以看出,式中第1个方括弧为直流分量,第2项为1次谐波分量,第3项为大干1次的高次谐波分量式2中的直流分量与成线性关系,并随着,从0到N.直流分量从VL到VL+VH之间变化。这正是电压输出的DAC所需要的。因此,如果能把式2中除直流分量外的谐波过滤掉,则可以得到从PWM波到电压输出DAC的转换,即:PWM 波可以通过一个低通滤波器进行解调式2中的第2项的幅度和相角与n有关,频率为1/(NT)其实就是PWM的输出频率。该频率是设计低通滤波器的依据。如果能把1次谐波很好过滤掉,则高次谐波就应该基本不存在了。
假设n的最小变化为1,当N=65536的时候,分辨率就是16位。而stm32单片机的定时器大部分都是16位的,可以很容易得到这么高的分辨率,要注意的是分辨率越高,速度就越慢。
在16位分辨条件下,我们一般要求1次谐波对输出电压的影响不要超过1个位的精度也就是3.3/65536=0.00005035400390625V。
假设VH为3.3V,VL为0V,那么一次谐波的最大值是2*3.3/15=0.44V,这就要求我们的RC滤波电路提供至少-20lg(0.44/0.00005035400390625)=-78dB的衰减。
STM32F722的定时器最快的计数频率是216Mhz,某些定时器只能到108M,所以我们以108M频率为例,16位分辨率的时候,PWM频率为108M/65535=1.648Khz。如果是1阶RC 滤波,则要求截止频率0.6hz,如果为2阶RC 滤波,则要求截止频率为8hz。二阶RC滤波截止频率计算公式为:f=1/2πRC。
PWM输出的相关配置可以参照这篇文章配置

还有一个方便RC截止频率计算的计算器网址:http://www.elecfans.com/tools/rclvboqijiezhipinlv.html
在实际的生产环境中,我们常用的电阻电容多为10、3.3、4.7等及相应整数倍。为了满足要求选择了100kΩ、1μF和10kΩ、10μF的RC组成截止频率为1.6hz的二阶低通滤波器。


另外如果需要对DAC调节的实时性有所要求的话,随着电阻电容的增大,时延也会增加,所以还需要考虑对应的时间常数。(影响不大,最主要的还是分辨率上升的影响)
RC时间常数计算器网址:http://www.elecfans.com/tools/RCshijianchangshu.html

参考资料:
STM32F7开发指南-HAL库版本_V1.1