欢迎光临散文网 会员登陆 & 注册

STM32Cubev6 PWM-DAC

2021-02-15 00:04 作者:僚机Wingplane  | 我要投稿

工作环境:

STM32CubeMXv6

Keil5

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

公式 1

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

公式 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

STM32Cubev6 PWM-DAC的评论 (共 条)

分享到微博请遵守国家法律