实际做逆变器、电机驱动或并网变换器时最常接触的调制算法之一就是 SPWM 调制算法。很多人刚开始只知道正弦波和三角波比较能输出驱动脉冲但真到了 Simulink 里搭建模型或者把波形映射到单片机 PWM 寄存器时问题会变多三角载波怎么产生、调制比如何影响输出电压、为什么波形只有正半周、FFT 里基波幅值对不上。这些问题的背后不是 Simulink 操作不熟而是没有把数学模型、比较过程和功率电路之间的关系理顺。这篇文章从 SPWM 的数学原理入手再进入 Simulink 模型搭建最后延伸到嵌入式实现和常见故障排查。读者可以按顺序把最小仿真模型跑通并理解每个模块参数为什么这样设置。文中的模型用于学习理解落地到具体产品时还需要结合直流母线电压、开关器件死区、采样延迟和控制器保护逻辑进一步完善。1. 先理解为什么要用 SPWM 调制算法1.1 逆变器的核心任务把直流电变成频率和幅值可调的交流电逆变器的基本任务是把直流母线电压转换为频率和幅值可调的交流电压。最简单的做法是让桥臂交替导通输出方波。方波实现起来很容易但谐波太大在电机负载上会产生明显转矩脉动在并网场合也容易不满足电流质量要求。SPWM 的思路是用低频正弦波作为目标电压的“形状”用高频三角波作为比较基准通过比较结果控制开关管的通断从而得到一系列宽度按正弦规律变化的脉冲。这些脉冲虽然还是开关波形但经过电机绕组或 LC 滤波器后平均电压会逼近正弦波。只要载波频率足够高脉冲宽度与目标正弦电压之间的伏秒面积就能保持等效。因此SPWM 调制算法要解决的是两个问题一是如何表达目标正弦电压二是如何用一次开关动作产生与之等效的脉冲宽度。1.2 SPWM、PWM、SVPWM 之间的关系PWM 是一个大类指通过调节脉冲宽度来改变平均电压的技术。SPWM 是把正弦波作为调制波的 PWM 策略属于脉宽调制中的一种。SVPWM空间矢量 PWM则从电压矢量的角度出发把三相逆变器的八个开关状态组合成空间电压矢量在载波周期内用相邻矢量合成期望电压。从工程结论看SVPWM 可以看作注入零序分量的 SPWM。两者在调制深度、谐波分布和实现方式上有明显差异但对初学者来说最重要的区别是直流电压利用率不同。下面的表格可以用来快速对比。调制策略线性调制区相电压基波峰值线电压基波峰值实现复杂度典型应用标准正弦 SPWMUdc / 2sqrt(3) * Udc / 2较低单相逆变、入门教学三次谐波注入 SPWM约 Udc / sqrt(3)约 Udc中三相不控整流场合SVPWM约 Udc / sqrt(3)约 Udc较高电机驱动、并网逆变器这里的 Udc 是直流母线电压。标准正弦 SPWM 在线性调制区最大调制比只能取到 1继续提高调制比会进入过调制区输出波形畸变迅速增大。注入三次谐波或零序分量之后调制波形本身仍然不会过调制但相电压基波峰值可以提高约 15.47%这就是 SVPWM 比普通 SPWM 电压利用率高的原因。1.3 本文使用的最小实验场景为了让学习路径足够短本文先搭建一个单相双极性 SPWM 模型。模型由正弦调制波、三角载波、比较器、桥臂输出电压计算和 LC 滤波组成。这个模型不涉及三相和闭环控制但具备 SPWM 的核心环节。跑通这个最小模型后可以再做三件事观察调制波与载波的交点如何转换成脉冲宽度测量输出电压的基波幅值是否与理论值一致用 FFT 看谐波主要分布在哪些频率附近。这些工作完成后再切换到单极性 SPWM 或 SVPWM思路会清晰很多。2. 从数学模型出发把比较规则和电压关系写清楚2.1 正弦调制波的数学表达SPWM 的目标是让输出电压的基波接近正弦所以调制波是一个低频正弦信号。设输出基波频率为 f_out正弦调制波可以写成u_r(t) m * sin(2 * pi * f_out * t phi)其中m 是调制比phi 是初始相位通常仿真时取 0。调制比 m 的含义是正弦调制波幅值与三角载波幅值的比值。如果三角载波幅值固定为 1那么正弦波的幅值就是 m。在线性调制区内0 m 1。此时正弦波的峰值不会超过三角载波的峰值每个载波周期内都能正常产生比较交点输出电压基波幅值与 m 近似成线性关系。当 m 超过 1 进入过调制区后正弦调制波会有一段持续时间始终高于或低于载波比较器输出会在一段时间内保持常高或常低输出波形会接近方波基波幅值增长变缓谐波显著增加。在 Simulink 模型里Sine Wave 模块的 Amplitude 参数可以直接设置为变量 m_mod。这样修改调制比时不需要反复改模块参数只需要执行初始化脚本。2.2 三角载波的数学表达与比较规则三角载波的频率称为载波频率 f_carrier。它决定了开关管在一个输出基波周期内切换多少次。三角波的数学形式可以理解为从峰值到谷值线性变化的高频周期信号。在 Simulink 中一般用 Repeating Sequence 模块生成。比较规则很直接当正弦调制波大于三角载波时比较器输出高电平当正弦调制波小于三角载波时比较器输出低电平。这个高低电平决定了桥臂开关状态。为什么这样能等效出正弦电压看一个载波周期。载波频率远高于调制波频率因此在一个载波周期内正弦调制波的瞬时值可以近似看作常量。比较器输出的脉冲宽度就正比于该瞬时正弦值与载波的关系。高电平时间与载波周期的比值等于开关周期内的平均电压与直流母线电压的比值这就是伏秒平均原理。开关频率越高一个周期内的“近似常量”假设越准确输出电压波形也越接近正弦。2.3 单极性工作与双极性工作的差异SPWM 按照桥臂输出电平可以分为单极性和双极性两种方式。双极性 SPWM 最简单每个载波周期内桥臂输出要么是 Udc/2要么是 -Udc/2输出电压在正负母线电压之间来回跳变。单极性 SPWM 则增加一个零电平状态输出电压可以在 Udc/2、0、-Udc/2 三个电平中选择。两种方式的差异可以从开关状态、输出电压电平和滤波难度来对比。工作方式输出电压电平开关状态滤波器压力死区影响双极性 SPWM正、负两种电平上下桥臂互补控制简单较大电压跳变幅度为 Udc死区导致电压误差较明显单极性 SPWM正、零、负三种电平需要增加换向逻辑控制复杂较小输出电平变化幅度低死区影响相对较小单极性方式因为输出电平跳变幅度小谐波含量通常更低滤波更容易但开关管在一个工频周期内的导通组合更复杂。学习阶段建议先实现双极性模型把比较和脉冲宽度看明白后再改成单极性。2.4 输出谐波的主要分布位置SPWM 输出脉冲经过滤波前包含大量与载波频率相关的谐波。基波分量在 f_out谐波主要集中在载波频率 f_carrier 及其整数倍附近并且每一簇谐波都会伴随调制频率的边频分量。也就是说想要降低谐波电流最有效的方式是提高载波频率或者在输出侧增加截止频率低于载波频率的滤波器。工程中常使用 THD总谐波失真评估波形质量。THD 是各次谐波有效值之和与基波有效值的比值。Simulink 里的 FFT 工具可以直接分析输出波形的 THD也能看到各次谐波的频率和幅值是验证 SPWM 模型正确性的重要手段。3. 搭建 Simulink 模型前需要准备的环境和初始化脚本3.1 工具版本和模块库准备本文模型使用 MATLAB/Simulink 基础模块即可完成不一定需要 Simscape 工具箱。核心模块是 Sources、Logic and Bit Operations、Math Operations、Continuous、Sinks 里的常用模块。需要用到 Powergui 和 Fourier 分析时才需要 Simscape Electrical 或 Simscape Power Systems。不同版本的 MATLAB 在模块库路径上略有差异但基本模块名称变化不大。在开始建模前可以在 MATLAB 命令行检查工具是否可用。ver(simulink) license(test, Simulink)如果输出中显示 Simulink 版本信息说明环境可以继续。如果打算使用电力电子功率模块还需要确认是否安装了 Simscape Electrical。ver(simelectrical)没有该工具箱时不要硬建电力电子模型可以先用数学运算模块模拟桥臂电压这样也能验证 SPWM 比较逻辑。3.2 建议的项目文件结构模型文件命名和脚本位置会影响调试效率。建议创建一个单独的仿真项目目录不要直接在 MATLAB 默认路径下散落文件。spwm_demo/ spwm_init.m spwm_model.slx run_analysis.m results/spwm_init.m 是初始化参数脚本spwm_model.slx 是 Simulink 模型run_analysis.m 是后处理脚本用于读取仿真结果并计算 THD。所有文件名不要包含中文和空格避免跨平台运行时出现路径解析问题。3.3 使用初始化脚本统一管理参数直接在模块参数窗口写死数值会导致后续参数扫描非常麻烦。推荐的做法是在模型里所有关键参数都写成变量名由脚本统一赋值。初始化脚本可以这样写。% spwm_init.m Vdc 100; % 直流母线电压单位 V f_out 50; % 输出基波频率单位 Hz f_carrier 10000; % 三角载波频率单位 Hz m_mod 0.8; % 调制比线性区为 0 ~ 1 T_stop 0.1; % 仿真时长单位 s % 载波周期 T_carrier 1 / f_carrier; % 仿真步长建议为载波周期的 1/100 ~ 1/500 Ts T_carrier / 200; % LC 滤波器参数 L_f 5e-3; % 滤波电感单位 H C_f 10e-6; % 滤波电容单位 F R_load 10; % 负载电阻单位 Ohm % 理论输出基波幅值双极性桥臂调制比 m V_out_theory m_mod * Vdc / 2;这样设置之后Simulink 里的 Sine Wave 模块的幅值参数可以写 m_modRepeating Sequence 的时间向量可以写基于 f_carrier 的表达式。修改参数时只需要执行一次脚本不需要打开模块参数界面逐个修改。注意Simulink 中的变量作用范围是 MATLAB 基础工作区。如果你在 Simulink 模型内部使用参数变量运行仿真之前必须先执行初始化脚本否则会出现未定义变量错误。4. 用最小模型实现 SPWM从比较器到功率输出4.1 最小模型需要哪些模块下面的模块列表可以直接用于搭建一个双极性 SPWM 开环仿真模型。模块库路径用途Sine WaveSimulink / Sources生成正弦调制波Repeating SequenceSimulink / Sources生成三角载波Relational OperatorSimulink / Logic and Bit Operations比较调制波和载波GainSimulink / Math Operations把逻辑值转换成电压比例BiasSimulink / Math Operations实现 0/1 到 -1/1 的偏移ScopeSimulink / Sinks观察波形To WorkspaceSimulink / Sinks导出数据做 FFT 分析Transfer FcnSimulink / Continuous模拟 LC 滤波后的负载电压如果只是做逻辑验证不需要 Transfer Fcn。只要把比较结果接入 Scope就能看到脉冲序列。如果还要验证滤波效果可以在桥臂输出电压之后串联一个二阶低通传递函数。4.2 三角载波模块的正确配置Repeating Sequence 模块的作用是产生周期信号。要产生双极性三角载波时间值和输出值可以这样设置。假如载波频率 f_carrier 是 10 kHz那么载波周期是 100 us半个周期是 50 us。在模块参数中设置Time values: [0 1/(2*f_carrier) 1/f_carrier] Output values: [-1 1 -1]输出波形会在 0 时刻从 -1 线性上升到 1再在下一个点从 1 线性下降到 -1。这样三角波的幅值是 1和正弦调制波 m_mod 的取值范围一致。若把三角载波幅值改成其他值调制比 m_mod 的含义也会跟着变容易混乱。如果使用 Repeating Sequence 后发现输出不是三角波常见原因是 Time values 的步长不一致。Time values 必须从 0 开始并且等间距递增否则输出会出现锯齿或不规则波形。4.3 比较器和桥臂输出电压计算Relational Operator 模块选择 比较方式。输入一端接 Sine Wave 输出另一端接 Repeating Sequence 输出。比较结果在正弦波大于或等于三角波时为 1否则为 0。这个 0/1 信号还不能直接当作桥臂输出电压。在双极性 H 桥中理想情况下输出只有两个状态上桥臂导通时输出 Vdc/2下桥臂导通时输出 -Vdc/2。因此需要把逻辑信号从 0/1 映射为 -1/1再乘以 Vdc/2。在 Simulink 中实现这个映射可以分两步Gain 模块增益为 2把 0/1 变为 0/2。Bias 模块偏移为 -1把 0/2 变为 -1/1。再接一个 Gain 模块增益为 Vdc/2。这样输出就是 Vdc/2 或 -Vdc/2 的桥臂电压。如果仿真结果只看到正电压没有负电压大概率就是漏掉了 Bias 偏移这一步。4.4 增加 LC 滤波模型桥臂输出电压是一串高频脉冲要看到正弦波需要在输出端接入低通滤波器。LC 滤波器的截止频率应远低于载波频率同时远高于输出基波频率。LC 截止频率可以按下面公式估算f_LC 1 / (2 * pi * sqrt(L_f * C_f))用初始化脚本中的参数L_f 5 mHC_f 10 uF则截止频率约为 711 Hz。相对于 50 Hz 基波和 10 kHz 载波这个滤波器既能通过基波又能明显衰减载波和谐波适合作为入门演示参数。在 Simulink 中可以用 Transfer Fcn 模块直接建立二阶滤波模型G(s) 1 / (L_f * C_f * s^2 (L_f / R_load) * s 1)分子是 [1]分母是 [L_f*C_f, L_f/R_load, 1]。需要注意的是这个传递函数只是理想情况下的滤波模型忽略了开关管管压降、死区、电感和电容寄生参数。真实功率电路如果要做精确仿真还是要用 Simscape Electrical 建立桥臂、电感和负载模型。5. 仿真运行、波形验证和 FFT 谐波分析5.1 求解器设置建议SPWM 模型包含高频开关信号和连续滤波器仿真步长设置不合适时波形会明显失真甚至出现非预期尖峰。对于入门模型建议使用固定步长求解器。在 Simulink 模型配置窗口的 Solver 选项里选择 Fixed-step求解器选择 ode3 或 ode4步长设置为初始化脚本中的 Ts也就是载波周期的 1/200。如果载波频率是 10 kHzTs 就是 5e-7 秒。仿真 0.1 秒数据点较多但不会影响普通电脑运行。如果只验证比较逻辑可以使用离散求解器。但一旦加入连续 LC 滤波器用离散求解器需要额外做离散化反而不直观。set_param(spwm_model, SolverType, Fixed-step); set_param(spwm_model, Solver, ode3); set_param(spwm_model, FixedStep, Ts); set_param(spwm_model, StopTime, T_stop);这里 spwm_model 是模型名实际使用时应替换成自己的 slx 文件名。5.2 正常波形应该是什么样仿真运行后在 Scope 里同时观察调制波、三角载波和比较输出。正常情况下正弦调制波和三角载波会有规律地相交比较输出是一串频率等于 f_carrier、宽度随正弦幅值变化的脉冲。继续观察桥臂输出电压它应该在 Vdc/2 和 -Vdc/2 之间切换。经过 LC 滤波器后输出应当接近一条光滑的正弦波幅值约为 m_mod * Vdc / 2。当 m_mod 0.8、Vdc 100 V 时理论幅值约为 40 V。如果滤波后波形幅度明显偏低或波形不对称先检查桥臂输出电压是否正确再检查负载电阻和 LC 参数是否低于截止频率。波形如果出现明显削顶通常是调制比 m_mod 大于 1进入了过调制区。5.3 用 FFT 分析 THD 和主要谐波频率运行结果需要从模型里导出到工作区才能做定量分析。推荐在滤波器输出端接一个 To Workspace 模块变量名设为 vout输出格式选择 Timeseries。然后在脚本里做 FFT。下面是简化分析代码% run_analysis.m load(results/vout.mat); % 或直接使用工作区中的 vout v vout.signals.values; t vout.time; % 去掉前 20% 数据避开启动暂态 idx find(t 0.02); v v(idx); t t(idx); Ts_sim t(2) - t(1); Fs 1 / Ts_sim; N 2^nextpow2(length(v)); V_fft fft(v .* hann(N)); f_axis Fs * (0:N-1) / N; mag abs(V_fft) / N * 2;计算完成后找到基波频率 f_out 附近的幅值再统计其他频率分量的幅值就可以得到 THD。也可以用 Simulink 的 Powergui 模块直接做 FFT Analysis但需要模型使用 Simscape 电力电子模块。对纯 Simulink 逻辑模型脚本分析更通用。5.4 调制比和载波频率对输出指标的影响SPWM 模型跑通后值得做一次参数扫描。修改 m_mod观察基波幅值和 THD 的变化趋势。下面表格给出了一般情况下的规律具体数值要在模型中实测。被扫描参数参数增大时的影响参数过小时的影响建议调整方式调制比 m_mod基波幅值接近线性增大过 1 后失真迅速增加输出电压利用不足线性区控制在 0.7 ~ 1.0载波频率 f_carrier谐波频率更高滤波更容易但开关损耗上升谐波接近基波滤波困难根据开关器件允许频率选择LC 截止频率对高频谐波衰减变弱基波幅值下降或动态响应变慢放在基波和载波频率之间偏下位置参数扫描时不要直接手工改模块可以在脚本里循环修改工作区参数再调用 sim 函数运行。注意每次修改后Simulink 模型参数里引用的是基础工作区变量因此需要先用 assignin 或直接在脚本中赋值到基础工作区。6. 从 Simulink 仿真到嵌入式驱动代码的映射6.1 查表法和实时计算法Simulink 模型验证的是算法逻辑但真正驱动电机或逆变器时PWM 脉冲通常由 MCU 的定时器产生。SPWM 常见的工程实现有两种查表法和实时计算法。查表法适合输出频率固定的场合。先把一个完整周期的正弦值离散成 N 个点放在数组中。控制中断里按固定步长查表查到的值映射到定时器比较寄存器。查表法计算量小但输出频率变化时需要调整查表步长。实时计算法适合变频调速。在每个载波中断里根据当前输出频率计算正弦值再换算成比较寄存器值。这种方法灵活但需要保证三角函数计算时间在中断周期内完成。6.2 死区、最小脉宽和电压补偿实际桥臂不能像理想模型那样直接上下管互补导通。功率开关器件存在关断延迟如果不加死区上管还没完全关断下管就导通会造成直通短路。死区时间是工程中必须增加的环节一般取几百纳秒到几微秒具体由开关器件参数决定。死区也会带来副作用。它会降低实际输出电压让电压波形产生误差。死区时间越长、载波频率越高误差越明显。工程中除了在硬件上加入死区生成电路还需要在软件上做死区补偿或电压误差补偿。另一个常见限制是最小脉宽。当正弦波接近过零时SPWM 的脉冲宽度会变得很窄。如果窄到小于开关器件的最小可靠导通时间输出就会出现丢脉冲或电压失真。处理方式有两种对过窄脉冲直接删除或者限制最小脉宽。6.3 一个简化的定时器中断实现示例以常见的中心对齐 PWM 为例定时器计数值在 0 和 ARR 之间来回变化形成三角载波效果。正弦表的值需要映射到比较寄存器。#define TABLE_NUM 512 #define ARR 1600 float m_cur 0.8f; uint16_t sin_table[TABLE_NUM]; void pwm_isr(void) { static uint16_t idx 0; uint16_t ccr; // 正弦值范围 -1.0 ~ 1.0 float sin_val sin_table[idx] / 32768.0f; // 归一化到 0.0 ~ 1.0再乘 ARR ccr (uint16_t)(0.5f * (1.0f m_cur * sin_val) * ARR); TIMx-CCR1 ccr; idx (idx 1) % TABLE_NUM; }这个示例把正弦表值和实时调制比 m_cur 结合得到一个比较寄存器值。定时器配置成中心对齐模式后CCR 的值直接决定 PWM 占空比。示例中的正弦表可以用 MATLAB 脚本生成后导入 C 数组这样 Simulink 仿真和嵌入式代码共用同一组正弦数据可以减少算法迁移误差。7. 常见问题排查现象、原因和处理路径7.1 比较器输出一直是高电平或没有切换如果 Scope 中比较输出是一条直线先看调制波和三角载波是否都有信号。用 Scope 分别观察 Sine Wave 和 Repeating Sequence 输出确认波形是否正常。可能原因有两个一是三角载波的 Time values 设置错误导致输出不是周期三角波二是两个信号幅值范围不匹配。如果正弦波幅值远大于三角载波比较器输出就会长时间为高反之长时间为低。调整 m_mod 和三角载波幅值到同一范围问题通常会消失。7.2 输出电压只有正半周这通常不是比较逻辑的错误而是电压映射环节少了负半周映射。双极性 H 桥输出应当是 Vdc/2 和 -Vdc/2 交替如果只有正电压说明逻辑信号 0/1 没有偏移到 -1/1。检查从 Relational Operator 到最终 Gain 的链路中间是否缺少 Bias 偏移模块。没有 Bias 时0/1 信号乘以 Vdc/2 只能得到 0 和 Vdc/2无法输出负电平。7.3 滤波后基波幅值和理论值不一致先确认当前调制比 m_mod 是否处于线性区。如果 m_mod 大于 1基波幅值不再满足 m_mod * Vdc / 2 的线性关系。再检查 LC 滤波器的截止频率。如果截止频率太接近输出基波频率基波也会有衰减。用公式 f_LC 1 / (2 * pi * sqrt(L * C)) 验算确认截止频率远大于 f_out同时远小于 f_carrier。7.4 FFT 结果中出现大量与载波无关的毛刺FFT 分析对数据长度和采样时间很敏感。如果数据包含启动暂态FFT 结果会包含非周期拖尾导致频谱泄漏严重。分析前应截掉前面一段暂态数据。同时要保证采样时间恒定。如果模型使用可变步长仿真导出的数据时间间隔不一致直接做 FFT 会产生误差。解决方法是使用固定步长或者先把数据重采样到等间隔时间序列。7.5 仿真速度慢或报不收敛连续 SPWM 模型在开关边沿处变化很快如果求解器步长过大可能错过比较交点步长过小又会导致仿真时间过长。使用固定步长求解器能改善这个问题。如果模型包含 Simscape 功率模块出现不收敛时优先检查是否有代数环、电流源直接并联、电感短路等拓扑问题。对于纯 Simulink 逻辑模型建议把载波频率先降到 1 kHz 验证逻辑确认无误后再恢复到 10 kHz。下面的表格汇总了上述排查路径。问题现象常见原因检查方式处理建议输出无脉冲三角波参数错误或信号未接入Scope 查看载波和调制波修正 Repeating Sequence 时间向量只有正半周缺少电压偏移0/1 未映射为 -1/1检查 Bias 是否存在在增益前加入 Bias -1基波幅值不对过调制或滤波器衰减计算线性调制区电压理论值降低调制比检查 LC 截止频率FFT 毛刺增多暂态数据未截除或采样不等间隔检查数据区间和时间步长去暂态使用固定步长仿真速度慢步长过小或载波频率过高观察仿真耗时和步长降低演示用载波频率优化步长8. 工程落地清单、参数速查与扩展方向8.1 从仿真到实验台架前要确认的检查清单仿真波形漂亮不代表实验台架一定能正常运行。以下清单是转入真实硬件前必须确认的内容。直流母线电压采样是否准确过压欠压保护是否生效开关管死区时间是否配置是否满足器件最小死区要求PWM 引脚和桥臂逻辑是否正确是否出现同相误接最小脉宽是否被定时器正确限制输出频率和幅值是否限制在硬件允许范围LC 滤波器或电机负载是否有过流风险控制器的中断频率和 AD 采样是否和载波频率同步Simulink 模型中使用的参数是否与硬件参数一致这组清单里的任何一项没有确认都可能让仿真和实验出现明显差异。不要只拿着调制波形就上电测试尤其是桥臂死区和母线电容放电保护必须优先处理。8.2 参数选择速查表下面的表格适合在搭建 SPWM 模型或编写初始化脚本时快速参考。参数含义学习模型建议值需要考虑的因素Vdc直流母线电压100 V实际母线电压和器件耐压f_out输出基波频率50 Hz电机额定频率或并网频率f_carrier三角载波频率10 kHz开关损耗和滤波器设计m_mod调制比0.8线性调制区为 0 ~ 1L_f滤波电感5 mH电流纹波和动态响应C_f滤波电容10 uF截止频率和谐振风险R_load负载电阻10 Ohm实际负载等效阻抗Ts仿真步长T_carrier / 200仿真精度和时间成本参数选择是相互制约的。提高载波频率能降低滤波压力但会增大开关损耗增大滤波电感能降低电流纹波但会影响动态响应。学习阶段先用表格里的数值把模型跑通再根据目标应用逐步调整。8.3 扩展方向三次谐波注入和 SVPWMSPWM 的线性调制区受调制比 m 1 的限制。如果想提高直流电压利用率可以在正弦调制波中注入零序分量或三次谐波。注入的分量不会出现在线电压基波中但可以改变调制波波形使正弦分量可以超过原三角载波峰值而不实际发生过调制。关于 SPWM 和 SVPWM 幅值关系的常见问题可以这样理解标准正弦 SPWM 在线性区最大相电压基波幅值是 Udc / 2当用 SPWM 注入三次谐波或零序分量来等效 SVPWM 时相电压基波幅值可以提高到约 Udc / sqrt(3)。由于 sqrt(3)这个值比 Udc / 2 大约高 15.47%。这就是 SVPWM 在电压利用率上优于标准 SPWM 的原因。这一结论可以在 Simulink 中验证分别实现标准正弦 SPWM 和注入三次谐波后的 SPWM在同样的 Vdc 和相同调制条件下比较线电压基波幅值。这样可以直观理解为什么电机驱动中大量使用 SVPWM 或三次谐波注入方案。8.4 学习建议SPWM 看起来简单但真正吃透需要把比较逻辑、电压等效、滤波器设计和代码实现串起来。新手可以先复现本文的双极性单相模型观察调制波、载波、桥臂电压和滤波电压四组波形再做一次 m_mod 参数扫描最后把 FFT 分析加入脚本。下一步可以尝试单极性 SPWM比较它与双极性在谐波含量上的差异。接着进入三相 SPWM理解三相调制波之间的相位关系。之后再切换到 SVPWM用 Simulink 查看扇区切换和开关状态序列。这条路径能帮助你避开直接上手 SVPWM 时“只知道公式、不知道物理含义”的问题。在实际项目中不要只依赖 Simulink 的自动代码生成至少要把中断函数、比较寄存器映射和死区配置这三部分看懂才能在波形异常时快速定位是算法问题还是硬件配置问题。