上一节介绍了STM32定时器产生PWM波的用法,PWM波有很多种用途,如控制LED的亮度,控制电机的转速等。还有一个常用的功能就是做DAC(数模转换器)用。有时候,项目中可能会需要输出多路电压信号,而外部的多路DAC芯片会增加不少成本,如果对输出信号的精度等要求不高,这时可以用PWM➕➕加低通滤波器的方式实现DAC的功能。

原理

    根据PWM的波形,可以用分段函数来表示:

STM32定时器输出PWM做DAC_单片机PWM函数表达式

    将该函数展开为傅里叶级数,可以得到:

STM32定时器输出PWM做DAC_低通滤波器_02PWM波函数展开傅里叶级数

    可以看到,上式中的第一项为直流分量,第二项为一次谐波,第三项为高次谐波的和。用低通滤波器将谐波部分滤掉后,只剩直流分量,即为需要输出的电压值。直流分量的电压取决于n的变化,当n从0变化到N时,对应的电压值为VL变化到VH。

STM32设计

    对于STM32来说就是占空比0~100%对应电压0~3.3V(电源电压)。因此DAC的电压分辨率就等于占空比的分辨率,占空比的调节范围为0~Period(计数周期),Period越大,分辨率就越高。但是由于单片机主频是一定的,Period越大,PWM的频率就越低,就需要设计更低截止频率的低通滤波器才可以将谐波分量滤除干净,但截止频率越低,DAC的响应速度就越慢。因此,DAC的分辨率、PWM的频率、低通滤波器的截止频率、DAC的响应速度这些参数都是相互关键的,实际应用中,要根据具体需要来进行设计。

校准

    用PWM做DAC存在一个问题就是其一致性较差。由于输出电压的精度主要取决于单片机电源电压VDD的精度,而一般的电源芯片电压精度都不高。这里提供一种自动校准的方法来提高DAC精度和一致性:

    当单片机有基准电压VREF引脚时,该引脚接一个外部基准电压芯片,单片机ADC采集电源电压,计算出其准确值,并根据电源电压和需要输出的电压计算占空比。

    当单片机没有基准电压引脚时,在单片机的ADC端口接一个外部基准电压芯片,同时采集基准电压和电源电压,用基准电压来校准电源电压,再根据电源电压和需要输出的电压计算占空比。