在STM32微控制器上实现SPWM(正弦脉宽调制,Sinusoidal Pulse Width Modulation)调制的核心是利用高频载波(三角波)与低频基波(正弦波)作比较得出。
那么在STM32里三角波和正弦波分别是什么,从哪里来?
从下图可看出
三角波是定时器计数值按时间的变化,方波是输出的PWM波。改变CCR就可以改变脉冲宽度,那么当CCR值按正弦变化就实现了SPWM调制。
定时器的计数值就是三角波。正弦波就是按正弦变化的CCR值。
比如我们要一个50HZ的正弦波,三角波频率20KHZ。可以知道一个正弦波里包含400个三角波,而一个三角波要与正弦波比较两次,所以我们需要800个CCR值。当然,我们不追求精度,可以让一个三角波的两次比较值都一样,也就是400个CCR值。甚至可以两次三角波的比较CCR都一样,这样就只需要200个CCR了,当然这么做会损失一些精度。最好的情况当然是三角波频率足够高,比较值也足够多。常见的CCR获取方式有两种,
查表法(空间换时间)
早期的单片机由于运算性能不行,所以是先把这些CCR值存储在ROM里(RAM也行)做正弦波码表。然后这个码表可以在一些软件里生成,如图,也可以自己提前算好。
有了码表,我们只需要每次计数器计到CCR触发中断时把CCR值更新就行了。
定时器中断运算
使用码表是因为运算性能不够,而stm32运算性能足够(使用dsp库,用C库的函数还是算起来有些慢的),可以自己去算正弦值。大致思路就是开一个定时器,每次进定时器中断的时间相同,累加就能得到时间.然后在定时器中断里计算sin(wt)。
总结
调制的过程涉及多个步骤,主要包括生成正弦波表、配置定时器生成PWM信号、以及通过中断或DMA更新PWM占空比。通过以上步骤,可以实现STM32上的SPWM调制,从而产生一个周期性变化的PWM信号,其占空比按照正弦函数变化,最终输出一个平滑的正弦波形。