最近在做三相逆变器与电机控制仿真时,又把 SPWM 从头到尾梳理了一遍。网上关于 SPWM 的资料虽然多,但大多停留在“正弦波和三角波比较”的层面,真正能把数学模型、三次谐波注入、SVPWM 等效关系以及 Simulink 仿真串成一条完整链路的内容并不多。本文从 SPWM 的数学原理出发,重点推导占空比公式与谐波分布,解释 SPWM 与三次谐波注入、SVPWM 之间的幅值关系,最后用 MATLAB 脚本和 Simulink 模型完整演示三相 SPWM 逆变器的仿真实现,并整理常见的仿真排错思路。内容面向电力电子、电机控制方向的学生和工程师,初学者可以按步骤跑通仿真,有经验的朋友也可以重点关注第 3 章和第 6 章的工程化细节。
1. SPWM 基础与背景
1.1 什么是 SPWM
SPWM 全称 Sinusoidal PWM,即正弦脉宽调制。它的基本思路是用一系列宽度按正弦规律变化的脉冲,去等效一个正弦波。之所以可以这样等效,是因为冲量相等而形状不同的窄脉冲加在惯性环节上时,其输出响应基本相同。逆变器输出端通常接有电感、电容或电机绕组,这些负载本身具有低通特性,因此只要脉冲的面积按正弦规律变化,负载电流和电压的基波分量就能逼近正弦波。
与方波逆变器不同,SPWM 不仅能改变输出电压的频率,还能同时调节输出电压的幅值。方波逆变器只能通过改变直流母线电压来调压,而 SPWM 通过改变调制比 (M) 就能实现调压,动态响应更快,控制也更灵活。因此在变频空调、伺服驱动、光伏并网逆变器、UPS 等场合,SPWM 都是最底层的调制手段之一。
1.2 载波、调制波与调制比
SPWM 中有两个核心信号:
- 调制波:频率为输出基波频率的正弦波,决定了输出电压的频率和幅值。
- 载波:频率远高于调制波的三角波或锯齿波,决定了开关频率。
将调制波与载波进行比较,当调制波大于载波时输出高电平,否则输出低电平,就得到了 PWM 脉冲序列。
两个最重要的参数:
- 调制比 (M):调制波幅值与载波幅值之比。当 (M \le 1) 时,PWM 工作在线性调制区,输出电压与 (M) 成正比;当 (M > 1) 时进入过调制区,输出基波幅值不再线性增长,同时会引入低次谐波。
- 载波比 (N):载波频率与调制波频率之比。载波比越高,谐波频率越远离基波,滤波越容易,但功率器件的开关损耗也随之增大。
这两个参数贯穿 SPWM 建模、仿真和实际工程调试的全过程,后续章节会反复用到。
2. SPWM 数学模型
2.1 自然采样法:占空比公式推导
自然采样法是 SPWM 最直观的实现方式:把三角载波和正弦调制波实时送入比较器,开关动作发生在两波形的交点处。这种方法得到的脉冲位置最接近理想等效,但在模拟电路时代不容易用硬件实现,因为需要实时求解正弦方程;在现代数字控制器中,通常用规则采样法代替。
以单相半桥双极性 SPWM 为例。设载波幅值为 (V_c),三角波瞬时值为:
[ v_c(t) = V_c \cdot \frac{2}{\pi}\arcsin(\sin(2\pi f_c t)) ]
工程上更简单的做法是直接定义载波在 ([-V_c, V_c]) 之间线性变化。调制波为:
[ v_r(t) = M V_c \sin(2\pi f_r t) ]
当 (v_r(t) > v_c(t)) 时,上桥臂导通,输出 (+V_{dc}/2);否则下桥臂导通,输出 (-V_{dc}/2)。
在一个载波周期内,占空比 (D) 为:
[ D(t) = \frac{1}{2}\left[1 + M \sin(2\pi f_r t)\right] ]
对应的输出电压平均值为:
[ V_o(t) = D(t) \cdot \frac{V_{dc}}{2} - (1 - D(t)) \cdot \frac{V_{dc}}{2} = \frac{M V_{dc}}{2} \sin(2\pi f_r t) ]
也就是说,SPWM 输出脉冲序列在一个载波周期内的平均值,正好等于该时刻正弦调制波对应的理想输出电压。基波幅值为:
[ V_{1m} = \frac{M V_{dc}}{2} ]
这个公式是所有 SPWM 电压计算的基础。
2.2 规则采样法:数字控制器的主流实现
自然采样法需要比较正弦波和三角波的实时交点,在 MCU 和 DSP 中很难做到逐点精确比较。数字控制器更常用的是规则采样法:在每个载波周期的特定时刻对正弦调制波采样一次,并在该周期内保持采样值不变,再与三角载波比较。
规则采样法又分为两种:
- 对称规则采样:只在三角载波的顶点或底点采样一次。由于每个载波周期内调制波保持不变,生成的脉冲关于载波周期中心对称。
- 不对称规则采样:在三角载波的顶点和底点各采样一次,生成更接近自然采样法的脉冲波形,谐波含量更低,但计算量翻倍。
对称规则采样的占空比近似为:
[ D(k) = \frac{1}{2}\left[1 + M \sin(2\pi f_r t_k)\right] ]
其中 (t_k) 是第 (k) 个载波周期的采样时刻。实际数字控制中,通常由定时器产生载波中断,在中断中更新比较寄存器的值,从而实现 SPWM 输出。
规则采样法的优势在于计算量小、时序确定,适合在固定开关频率下运行。它的缺点是存在一个载波周期的量化延迟,可能会引入轻微的低次谐波,但在开关频率足够高时可以忽略。
2.3 双极性 SPWM 与单极性 SPWM
根据输出电平的跳变方式,SPWM 分为双极性 SPWM 和单极性 SPWM。
双极性 SPWM 中,同一桥臂的上下两个开关管在一个载波周期内互补导通,输出在 (+V_{dc}) 和 (-V_{dc})(或 (+V_{dc}/2) 和 (-V_{dc}/2))之间来回切换。这种方式的控制逻辑简单,但开关管电压应力大,输出谐波也相对较高。
单极性 SPWM 常见于全桥逆变器,正半周输出在 (+V_{dc}) 和 0 之间切换,负半周输出在 (-V_{dc}) 和 0 之间切换。相比双极性调制,单极性 SPWM 在一个开关周期内只翻转一个桥臂,等效开关频率翻倍,谐波更低,EMI 更小。缺点是控制逻辑稍复杂,需要根据输出电流方向判断续流路径。
| 对比项 | 双极性 SPWM | 单极性 SPWM |
|---|---|---|
| 输出电平 | (+V_{dc})、(-V_{dc}) 两电平 | (+V_{dc})、0、(-V_{dc}) 三电平 |
| 开关次数 | 每个周期所有开关管高频动作 | 每个周期只有一半开关管高频动作 |
| 谐波特性 | 谐波集中在载波频率附近 | 等效载波频率翻倍,谐波频率更高 |
| 控制复杂度 | 简单 | 较复杂 |
| 适用场景 | 三相桥式逆变器 | 单相全桥逆变器 |
三相两电平逆变器通常采用双极性 SPWM,因为每相桥臂只有上下两个开关管,输出相电压只能在 (+V_{dc}/2) 和 (-V_{dc}/2) 之间跳变。单极性 SPWM 在三相逆变器中需要更高电平拓扑(如 T 型三电平、NPC 三电平)才能实现。
2.4 SPWM 谐波分布特征
SPWM 输出的脉冲电压并非标准正弦波,而是包含大量高频谐波。理论上,自然采样 SPWM 的谐波分布可以表示为载波频率及其整数倍附近的边带分量:
[ f_h = n f_c \pm m f_r \quad (n=1,2,3,\dots,; m=0,1,2,\dots) ]
其中 (n) 为载波谐波次数,(m) 为调制波边带次数。基波频率 (f_r) 附近没有明显的低次谐波,这是 SPWM 相比方波调制的最大优势。谐波能量主要集中在 (f_c)、(2f_c)、(3f_c) 等载波频率整数倍附近。
在三相三线制逆变器中,线电压会抵消掉一部分载波同相分量,因此三相 SPWM 的线电压谐波含量通常低于单相 SPWM。实际应用中,可以通过提高载波频率或增加输出滤波器来进一步降低谐波。
3. SPWM、三次谐波注入与 SVPWM 的关系
3.1 线性调制区与过调制
当调制比 (M \le 1) 时,调制波峰值不超过载波峰值,占空比在 0 到 1 之间线性变化,输出电压与调制比成正比。当 (M > 1) 时,部分调制波会被载波“削顶”,占空比饱和到 0 或 1,输出电压出现严重的低次谐波,进入过调制区。过调制虽然可以进一步提高输出电压,但会引入大量谐波,在电机驱动中可能导致转矩脉动,通常只在需要弱磁扩速等特殊工况下短时使用。
因此,传统 SPWM 的线性输出电压上限受 (M=1) 限制。在直流母线电压为 (V_{dc}) 时,三相 SPWM 相电压基波峰值最大为 (V_{dc}/2),线电压基波峰值最大为:
[ V_{LL1m} = \frac{\sqrt{3}}{2} V_{dc} \approx 0.866 V_{dc} ]
3.2 为什么注入三次谐波能提高电压利用率
三次谐波在三相三线制系统的线电压中相互抵消,因此在线电压中不会产生对应的分量。但如果在正弦调制波中注入一定比例的三次谐波,可以改变调制波的形状,降低其峰值。
具体来说,设 A 相原始调制波为:
[ v_a = M \cos \theta ]
加入零序性质的三次谐波:
[ v_a' = M \cos \theta - \frac{M}{6} \cos 3\theta ]
当注入量为基波幅值的 (1/6) 时,合成调制波的峰值会从基波的 1 降低到 (\sqrt{3}/2 \approx 0.866)。也就是说,在同样的母线电压下,调制比 (M) 可以提高到原来的 (2/\sqrt{3} \approx 1.1547),而不会出现过调制。输出电压的线性范围因此扩大了约 15.47%,这就是 “电压利用率提升” 的本质。
需要说明的是,注入三次谐波后,相电压波形是鞍形波,而不是标准正弦波。但在三相三线制系统中,负载看到的线电压仍然是正弦基波,因此并不会影响负载运行。
3.3 SVPWM 的本质就是零序分量注入
SVPWM(空间矢量脉宽调制)最初是从交流电机磁链跟踪的角度提出的,通过开关矢量的合成来逼近目标电压矢量。但从调制波的角度看,SVPWM 可以等效为:在原始三相正弦调制波中注入合适的零序分量,再与三角载波比较。
SVPWM 常用的零序分量表达式为:
[ v_0 = -\frac{1}{2}\left(\max(v_a, v_b, v_c) + \min(v_a, v_b, v_c)\right) ]
合成后的三相调制波为:
[ v_a' = v_a + v_0, \quad v_b' = v_b + v_0, \quad v_c' = v_c + v_0 ]
这种注入方式将三相调制波的峰值严格限制在 (\sqrt{3}/2) 以内,因此在线性区内可以把调制比推到 (2/\sqrt{3})。
3.4 幅值关系与对比总结
关于 “SPWM 和三次谐波 / 零序分量进行等效时,二者的幅值大小存在怎样的关系”,简单来说:在同一组三相正弦调制波的基础上,注入零序分量后调制波本身的峰值从 1 降低到约 0.866;如果保持调制不进入过调制区,则输出的基波电压幅值可以提升到原来的 (2/\sqrt{3} \approx 1.1547) 倍。
| 调制方式 | 线性调制比上限 | 相电压基波峰值上限 | 线电压基波峰值上限 |
|---|---|---|---|
| 传统 SPWM | 1 | (V_{dc}/2) | (0.866 V_{dc}) |
| SPWM + 1/6 三次谐波注入 | (2/\sqrt{3}) | (V_{dc}/\sqrt{3}) | (V_{dc}) |
| SVPWM | (2/\sqrt{3}) | (V_{dc}/\sqrt{3}) | (V_{dc}) |
需要注意,SVPWM 的零序分量是分段函数,并不是简单的连续三次谐波。用三次谐波注入来理解 SVPWM 是为了理论上的直观性,工程上 SVPWM 通常仍按空间矢量扇区进行实现。
4. 基于 MATLAB/Simulink 的 SPWM 仿真
4.1 环境准备与仿真规划
本文示例以较新的 MATLAB/Simulink 版本为例,主要使用以下工具箱:
- MATLAB 基础环境
- Simulink
- Simscape Electrical(早期版本称为 SimPowerSystems,用于搭建功率电路和逆变器)
如果手头版本缺少 Simscape Electrical,也可以只搭建控制信号部分的模型,用简单的受控电压源代替功率桥,但无法观测到真实的开关纹波和谐波特性,效果会打折扣。
下面的仿真规划以三相两电平逆变器 + RL 负载为对象,直流母线电压取 400 V,调制比 0.8,载波频率取 2 kHz,基波频率 50 Hz。
4.2 用 MATLAB 脚本生成单相 SPWM 脉冲
在进入 Simulink 之前,先用一段纯 MATLAB 代码把自然采样 SPWM 的脉冲生成逻辑跑通,这样更容易理解调制波与载波比较的原理。
%% 单相双极性SPWM自然采样法脉冲生成示例 % 参数设置 fc = 2000; % 载波频率 [Hz] fr = 50; % 调制波频率 [Hz] M = 0.8; % 调制比 Vdc = 400; % 直流母线电压 [V] Tsim = 0.1; % 仿真时长 [s] Ts = 1e-6; % 仿真步长 [s] % 时间向量 t = 0:Ts:Tsim; % 对称三角载波,幅值范围 [-1, 1] carrier = sawtooth(2*pi*fc*t, 0.5); % 正弦调制波,幅值为 M mod_wave = M * sin(2*pi*fr*t); % 自然采样比较逻辑:调制波大于载波输出高电平 pwm = double(mod_wave > carrier); % 双极性半桥输出电压:+Vdc/2 或 -Vdc/2 vout = (2*pwm - 1) * Vdc/2; % 基波参考分量 vref = M * Vdc/2 * sin(2*pi*fr*t); % 绘图 figure; subplot(3,1,1); plot(t, carrier, 'b', t, mod_wave, 'r--'); legend('载波', '调制波'); grid on; xlim([0 2/fr]); subplot(3,1,2); plot(t, pwm, 'b'); grid on; ylim([-0.2 1.2]); xlim([0 2/fr]); subplot(3,1,3); plot(t, vout, 'b'); hold on; plot(t, vref, 'r--'); legend('SPWM输出电压', '基波分量'); grid on; xlim([0 2/fr]);运行这段代码,可以看到调制波与三角载波的比较结果、PWM 脉冲序列以及输出电压波形。由于仿真步长取的是固定小步长,脉冲跳变沿很清晰,适合观察占空比随正弦波变化的过程。
4.3 三相调制波与零序注入效果对比
再看一个更贴近标题核心的脚本:对比纯 SPWM、注入 1/6 三次谐波和 SVPWM 零序注入后的调制波峰值。
%% 三相SPWM与三次谐波注入/零序分量等效幅值关系比较 theta = linspace(0, 4*pi, 2000); % 三相原始正弦调制波,按幅值归一化 va = 1.0 * cos(theta); vb = 1.0 * cos(theta - 2*pi/3); vc = 1.0 * cos(theta + 2*pi/3); % 方案1:纯正弦,没有任何注入 vmax_origin = max(max(abs([va; vb; vc]))); % 方案2:注入1/6幅值的三次谐波 v0_3rd = -1/6 * cos(3*theta); va_3rd = va + v0_3rd; vb_3rd = vb + v0_3rd; vc_3rd = vc + v0_3rd; vmax_3rd = max(max(abs([va_3rd; vb_3rd; vc_3rd]))); % 方案3:SVPWM常用的min/max零序分量注入 vmin = min([va; vb; vc], [], 1); vmax = max([va; vb; vc], [], 1); v0_svm = -0.5 * (vmax + vmin); va_svm = va + v0_svm; vb_svm = vb + v0_svm; vc_svm = vc + v0_svm; vmax_svm = max(max(abs([va_svm; vb_svm; vc_svm]))); fprintf('纯正弦SPWM调制波峰值: %.4f\n', vmax_origin); fprintf('注入1/6三次谐波后峰值: %.4f\n', vmax_3rd); fprintf('SVPWM零序注入后峰值: %.4f\n', vmax_svm); fprintf('零序注入后的幅值比值: %.4f\n', vmax_origin / vmax_svm); % 绘图:绘制一个周期内的三种调制波 figure; subplot(3,1,1); plot(theta/pi, va, 'b', theta/pi, v0_3rd, 'r--'); grid on; xlabel('theta / pi'); legend('A相调制波', '三次谐波分量'); subplot(3,1,2); plot(theta/pi, va, 'b', theta/pi, va_3rd, 'r--'); grid on; xlabel('theta / pi'); legend('纯正弦调制波', '注入三次谐波后'); subplot(3,1,3); plot(theta/pi, va, 'b', theta/pi, va_svm, 'r--'); grid on; xlabel('theta / pi'); legend('纯正弦调制波', 'SVPWM零序注入后');运行之后,命令窗口会输出调制波峰值的对比结果。最终显示的幅值比值约为 1.1547,这正好对应 SVPWM 相比传统 SPWM 电压利用率提升的 15.47%。
4.4 Simulink 中搭建三相 SPWM 逆变器
下面进入 Simulink 模型搭建。以三相两电平电压型逆变器为例,完整模型包含以下部分。
4.4.1 调制波与载波生成
- 添加三个 Sine Wave 模块,分别生成 A、B、C 三相调制波。幅值设为调制比 (M=0.8),频率设为 50 Hz,相位分别设置为 (0)、 (-2\pi/3)、 (2\pi/3)。
- 载波使用 Repeating Sequence 模块,设置输出向量为
[0 1 0 -1],时间向量为[0 1/(2*fc) 1/fc 3/(2*fc)]的等差数列形式,具体以模块配置为准,得到幅值为 1 的对称三角波。也可以使用 Repeating Sequence Staircase 配合其他模块实现,但 Repeating Sequence 最直观。
需要注意的是,调制波幅值必须和载波幅值匹配。如果载波幅值为 1,则调制波幅值就是调制比 (M)。
4.4.2 PWM 比较信号
每个调制波分别与载波通过 Relational Operator 模块比较,输出逻辑 0/1 信号。该信号作为上桥臂的开关控制信号;下桥臂的开关信号需要取反,并叠加死区。
死区可以用 On-Off Delay 模块实现,也可以手动构造:将 PWM 信号通过单位延迟和逻辑运算生成带死区的互补信号。死区时间一般取 2~5 us,仿真中为了观察方便,可以取 2e-6 s。
4.4.3 功率电路
- 直流电源使用 DC Voltage Source,电压设为 400 V。
- 三相桥使用 Universal Bridge 模块,桥臂数选 3,功率器件选 IGBT/Diode,Ron 和 Vf 按默认即可。
- 输出端接 Three-Phase Series RLC Branch,设置为 RL 串联,R 取 10 欧姆,L 取 10 mH。
这里需要强调一点:Universal Bridge 的开关信号是高电平有效还是低电平有效,取决于桥臂配置。通常控制信号为 1 时对应上桥臂导通,为 0 时对应下桥臂导通。加入死区后,上下桥臂不会同时导通,避免直通短路。
4.4.4 测量与仿真设置
使用 Voltage Measurement 和 Current Measurement 分别测量负载线电压和相电流。所有波形送入 Scope 观察,也可以通过 Powergui 模块的 FFT Analysis 工具做谐波分析。
仿真参数建议:
- Solver 选择离散或变步长,但功率电路用的 Simscape Electrical 模块在大多数情况下推荐使用固定步长离散求解器。
- 仿真步长建议设置为 1e-6 s 或更小,确保能够捕捉到载波周期内的开关动作。
- 仿真时长可以先设置为 0.1 s,观察 5 个基波周期。
4.5 在 MATLAB Function 中实现三相占空比计算
如果后续要生成嵌入式 C 代码,推荐把占空比计算封装成 MATLAB Function 模块,而不是把整个比较模型都放进代码生成流程。下面是一个可以直接用于 Simulink 的 MATLAB Function 代码骨架。
function [Ta, Tb, Tc] = spwm_duty(theta, M) % theta: 当前电角度 [rad] % M: 调制比,建议范围 0~1 % 输出:A/B/C 三相占空比,范围 [0,1] % 三相对称正弦调制波 d_a = 0.5 + 0.5 * M * cos(theta); d_b = 0.5 + 0.5 * M * cos(theta - 2*pi/3); d_c = 0.5 + 0.5 * M * cos(theta + 2*pi/3); % 最小/最大占空比限幅,防止过窄脉冲损坏功率器件 d_min = 0.05; d_max = 0.95; Ta = min(max(d_a, d_min), d_max); Tb = min(max(d_b, d_min), d_max); Tc = min(max(d_c, d_min), d_max); end在数字控制中,这个函数返回的占空比可以直接换算为定时器比较寄存器的值。例如定时器计数周期为 (T_{PWM}),则比较值:
CMPA = Ta * T_PWM这种实现方式模型简洁,便于代码生成,也方便后续替换成 SVPWM 或三次谐波注入的占空比计算函数。
5. 仿真结果与分析
5.1 占空比与脉冲波形
当调制比 (M=0.8) 时,A 相上桥臂的占空比在 0.1 到 0.9 之间按正弦规律变化,B、C 相依次相差 (120^\circ)。下桥臂信号理论上与上桥臂互补,但由于死区存在,上下桥臂之间存在短暂的同时关断时间,这是