一、理论基础
所谓SPWM,就是通过只有开关两个状态(离散,数字的)的PWM序列产生正弦波(连续,模拟的)的方法。其理论基础一句话就能说明白:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。用人话类比就是五张一块和一张五块一样有价值。
从调制的角度可以理解为低频的50hz正弦信号作为调制波,高频的方波作为载波,调制方法是占空比调制,在经过全桥放大信号之后,通过低通滤波器就能还原出大功率的50hz正弦信号。
二、调制方法
常见的调制方法包括单极性PWM、双极性PWM、单极性倍频PWM。单双极性是以半个开关周期内负载上电压变化情况来分的。
单极性PWM调制在上半个正弦周期内一桥臂A两只功率管以较高的开关频率互补开关,另一桥臂B只开下管,这时负载上的电压在正电源电压和0V之间切换;在下半个周期则A桥臂只开下管,B桥臂高频互补开关,这时负载上的电压在负电源电压和0V之间切换,就产生了两个方向上的电压。半个周期内只有一侧桥臂受控。优点是开关损耗小,缺点是生成的正弦波在过零点会产生失真、控制复杂、而且MOS发热不均匀。
其负载上的波形图如下。
而双极性pwm则是在整个正弦周期内,四只管子都在高频开关状态工作,对角线上的管子一起导通,另一对角线上管子互补导通,实际上只需要一路互补的PWM控制,负载上电压在正电压和负电压之间切换,不出现0v。半个周期内两侧桥臂都受控。优点是控制简单、波形失真度小,缺点是管子开关损耗大,发热比较高。
其负载上的波形图如下:
倍频调制则是上两种控制方法的结合,半个周期内两侧桥臂都受控,但负载在半个周期内只在一种电压与0V之间切换,要么正要么负。其核心思想是两边桥臂分别由两个180度相位差的正弦波与三角载波比较来控制,优点是在开关器件工作频率一样的情况下,输出PWM频率是单极性SPWM的2倍,能够明显减少谐波,因此只需要相对较小的电感和电容滤波器件就可以起到很好的滤波效果,提升了系统的性能,也精简了系统体积,降低了成本。缺点就是控制麻烦。
三、占空比序列生成
这一部分的作用是控制管子什么时候开,什么时候关。
控制的方法有两大流派:模拟和数字。模拟的方法很简单,生成正弦波和三角波,直接输入比较器,产生高低电平控制管子开关。这个没啥好说的,搭电路的事。数字则也分两大流派,模拟模拟方法(两个模拟不同意思)的有自然采样法、规则采样法、不对称规则采样法。自然采样法是通过计算高频三角载波与正弦调制波的交点来确定开关切换点,以求出相应的脉冲宽度,而生成 SPWM波形的。本质上还是模拟那一套,不过由于脉宽计算公式是一个超越方程,采样点不能预先确定,只能通过数值迭代求解,所以用的很少。
规则采样法是对其的简化,只在三角波的顶点或底点位置对正弦波采样而形成阶梯波,计算简单,但是波形没那么像正弦波(谐波含量高)。
不对称规则采样法是规则采样法的优化,在每个载波周期采样两次, 即在三角波的顶点位置采样, 又在三角波的底点位置采样, 这样形成的阶梯波与正弦波的逼近程度会大大提高(谐波含量低了一点),但是计算量是规则采样法两倍。
数字实现的另一种流派则是等面积法,这是纯数学的,和模拟已经没关系了,还记得冲量相等而形状不同的窄脉冲吗?冲量在电路中就是伏秒积,在图中表现为面积,这个方法将正弦波等分,用等面积的PWM波代替,可以计算出来占空比。这种方法生成的正弦波精度是最高的。
图为我写的PY程序,计算得到的结果,调制深度为1,半个周期分16段。PWM幅度等于正弦波最大值,图中灰色部分是高电平时间。积分求面积,PWM波和正弦波的面积是相等的。
四、代码
最简单实现的SPWM我觉得是双极性调制。全程只需要控制一个PWM的占空比。代码包括两部分,生成SPWM占空比序列的py程序和基于hal库和STM32cubeMX的单片机程序。因为我用的是F030F4,这玩意两块多一片,只有16kRAM和4k运存,所以实时计算是没戏了,只能预先计算好占空比序列,用查表法实现。
生成SPWM占空比序列的py程序有两个,分别是单极性和双极性。先从单极性开始吧。
核心思想是分段,求正弦波的积分,除PWM周期长度,结果就是PWM占空比。结果是对称的,负半周就换个桥臂。很简单的数学,不详细分析了。
双极性也差不多,不过需要做出更改。正弦波的积分除2倍的PWM周期长度,结果再加50%才是PWM占空比。占空比50%时等效0v输出,100%时等效+vcc,0%等效-vcc。
调制深度大致等于直流母线电压利用率,受到mos自举驱动器和mos的限制,高侧mos不可能持续导通,也就是说占空比不可能高到100%,90%算保守值,因此调制深度最好不大于90%。最后输出的正弦波的有效值=直流母线电压*调制深度/根号2,输入24vDC,调制深度0.90时可以输出有效值15.28vAC。改变调制深度就能改变正弦波电压。点一下运行,py会以双精度计算占空比,对于单片机11位的定时器精度绝对是大大超过了。
至于STM32,使用两个定时器,TIM1使用CH3互补输出48K的PWM,作为载波,TIM17作为中断时基,中断频率12.8khz(基波50Hz X 调制比256)。
生成好长度为256的占空比序列,存成数组。
重写TIM17中断回调函数,每次中断更新TIM1->CCR3的值,PWM占空比就会以12.8khz的刷新率改变。
到此为止SPWM逆变器的软件就完成了。只要正确连接硬件就能输出SPWM波。只要改变TIM17ARR值就能改变占空比刷新频率,实现变频。
五、硬件设计硬件上需要一个全桥,全桥PCBlayout和选型看我之前的帖子。懒得搞的话,我也有一个现成的全桥模块我发布在立创的开源平台上了,已经打样验证过实物。记得点赞收藏评论三连哦(笑)。这还懒得搞的话请拿钱砸我。
硬件上短接L1和H2,短接L2和H1,任意连接单片机的pwm和互补pwm到两个输入端,小心不要接错。在全桥输出端接上LC滤波器,上电开机就能看到正弦波了。
将这个正弦波接到变比合适的工频变压器上就可以升压到220v。我手头上没有合适的变压器就不测了。不过比较常规的方案是先升压到400v直流在输入高压全桥逆变成交流电,这样体积可以做的比较小两路相差180度正弦波能驱动步进电机,三路依次相差120度的正弦波就是三相逆变器。
上两张测试图吧。