SPWM调制算法:数学原理、Simulink建模与嵌入式实现
2026/9/1 18:40:21 网站建设 项目流程

实际做逆变器、电机驱动或并网变换器时,最常接触的调制算法之一就是 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_mod,Repeating 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 mH,C_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 kHz,Ts 就是 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 ~ 1
L_f滤波电感5 mH电流纹波和动态响应
C_f滤波电容10 uF截止频率和谐振风险
R_load负载电阻10 Ohm实际负载等效阻抗
Ts仿真步长T_carrier / 200仿真精度和时间成本

参数选择是相互制约的。提高载波频率能降低滤波压力,但会增大开关损耗;增大滤波电感能降低电流纹波,但会影响动态响应。学习阶段先用表格里的数值把模型跑通,再根据目标应用逐步调整。

8.3 扩展方向:三次谐波注入和 SVPWM

SPWM 的线性调制区受调制比 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 的自动代码生成,至少要把中断函数、比较寄存器映射和死区配置这三部分看懂,才能在波形异常时快速定位是算法问题还是硬件配置问题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询