
做逆变器或者变频器SPWM调制是绕不过去的基础。不管是单极性、双极性还是单极性倍频本质上都是把正弦调制波与高频三角载波做比较生成脉宽按正弦规律变化的驱动脉冲差别在于开关管怎么分配、输出波形长什么样、谐波水平差多少以及滤波成本差多少。这篇文章我直接用Simulink把三种方式各搭了一遍从模型结构、驱动逻辑到FFT谐波对比都梳理清楚还顺便把网上经常讨论的“SPWM线电压利用率只有86.6%”这个数字的来龙去脉算了算。适合正在做电源、逆变器、电机驱动方向的学生以及想把SPWM细节吃透的初入职工程师。1. 三种SPWM方式到底差在哪1.1 先搞清楚SPWM在干什么SPWM的全称是正弦脉宽调制思路很朴素用一串宽度按正弦规律变化的矩形脉冲去逼近一个正弦电压。脉冲越密、越窄逼近效果越好低次谐波越少后级滤波也就越轻松。这里有两个基本概念一个是调制比M也就是正弦调制波幅值与三角载波幅值的比值M不大于1时工作在线性调制区另一个是载波比N也就是三角载波频率fs与正弦基波频率f1之比N越大输出波形质量越好。从数学上看在载波频率足够高、调制比不大于1的前提下每个载波周期内输出的局部平均电压近似为 M·Vdc·sin(ωt)这里的Vdc是直流母线电压。也就是说调制波经过比较器“切碎”之后低频分量仍然精确保留了正弦信息。这也是为什么SPWM被广泛用在逆变器、UPS、变频器里因为它能用简单的比较逻辑把直流电变成频率和幅值都可调的正弦交流电。三种调制方式——单极性、双极性、单极性倍频——在“生成正弦脉宽”这个大目标上是一致的真正的区别在于开关管的开关规律和输出端电压电平的组合方式。1.2 单极性SPWM一半工作一半休息单极性SPWM一般用于单相全桥结构。全桥有四个开关管左桥臂上下管分别叫S1、S2右桥臂上下管叫S3、S4负载接在两个桥臂中点之间。所谓单极性是指输出电压只在一个极性内变化正半周期输出在0和Vdc之间切换负半周期输出在0和-Vdc之间切换不会直接跳到另一个极性。实现方式是这样的正半周期让右桥臂下管S4一直导通右桥臂上管S3一直关断同时左桥臂的上管S1做高频PWM、下管S2互补动作负半周期反过来让左桥臂下管S2一直导通左桥臂上管S1一直关断右桥臂上管S3做高频PWM。这样一来每个开关管只在半个基波周期内高频动作另外半个周期要么恒通、要么恒关开关损耗天然就低。单极性SPWM的输出是0、Vdc、-Vdc三电平结构波形正负半周对称谐波成分比双极性小。它的缺点是驱动逻辑需要根据正弦调制波的极性切换两个桥臂的工作状态在过零点附近需要额外处理不然可能出现窄脉冲或者切换毛刺。1.3 双极性SPWM四只管跟着载波一起翻双极性SPWM的开关规律更简单同一时刻对角线上的两只管子同时导通、同时关断。当正弦调制波大于三角载波时S1和S4导通S2和S3关断输出Vdc反之S2和S3导通S1和S4关断输出-Vdc。也就是说输出电压始终在Vdc和-Vdc之间来回切换不存在0电平。双极性最大的优点是驱动逻辑最简单一个比较器输出就能生成四路驱动所以三相桥式逆变器普遍采用这种思路。缺点也很明显四只管全部在高频开关开关损耗最大输出电压在Vdc和-Vdc之间直接跳变dv/dt大对滤波器的要求更高同样的载波频率和滤波参数下输出谐波比单极性大不少。在仿真对比时双极性通常被当成“基准线”——它实现最简单但波形最差用来衬托另外两种方式的优势。1.4 单极性倍频SPWM脉冲翻倍管子不翻倍单极性倍频是单极性SPWM的进阶版本核心思路是让两个桥臂都参与高频PWM但是两个桥臂的调制波互为反相。一个桥臂用正弦调制波sin与双极性三角载波比较另一个桥臂用反相调制波-sin与同一个载波比较各自生成互补PWM信号。这样做的效果是每个三角载波周期内负载两端的电压会出现两个脉冲分别对应载波的上升沿和下降沿输出脉冲频率等于载波频率的2倍。但每个开关管的开关频率仍然是原来的fs并没有增加。换句话说单极性倍频用“两路普通PWM相减”的方式白赚了一倍的等效开关频率。输出电平依然是0、Vdc、-Vdc三电平但谐波最低边带从fs附近搬到了2fs附近滤波难度大幅下降。代价是四个开关管都在高频动作开关损耗比普通单极性大驱动逻辑也比双极性复杂一些。1.5 三种方式特性对比表对比项单极性双极性单极性倍频输出电压电平0、Vdc、-VdcVdc、-Vdc0、Vdc、-Vdc每个载波周期输出脉冲数112单管开关频率fs仅半周动作平均fs/2fs全周动作fs全周动作等效输出脉冲频率fsfs2fs谐波主要边带位置fs附近fs附近2fs附近开关损耗最低最高中等偏高驱动逻辑复杂度需要极性切换最简单需要反相调制波滤波器设计难度中等最高最低这张表基本概括了三种方式的工程定位。实际做项目时如果追求波形质量、想把电感和电容做小单极性倍频是很划算的选择如果成本和损耗优先普通单极性更合适如果是三相系统又不想用SVPWM那就只能老老实实双极性。2. Simulink实操把三种调制搭进一个模型2.1 模型总体结构与搭建策略在Simulink里做SPWM对比我建议分成五块来搭信号生成模块、PWM比较模块、驱动逻辑模块、主电路模块、测量与分析模块。这样每一块可以独立检查出了问题也好定位。信号生成模块负责正弦调制波和三角载波。PWM比较模块用Relational Operator把两者做比较输出0/1脉冲。驱动逻辑模块根据单极性、双极性、倍频的不同规则把比较结果分配成四路开关管驱动信号。主电路可以用Simscape Electrical里的功率开关搭真实H桥也可以用受控电压源直接输出理想的PWM电压波形。测量模块用Scope和To Workspace把电压电流记录下来后续用MATLAB脚本做FFT。一个关键建议对比调制方式原理时优先用受控电压源方案也就是直接输出Vdc乘以驱动信号的组合结果。这样排除了开关管压降、死区、续流二极管导通压降这些非理想因素三种调制方式的差异完全来自调制逻辑本身分析起来最干净。等原理搞清楚了再换Universal Bridge搭带死区的功率级模型。解算器设置也要注意。SPWM仿真有很多开关边沿建议用定步长离散求解器步长取1e-6秒左右。如果使用变步长仿真会在每个边沿反复计算步长速度慢还容易出现异常结果。2.2 载波和调制波怎么生成正弦调制波很简单用Simulink的Sine Wave模块幅值设为调制比M频率设为基波频率50Hz偏置为0。我这里用的是双极性三角载波幅值范围在-1到1之间这样调制比M直接和正弦波幅值对应比较好理解。三角载波我用Repeating Sequence模块生成。以载波频率fs10kHz为例三角波周期是Ts_carrier 1/10000 1e-4秒。一个完整的双极性三角波周期要从0升到1再从1降到0再从0降到-1最后回到0。因此时间点可以设置为Time values: [0, 2.5e-5, 5e-5, 7.5e-5, 1e-4] Output values: [0, 1, 0, -1, 0]这里的2.5e-5秒是载波周期的四分之一。很多初学者直接把三角波周期设成1/fs结果输出频率翻倍或者减半波形怎么看都不对。另外Repeating Sequence模块默认会延拓所以只需设置一个周期内的点就够。调制比M我取0.8。这样在线性调制区内输出基波电压幅值大约是0.8倍的直流母线电压波形失真小对比谐波也更有意义。如果M取1或者超过1进入过调制区低次谐波会明显增加三种调制方式的差距会被谐波干扰不利于原理验证。2.3 三种驱动逻辑的具体实现这一块是仿真的核心也是容易做错的地方。我先定义比较结果正弦调制波为sin_ref三角载波为tri。那么基础比较信号为P (sin_ref tri)P为1代表上管导通区间P为0代表下管导通区间。对于双极性SPWM驱动逻辑最简单S1 P S2 NOT P S3 NOT P S4 P也就是S1和S4同时导通、S2和S3同时导通输出(Vdc)或(-Vdc)。对于单极性SPWM要引入正弦调制波的极性判断。用比较模块判断sin_ref是否大于0得到一个高电平有效的方向信号dir。然后S1 P AND dir S2 NOT S1 S3 P AND (NOT dir) S4 NOT S3这样在正半周期右桥臂下管S4一直导通左桥臂上管S1高频动作负半周期左桥臂下管S2一直导通右桥臂上管S3高频动作。对于单极性倍频SPWM需要生成第二路比较信号P1 (sin_ref tri) P2 (-sin_ref tri) S1 P1 S2 NOT P1 S3 P2 S4 NOT P2这里最关键的是-tri这个反相调制波而不是在载波上做文章。用同一个双极性三角载波一路比较sin_ref一路比较-sin_ref输出端自然会出现倍频效果。我在初学阶段犯过糊涂把载波反相当成倍频条件结果怎么调都看不出两倍脉冲后来把注意力放在调制波上才通了。如果不想搭这么多逻辑模块可以直接用MATLAB Function模块写转换逻辑输入P1、P2和dir输出四路开关信号。代码量不大排查也比较直观。2.4 负载、测量与FFT准备负载我用一个RLC串联电路其中L和C组成低通滤波器R是负载。参数先用L5mH、C10uF、R10Ω这个组合的LC截止频率大概是f0 1 / (2 * pi * sqrt(L * C)) 1 / (2 * pi * sqrt(5e-3 * 10e-6)) ≈ 711.8 Hz远小于10kHz载波频率所以能有效滤除高频开关纹波同时又不影响50Hz基波通过。主电路如果采用受控电压源方案只需要把三种驱动逻辑对应的理想输出电压算出来双极性v_ideal Vdc * (2*P - 1)单极性v_ideal Vdc * (S1 - S3)单极性倍频v_ideal Vdc * (P1 - P2)然后接到受控电压源的控制端即可。受控电压源再串联L、C、R用电压测量模块测负载电压和电容电压。测量数据用To Workspace模块导出变量名分别设为vout和iout保存格式选Array。仿真时长取0.2秒正好是10个完整的50Hz基波周期后续做FFT时可以直接取整周期数据避免频谱泄漏。3. 仿真结果对比波形、谐波与工程取舍3.1 仿真条件与参数设定我把这次仿真用的关键参数整理成一个表方便复现参数数值直流母线电压 Vdc100 V调制比 M0.8基波频率 f150 Hz载波频率 fs10 kHz滤波电感 L5 mH滤波电容 C10 uF负载电阻 R10 Ω仿真步长 Ts1e-6 s仿真时长0.2 s这组参数很典型既能看到明显的PWM开关纹波又能让LC滤波后的波形比较接近正弦。如果你用的负载电阻非常小或者非常大滤波效果会差很多不过三种调制方式的相对差异不会改变。3.2 三种输出波形差异从示波器上看双极性SPWM的桥臂输出电压在100V和-100V之间来回跳变脉冲宽度按正弦规律变化。波形正负对称但每个载波周期只有一个脉冲低次谐波和开关谐波都比较明显。单极性SPWM的桥臂输出是0V和100V交替正半周、0V和-100V交替负半周看起来像被“削掉”了一半的方波。由于输出在0电平时续流负载电流的纹波明显比双极性小波形更干净。单极性倍频的桥臂输出电压同样是0和±100V三电平但局部波形能看到一个载波周期内有两个脉冲一个出现在载波上升沿区间一个出现在载波下降沿区间。两者的宽度不一定相等合在一起等效成了20kHz频率的PWM效果。滤波之后的电压波形单极性倍频最平滑单极性次之双极性最差。这里要强调一下三种调制方式在线性调制区内输出电压基波的幅值基本一致区别主要体现在高频谐波含量上。所以如果只看整体波形不看局部细节可能觉得差不多把FFT做出来差距就一目了然。3.3 FFT谐波对比用FFT分析桥臂输出电压能看到很典型的频谱特征。双极性SPWM的主要谐波集中在10kHz载波频率附近在10kHz±50Hz、10kHz±100Hz等位置有一簇边带单极性SPWM的谐波同样在10kHz附近但幅度较低而且由于波形正负半周对称偶次谐波被明显抑制单极性倍频SPWM最明显的变化是10kHz附近的谐波大幅下降主要谐波跑到20kHz附近去了。滤波之后再看负载电压的THD我这次跑出的数据大概是这样一个趋势调制方式滤波后THD示例值双极性约1.8% ~ 2.0%单极性约0.8% ~ 1.0%单极性倍频约0.4% ~ 0.6%具体数值会随着LC参数和负载变化但相对关系基本稳定双极性最差单极性中等单极性倍频最好。这个结果也符合理论判断——谐波最低边带从10kHz移到20kHz后二阶LC滤波器对20kHz的衰减比10kHz大得多输出自然更干净。如果要在MATLAB里自己分析数据可以用下面这段脚本前提是已经用To Workspace把负载电压导出成变量vout并且仿真数据是定步长Ts 1e-6; Fs 1/Ts; v vout.Data; N length(v); f (0:N-1) * Fs / N; Y fft(v - mean(v)) * 2 / N; % 找基波50Hz i50 find(abs(f - 50) 1); fund abs(Y(i50)); % 计算2到99次谐波的总有效值 iH find(f 100 f 5000); harm abs(Y(iH)); thd sqrt(sum(harm.^2)) / fund * 100; fprintf(THD %.2f%%\n, thd);这里用了整周期0.2秒的数据所以基波分辨率为5Hz50Hz处能准确取出基波分量。如果不取整周期FFT会有频谱泄漏THD算出来会偏高而且不同调制方式之间的差距会被掩盖。3.4 工程权衡开关损耗、滤波难度与动态性能单看THD单极性倍频几乎完胜但工程上不能只看波形。开关损耗方面双极性和单极性倍频的四只管都在高频动作损耗相当普通单极性只有两只管在半周内高频动作损耗最低。散热设计时如果功率很大普通单极性有明显优势。滤波难度方面单极性倍频因为等效开关频率翻倍同样的LC参数下纹波更小或者反过来说要达到同样的THD指标单极性倍频可以把电感和电容做得更小。这在逆变器体积和成本敏感的场景里是非常重要的优势。动态性能方面三种方式在载波频率足够高时差别不大但单极性倍频在每个载波周期内有两个脉冲输出电压更新的时间分辨率更高对突变负载的响应更快一点。当然这会增加控制环路的采样复杂度实际做数字控制时要注意PWM计数器的周期和比较寄存器的更新方式。从实现复杂度看双极性最简单一个比较器直接搞定单极性需要在过零点切换桥臂单极性倍频需要两路反相调制波对数字控制的PWM外设也有一定要求。现在主流MCU的PWM模块都支持互补输出和多重比较功能实现单极性倍频并不难但定时器配置要比双极性多一些。3.5 顺便把86.6%的账算清楚很多人在电机驱动或三相并网逆变器里会听到一句话SPWM的线电压利用率最高只有86.6%。这个说法针对的是三相SPWM不是前面仿真的单相全桥。单相全桥在线性调制区内输出基波电压幅值最大就是Vdc并不存在这个限制。三相桥式SPWM里调制比M1时每相输出对直流母线中点而言的基波电压幅值最大是Vdc/2。对于星形负载线电压基波幅值是相电压基波幅值的√3倍线电压基波幅值 √3 * (Vdc/2) ≈ 0.866 * Vdc折算成有效值线电压基波有效值 ≈ 0.866 * Vdc / √2 ≈ 0.612 * Vdc而SVPWM或者带三次谐波注入的SPWM在线性调制区内可以让线电压基波幅值达到Vdc也就是有效值约0.707倍的直流母线电压。两个有效值一比0.612 / 0.707 ≈ 0.866所以“SPWM线电压利用率只有86.6%”这个数字说的是普通正弦SPWM相对SVPWM方案在同样直流母线电压下能输出的线电压基波有效值打了86.6%的折扣。它并不是效率而是直流电压利用率的相对比值。理解了这一点就能明白为什么大功率电机驱动和并网逆变器更倾向于用SVPWM或者注入三次谐波的方案——不是SPWM不能用而是直流母线电压被浪费了约13.4%。4. 常见仿真问题与避坑经验4.1 驱动逻辑接错导致直通或波形反向我在搭H桥驱动时踩过最大的坑就是上下桥臂逻辑没有严格互补。Simulink里如果用两个独立比较器生成高低端信号非常容易出现某一时刻S1和S2同时为1的情况仿真直接报错或者电流飞掉。排查方法很简单把四路驱动信号接到Scope里放大到几个载波周期看。任何同一桥臂上下管同时为1的时间段都是危险区间。在理想仿真中不加死区还可以跑但逻辑上必须保证互补因为实际硬件一旦直通就是炸管。另外注意单极性SPWM里方向信号dir在过零点附近的处理。如果直接判断sin_ref大于等于0过零点会产生极窄脉冲仿真结果会有毛刺。可以在Simulink里加一个滞回比较器或者在实际代码里做消抖。教学仿真可以无视这个问题但不建议完全忽略。4.2 载波和仿真步长设置不当Repeating Sequence是最容易设置错的地方。10kHz载波对应周期1e-4秒双极性三角波的Time values必须覆盖一个完整周期0、T/4、T/2、3T/4、T。少写一个点波形就是错的。仿真步长也要足够小。我一般要求步长小于等于载波周期的1/20也就是1e-6秒左右。步长太大PWM边沿会被阶梯化谐波计算结果失真步长太小仿真时间明显变长。1e-6秒配合0.2秒仿真时长是合理的折中数据量也不至于爆炸。4.3 FFT分析踩过的坑FFT最怕频谱泄漏。如果你把0.13秒这种非整数基波周期的数据拿去做FFT50Hz基波能量会泄漏到相邻频点THD计算结果偏差很大。解决方式是仿真时长设为基波周期的整数倍比如0.2秒对应10个周期。另外分析电压波形时先减掉直流分量。虽然理想SPWM输出没有直流偏置但仿真数据里可能因为起始条件产生微小直流不减的话会在0Hz处出现一根大谱线影响谐波计算。如果觉得手动计算麻烦Simscape Electrical模型可以直接用Powergui的FFT Analysis工具选好整流周期和基波频率一键出THD。但要注意它只针对Simscape模型受控电压源那种数学模型用不了。4.4 死区怎么加、什么时候可以不加从调制原理上对比单极性和双极性可以先不加死区。如果不加死区H桥上下管严格互补输出波形是理想的三种调制方式的谐波差异非常清晰。但到了工程仿真阶段一定要加死区因为实际开关管存在关断延迟上下管同时导通就是直通。在Simulink里加死区可以用On/Off Delay模块。对每一路互补信号设置On delay为死区时间比如2微秒Off delay为0这样开启沿被延迟关断沿不变上下管之间自然形成一段共同关断的空隙。加上死区之后输出波形会有一点缺口THD也会略微升高这是正常现象。死区时间越长低次谐波越明显尤其在小电流情况下死区引起的电压误差占比会更大。4.5 “单极性倍频”为什么容易搞混很多教材里单极性倍频有两种等效画法一种是调制波反相法也就是我前面推荐的sin和-sin分别与同一个双极性载波比较另一种是载波反相法两个三角载波相差180度但调制波都用同一个sin。这两种方法在数学上是等效的如果你看到别人用的是两个载波也别觉得奇怪。容易搞混的点在于如果用0到1的单极性三角载波再拿sin和-sin去比较输出并不是倍频效果因为载波本身没有负半轴反相调制波在大部分时间里都比载波小产生的脉冲宽度远不是想要的。所以要复现倍频要么用双极性载波配反相调制波要么用互补的单极性载波配相同调制波。我自己第一次搭倍频模型时就因为没有把载波范围改成-1到1折腾了大半天才发现问题。4.6 从仿真到工程代码的衔接建议模型跑通之后如果目标是落到STM32或者DSP上建议直接把驱动逻辑翻译成C代码。双极性和单极性倍频在数字控制里其实就是两路占空比互减PWM模块需要支持中心对齐或者边沿对齐模式。单极性倍频要特别注意PWM计数器的更新频率等效输出脉冲频率是2fs但每个开关管仍然工作在fs所以定时器周期不要算错。我个人在实际项目里更常用单极性倍频做单相逆变器因为波形质量好、滤波器小巧。代价是硬件上需要两个独立比较值而且过零点的毛刺会比普通单极性更明显。如果项目对成本极端敏感、开关损耗是主要制约因素普通单极性依然是很能打的方案。做仿真对比这件事最重要的是能清楚看到“同样一套LC滤波器只是改了调制方式THD差出一大截”。这个直观感受会直接影响后续拓扑选型和控制方案设计。跑通三种调制波形只是第一步后面把模型改成三相、加入闭环、甚至做自动代码生成都只是在这个基础上继续延伸而已。