SPWM数学模型与三次谐波注入:从原理到Simulink仿真实践 很多做电机控制或电源逆变的朋友第一次接触 SPWM 时都会觉得“原理挺简单不就是正弦波和三角波比较输出 PWM 嘛”。但实际一到项目里就会发现事情没那么简单为什么我调出来的波形不对称为什么电源的输出电压比理论值低那么多为什么我用 SVPWM 的时候电压利用率更高它和 SPWM 差的 15% 到底差在哪里这些问题只有在把调制算法背后的数学模型吃透之后才能一次性想明白。这篇内容我会从 SPWM 的数学模型讲起推导脉冲宽度和调制度的公式分析单极性和双极性调制的区别再重点讲一个很多资料一笔带过的关键点——三次谐波注入与零序分量的幅值关系最后带你在 Simulink 里从零搭一个 SPWM 仿真模型并用 FFT 工具观察谐波分布。整篇的逻辑是“先懂原理再懂仿真实例”这样你以后不管是调调制度、换载波频率还是切换到 SVPWM都有一条清晰的排查线索。1. 这篇文章真正要解决的问题SPWM 调制算法的资料在网上并不少但你如果去搜会发现一个奇怪的现象要么是只讲概念和公式不给模型文件要么是丢给你一个 Simulink 模型下载链接却说不清楚内部为什么这么搭。这就导致很多学习者卡在一个很尴尬的位置代码能跑波形能出但一旦发生问题完全不知道从哪里排查。我写这篇文章的目的是帮你用一条线把下面这几个常见疑问串起来第一个疑问是“占空比到底怎么算”。你写 DSP 程序的时候正弦查表加上三角载波比较具体那个比较值是多少这与调制定义、载波幅值归一化方式直接相关很多初学者就是在这里开始混乱的。第二个疑问是“为什么输出电压比母线的半压还低”。很多人以为 SPWM 的相电压最大能到母线电压的一半但实际在线性调制区根本到不了这里牵涉到一个基本限制。而 SVPWM 之所以“高压”本质是在参考电压里加入了零序分量把正弦波的峰值“压”了下去。这个峰值压低的量是多少为什么三次谐波注入是最优解我会在第 4 章用数学公式给你算清楚。第三个疑问是“仿真搭出来了波形却不对”。这通常是模型里模块选择、仿真步长、载波频率这些细节出了问题。我会在第 7、第 9 章给出完整的模型搭建步骤和验证标准并列出最常见的仿真报错和解决办法。所以这篇文章更适合这几类读者刚接触逆变器、变频器想搞清楚 SPWM 本质的入门工程师已经在用 SVPWM但对 SPWM 和 SVPWM 的等效关系没完全想明白的开发人员准备用 Simulink 做电机控制或电源仿真但不知道仿真模型怎么搭、怎么分析波形的人。如果你只是想要一个能用的 SVPWM 模型那本文侧重点不是直接给你模型而是帮你获得看懂模型、改模型、排错的能力。2. SPWM 的基础概念与信号模型SPWM 的全称是 Sinusoidal PWM正弦脉宽调制。它的核心思想用一句话说就是让输出脉冲的宽度按照正弦规律变化从而在负载端得到近似的正弦电压或正弦电流。为什么宽度按正弦变化输出就能接近正弦这里要用到采样控制理论里的“面积等效原理”对两个在时间上分段的信号只要它们在每一小段内冲量信号对时间的积分相等当段数足够多时波形经过低通滤波后的效果就会接近。换句话说一个宽度变化的高频矩形波序列经过惯性环节后等效于一个低频的调制波。逆变器输出的高频 PWM 脉冲再经过电机绕组或者 LC 滤波器就变成一个连续变化的电流或电压。在信号模型层面SPWM 由两个核心信号组成调制波Modulation Wave通常是正弦波频率 f_r 是期望的输出基波频率。它在电网应用中是 50Hz 或 60Hz在电机控制中是变化的给定频率。载波Carrier通常是三角波频率 f_c 就是 PWM 开关频率。载波的幅值通常归一化到 1调制度 M 就是调制波的峰值与载波峰值之比。两个信号送入比较器规则是调制波瞬时值大于载波时输出高电平否则输出低电平。这个比较过程要看起来很直观但仔细想会发现一个问题自然采样得到的 PWM 开关时刻是三角波与正弦波的交点交点时刻靠三角函数方程求解是解不出来的。这就是计算机控制里“规则采样法”存在的根本原因。我在下一章会专门把自然采样法和规则采样法的数学模型拆开讲。这里还要补充一个 SPWM 分类上的选择根据载波和调制波频率的关系可以分成同步调制和异步调制。当载波比 N f_c / f_r 是整数时叫同步调制这时每周期内开关次数固定输出波形周期对称性好异步调制的 N 不是整数可能在低频时出现半波不对称。工程上电网并网逆变器一般用同步调制电机控制变频器常在中低频用同步、极低频用异步或者直接空间矢量调制代替。这个点对后面设置载波频率很有帮助我会在第 11 章再展开。3. 从自然采样到规则采样SPWM 的核心数学模型3.1 自然采样法的数学模型自然采样法就是直接让调制波和载波在时间域上自然相交。设调制波信号为u_r(t) M * sin(2 * π * f_r * t)载波为对称三角波峰值为 ±1周期为 T_c。在一个载波周期 T_c 内三角波从谷值上升到峰值再从峰值下降到谷值。在上升沿时刻 t_a满足调制波等于载波此时输出从低电平翻转为高电平在下降沿时刻 t_b输出再次翻转为低电平。脉冲宽度 T_on t_b - t_a。写出方程后可以看出这个 T_on 隐含在三角方程中含有三角函数反函数直接计算交点需要解超越方程。在早期模拟电路实现时代这是可以做的因为运放比较器天然完成了“瞬时比较”但到了数字信号处理器时代ADC 采样是一拍一拍进行的你没法在一个 PWM 周期内连续跟踪调制波和三角波的相交点。3.2 规则采样法数字控制的基础规则采样法有两个变体对称规则采样和不对称规则采样。实际工程中使用最多的是每个载波周期内采样一次调制波并将该采样值保持到下一个采样周期。设采样时刻 t_c 取在载波峰值或谷值处此时调制波瞬时值为u_r(t_c) M * sin(ω * t_c)在三角波顶点附近我们可以近似认为三角波是线性的于是高电平时间 T_on 与调制波瞬时值近似成正比。按双极性调制的约定一个载波周期内输出有正有负占空比 D 定义为正电平时间占整个载波周期的比例则T_on T_c / 2 * (1 M * sin(ω * t_c)) D T_on / T_c 0.5 * (1 M * sin(ω * t_c))这就是你写 DSP 定时器比较值时最常用的公式。如果你把载波周期 T_c 换成定时器重载值把 0.5 换成半个定时器周期对应的计数值就能算出比较寄存器应该写多少。3.3 采样周期对输出波形的影响规则采样法相比于自然采样法有一个代价它的脉冲宽度不是调制波与三角波的精确交点而是用采样值代替了区间内的近似值。当载波比 N f_c / f_r 足够大时一个载波周期内调制波变化很小这种采样误差可以忽略但 N 很低比如 N9 甚至 6时规则采样会导致输出基波产生一点相位滞后和幅值误差这在电机高速弱磁区要尤其注意。这里有一个工程经验载波频率与基波频率之比建议不低于 20常见电机控制载波比在 50200。电网逆变器多取载波频率 3kHz10kHz基波 50HzN 为 60200采样误差非常小。4. 调制度、电压利用率与三次谐波注入4.1 调制度 M 与线性调制区调制度 M 定义为调制波峰值与载波峰值之比工程上也常叫调制比。当 M ≤ 1 时调制波始终在载波峰峰值范围内比较器输出脉冲宽度随调制波单调变化这属于线性调制区当 M 1 时调制波峰值超过载波峰值会出现“削顶”现象即调制波高于载波或在低于负载波的区间内输出持续饱和这时候虽然开关仍然动作但脉冲宽度不再线性反映调制波输出基波会产生严重谐波对应过调制区。线性调制区内SPWM 的相电压基波幅值的理论极限是母线电压的一半。注意这是“相电压幅值”不是线电压幅值。三相 SPWM 中线电压幅值等于相电压幅值乘以根号三。这个结论我建议你亲手推导一遍三相桥臂输出相对于母线中点相当于三个幅值为 U_dc/2、相位互差 120° 的正弦电压你把线电压做基波向量合成自然能得到根号三的关系。4.2 和 SVPWM 对比为什么 SVPWM 电压利用率高 15.47%很多做电机控制的同学第一次看到 SVPWM 的电压利用率数据会很困惑为什么同样是母线电压SVPWM 能给出的最大相电压幅值是 U_dc/√3而 SPWM 只有 U_dc/2我说一个关键点SVPWM 并没有“变出”任何额外的电能它只是改变了调制波的形状。SVPWM 本质是在三相正弦参考波中注入了零序分量让三相调制波不再是纯正弦而是一种鞍形波。鞍形波的峰值比纯正弦波低因此在线性调制区内可以把调制幅度推到更高而不发生削顶。我们做个数学对比。纯 SPWM 的相调制波峰值为 1最大相电压幅值正比于 1/2。注入三次谐波后调制波变为f(t) sin(ωt) a * sin(3ωt)其中 a 是注入系数。三次谐波在三相系统里有个特别的性质三个相位的三次谐波彼此同相位在线电压合成中会相互抵消因此注入三次谐波不会污染线电压波形。这就是为什么可以放心大胆地注入三次谐波。优化目标是让 f(t) 的峰值最小从而允许更高的调制幅度。经过求导计算当 a 1/6 时f(t) 的峰值从 1 降低为 √3/2 ≈ 0.866。这意味着调制度 M 可以提高到 1 / 0.866 ≈ 1.1547 而仍然处于线性调制区。这 15.47% 的提升刚好就是 SVPWM 相比 SPWM 提升的比例。所以回答一个常见疑问SPWM 里注入三次谐波时三次谐波幅值取多大合适答案是最优值为基波的 1/6而不是随意的某个值。这也是热词里“spwm 和三次谐波或零序分量进行等效时二者的幅值大小存在怎样的关系”的答案所在三次谐波分量幅值为基波的 1/6 时等效于鞍形波调制波峰值降到基波的 √3/2 倍调制比极限从 1 提升到 1.1547。4.3 零序分量与 SVPWM 的统一视角更进一步地SVPWM 的“电压矢量合成”视角和“SPWM 注入零序分量”视角数学上是相通的。SVPWM 在一个扇区内输出的零序电压可以写成一个与 θ 有关的分段函数它的效果就是给三相调制波都叠加一个相同的零序量。不同 SVPWM 的具体实现方式比如七段式、五段式会产生不同的调制波形状和开关次数但它们都能在保持线电压正弦度不变的前提下把相电压调制波峰值压低。当你把 SVPWM 的调制波画出来和你注入 1/6 三次谐波的 SPWM 调制波对比时会发现两者曲线形状在大多数扇区上几乎一致。这个统一视角建议你作为从 SPWM 走向 SVPWM 的桥梁来理解。5. 单极性 SPWM 和双极性 SPWM 怎么选SPWM 的第二个重要分类是单极性和双极性。它们直接影响开关管损耗、谐波含量和滤波成本也是初学者最容易搞混的地方。单极性 SPWM 的桥臂输出在一个正弦半周期内只输出正的母线电压高电平和零电压也就是只有一个桥臂在高速开关另一个桥臂在工频周期内保持固定。以单相全桥为例一个半周期内左桥臂按正弦波与三角波比较的结果高频地开关右桥臂保持低电平下半周期互换。这样输出端电压波形为 0 到 U_dc 之间的高频脉冲不出现负电压脉冲。双极性 SPWM 的四只开关管全部在高频工作每一时刻对角两只同时导通输出电压在 U_dc 和 -U_dc 之间来回切换。这两种方式对系统的影响差别很明显对比维度单极性 SPWM双极性 SPWM开关动作次数半周期内只有一支桥臂高频开关开关损耗低四只管全部高频开关开关损耗较高输出电压脉冲0 和 U_dc 之间变化无负脉冲U_dc 和 -U_dc 之间切换谐波特性谐波集中在载波频率附近低次谐波较小谐波频谱更宽需要更大滤波电感和电容控制复杂度需要极性判断逻辑和换向控制控制逻辑更简单适用场景中小功率单相逆变器、UPS、光伏微型逆变器三相全桥逆变器、电机驱动、中大功率电源一个常见的误解是单极性 SPWM 既然“开关损耗低、谐波小”为什么三相逆变器不用原因是三相桥的结构限制了输出波形只能是对称的三态输出。三相桥的每相输出相对于直流母线中点只有两种电平U_dc/2 或 -U_dc/2本质上就是双极性工作。除非你用 NPC 三电平拓扑才能在一相输出中获得零电平进而实现类似“单极性”的效果。在 Simulink 仿真里如果你只关心原理验证建议先用双极性调制逻辑最简单如果你想验证单极性调制的低频谐波优势可以单独搭一个单相全桥模型加入正弦波绝对值参与比较。第 7 章我会给出双极性三相 SPWM 模型的完整操作步骤。6. Simulink 仿真环境配置与前置知识SPWM 仿真模型可以用 MATLAB 的基本 Simulink 模块搭出来不需要安装额外的电力电子工具包。但如果你想直接使用电力电子开关器件、观测 PWM 驱动信号推荐安装 Simscape Electrical原 SimPowerSystems工具箱这样可以直接使用 Universal Bridge万用桥、IGBT/Diode 等器件模型。依赖工具箱的好处是模型更接近物理实际缺点是仿真速度会明显变慢尤其是在多路开关和滤波电感同时存在时。环境版本方面建议使用 MATLAB R2020a 及以上版本因为较新版本的 Simulink 对 Repeating Sequence 模块的三角波生成方式、Scope 波形读取方式都有改进界面也更好用。版本差异不会影响本章的建模思路只是菜单路径可能略有不同。开始搭建前请确认你的 Simulink 模型中的求解器设置。SPWM 仿真必须使用固定步长求解器推荐使用 discrete离散定步长或者 ode1Euler 法。这一步非常关键仿真步长应该设置为载波周期的 1/501/100 左右。如果载波频率是 10kHz周期为 0.0001s那么最大仿真步长建议取 1e-6 到 2e-6 秒。步长太大会导致 PWM 上升沿和下降沿捕捉不准波形失真步长太小则仿真时间过长。另外如果你在 Simulink 中遇到“Caused by: Lapack 加载错误: mllapack.dll”这类问题这在中文环境里经常是因为 MATLAB 路径被修改、或者外部依赖库损坏导致的。排查思路是先确认 MATLAB 在英文路径下再检查startup.m中是否有路径污染程序最后用matlab -noupdate的方式重新启动 MATLAB。这个问题的根因往往不在模型本身而在环境配置。7. 基于 Simulink 搭建 SPWM 仿真模型下面我会给出一个三相双极性 SPWM 仿真模型的完整搭建步骤。整个模型由信号源、比较器、PWM 输出和观测模块组成不使用电力电子功率器件模型先验证纯算法波形调试最快。7.1 模型架构总览Simulink 模型内部结构由上到下分为三层参考波生成层三个幅值相同、相位相差 120° 的正弦波频率为 f_r幅值由调制度 M 控制。载波生成层一个高频三角波频率为 f_c幅值归一化到 ±1。比较输出层对每一相正弦波和三角波做逻辑比较输出 0/1 的 PWM 信号乘以母线电压半值后得到相电压波形。用到的 Simulink 模块清单如下模块功能模块名称库路径关键参数三相正弦波Sine WaveSimulink / Sources幅值 M频率 50Hz相位相差 2π/3三角载波Repeating SequenceSimulink / Sources输出值为 [-1,1] 排列的三角波比较器Relational OperatorSimulink / Logic and Bit Operations选择 或 数值转换Data Type ConversionSimulink / Signal Attributes输出 double母线电压比例GainSimulink / Math Operations增益为 U_dc/2波形显示ScopeSimulink / Sinks多输入端口谐波分析Powergui FFT Analysis ToolSimscape Electrical / Specialized Power Systems无参数需配合 Scope 数据7.2 模块搭建步骤第一步新建模型文件建议命名为spwm_three_phase.slx。从 Simulink 库中拖入一个 Sine Wave 模块双击打开参数设置Sine type 选择 Time basedAmplitude 设置为变量 M这里 M 可以先用常量 0.8Bias 为 0Frequency 设置为 2pi50对应 50HzPhase 设置为 0。复制这个 Sine Wave 模块两次得到 B 相和 C 相。B 相 Phase 改为 2pi/3C 相 Phase 改为 4pi/3注意负序关系三相 ABC 相位依次滞后 120°。第二步生成三角载波。拖入一个 Repeating Sequence 模块双击设置Time values 输入[0 1/(2*fc) 1/fc]其中 fc 是载波频率Output values 输入[0 1 0]这样得到一个从 0 到 1 再到 0 的三角波。但注意这个三角波的范围是 0 到 1而正弦波幅值如果设为 M范围是 -M 到 M两者范围不一致直接比较会出错。所以需要把载波平移。推荐的做法是正弦波幅值设为2*MBias 设为-M也就是把正弦波平移到 0 到 2M 范围载波用 0 到 1 的三角波。这样比较器可以直接用“正弦波瞬时值 三角波瞬时值”判断输出的占空比本质上和双极性调制一致。第三步为每一相接入一个 Relational Operator 模块符号选择。将 Sine Wave 输出接到第一个输入端Repeating Sequence 输出接到第二个输入端。比较结果直接输出逻辑信号表示每个时刻到底是输出高电平还是低电平。第四步为了后续观察给 PWM 信号乘以母线电压比例。如果你仿真直流母线电压 U_dc 800V理论上桥臂相电压会在 400V 和 -400V 之间切换。可以给比较输出乘上 400 的增益然后用一个 Bias 模块叠加 -400得到双极性输出电压。但更简洁的做法是直接用 Gain 模块乘以 U_dc不需要额外的 bias。第五步将三相 PWM 输出接到三路 Scope 上保存波形。为了做 FFT 分析建议用To Workspace模块把输出保存成数组这样后面用 MATLAB 命令做谐波分析更方便。你可以在 To Workspace 中设置变量名为pwm_a保存格式为Array采样时间保持和仿真步长一致。7.3 仿真参数设置在 Simulink 模型工具栏中打开 Configuration Parameters按以下参数设置Solver 选 discreteType 选 Fixed-stepFixed-step size 填1/(fc*500)其中 fc 是载波频率。如果 fc5000Hz那么步长为 4e-7 秒Stop time 填0.2这个时长足以观察 10 个 50Hz 基波周期做 FFT 时最好选整数个基波周期窗口Save to workspace 有时区设置可以勾选输出时间变量 t 方便后续绘图。做完这些设置后点击运行按钮。如果没有报错模型会立刻生成三相 PWM 波形。这个模型虽然没有电力电子开关器件但已经能验证 SPWM 的算法逻辑、调制度对脉冲宽度的影响、以及不同载波比时的脉冲分布形态。后续如果你想在功率电路上验证滤波后的正弦波形可以在此基础上接入 Universal Bridge 和 RL 负载。8. MATLAB 脚本实现 SPWM 波形生成与对比分析除了用 Simulink 模块还可以用 MATLAB 脚本直接生成 SPWM 波形。脚本的好处是参数化能力更强适合批量分析不同调制度、不同载波频率下的谐波变化。这里我给出两个核心脚本一个是规则采样法生成 SPWM 波形一个是对生成的 PWM 做 FFT 谐波分析。8.1 规则采样法生成 SPWM 脚本% spwm_rule_sampling.m % 用规则采样法生成三相 SPWM 波形 % 参数设置 fc 5000; % 载波频率 5kHz fr 50; % 基波频率 50Hz M 0.8; % 调制度 Udc 800; % 母线电压 800V Ts 1/(fc*500); % 仿真步长 t 0:Ts:0.1; % 100ms 仿真时间 Tc 1/fc; % 载波周期 N length(t); pwm_a zeros(N,1); pwm_b zeros(N,1); pwm_c zeros(N,1); % 规则采样在每个载波周期峰值处采样一次调制波 for k 1:N t_sample floor(t(k)/Tc) * Tc Tc/2; % 当前载波周期近似峰值时刻 ua M * sin(2*pi*fr*t_sample); ub M * sin(2*pi*fr*t_sample - 2*pi/3); uc M * sin(2*pi*fr*t_sample - 4*pi/3); % 双极性调制占空比 D 0.5*(1u) % 等效为比较u carrier 来生成 PWM 波形 % 这里直接用归一化三角波比较 carrier (2*mod(t(k)/Tc, 1) - 1); % 从 -1 到 1 的三角波近似 carrier 2*carrier - 1; % 确保幅值范围合理 % 更标准做法三角波用 sawtooth 的派生产物见下方替代 end % 实际推荐用向量化方法生成三角波 carrier_tri (2/pi)*asin(sin(2*pi*fc*t)); % 下面的循环可以替换为 % pwm_a double(M*sin(2*pi*fr*t) carrier_tri); % pwm_b double(M*sin(2*pi*fr*t - 2*pi/3) carrier_tri); % pwm_c double(M*sin(2*pi*fr*t - 4*pi/3) carrier_tri);上面脚本中用了 asin(sin()) 这种数学方式生成三角波优点是写法简单。实际上 MATLAB 里更常见的三角波生成方式是直接用sawtooth% 生成幅值 -1 到 1 的三角载波 tri sawtooth(2*pi*fc*t, 0.5); % duty cycle 0.5 表示对称三角波用 sawtooth 输出的是 [−1,1] 范围所以正弦波幅值直接用 M 即可。完整生成代码% spwm_generate.m fc 5000; fr 50; M 0.8; Udc 800; Ts 1/(fc*500); t 0:Ts:0.1; tri sawtooth(2*pi*fc*t, 0.5); ua M * sin(2*pi*fr*t); ub M * sin(2*pi*fr*t - 2*pi/3); uc M * sin(2*pi*fr*t - 4*pi/3); pwm_a double(ua tri); pwm_b double(ub tri); pwm_c double(uc tri); % 相电压波形 va (2*pwm_a - 1) * Udc/2; vb (2*pwm_b - 1) * Udc/2; vc (2*pwm_c - 1) * Udc/2;8.2 FFT 谐波分析脚本% fft_analysis.m % 对 SPWM 输出电压波形做 FFT fs 1/Ts; L length(va); f fs*(0:(L/2))/L; Y fft(va); % 忽略直流分量 P2 abs(Y/L); P1 P2(1:L/21); P1(2:end-1) 2*P1(2:end-1); % 找到基波幅值和谐波分量 [~, idx_fund] min(abs(f - fr)); fund_amp P1(idx_fund); thd_value sum(P1.^2) - fund_amp^2; thd_value sqrt(thd_value) / fund_amp; fprintf(基波幅值: %.2f V\n, fund_amp); fprintf(THD: %.2f%%\n, thd_value*100); figure; plot(f(1:5000), P1(1:5000)); xlabel(频率 (Hz)); ylabel(电压幅值 (V)); title(SPWM 输出电压频谱); xlim([0 20000]);运行这段脚本你会看到50Hz 处有一个明显的基波峰值幅值约为 M * Udc / 2在 5000Hz 载波频率附近会出现一簇边带谐波主谐波集中在 5000Hz 两边各若干倍频当 M 从 0.8 提升到 1 时基波幅值线性增加但 THD 也会略微变化。9. 仿真运行结果与效果验证9.1 如何判断仿真模型正确把示波器 Scope 打开后你至少要验证三个结果才算这个模型基本正确第一个是 PWM 脉冲宽度分布是否呈正弦规律。把三角载波和某一相正弦调制波同时显示在同一个坐标轴上你会看到调制波越高的区域PWM 高电平脉冲越宽越接近 100% 的导通时间调制波接近负峰值时高电平脉冲越来越窄最终接近 0。观察这个趋势是最快的功能验证。第二个是相电压平均值波形是否为正弦。将某一相的 PWM 输出信号通入一个低通滤波器连续时间滤波或者直接在 Scope 上放一个 Moving Average 模块你会看到滤波后的波形接近正弦波频率为 50Hz幅值正比于 M。第三个是线电压合成是否正确。取 A 相和 B 相相电压相减得到线电压波形。理想的线电压波形是幅值为相电压 √3 倍的正弦波。你可以通过两个 Gain 加一个 Sum 模块实现。9.2 调制度变化时波形怎么变把 M 改到 0.4、0.8、1.0 各跑一次仿真对比 PWM 脉冲宽度和滤波后正弦波幅值。你会观察到M 越大脉冲宽度变化幅度越大到 M1 时调制波正弦峰值刚好等于三角载波峰值此时线性调制区到达极限。如果继续设 M1.2调制波会削顶此时滤波器输出波形出现明显畸变FFT 分析里 3、5、7 次谐波显著增加。这就是过调制区工程上一般不推荐长时间工作在这个区间。9.3 仿真失败时的排查顺序如果模型跑起来没有输出波形不要急先检查三件事步长设置固定步长是否比载波周期小很多如果步长比载波周期大PWM 比较结果根本不会翻转数据类型Relational Operator 比较的两个信号类型是否一致如果正弦波是 double三角载波是 boolean很多版本会报错或者产生异常Scope 的连接端口你看到的 Scope 是否接对了输出而不是接到了比较器内部信号。如果 Simulink 直接报错说“Output data type must be boolean to drive this block”说明比较器的输入不是两个数值信号。这种情况通常是你把 Repeating Sequence 的输出直接送给了某些默认要求 boolean 的模块。解决方式是在比较器输出后加一个 Data Type Conversion 模块把它转成 double再继续向后传递。10. 常见问题与排查思路问题现象可能原因排查方式解决方案PWM 输出全是 0 或全是 1调制波幅值超出载波范围比较器极端饱和查看调制波和载波各自的 Scope 波形把调制波幅值限制在载波范围内确保 M ≤ 1正弦载波与三角波幅值范围不匹配正弦波和三角波的数值范围相差太大分别显示两个信号的数值范围统一归一化到 [0,1] 或 [-1,1]滤波后输出正弦波幅值低于理论值调制度 M 设置过低或滤波截止频率设置不当检查 M 值并对比 FFT 基波幅值增大 M 或重新设计滤波器截止频率仿真速度慢到无法接受步长过细或 Simscape 电力电子器件过多查看仿真计算耗时调大步长到载波周期的 1/50 左右Simulink 报 mllapack.dll 加载错误MATLAB 路径冲突或环境损坏检查 startup.m、路径设置在英文路径下重启 MATLAB修复安装FFT 分析中谐波峰值不明显分析窗口未取整数基波周期检查 FFT 时间窗长度取 0.02s 的整数倍50Hz 基波周期单极性 SPWM 模型输出半波不对称半周期切换逻辑错误查看桥臂控制信号时序增加极性判断按正弦符号切换两个桥臂的工作模式11. 工程最佳实践与后续深入方向11.1 载波频率选择的典型权衡载波频率不是越高越好。载波频率越高电流纹波越小、噪声越小、滤波器体积越小但开关损耗按线性增长死区效应造成的谐波问题也会加剧。实际工程中IGBT 方案的开关频率一般在 2kHz10kHz 之间SiC MOSFET 方案可以到 20kHz50kHz但要配合高效散热设计。仿真阶段我建议从 5kHz 开始这个频率既能在波形上清楚看到 PWM 各次谐波又不会让仿真时间太长。11.2 死区时间的影响现实功率器件不可能瞬时开通和关断。同一桥臂上、下管如果同时导通会直接造成直通短路。所以必须插入死区时间即让上管关断后等待一小段时间再让下管开通。死区时间一般取开关周期的 2%5%典型值是 1μs3μs。死区时间会在输出基波中引入低次谐波导致电流畸变。你在仿真纯算法模型时默认为 0 死区波形比较完美但实际硬件上死区效应不可忽略。这属于 SPWM 进阶内容可以继续深入“死区补偿”和“最小脉宽限制”两个方向。11.3 从 SPWM 到 SVPWM 的学习路径理解了 SPWM 的数学模型、特别是三次谐波注入对调制波的峰值抑制作用后再学习 SVPWM 会轻松很多。SVPWM 的本质不是真的“矢量合成”而是通过相邻基本电压矢量作用时间的计算输出一组占空比序列。它的调制波形状恰好等价于注入了 1/6 三次谐波的 SPWM 调制波。你在 Simulink 中实现 SVPWM 以后建议把三角载波比较环节的调制波换成 SVPWM 计算出的调制波并直接对比两种调制下逆变器输出电压的 THD 和直流电压利用率这一步会让你彻底贯通“调制算法”的底层逻辑。11.4 推荐的实践路径如果你已经完整跑通了本文介绍的 SPWM 模型下一步建议这样安排把调制度 M 做成模型的外输入参数改成正弦扫描或者 ramp 信号观察输出电压动态变化给三相 PWM 加入死区逻辑分析死区对基波电压的影响把载波从 5kHz 改为 2kHz 和 10kHz对比 FFT 谐波谱的位置变化接入 Universal Bridge 和 RL 负载用真实功率器件模型跑通一次完整的逆变器带载仿真阅读 DSP 定时器 PWM 生成模块的手册把规则采样法公式写成实际寄存器值计算的 C 代码。到了最后这一步你会发现自己对“数学模型、仿真验证、硬件实现”三者之间的关系有了真正完整的认知。这也正是本文想达到的目标不是让你背下一个 SPWM 模型结构而是让你理解每一个模块、每一个公式背后到底发生了什么从而在真实项目中敢于改模型、敢于下结论、有能力排查问题。这篇文章所写的模型搭建步骤和 MATLAB 脚本建议收藏起来以后调逆变器模型、做电机控制仿真时直接拿出来对照用。