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

将该函数展开为傅里叶级数,可以得到:
PWM波函数展开傅里叶级数
可以看到,上式中的第一项为直流分量,第二项为一次谐波,第三项为高次谐波的和。用低通滤波器将谐波部分滤掉后,只剩直流分量,即为须要输出的电压值。直流分量的电压取决于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端口接一个外部基准电压芯片,同时采集基准电压和电源电压,用基准电压来校准电源电压,再根据电源电压和须要输出的电压打算占空比。