三相PWM整流器是电力电子与新能源方向的常见仿真课题,课程设计、毕业设计、论文验证都会用到。这类模型的核心不在于“能不能转起来”,而在于双闭环能不能稳住、SVPWM 调制出来的波形正不正、交流侧电流谐波大不大、直流母线电压的抗扰动能力够不够。这次我们来看一套基于 MATLAB/Simulink 的三相 PWM 整流器双闭环仿真模型,控制结构采用电压外环、电流内环的 VOC(电压定向控制),调制方式用 SVPWM,模型可以在 Simulink 里完整搭出来,也可以按自己的参数批处理跑波形。
这个模型要解决的核心问题有三个。第一,交流侧电流要接近正弦,功率因数接近 1;第二,直流母线电压要稳定在给定值,负载突变时不能出现大的超调和振荡;第三,SVPWM 算法要能正确计算扇区和作用时间,保证 IGBT 桥臂按七段式顺序动作。下文会给出拓扑结构、控制原理、双闭环 PI 参数设计思路、SVPWM 算法实现代码、Simulink 搭建步骤、仿真验证方法和常见问题排查清单。如果你正在做 PWM 整流器仿真、SVPWM 代码实现或者 simulink 建模,这篇可以直接对照参考。
先说清楚,这是一篇建模与调试向的文章,不是“下载即跑”的一键包教程。模型需要你自己在 Simulink 里按步骤搭,或者借助脚本生成。文章末尾也会单独讲,如果不想从零搭,或者需要按你的电机参数、电网参数、控制指标改模型,这类定做 matlab 仿真模型服务的对接思路是什么。
1. 核心能力速览
| 能力项 | 说明 |
|---|---|
| 项目类型 | 三相 PWM 整流器 Simulink 仿真模型,双闭环控制 |
| 控制结构 | 电压外环 + 电流内环,dq 旋转坐标系下 VOC 控制 |
| 调制方式 | SVPWM 空间矢量调制,七段式 |
| 仿真平台 | MATLAB/Simulink,需要 Simulink、Simscape Electrical(或 SimPowerSystems)工具箱 |
| 主电路拓扑 | 三相全桥 IGBT 整流器,交流侧进线电感,直流侧支撑电容 |
| 输入电源 | 三相交流电源,示例按 380V/50Hz 搭建,可修改 |
| 主要输出 | 直流母线电压 Vdc、三相电流 ia/ib/ic、dq 轴电流、SVPWM 开关脉冲 |
| 分析能力 | 通过 Powergui 的 FFT 工具做电流谐波分析,通过 Scope 观察动态波形 |
| 批处理能力 | 支持用 sim 命令做负载、电感、PI 参数的批量扫描 |
| 适用场景 | 课程设计、毕业设计、论文仿真、工程预研验证 |
| 扩展方向 | 弱磁控制、LCL 滤波器、单位功率因数验证、双向整流器、电机侧整流等 |
从材料看,这套模型的重点是双闭环和 SVPWM。搭建时必须把“主电路、坐标变换、PI 调节器、SVPWM 调制、脉冲驱动”五块全部打通,任何一环极性接反或者采样时间不匹配,波形都会出问题。
2. 拓扑结构与双闭环控制原理
三相 PWM 整流器的主电路由三相交流电源、进线电感 L、三相 IGBT 全桥和直流侧电容 C 组成。交流侧电感起到升压和滤波作用,直流侧电容维持母线电压稳定。与普通不控整流相比,PWM 整流器通过控制 IGBT 的开通顺序,可以让交流侧电流跟踪电压相位,实现单位功率因数,同时把直流母线电压抬升到高于交流侧线电压峰值。
控制上最常用的是电压定向控制 VOC。把电网电压矢量定向到 d 轴,q 轴电压分量为零,则有功电流和无功电流自然解耦。外环是直流电压环,负责把 Vdc 稳在给定值 Vdc_ref,它的输出作为 d 轴电流给定 id_ref;q 轴电流给定 iq_ref 通常设为 0,也就是要求无功电流为零。内环是 dq 轴电流环,分别调节 id 和 iq,输出经过反 Park 变换得到静止坐标系下的 Ualpha 和 Ubeta,送给 SVPWM 模块生成开关脉冲。
整个控制回路可以写成下面这条链路:
Vdc_ref → 电压PI → id_ref → 电流PI → Vd_ref → Vq_ref iq_ref = 0 → 电流PI → ↑ Vd/Vq → 反Park → Ualpha/Ubeta → SVPWM → IGBT脉冲电流内环的响应速度要远快于电压外环。一般电流环带宽取开关频率的 1/10 到 1/20,电压环带宽再比电流环慢 5 到 10 倍。这个带宽关系决定了 PI 参数的数量级,后续整定时会用到。
3. 双闭环控制器设计与 PI 参数整定
3.1 电流内环设计
忽略电网电压扰动,单相电流环路的被控对象近似为一阶惯性环节:
G(s) = 1 / (Ls + R)其中 L 为进线电感,R 为电感等效串联电阻。电流环 PI 可以采用零极点对消方式整定。设电流环期望带宽为 omega_c,则 PI 参数可按下式估算:
Kp = L * omega_c Ki = R * omega_c这里 omega_c 的单位是 rad/s。如果开关频率是 10 kHz,电流环带宽通常取 500 到 1000 Hz 左右,对应 omega_c 约为 3000 到 6000 rad/s。注意这只是工程估算起点,实际要在模型里微调。
3.2 电流解耦
在 dq 坐标系下,d 轴和 q 轴电流之间存在交叉耦合项。为了消除这种耦合,需要在电流 PI 输出上叠加前馈补偿。常见写法如下:
Vd_ref = Vd_pi - omega * L * iq + ed Vq_ref = Vq_pi + omega * L * id + eq其中 omega 是电网角频率,ed 和 eq 是电网电压的 dq 轴分量。Vd_pi 和 Vq_pi 是电流 PI 调节器的输出。加上前馈后,d 轴和 q 轴电流可以独立控制,动态性能会明显改善。
3.3 电压外环设计
电压外环控制对象是从交流侧有功功率到直流母线电压的能量平衡关系。近似模型可以写成一阶惯性环节,PI 参数一般从电流环带宽的 1/5 到 1/10 起步。外环输出必须限幅,因为 id_ref 代表交流侧允许的最大有功电流,不限幅会导致启动时电流冲击过大。
3.4 示例参数
下面给一组可以起仿的示例参数,具体数值需要按你的电网电压和功率等级调整。
| 参数 | 数值 | 说明 |
|---|---|---|
| 电网线电压 | 380V / 50Hz | 三相交流源 |
| 进线电感 | 5 mH | 可在 3~10 mH 之间调整 |
| 电感等效电阻 | 0.1 Ω | 寄生电阻 |
| 直流侧电容 | 4700 μF | 影响电压纹波和动态响应 |
| 直流母线给定 | 650 V | 必须高于交流侧线电压峰值 |
| 开关频率 | 10 kHz | SVPWM 载波频率 |
| 负载 | 电阻负载,可改恒功率负载 | 用于验证抗扰性 |
4. SVPWM 调制算法原理与 MATLAB 实现
SVPWM 的基本思想是,把三相逆变桥的 8 种开关状态对应到 6 个有效电压矢量和 2 个零矢量,在一个开关周期内用相邻有效矢量和零矢量来合成期望的参考电压矢量。相比 SPWM,SVPWM 的直流电压利用率更高,电流谐波也更小。
实现 SVPWM 需要做四件事:扇区判断、计算相邻矢量作用时间 T1 和 T2、处理过调制、生成七段式开关序列。下面是可直接放到 MATLAB Function 或 .m 文件里的完整函数。
function [Da, Db, Dc] = svpwm_duty(Ualpha, Ubeta, Vdc, Ts) % SVPWM 七段式调制 % 输入: % Ualpha, Ubeta - 静止两相坐标系电压指令 (V) % Vdc - 直流母线电压 (V) % Ts - 开关周期 (s) % 输出: % Da, Db, Dc - 三相上桥臂占空比 (0~1) % 1. 扇区判断 U1 = Ubeta; U2 = 0.5 * sqrt(3) * Ualpha - 0.5 * Ubeta; U3 = -0.5 * sqrt(3) * Ualpha - 0.5 * Ubeta; N = 0; if U1 > 0 N = N + 1; end if U2 > 0 N = N + 2; end if U3 > 0 N = N + 4; end switch N case 3, sector = 1; case 1, sector = 2; case 5, sector = 3; case 4, sector = 4; case 6, sector = 5; case 2, sector = 6; end % 2. 基本矢量作用时间中间变量 X = sqrt(3) * Ubeta * Ts / Vdc; Y = (1.5 * Ualpha + sqrt(3) / 2 * Ubeta) * Ts / Vdc; Z = (-1.5 * Ualpha + sqrt(3) / 2 * Ubeta) * Ts / Vdc; % 3. 按扇区计算 T1, T2 switch sector case 1 T1 = Z; T2 = Y; case 2 T1 = Y; T2 = -X; case 3 T1 = -Z; T2 = X; case 4 T1 = -X; T2 = Z; case 5 T1 = X; T2 = -Y; case 6 T1 = -Y; T2 = -Z; end % 4. 过调制限幅 if (T1 + T2) > Ts T1 = T1 * Ts / (T1 + T2); T2 = T2 * Ts / (T1 + T2); end T0 = Ts - T1 - T2; % 5. 七段式比较值 Tcm1 = T0 / 4; Tcm2 = T0 / 4 + T1 / 2; Tcm3 = T0 / 4 + T1 / 2 + T2 / 2; % 6. 按扇区分配三相占空比 switch sector case 1 Ta = Tcm1; Tb = Tcm2; Tc = Tcm3; case 2 Ta = Tcm2; Tb = Tcm1; Tc = Tcm3; case 3 Ta = Tcm3; Tb = Tcm1; Tc = Tcm2; case 4 Ta = Tcm3; Tb = Tcm2; Tc = Tcm1; case 5 Ta = Tcm2; Tb = Tcm3; Tc = Tcm1; case 6 Ta = Tcm1; Tb = Tcm3; Tc = Tcm2; end Da = Ta / Ts; Db = Tb / Ts; Dc = Tc / Ts; end这段代码的输出是三相上桥臂占空比。在 Simulink 里,可以把占空比和一个 0 到 1 的三角载波做比较,占空比大于载波时输出高电平,得到 IGBT 的驱动脉冲。注意下桥臂必须取反,并且要加死区,防止同一桥臂上下管直通。
5. MATLAB/Simulink 仿真环境准备
搭建模型之前,先确认环境满足要求。
- MATLAB 版本:建议 R2020a 及以上,版本太老时部分模块名称和位置会有差异。
- 必备工具箱:Simulink、Simscape Electrical(旧版本叫 SimPowerSystems)。
- 求解器:PWM 整流器模型建议使用离散固定步长求解器,步长取 1e-6 到 1e-5 秒。
- 模型里必须放置 Powergui 模块,否则 Simscape Electrical 的主电路仿真无法运行。
环境检查清单如下:
- MATLAB 能正常打开 Simulink;
- Simscape Electrical 库可以访问,能看到 Three-Phase Source、Universal Bridge、Powergui 等模块;
- MATLAB Function 模块可用,支持自定义函数;
- 工作区变量能通过 .m 脚本初始化和读取。
如果缺少 Simscape Electrical 工具箱,通用办法是换用 Simulink 基础模块搭建主电路,但工作量和调试难度都会增加,建议优先确认工具箱是否完整。
6. Simulink 模型搭建步骤
下面按模块顺序给出搭建步骤,模型命名建议用“主电路 + 控制回路”分层的结构。
6.1 主电路搭建
从 Simscape Electrical 库中拖入 Three-Phase Source,设置线电压 380V、频率 50Hz。串联三根进线电感 L,再接到 Universal Bridge 模块。Universal Bridge 选择 IGBT/Diodes,桥臂数选 3。直流侧接电容 C 和负载电阻。电容建议并联一个大电阻用于初始放电,避免仿真初始时刻出现数值奇异。
6.2 采样与坐标变换
把三相电流 ia、ib、ic 和直流母线电压 Vdc 通过 Goto/From 或者信号线送入控制回路。电流先经过 Clarke 变换得到 i_alpha、i_beta,再经过 Park 变换得到 id、iq。Park 变换需要电网电压相位 theta,可以用 Simscape Electrical 自带的 Three-Phase PLL 模块锁定电网电压相位,也可以自己搭一个单同步坐标系锁相环。
Clarke 和 Park 变换可以直接写成 MATLAB Function 模块,也可以拆成 Gain 和三角函数组合。推荐写成函数,便于复用。
function [i_alpha, i_beta] = clarke(ia, ib, ic) % 三相 abc 到两相静止坐标系 i_alpha = (2/3) * (ia - 0.5 * ib - 0.5 * ic); i_beta = (2/3) * (sqrt(3)/2 * ib - sqrt(3)/2 * ic); endfunction [id, iq] = park(i_alpha, i_beta, theta) % 两相静止到两相旋转坐标系 id = i_alpha * cos(theta) + i_beta * sin(theta); iq = -i_alpha * sin(theta) + i_beta * cos(theta); end6.3 双闭环控制回路
直流电压给定 Vdc_ref 通过阶跃或斜坡信号输入,与 Vdc 反馈做差后进电压 PI 控制器,输出限幅后作为 id_ref。iq_ref 直接给 0。id、iq 与给定做差后进两个电流 PI 控制器,得到 Vd_pi、Vq_pi。在此基础上叠加解耦前馈项,得到 Vd_ref、Vq_ref,再经过反 Park 变换得到 Ualpha、Ubeta。
function [Ualpha, Ubeta] = inv_park(Vd, Vq, theta) % 两相旋转到两相静止坐标系 Ualpha = Vd * cos(theta) - Vq * sin(theta); Ubeta = Vd * sin(theta) + Vq * cos(theta); end6.4 SVPWM 与脉冲驱动
把 Ualpha、Ubeta、Vdc 和 Ts 送入前面写的 svpwm_duty 函数,得到 Da、Db、Dc。在 Simulink 里用 Repeating Sequence 生成 0 到 1 的三角载波,频率设为开关频率。占空比与载波比较后生成上桥臂脉冲,下桥臂信号取反,并通过 Transport Delay 或 Programmable Pulse Generator 加死区,再送入 Universal Bridge 的 gate 端口。
6.5 波形显示
用 Scope 或 Data Type Conversion 加 To Workspace 把 Vdc、ia、ib、ic、id、iq、Ualpha、Ubeta 保存到工作区。推荐用 To Workspace 保存结构体或数组,便于后续批处理和 FFT 分析。
7. 仿真参数设置与运行
仿真参数直接影响收敛性和速度,建议按下表设置初始值。
| 设置项 | 推荐值 | 说明 |
|---|---|---|
| 求解器类型 | 离散固定步长 | 与 SVPWM 数字控制匹配 |
| 固定步长 | 1e-6 s | 可放宽到 5e-6,步长太大影响 PWM 精度 |
| 仿真时长 | 0.4~0.6 s | 足够观察启动和稳态 |
| 开关频率 | 10 kHz | SVPWM 载波频率 |
| Vdc_ref 软启动 | 斜坡上升 | 减小启动冲击 |
运行之前,先在工作区初始化参数。推荐单独建一个 init.m,把所有参数集中写在里面。
% init.m 参数初始化示例 Vg_rms = 380; % 电网线电压有效值 f_grid = 50; % 电网频率 L = 5e-3; % 进线电感 R = 0.1; % 电感等效电阻 C = 4700e-6; % 直流侧电容 Vdc_ref = 650; % 直流母线电压给定 f_sw = 10000; % 开关频率 Ts = 1 / f_sw; % 开关周期 Ts_sim = 1e-6; % 仿真步长 RL = 20; % 负载电阻 % PI 参数 w_cc = 2 * pi * 500; % 电流环带宽 Kp_i = L * w_cc; % 电流环 Kp Ki_i = R * w_cc; % 电流环 Ki w_cv = w_cc / 8; % 电压环带宽 Kp_v = C * w_cv; % 电压环 Kp Ki_v = 100; % 电压环 Ki,需微调注意 Kp_v 和 Ki_v 只是估算起点,实际要观察波形微调。建议先只闭环电流环,用开环电压方式验证电流跟踪能力,再闭合电压环,这样定位问题更快。
运行仿真时直接点 Run,或者在命令行执行:
% 运行仿真并读取结果 simOut = sim('PWM_Rectifier_DoubleLoop', 'StopTime', '0.4'); Vdc = simOut.Vdc.Data; Ia = simOut.Ia.Data; t = simOut.tout;8. 仿真结果分析与波形验证
模型搭完后,重点看四类波形。
第一,直流母线电压 Vdc。启动后 Vdc 应该从初始值平稳爬升到 650V,稳态误差尽可能小,电压纹波在允许范围内。如果 Vdc_ref 加了斜坡,波形应该平滑跟随;如果直接用阶跃,会有一定超调,这是正常的,但超调不应太大。
第二,三相交流电流 ia、ib、ic。稳态时电流应接近正弦,幅值由负载功率决定。用 Powergui 的 FFT 工具分析稳态电流波形,THD 应该在一个可接受的范围内。工程上通常以 5% 作为电网侧电流谐波的参考红线,但仿真模型的值会随电感和开关频率变化。
第三,dq 轴电流 id 和 iq。id 应该跟随 id_ref,iq 应该在 0 附近小幅波动。如果 iq 均值明显偏大,说明功率因数没有调好,需要检查 Park 变换角度和给定方向。
第四,SVPWM 脉冲。展开波形看桥臂驱动信号,确认七段式顺序正常,同一桥臂上下管之间有死区间隔。
判断仿真是否成功的标准可以归纳为:
- Vdc 稳态误差在 1% 以内;
- 交流电流正弦度好,无明显尖峰和非周期振荡;
- iq 平均值为 0 附近,功率因数接近 1;
- 负载突变后 Vdc 能重新收敛,恢复时间在可接受范围;
- SVPWM 脉冲频率和开关频率一致,不死区异常。
9. 批量仿真与参数扫描
Simulink 模型本身不支持自动批量跑,但可以通过 sim 命令在工作区批量修改参数。这是做论文参数分析和定做模型时最常用的方式。下面是一个负载电阻扫描脚本的通用模板。
% 批量负载扫描脚本 clear; clc; init; % 先运行参数初始化脚本 R_list = [10, 20, 40]; for k = 1:length(R_list) set_param('PWM_Rectifier_DoubleLoop/RL', 'Resistance', num2str(R_list(k))); simOut = sim('PWM_Rectifier_DoubleLoop', 'StopTime', '0.4'); Vdc = simOut.Vdc.Data; Ia = simOut.Ia.Data; save(sprintf('result_R%d.mat', R_list(k)), 'Vdc', 'Ia'); end注意 set_param 的模块路径必须和实际模型一致,RL 模块名称也要对应。批量扫描时建议每次只改一个参数,并给输出文件加上参数标识,避免结果互相覆盖。
如果要做 PI 参数扫描,可以外层再套一层循环,把每组 Kp、Ki 写入工作区,再调用 sim。批量仿真的耗时取决于模型复杂度和步长,模型规模大时可以先用较短仿真时长粗扫,锁定候选参数后再跑长仿真。
10. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 仿真直接报错 | 缺少 Powergui,或模块库不完整 | 检查模型里有没有 Powergui | 添加 Powergui,并选择离散求解模式 |
| 直流母线电压一直冲高 | 电流环极性接反,或 PI 参数不合理 | 观察 id 是否跟随给定 | 先单独调电流环,确认反馈极性正确 |
| 启动冲击电流过大 | Vdc_ref 阶跃给定,PI 积分饱和 | 查看启动段电流波形 | Vdc_ref 加斜坡,限制 PI 输出限幅 |
| SVPWM 脉冲异常 | 扇区判断错误,或限幅没处理 | 查看 Ualpha/Ubeta 和占空比波形 | 单独给 svpwm_duty 喂固定电压做单元测试 |
| 电流 THD 偏高 | 电感偏小,或开关频率太低 | 用 FFT 工具分析电流 | 增大电感、提高开关频率、检查采样时间 |
| 仿真速度很慢 | 连续求解器,或步长太小 | 查看仿真执行时间 | 改用离散固定步长,适当放大步长 |
| 同一桥臂直通 | 死区未加或下桥臂取反错误 | 展开脉冲波形 | 下桥臂取反,并加死区 |
| 负载突变后 Vdc 发散 | 电压环带宽过高或相位裕度不足 | 观察 Vdc 和 id 动态波形 | 降低电压环带宽,重新整定 PI |
调试时的第一原则是“先内环后外环”。先把电压环断掉,给 id_ref 一个固定值,确认电流能跟踪;再把电压环闭合,确认 Vdc 能稳定。绝大多数模型跑不出波形,都是坐标变换方向、PI 极性或者脉冲取反这类细节问题。
11. 定做仿真模型服务的对接思路
标题里提到的“定做 matlab 仿真模型服务”,本质上是把通用模型按你的具体场景改造成可以直接用的版本。常见的定做需求包括:修改进线电感和电容参数、更换三相电源电压频率、增加 LCL 滤波器、把电阻负载改成恒功率负载、把 SVPWM 换成其他调制方式、增加弱磁或单位功率因数验证逻辑、整理成论文格式的波形图和 FFT 分析图,以及把单次仿真改造成批量参数扫描脚本。
如果你需要这类服务,对接时建议准备以下信息:电网电压和频率、额定功率、进线电感电容参数、直流母线电压给定、开关频率、负载类型、控制要求(电压纹波、THD 指标、动态响应时间)、MATLAB 版本和已有模型文件。信息越完整,定做出来的模型越接近你的实际需求。
有一点要说明:定做模型不等于“包通过”。仿真模型需要和你的控制目标、参数设定匹配,拿到模型后第一件事应该是按自己的工况做参数验证,再决定是否用在论文或项目里。任何仿真模型在用于正式场合前,都要经过与目标工况一致的测试复核。
12. 总结与下一步
这套三相 PWM 整流器双闭环仿真模型,最值得先验证的功能是电流内环的跟踪能力和 SVPWM 脉冲的正确性。只要这两个环节没问题,电压外环闭合后通常能较快稳定。最容易踩的坑是坐标变换方向、PI 极性、死区设置和 Powergui 缺失,调试时优先按“内环 → 外环 → 整体”的顺序排查。
下一步可以做的扩展方向很多:加 LCL 滤波器观察高频谐波抑制效果,把负载改成恒功率负载验证电压环抗扰性,加入启动软启动逻辑减小冲击电流,或者用批量脚本跑一组 PI 参数对比曲线。先按这篇文章的流程把基础模型跑通,再逐步增加复杂度,比一次性搭一个“什么都有”的大模型更可控。
建议收藏备用。遇到模型跑不动的情况,回头对照第 10 节的排查表逐条查,大部分问题都能在半小时内定位。