
最近在做三相逆变器与电机控制仿真时又把 SPWM 从头到尾梳理了一遍。网上关于 SPWM 的资料虽然多但大多停留在“正弦波和三角波比较”的层面真正能把数学模型、三次谐波注入、SVPWM 等效关系以及 Simulink 仿真串成一条完整链路的内容并不多。本文从 SPWM 的数学原理出发重点推导占空比公式与谐波分布解释 SPWM 与三次谐波注入、SVPWM 之间的幅值关系最后用 MATLAB 脚本和 Simulink 模型完整演示三相 SPWM 逆变器的仿真实现并整理常见的仿真排错思路。内容面向电力电子、电机控制方向的学生和工程师初学者可以按步骤跑通仿真有经验的朋友也可以重点关注第 3 章和第 6 章的工程化细节。1. SPWM 基础与背景1.1 什么是 SPWMSPWM 全称 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 (n1,2,3,\dots,; m0,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 的线性输出电压上限受 (M1) 限制。在直流母线电压为 (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) 倍。调制方式线性调制比上限相电压基波峰值上限线电压基波峰值上限传统 SPWM1(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 基础环境SimulinkSimscape 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]))); % 方案3SVPWM常用的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 三相调制波。幅值设为调制比 (M0.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/DiodeRon 和 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 占空比与脉冲波形当调制比 (M0.8) 时A 相上桥臂的占空比在 0.1 到 0.9 之间按正弦规律变化B、C 相依次相差 (120^\circ)。下桥臂信号理论上与上桥臂互补但由于死区存在上下桥臂之间存在短暂的同时关断时间这是