
做逆变器这几年最常被同行和刚入门的朋友问到的一个问题同样一块全桥板子为什么有人调出来的正弦波干净得像信号发生器有人一上电就炸管波形乱得跟锯齿一样我把话放这儿八成问题都出在SPWM的调制方式上。今天就把单极性SPWM这个方案从头到尾拆开讲一遍顺带把双极性SPWM拉出来做一次硬碰硬的对比。这篇文章面向正在搞逆变器、UPS、光伏微逆、或者想在STM32上输出SPWM的工程师和爱好者看完你不仅能自己设计滤波参数、写波形生成逻辑还能在炸管之后快速定位问题。全文不玩虚的直接从原理讲到参数计算再到仿真、上板子实测最后是问题排查。单极性和双极性的优劣不会只甩结论我会把为什么单极性纹波更小、为什么双极性动态响应更好这些底层原因也讲清楚。1. 动手之前先把概念捋清楚1.1 SPWM到底是什么SPWM全称Sinusoidal PWM正弦脉宽调制。它的核心思路是用一串宽度按正弦规律变化的脉冲去等效一个正弦波。你看示波器上那些密密麻麻的矩形波觉得跟正弦不沾边但把时间尺度拉大经过低通滤波器之后脉冲的平均值就构成了一条正弦曲线。类比一下你用手指在沙地上划一条线不可能一次划出完美的直线只能一点一点地挪挪得越密、每段长度越精确最终划出来的线就越直。SPWM干的就是这件事只不过它划出来的是正弦。判断SPWM好坏的标准有两个一是脉冲宽度序列能不能精确复现正弦的瞬时值二是实现这个序列的成本开关损耗、谐波含量、控制复杂度高不高。单极性和双极性的区别本质上是对这两个标准的不同取舍。1.2 逆变器输出为什么非要SPWM有人会问直接用一个方波逆变不行吗方波逆变器结构简单、成本低但方波含有大量低次谐波根本不能满足大多数负载的供电要求。尤其是电机负载方波里的谐波会造成额外的发热和噪音还能让电机转矩脉动大得吓人。SPWM的本质是让逆变器在开关频率上做“高速开合”从而把谐波推到高频段。高频谐波用一个小电感就能滤掉而低频段只留下我们想要的50Hz基波。这就是为什么SPWM成为逆变器的主流调制方案。简单说SPWM是用开关频率换波形质量用控制复杂度换滤波成本。1.3 单极性、双极性差在一个“电平”双极性SPWM每时每刻都在正负两个电平之间来回跳变输出电压波形只有Udc和-Udc两种状态永远没有零电平。单极性SPWM则多了一个零电平状态输出电压可以在Udc、0、-Udc三种状态之间切换。这正是“单极性”名字的来历在一个开关周期内输出电压只在0到Udc之间切换正半周或在0到-Udc之间切换负半周极性只有一种而不是在正负之间来回翻转。别看只是多了一个零电平这一个状态让滤波电感上的电流纹波、开关管的损耗、以及EMI特性都发生了质的变化后面我会用实测数据说明。2. SPWM波形怎么来调制原理与参数计算2.1 自然采样法、规则采样法与不对称规则采样法SPWM的经典生成方式是“调制波与载波比较”一个高频三角波载波和一个低频正弦波调制波送进比较器三角波高于正弦波时输出高电平低于时输出低电平。交点的位置决定了脉冲宽度。这个方案叫自然采样法模拟电路时代很常用缺点是交点的方程是超越方程用单片机很难实时求解。数字控制时代主流做法是规则采样法。规则采样法在每个载波周期的固定时刻采样正弦波的值用这个采样值在一个周期内保持不变近似求出脉冲宽度。对称规则采样法只在三角波顶点采样一次不对称规则采样法在顶点和底点各采样一次。不对称规则采样的精度高于对称规则采样谐波更小是目前DSP和STM32实现的主流方式。实际工程里你会发现“规则采样”和“自然采样”在调制比不高时差别很小但在调制比接近1时自然采样法的脉冲宽度失真明显会出现过调制。这也是为什么很多成熟逆变器方案宁愿用一个很大的正弦表用不对称规则采样来避免脉冲宽度计算误差。2.2 载波频率、调制比、死区三个参数怎么定载波频率是SPWM系统里最重要的参数之一。载波越高谐波越容易被滤除但开关损耗也会线性上升。对MOSFET10kHz到20kHz是甜点区既能避开人耳听觉范围又不会让管子热得离谱。IGBT一般只能跑到10kHz左右再高开关损耗就盖不住了。调制比m定义为正弦调制波峰值与三角载波峰值之比也叫调制度。m最大只能到1超过1就进入过调制区输出电压基波幅值不再线性增大但谐波会急剧增加。工程上一般留10%的余量长期运行调制比控制在0.85到0.95之间。死区是同一桥臂上下管为了防止直通而强制插入的延迟时间。死区太短管子关断来不及上下管直通炸模块死区太长输出电压畸变变大还会损失基波幅值。对常见的IGBT死区取1到3微秒对MOSFET取200到500纳秒比较靠谱。STM32的定时器可以直接配置死区时间硬件上会自动插入。2.3 电压利用率86.6%这个数是怎么来的很多文章提到SPWM的电压利用率最高只有86.6%很多人一头雾水。这里要澄清一下这个86.6%指的是三相SPWM逆变器的线电压利用率不是单相全桥的结论。推导过程并不复杂。设直流母线电压为Udc三相逆变器的每一相输出相对于母线中点来说最高只能到±Udc/2。当调制比m1时相电压基波幅值最大为相电压基波幅值Up Udc / 2线电压是两相电压之差幅值等于相电压幅值的根号3倍线电压基波幅值Ul Udc / 2 × √3 ≈ 0.866 × Udc所以线电压基波峰值最多是直流母线电压的86.6%。如果不用SPWM而改用方波电压利用率能到100%以上但谐波爆炸得不偿失。如果想既保留SPWM的谐波特性又提高电压利用率可以注入三次谐波或者用SVPWM空间矢量调制能把利用率提到100%。单相全桥逆变器没有这个限制。全桥输出的是两个桥臂之间的电压差正半周时可以在Udc和0之间切换负半周在0和-Udc之间切换。调制比m1时输出基波幅值可以达到Udc电压利用率是100%。3. 主电路拓扑与滤波参数设计别急着写代码3.1 单极性SPWM为什么必须用全桥半桥逆变器输出端相对于母线中点最多只有±Udc/2而且没有零电平状态可选做不了真正意义上的单极性输出。所以要做单极性SPWM必须用全桥拓扑四个开关管组成H桥。全桥的四个管子分成两组左桥臂Q1/Q2和右桥臂Q3/Q4。正半周时Q4保持导通Q1和Q2高频互补动作输出端在Udc和0之间切换负半周时Q3保持导通Q1和Q2继续高频互补输出端在0和-Udc之间切换。这样每个开关周期内输出电压只在一个极性和零之间摆动这就是单极性。这种结构的妙处在于高频动作的只有一只桥臂的两个管子另外一只桥臂的两个管子只做50Hz低频换向开关损耗直接降了将近一半。而且输出电压的跳变幅度是Udc而双极性SPWM的跳变幅度是2Udc电感电流纹波也会显著减小。3.2 LC滤波参数怎么算逆变器输出端必须加低通滤波器把SPWM的高频分量滤掉。最常见的是一阶LC滤波器电感和电容串联到负载前面。设计原则有两条谐振频率要远高于基波50Hz至少10倍以上同时要远低于开关频率一般取开关频率的1/10到1/5。举个例子开关频率20kHz谐振频率取2kHz左右比较合适。计算公式f0 1 / (2π√(LC))假设取L3mHC2.2uF算一下谐振频率f0 1 / (2π√(3×10⁻³ × 2.2×10⁻⁶)) ≈ 1960Hz这个频率对50Hz基波几乎零衰减对20kHz纹波有约20dB以上的衰减效果就很好。如果输出功率大、负载电流大可以适当减小电感、增大电容但电容太大会让空载电流变大逆变器空载损耗增加。这是一个典型的取舍没有绝对最优只有适不适合你的工况。3.3 母线电容和开关管耐压怎么选直流母线电容主要有两个作用一是给高频脉冲电流提供低阻抗通路二是抑制直流输入电压的波动。容量太小母线电压带载后会剧烈跌落输出波形会塌陷。一般按每千瓦输出功率配1000到2000uF电解电容再并联一个0.1到1uF的CBB高频电容用来吸收开关尖峰。开关管的耐压按1.5到2倍母线电压选。母线电压400V的时候管子耐压最少650V保险起见选800V以上的MOSFET或者600V的IGBT。压降裕量不够的话关断瞬间的尖峰电压很容易击穿管子这是炸管的一个重要原因。4. 从仿真到上板完整走一遍单极性SPWM实现4.1 先拿仿真验证思路不建议一上来就焊板子。先用Matlab/Simulink或者PLECS搭一个全桥逆变模型把单极性SPWM的控制逻辑跑通了再动硬件。仿真里重点看三件事输出波形是否正常、电感电流纹波是否符合预期、死区效果是否正确。任何逻辑错误在仿真里暴露出来要比在硬件上炸管成本低得多。仿真模型搭建也不复杂直流源400V接到全桥桥臂中点接LC滤波器和电阻负载。载波用三角波发生器频率20kHz。调制波用50Hz正弦波幅度按调制比m0.9设置。四个开关管的驱动信号用比较器计算出来。重点在于把Q1/Q2的互补驱动做对还要加入死区时间否则仿真里也会看到直通大电流。4.2 STM32生成SPWM的工程细节硬件方案里我习惯用STM32的定时器PWM模式。核心思路是定时器以中心对齐模式工作自动重载值ARR决定了载波频率比较寄存器CCR决定每个周期的脉冲宽度。CCR的值由一个预先生成的正弦表决定更新定时器触发时从表中取出下一个值写入CCR。载波频率计算公式为fs fclk / (ARR 1) / 2假设定时器时钟84MHz希望得到20kHz载波ARR 84×10⁶ / (2×20×10³) - 1 2099CCR的计算需要做归一化。中心对齐模式下当CCRARR时输出占空比接近100%当CCR0时占空比接近0%。要输出一个调制比m的正弦波正弦表第i个点的CCR可以这样算CCR[i] (uint16_t)((ARR 1) × (0.5 - 0.5 × m × sin(2πi/N)))其中N是一个工频周期内的采样点数。N取多少呢如果载波20kHz工频50Hz一个周期有400个载波周期所以N400刚好一一对应。取大了比如1024载波周期和数据更新率就对不上要么放弃部分点要么提高载波频率实际工程中要提前算好这个匹配关系。4.3 单极性调制的核心右桥臂换向逻辑单极性SPWM在代码层面的关键点不是高频桥臂怎么发PWM而是低频桥臂什么时候换向。换向点必须和调制波过零点对齐。正半周时让Q4常通负半周时让Q3常通如果换向点不准输出电压在过零附近会出现畸变也就是常说的过零失真。一个省事的方法是让低频桥臂的驱动信号也由定时器产生占空比50%频率50Hz和正弦波过零同步。你可以用另一个定时器输出50Hz方波在正弦表索引跳变到0的时候同步改变低频桥臂的输出电平。注意这里必须加软件滞回否则电流方向接近零时电平抖动容易产生毛刺。另外提一句“单极性倍频”方案它也属于单极性范畴但四个管子全都在高频动作只是左右两个桥臂的驱动相位错开让输出电压在同一个开关周期内出现正负两个脉冲等效输出纹波频率翻倍。它的优点是没有低频桥臂的过零换向问题但开关损耗比经典单极性大。要求不高的场合可以直接用这个方案省心不少。这里我贴一段简化代码逻辑展示高频桥臂和低频桥臂的基本配合// 伪代码展示单极性SPWM的核心控制逻辑 volatile uint16_t sin_index 0; void TIM1_UP_IRQHandler(void) { // 20kHz载波中断更新高频桥臂比较值 TIM1-CCR1 sin_table[sin_index]; // Q1 PWM TIM1-CCR2 sin_table[sin_index]; // Q2 PWM互补输出带死区 // 低频桥臂换向50Hz每次工频周期翻转 if (sin_index 0) { HAL_GPIO_WritePin(Q4_GPIO_Port, Q4_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(Q3_GPIO_Port, Q3_Pin, GPIO_PIN_SET); } else if (sin_index 200) { HAL_GPIO_WritePin(Q3_GPIO_Port, Q3_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(Q4_GPIO_Port, Q4_Pin, GPIO_PIN_SET); } sin_index; if (sin_index 400) sin_index 0; }注意上面这段只是说明逻辑关系实际工程里低频桥臂的换向建议用独立定时器或者比较器来做千万别放在高优先级中断里用if判断否则中断响应时间稍有抖动过零失真就会立刻体现出来。4.4 驱动电路设计要点全桥高边的MOSFET或IGBT需要用自举驱动或者隔离驱动。自举驱动方案简单成本低但占空比接近1时自举电容充不上电高边驱动会失效所以在单极性SPWM高频桥臂占空比接近满调制的场合要特别留意自举电容的容量一般选0.1uF到1uF的CBB电容并保证有足夠的刷新时间给自举电容充电。如果输出功率大或者调制比长期接近1建议改用隔离驱动芯片配隔离电源。别小看这一步自举驱动在满载时波形畸变的概率远比你想的高。5. 单极性与双极性逐项对线谁更适合你的场景5.1 输出电压纹波与谐波对比双极性SPWM每个开关周期都在Udc和-Udc之间翻转输出电压跳变幅度是2Udc。同样条件下电感电流纹波近似为ΔI (Udc - |Vout|) × D × T / L而单极性SPWM在一个开关周期内只在Udc和0之间跳纹波公式不同等效的纹波幅度大约是双极性的一半到三分之一。实际示波器上看同样LC参数下单极性输出的THD明显更低滤波电感的发热也更小。5.2 开关损耗与效率对比双极性SPWM四个管子全部在载波频率下高频动作每个管子的开关损耗都跑不掉。单极性SPWM只有一只桥臂高频开关另一只桥臂的管子工作在50Hz开关损耗几乎可以忽略。实测下来同样功率等级单极性方案整机效率能比双极性高2到3个百分点这在逆变器里是很大的差距。5.3 EMI和共模干扰对比单极性SPWM的输出电压在0和Udc之间变化共模电压的跳变幅度是Udc双极性SPWM的输出在正负之间来回跳共模电压跳变幅度接近2Udc。共模变化率dv/dt越大通过寄生电容产生的漏电流就越大EMI表现就越差。这就是为什么光伏逆变器和储能逆变器普遍倾向单极性方案漏电流太大会直接触发系统的剩余电流保护。5.4 动态响应和实现复杂度对比在动态响应方面双极性反而占优。因为每个开关周期都有正负电平切换电感电流可以快速上升和下降电流环带宽可以做得很高。单极性在一个开关周期内只有单方向脉冲动态响应略慢需要更高的开关频率才能追平。另外单极性实现时还要处理过零换向逻辑比双极性多一层麻烦。5.5 怎么选对比维度单极性SPWM双极性SPWM输出电压纹波小大谐波含量低高开关损耗低高EMI特性好差动态响应中等快实现复杂度较高低适用场景光伏/储能/UPS并网电机驱动、动态要求高的场合一句话总结追求效率、波形质量和EMI表现选单极性追求简单可靠、动态响应和通用性选双极性。没有绝对的好坏只有匹配不匹配。6. 常见问题与排查技巧实录6.1 上电就炸保险先查死区这个坑我踩过不止一次。刚上电的时候母线电容充电瞬间电流很大如果死区配置不对桥臂直通一下可能只烧驱动不炸保险。但如果是死区完全没有生效那看波形就不是毛刺而是直接短路的尖峰电流会瞬间爆表。排查方法很简单用一个隔离示波器探头看同一桥臂上下管的栅源电压放大时间轴确认关断和导通之间有明显间隔。不要用普通示波器探头直接测高边栅极共模电压会让你看到一堆假波形。6.2 空载波形正常一带载波形就拉胯大概率是母线电容容量不够。空载时逆变器功率很小母线电压稳定波形自然好看。一带载电容容量不足导致母线电压在每个工频周期内大幅度波动输出波形就会跟着塌。解决方法是先把母线电容加大一档试试同时用示波器监测母线电压是否稳定。6.3 输出电压削顶正弦波顶部变成平的这是调制比m设置超过了1进入过调制区正弦波顶部被削平。把正弦表的调制比降到0.9或者提高直流母线电压问题自然消失。如果调制比已经低于1还是削顶检查一下CCR计算公式里的偏移量是不是少了中心对齐模式下的坐标原点不对会整体偏移导致单侧削顶。6.4 过零处波形畸变有毛刺单极性方案最常见的波形缺陷就出现在过零附近。原因前面提过低频桥臂换向瞬间如果电流方向刚好处在零附近高频驱动又在这个时刻动作几个因素叠加就会产生一个窄尖峰。解决思路是给换向逻辑加滞回窗口或者使用单极性倍频方案绕开这个工况。6.5 驱动信号正常输出还是带直流分量怀疑是正弦表零点没对准或者CCR的偏置计算错误。单极性SPWM要求正弦正半周和负半周的脉冲面积完全对称如果代码里正弦表的平均值不是ARR的一半输出就会带直流分量。这个直流分量在变压器的场合会直接导致磁偏饱和发热严重。排错时用万用表测一下滤波电容两端的直流电压正常情况下应该接近零。6.6 常见问题速查表现象最可能原因处理建议上电烧保险/炸管死区没配好检查死区寄存器示波器实测空载正常、带载波形塌陷母线电容偏小加大电容容量输出削顶调制比超过1调低M值或提高母线电压过零毛刺换向逻辑抖动加滞回或改用倍频方案输出有直流分量正弦表偏置错误校正CCR偏置电感噪声大载波频率低于20kHz提高载波频率或改进磁芯材质我个人在实际调试中的体会是单极性SPWM调试的难点不在算法理论而在过零换向和死区配合这两个容易被忽视的细节。先把波形搞干净再谈效率优化和功率提升。如果你第一次上手建议按照“仿真验证逻辑 - 低压小功率实测 - 加高压大功率”的顺序推进每一步都把数据记录下来出了问题往回查绝对比心血来潮直接怼高压要省时间。这个项目后续还可以加电流内环把单极性SPWM和PI控制器结合起来做成真正的并网逆变器那又是另一个更深的坑了。