做逆变器或者变频器,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、-Vdc | +Vdc、-Vdc | 0、+Vdc、-Vdc |
| 每个载波周期输出脉冲数 | 1 | 1 | 2 |
| 单管开关频率 | fs(仅半周动作),平均fs/2 | fs(全周动作) | fs(全周动作) |
| 等效输出脉冲频率 | fs | fs | 2fs |
| 谐波主要边带位置 | 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模块生成。以载波频率fs=10kHz为例,三角波周期是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是负载。参数先用L=5mH、C=10uF、R=10Ω,这个组合的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 仿真条件与参数设定
我把这次仿真用的关键参数整理成一个表,方便复现:
| 参数 | 数值 |
|---|---|
| 直流母线电压 Vdc | 100 V |
| 调制比 M | 0.8 |
| 基波频率 f1 | 50 Hz |
| 载波频率 fs | 10 kHz |
| 滤波电感 L | 5 mH |
| 滤波电容 C | 10 uF |
| 负载电阻 R | 10 Ω |
| 仿真步长 Ts | 1e-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秒的数据,所以基波分辨率为5Hz,50Hz处能准确取出基波分量。如果不取整周期,FFT会有频谱泄漏,THD算出来会偏高,而且不同调制方式之间的差距会被掩盖。
3.4 工程权衡:开关损耗、滤波难度与动态性能
单看THD,单极性倍频几乎完胜,但工程上不能只看波形。开关损耗方面,双极性和单极性倍频的四只管都在高频动作,损耗相当;普通单极性只有两只管在半周内高频动作,损耗最低。散热设计时,如果功率很大,普通单极性有明显优势。
滤波难度方面,单极性倍频因为等效开关频率翻倍,同样的LC参数下纹波更小,或者反过来说,要达到同样的THD指标,单极性倍频可以把电感和电容做得更小。这在逆变器体积和成本敏感的场景里是非常重要的优势。
动态性能方面,三种方式在载波频率足够高时差别不大,但单极性倍频在每个载波周期内有两个脉冲,输出电压更新的时间分辨率更高,对突变负载的响应更快一点。当然这会增加控制环路的采样复杂度,实际做数字控制时要注意PWM计数器的周期和比较寄存器的更新方式。
从实现复杂度看,双极性最简单,一个比较器直接搞定;单极性需要在过零点切换桥臂;单极性倍频需要两路反相调制波,对数字控制的PWM外设也有一定要求。现在主流MCU的PWM模块都支持互补输出和多重比较功能,实现单极性倍频并不难,但定时器配置要比双极性多一些。
3.5 顺便把86.6%的账算清楚
很多人在电机驱动或三相并网逆变器里会听到一句话:SPWM的线电压利用率最高只有86.6%。这个说法针对的是三相SPWM,不是前面仿真的单相全桥。单相全桥在线性调制区内,输出基波电压幅值最大就是Vdc,并不存在这个限制。
三相桥式SPWM里,调制比M=1时,每相输出对直流母线中点而言的基波电压幅值最大是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秒这种非整数基波周期的数据拿去做FFT,50Hz基波能量会泄漏到相邻频点,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差出一大截”。这个直观感受会直接影响后续拓扑选型和控制方案设计。跑通三种调制波形只是第一步,后面把模型改成三相、加入闭环、甚至做自动代码生成,都只是在这个基础上继续延伸而已。