最近在做一个三相并网逆变器的控制项目,反复在电流控制与功率控制之间切换需求,既要压住并网电流谐波,又要能快速响应有功无功调度指令。查了一圈资料,传统 PI 双闭环虽然成熟,但参数整定繁琐,动态响应受限;模型预测控制(MPC)结构直观、动态性能好,配合 Simulink 仿真验证,非常适合这类非线性、强耦合的电力电子控制场景。
这篇文章围绕“基于电流-功率双模式 MPC 的三相并网逆变器闭环控制策略”展开,包含 MPC 原理说明、电流模式与功率模式两种代价函数设计、Simulink 仿真模型搭建思路、Matlab 核心代码实现,以及我在调试过程中遇到的高频问题。适合刚接触模型预测控制的电力电子方向研究生,也适合做新能源并网工程仿真验证的工程师。
1. 背景与核心概念
1.1 为什么用 MPC 控制三相并网逆变器
三相并网逆变器是将直流侧电能转化为与电网同频同相的交流电能的关键装置,广泛应用于光伏并网、储能变流器、风电变流器等领域。它的控制目标通常包括:输出电流跟踪参考电流、控制有功功率和无功功率、保证并网电流谐波满足要求、维持直流母线电压稳定。
传统控制方案以 PI 双闭环控制为主,内环控制电流,外环控制直流电压或功率。PI 参数整定依赖工作点,当电网阻抗变化、负载突变或电网电压跌落时,控制性能可能下降。而模型预测控制不依赖精确的开关调制策略,它利用系统的离散数学模型,在线预测未来多个控制周期的输出,通过最小化代价函数直接选择最优的开关状态。
在并网逆变器控制中,MPC 的突出优势体现在:
- 动态响应快速,适合电流突变和功率阶跃场景;
- 不需要调制器和 PWM 生成环节,开关状态直接由代价函数优化得到;
- 多约束和多目标容易处理,例如限制开关频率、限制电流幅值;
- 对系统参数变化有一定的鲁棒性。
1.2 什么是“电流-功率双模式”控制
在实际并网工程中,逆变器可能面对两种不同的控制需求。
电流模式控制是最常见的方式,核心目标是让并网电流精确跟踪参考电流,适用于电流源型控制结构,例如底层电流内环、上层功率外环或者电压外环。并网电流的质量直接决定了电能质量。
功率模式控制则直接以有功功率和无功功率作为控制目标,外环指令通常来自电网调度系统或者上层能量管理系统,例如要求变流器按照指令发送 P=10kW、Q=0kVar。功率模式下,MPC 可以直接预测有功无功的演变趋势,而不需要先把功率指令转换为电流指令再做跟踪。
所谓双模式,就是在同一个 MPC 框架下,设计两套预测模型和代价函数,电流模式跟踪电流误差,功率模式跟踪功率误差,并且根据需要切换控制模式。这样既保留了电流模式在限流、动态响应上的优势,又发挥了功率模式在调度响应上的直观性。
1.3 本文实现的总体方案
本文采用的总体控制结构如下:
- 对三相并网逆变器进行 Clarke 变换,把 abc 三相变量转换到 αβ 两相静止坐标系;
- 建立逆变器输出电流的离散预测模型,基于有限控制集(FCS-MPC)遍历逆变器 8 种开关状态;
- 设计电流模式代价函数,直接跟踪 αβ 轴参考电流;
- 设计功率模式代价函数,根据瞬时功率理论计算预测有功、无功,跟踪功率参考值;
- 通过模式选择信号,在电流控制和功率控制之间切换;
- 在 Simulink 中搭建完整闭环仿真模型,用 Matlab 编写控制算法代码块。
2. 系统结构与数学模型
2.1 三相并网逆变器拓扑
本文讨论的三相两电平并网逆变器拓扑如图中常见结构所示(文字描述如下):
直流侧为电压源,通过三相桥臂逆变后,经过滤波电感 L 和等效电阻 R 接入三相电网。电网电压可以等效为三相对称电压源。滤波电感和电阻构成一阶 RL 负载模型,这也是 MPC 预测模型的物理基础。
在仿真中,通常直接用 Simulink Simscape Electrical 或者 SimPowerSystems 模块搭建主电路,控制部分用 Matlab Function 或 S-Function 实现。
2.2 αβ 坐标系下的连续数学模型
首先进行 Clarke 变换:
[ \begin{bmatrix} x_\alpha \ x_\beta \end{bmatrix} = \frac{2}{3} \begin{bmatrix} 1 & -\frac{1}{2} & -\frac{1}{2} \ 0 & \frac{\sqrt{3}}{2} & -\frac{\sqrt{3}}{2} \end{bmatrix} \begin{bmatrix} x_a \ x_b \ x_c \end{bmatrix} ]
其中 (x) 可以代表电压或电流。
在 αβ 坐标系下,并网逆变器的动态方程为:
[ L \frac{di_\alpha}{dt} = v_\alpha - e_\alpha - R i_\alpha ]
[ L \frac{di_\beta}{dt} = v_\beta - e_\beta - R i_\beta ]
其中:
- (v_\alpha, v_\beta) 是逆变器输出电压的 αβ 分量,由直流母线电压和当前开关状态决定;
- (e_\alpha, e_\beta) 是电网电压的 αβ 分量;
- (i_\alpha, i_\beta) 是并网电流的 αβ 分量;
- (R) 是滤波电感等效串联电阻;
- (L) 是滤波电感值。
2.3 离散化预测模型
MPC 需要在离散域内预测未来电流,本文使用一阶前向欧拉法对连续方程进行离散化。设采样周期为 (T_s),则:
[ \frac{di}{dt} \approx \frac{i(k+1) - i(k)}{T_s} ]
代入连续方程后得到:
[ i_\alpha(k+1) = \left(1 - \frac{R T_s}{L}\right) i_\alpha(k) + \frac{T_s}{L} \left[ v_\alpha(k) - e_\alpha(k) \right] ]
[ i_\beta(k+1) = \left(1 - \frac{R T_s}{L}\right) i_\beta(k) + \frac{T_s}{L} \left[ v_\beta(k) - e_\beta(k) \right] ]
注意:在实际控制中,由于信号采集、计算和开关动作存在延迟,通常还需要一拍延迟补偿,本文在 4.3 节代码中会体现。
2.4 有限控制集与开关状态
三相两电平逆变器共有 6 个开关管,上桥臂和下桥臂互补导通,因此一共有 (2^3 = 8) 种开关组合,对应 8 个电压矢量,其中包括 6 个有效电压矢量和 2 个零矢量。
设三相开关状态为 (S_a, S_b, S_c),取值为 1 表示上桥臂导通,0 表示下桥臂导通。逆变器输出相电压为:
[ v_{aN} = S_a V_{dc},\quad v_{bN} = S_b V_{dc},\quad v_{cN} = S_c V_{dc} ]
经过 Clarke 变换后,得到 αβ 坐标系下的电压矢量。FCS-MPC 的核心思想就是:在每个采样周期内,根据当前测量值,依次代入 8 种开关状态对应的电压矢量,预测下一拍电流或功率,计算代价函数,选择使代价函数最小的开关状态输出。
3. 电流模式 MPC 与功率模式 MPC 的设计
3.1 电流模式 MPC 的代价函数设计
电流模式 MPC 的目标是让并网电流跟踪参考电流。最直接的代价函数是:
[ g_i = \left| i_\alpha^(k+1) - i_\alpha(k+1) \right| + \left| i_\beta^(k+1) - i_\beta(k+1) \right| ]
考虑到实际系统中可能存在开关频率约束、电流限幅约束,可以增加惩罚项。例如:
[ g_i = \left| \Delta i_\alpha \right| + \left| \Delta i_\beta \right| + \lambda_{sw} \cdot n_{sw} ]
其中 (n_{sw}) 表示当前开关状态与上一拍开关状态之间发生切换的开关次数,(\lambda_{sw}) 是权重系数。增加该惩罚项可以降低平均开关频率,减少开关损耗,但会略微削弱动态性能。
电流模式适合下列场景:
- 并网电流质量要求高,需要严格限制 THD;
- 低电压穿越或故障条件下需要限流;
- 外环控制器输出本身就是电流指令。
3.2 功率模式 MPC 的代价函数设计
功率模式以有功功率 P 和无功功率 Q 为控制目标。根据瞬时功率理论,在 αβ 坐标系下:
[ P = \frac{3}{2} \left( e_\alpha i_\alpha + e_\beta i_\beta \right) ]
[ Q = \frac{3}{2} \left( e_\beta i_\alpha - e_\alpha i_\beta \right) ]
对应地,可以用预测电流 (i_\alpha(k+1), i_\beta(k+1)) 计算预测功率:
[ P(k+1) = \frac{3}{2} \left( e_\alpha(k+1) i_\alpha(k+1) + e_\beta(k+1) i_\beta(k+1) \right) ]
[ Q(k+1) = \frac{3}{2} \left( e_\beta(k+1) i_\alpha(k+1) - e_\alpha(k+1) i_\beta(k+1) \right) ]
功率模式代价函数为:
[ g_p = \left| P^(k+1) - P(k+1) \right| + \left| Q^(k+1) - Q(k+1) \right| ]
也可以对不同目标赋予权重,例如优先控制有功或优先控制无功。
功率模式适合下列场景:
- 上层调度直接下发有功无功指令;
- 储能变流器参与电网调频调压;
- 并网系统需要快速平滑调整输出功率。
3.3 双模式切换逻辑
双模式切换可以采用外部使能信号。例如信号 mode=0 表示电流模式,mode=1 表示功率模式。
切换逻辑的建议:
- 正常运行且功率指令明确时,使用功率模式;
- 检测到过流风险或需要快速限流时,切换为电流模式,并将参考电流限制在安全范围内;
- 并网启动阶段建议使用电流模式,避免直接控制功率导致冲击电流;
- 两种模式共用同一个预测模型,只切换代价函数部分,降低算法复杂度。
在 Simulink 中,可以通过一个 Step 信号或者手动开关模拟模式切换,观察切换瞬间的电流和功率动态过程。
4. Matlab 代码与 Simulink 模型实现
4.1 环境准备与版本说明
本文仿真示例基于 Matlab/Simulink 环境,需要安装 Simscape Electrical 或 SimPowerSystems 工具箱(不同 Matlab 版本中名称可能略有不同)。本文代码为通用示例,版本需要根据你的项目实际情况调整,重点演示控制算法实现思路。
仿真主电路部分由 Simulink 模块搭建,控制算法通过 Matlab Function 模块编写。如果你手头没有 Simscape Electrical,也可以使用纯 Simulink 基础模块结合受控电压源搭建简化模型。
4.2 Simulink 模型总体结构
整体仿真模型可以用如下结构描述:
- 直流电压源:模拟直流侧母线电压;
- 三相两电平桥:Universal Bridge 模块,选择 IGBT/Diodes 类型;
- 滤波电感与等效电阻:串联在桥臂输出与电网之间;
- 三相电网电源:Three-Phase Source 模块;
- 测量模块:测量电网电压、并网电流、直流母线电压;
- 控制算法模块:Matlab Function 实现 MPC 算法;
- 模式切换信号:Step 或者手动开关;
- 示波器 Scope:观察电流、功率、开关状态。
需要注意:三相电网电源、桥式电路和测量模块需要共地,否则仿真可能出现奇异解。
4.3 电流模式 MPC 核心代码
下面给出 Matlab Function 模块内的核心代码示例。该函数输入为当前采样时刻的电流、电网电压、直流母线电压、参考电流和上一拍开关状态,输出为最优开关状态。
function [Sa, Sb, Sc] = mpc_current_mode(i_alpha, i_beta, e_alpha, e_beta, Vdc, i_ref_alpha, i_ref_beta, Ts, R, L, last_state) % 电流模式 FCS-MPC 核心函数 % 输入: % i_alpha, i_beta 当前并网电流 alpha/beta 分量 % e_alpha, e_beta 当前电网电压 alpha/beta 分量 % Vdc 直流母线电压 % i_ref_alpha, i_ref_beta 参考电流 alpha/beta 分量 % Ts 采样周期 % R, L 滤波电感和等效电阻 % last_state 上一拍最优开关状态,用于开关频率约束 % 输出: % Sa, Sb, Sc 三相开关状态 % 开关状态表,每一行对应一种开关组合 [Sa Sb Sc] sw_table = [ 0 0 0; 1 0 0; 1 1 0; 0 1 0; 0 1 1; 0 0 1; 1 0 1; 1 1 1 ]; % 开关频率权重系数,可根据需要调整 lambda = 0.0; % 初始化最优值 g_opt = 1e10; opt_switch = 0; % 遍历 8 种开关状态 for idx = 1:8 Sa_cand = sw_table(idx, 1); Sb_cand = sw_table(idx, 2); Sc_cand = sw_table(idx, 3); % 由开关状态计算逆变器输出相电压 va = Sa_cand * Vdc; vb = Sb_cand * Vdc; vc = Sc_cand * Vdc; % Clarke 变换得到 alpha/beta 轴电压 v_alpha = (2/3) * (va - 0.5*vb - 0.5*vc); v_beta = (2/3) * ((sqrt(3)/2)*vb - (sqrt(3)/2)*vc); % 预测下一拍电流 i_alpha_pred = (1 - R*Ts/L) * i_alpha + (Ts/L) * (v_alpha - e_alpha); i_beta_pred = (1 - R*Ts/L) * i_beta + (Ts/L) * (v_beta - e_beta); % 求参考电流预测值(简单处理:假设下一拍参考值等于当前拍参考值) i_ref_alpha_pred = i_ref_alpha; i_ref_beta_pred = i_ref_beta; % 开关切换次数计算 switch_count = abs(Sa_cand - sw_table(last_state+1, 1)) ... + abs(Sb_cand - sw_table(last_state+1, 2)) ... + abs(Sc_cand - sw_table(last_state+1, 3)); % 代价函数 g = abs(i_ref_alpha_pred - i_alpha_pred) + abs(i_ref_beta_pred - i_beta_pred) + lambda * switch_count; % 记录最小值对应的开关状态 if g < g_opt g_opt = g; opt_switch = idx; end end % 输出最优开关状态 Sa = sw_table(opt_switch, 1); Sb = sw_table(opt_switch, 2); Sc = sw_table(opt_switch, 3);需要注意,上面的代码示例做了简化处理:参考电流预测值直接取当前参考电流,实际工程中可以做一拍延迟补偿。另外,Matlab Function 模块内部保存 last_state 时,建议使用持久变量或者在 Simulink 层用 Unit Delay 模块保存上一拍状态。
4.4 功率模式 MPC 核心代码
功率模式与电流模式的区别在于代价函数部分。下面给出功率模式的预测与代价函数计算片段。
function [Sa, Sb, Sc] = mpc_power_mode(i_alpha, i_beta, e_alpha, e_beta, Vdc, Pref, Qref, Ts, R, L, last_state) % 功率模式 FCS-MPC 核心函数 % 输入 Pref, Qref 为有功无功参考值 sw_table = [ 0 0 0; 1 0 0; 1 1 0; 0 1 0; 0 1 1; 0 0 1; 1 0 1; 1 1 1 ]; g_opt = 1e10; opt_switch = 0; for idx = 1:8 Sa_cand = sw_table(idx, 1); Sb_cand = sw_table(idx, 2); Sc_cand = sw_table(idx, 3); va = Sa_cand * Vdc; vb = Sb_cand * Vdc; vc = Sc_cand * Vdc; v_alpha = (2/3) * (va - 0.5*vb - 0.5*vc); v_beta = (2/3) * ((sqrt(3)/2)*vb - (sqrt(3)/2)*vc); i_alpha_pred = (1 - R*Ts/L) * i_alpha + (Ts/L) * (v_alpha - e_alpha); i_beta_pred = (1 - R*Ts/L) * i_beta + (Ts/L) * (v_beta - e_beta); % 假设电网电压变化不大,用当前电网电压预测功率 P_pred = 1.5 * (e_alpha * i_alpha_pred + e_beta * i_beta_pred); Q_pred = 1.5 * (e_beta * i_alpha_pred - e_alpha * i_beta_pred); % 代价函数 g = abs(Pref - P_pred) + abs(Qref - Q_pred); if g < g_opt g_opt = g; opt_switch = idx; end end Sa = sw_table(opt_switch, 1); Sb = sw_table(opt_switch, 2); Sc = sw_table(opt_switch, 3);功率模式的优点是控制目标直接对应调度指令,不需要中间经过电流指令计算。但在电网电压畸变或者不平衡时,有功无功计算会受到电压质量影响,需要结合实际情况增加滤波或正负序分离处理。
4.5 双模式切换的 Matlab 函数
双模式切换可以在 Simulink 中通过一个精简的封装函数实现。假设 mode 信号输入为 0 或 1,代码结构如下:
function [Sa, Sb, Sc] = mpc_dual_mode(mode, i_alpha, i_beta, e_alpha, e_beta, Vdc, i_ref_alpha, i_ref_beta, Pref, Qref, Ts, R, L, last_state) % 双模式 MPC 封装函数 if mode < 0.5 % 电流模式 [Sa, Sb, Sc] = mpc_current_mode(i_alpha, i_beta, e_alpha, e_beta, Vdc, i_ref_alpha, i_ref_beta, Ts, R, L, last_state); else % 功率模式 [Sa, Sb, Sc] = mpc_power_mode(i_alpha, i_beta, e_alpha, e_beta, Vdc, Pref, Qref, Ts, R, L, last_state); end在 Simulink 中,可以把 mode 信号连接到 Constant 或 Step 模块,仿真过程中动态改变模式,观察 MPC 输出开关状态和并网电流的动态变化。
4.6 运行与验证
仿真时间建议设置 0.1s 到 0.5s,采样周期 Ts 取 20e-6 s 到 100e-6 s 比较合适。Ts 越小,控制效果越精细,但仿真速度越慢。本文示例中,如果只是验证控制算法逻辑,可以先取 Ts=50e-6 s,观察波形稳定后再逐步缩小。
预期结果:
- 在电流模式下,并网电流能够快速跟踪给定参考电流,动态响应时间一般在几个采样周期内;
- 在功率模式下,有功无功能够快速收敛到参考功率,稳态时功率纹波较小;
- 双模式切换瞬间,电流和功率会有短暂过渡过程,但整个切换过程应保持收敛,不发生发散;
- 开关状态在稳态时呈现常见的 FCS-MPC 非固定频率特征。
5. 常见问题与排查思路
在实际仿真和调试中,最容易遇到的问题如下表所示:
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 仿真发散,电流数值爆炸 | 采样周期 Ts 过大,导致离散化模型失稳 | 减小 Ts 重新运行;检查滤波电感 L 和电阻 R 是否设置合理 |
| 电流波形畸变严重,THD 偏高 | 权重因子设置不当,开关状态切换过于频繁 | 增加开关频率惩罚项权重 lambda;增大滤波电感 |
| 功率模式稳态纹波大 | 电压波形畸变影响瞬时功率计算 | 对电网电压进行滤波,或采用一阶低通滤波后再计算功率 |
| 模式切换瞬间出现过流 | 切换瞬间参考值突变,没有限幅 | 在参考值输入端增加斜坡函数或者限幅器;切换时先切换到电流模式再改变功率指令 |
| MPC 计算时间长,仿真速度慢 | 循环遍历和浮点运算量大 | 优化代码减少重复计算;用 C MEX S-Function 替代 Matlab Function |
| 高频开关噪声明显 | FCS-MPC 开关频率不固定,频谱分散 | 添加开关频率约束项;考虑使用调制型 MPC |
| Simulink 启动报 LAPACK 加载错误 | Matlab 环境或者工具箱安装异常 | 检查 Matlab 安装完整性,重装或修复对应工具箱,确认第三方库路径无误 |
另外,在调试 MPC 时,可以先断开电网电压或者使用理想电压源,简化系统,逐步排除因为电网模型引起的异常。
6. 最佳实践与工程建议
6.1 采样周期与模型参数匹配
采样周期 Ts 不是越小越好,也不是越大越好。Ts 过大,离散化误差增大,系统可能不稳定;Ts 过小,控制算法来不及执行,仿真和实际控制器都承受不了。
建议从以下公式估算采样周期上限:
[ T_s \ll \frac{L}{R} ]
同时考虑开关周期。工程中常取 Ts 在 10us 到 100us 之间。如果你做硬件在环仿真,还需要考虑数字处理器的运算能力。
6.2 权重因子的整定方法
当代价函数中包含多个控制目标时,权重因子直接决定控制的优先级。例如开关频率惩罚项权重 lambda 如果过大,系统会为了降低开关频率而牺牲电流跟踪精度。
整定权重因子没有统一公式,常用方法:
- 先令 lambda=0,确认系统动态和稳态性能;
- 逐步增大 lambda,观察平均开关频率下降和电流 THD 变化;
- 选择 THD 满足要求且开关频率较低的临界值;
- 如果加入电流限幅项,权重应足够大,确保过流时强制限幅。
6.3 参数鲁棒性与在线辨识
FCS-MPC 依赖系统模型的准确性,尤其是滤波电感 L 的取值。实际运行时,电感可能因温度、饱和而变化。如果电感误差过大,会导致预测电流偏移,甚至稳态误差。
提高鲁棒性的常用方法:
- 代价函数中增加积分项;
- 使用扰动观测器估计模型失配项;
- 在运行过程中做参数在线辨识,但需要保证辨识算法在合法、受控的环境中验证。
6.4 延迟补偿问题
数字控制中,从采样到开关动作存在一拍延迟,也就是常说的计算延迟。如果不做补偿,当采样周期较大时,系统可能振荡。
延迟补偿的方法是:假设 k 时刻采样的数据,要等到 k+1 时刻才作为控制量输出。因此,需要先对 k+1 时刻的电流进行预测,再基于预测值继续预测 k+2 时刻的电流,最后在代价函数中比较 k+2 时刻的预测值与参考值。代码中可以将预测过程执行两次。
6.5 仿真与硬件实现的差异
Simulink 仿真通过后,并不意味着硬件实现一定顺利。MPC 在硬件实现时需要注意:
- Matlab Function 模块在生成 C 代码时,循环次数需要固定,避免动态数组;
- 开关状态输出到 FPGA 或 DSP 时需要增加死区时间;
- 实际采样存在噪声,建议对电流电压进行低通滤波;
- FCS-MPC 开关频率不固定,在电磁兼容和滤波器设计上要留裕量。
如果考虑工程落地,推荐先从简化模型仿真开始,再逐步过渡到控制器硬件在环(HIL)测试,最后再做功率级实验。任何涉及真实电气装置的实验,都必须在安全的实验室条件下进行,遵守相关操作规程。
7. 总结与下一步学习路线
本文围绕三相并网逆变器,梳理了基于电流-功率双模式 MPC 的闭环控制策略。核心内容包括:MPC 的基本原理、三相并网逆变器的 αβ 数学模型、电流模式和功率模式的两套代价函数设计、Simulink 仿真模型搭建思路以及 Matlab 代码实现。通过双模式切换,可以同时兼顾电流动态响应和功率调度响应,在某些工程场景下比单一控制模式更灵活。
继续深入可以从以下几个方向展开:
- 从两电平逆变器扩展到三电平 NPC 逆变器, MPC 的开关状态数量会显著增加;
- 研究模型预测控制与 PWM 调制结合的 MPC 策略,例如模型预测直接功率控制加空间矢量调制;
- 研究 LCL 滤波器的有源阻尼问题,MPC 需要考虑状态变量增多带来的预测模型复杂度;
- 考虑电网不平衡或者畸变工况下的控制策略,引入正负序分离或者谐波抑制目标。
如果你在实践中遇到本期内容相关的调试问题,建议先把采样周期调小、把权重因子清零、把参考值变化斜率放缓,这三个手段通常能解决大部分发散和振荡问题。