基于 MATLAB/Simulink的 MMC 闭环仿真模型
模块化多电平换流器(MMC)在运行时,由于各相单元子模块参数微小差异及开关动作不一致,会产生由二次侧频率(通常为二倍频)为主的内部环流。若不加抑制,会导致器件应力剧增、功率损耗加大及电容电压失衡。
基于 MATLAB/Simulink 的 MMC 闭环仿真模型,重点实现环流抑制(Circulating Current Suppression, CCS)。
一、 系统核心架构与数学模型
1.1 闭环控制整体框图
为了实现无环流运行,通常采用经典的三环控制架构:
- 功率/直流电压外环:根据功率指令或直流电压指令,生成内环电流参考。
- 交流电流内环:采用 dqdqdq 坐标系下的 PI 控制 + 前馈解耦,生成各相的调制波。
- 环流抑制环(CCS):提取各相内部环流的二倍频分量,通过准PR(Quasi-PR)控制器生成修正量,叠加到调制波中以抵消环流。
1.2 桥臂电流与环流定义
对于 jjj 相(j=a,b,cj=a, b, cj=a,b,c),桥臂电流 ipj,inji_{pj}, i_{nj}ipj,inj,输出电流 isji_{sj}isj,内部环流 idiff_ji_{diff\_j}idiff_j 定义为:
idiff_j=ipj+inj2=icirc_dc+icirc_2ω i_{diff\_j} = \frac{i_{pj} + i_{nj}}{2} = i_{circ\_dc} + i_{circ\_2\omega} idiff_j=2ipj+inj=icirc_dc+icirc_2ω
其中,icirc_2ωi_{circ\_2\omega}icirc_2ω 即为需要抑制的二倍频交流分量。
二、 MATLAB/Simulink 仿真实现
2.1 主程序与参数初始化 (main_mmc_sim.m)
该脚本用于定义系统参数并启动仿真。
%% MMC闭环无环流抑制仿真 - 主程序
clear; clc; close all;
% ==================== 系统参数 ====================
params.Vdc = 20e3; % 直流侧电压 20kV
params.Vac_peak = params.Vdc / 2; % 交流侧峰值电压 (理想情况下)
params.f_ac = 50; % 交流频率 50Hz
params.N_sub = 20; % 每桥臂子模块数 (例如20个,形成21电平)
params.C_sub = 10e-3; % 子模块电容 10mF
params.L_arm = 20e-3; % 桥臂电感 20mH
params.R_arm = 0.1; % 桥臂等效电阻
params.f_sw = 2000; % 开关频率 2kHz
params.Ts = 1/params.f_sw; % 仿真步长
% ==================== 控制器参数 ====================
% 外环:直流电压控制 (或功率控制)
params.Kp_vdc = 5;
params.Ki_vdc = 100;
% 内环:电流解耦控制
params.Kp_idq = 2;
params.Ki_idq = 100;
% 环流抑制控制器 (准PR控制)
params.Kp_pr = 5; % 比例增益
params.Kr_pr = 200; % 谐振增益
params.wc = 2*pi*5; % 截止频率 (通常取电网频率的 5-10Hz)
params.w0 = 2*pi*100; % 谐振频率 (二倍频 100Hz)
% ==================== 运行仿真 ====================
fprintf('正在启动 MMC 闭环仿真...\n');
sim('mmc_closed_loop_simulink.slx'); % 运行Simulink模型
% 仿真结束后,会自动在工作区生成变量供分析
analyze_results();
2.2 Simulink 控制算法封装 (MATLAB Function)
在 Simulink 中,可以使用 MATLAB Function 模块直接编写核心控制算法。以下代码实现了包含环流抑制的完整控制逻辑:
function [V_ref_upper, V_ref_lower] = mmc_control_algorithm(...
i_a, i_b, i_c, i_up_a, i_lo_a, ... % 测量信号:交流电流,A相上下桥臂电流
vdc_measured, Pref, Qref, params)
% MMC 闭环控制算法 (含环流抑制)
% 将参数结构体转为局部变量
Ts = params.Ts;
Vdc = params.Vdc;
N = params.N_sub;
Kp_vdc = params.Kp_vdc;
Ki_vdc = params.Ki_vdc;
Kp_idq = params.Kp_idq;
Ki_idq = params.Ki_idq;
Kp_pr = params.Kp_pr;
Kr_pr = params.Kr_pr;
wc = params.wc;
w0 = params.w0;
persistent integral_vdc integral_id integral_iq ...
integral_pr pr_last1 pr_last2...
% 初始化积分器
if isempty(integral_vdc)
integral_vdc = 0; integral_id = 0; integral_iq = 0;
integral_pr = 0; pr_last1 = 0; pr_last2 = 0;
end
% ==========================================
% 1. 坐标变换 (3s/2r)
% ==========================================
theta = atan2(-i_b + sqrt(3)*i_c/2, 3*i_a/2 - i_b/2); % 简化的锁相环 (PLL)
cos_theta = cos(theta); sin_theta = sin(theta);
% Clarke变换
i_alpha = i_a;
i_beta = (i_b - i_c) / sqrt(3);
% Park变换
i_d = i_alpha * cos_theta + i_beta * sin_theta;
i_q = -i_alpha * sin_theta + i_beta * cos_theta;
% ==========================================
% 2. 外环控制:直流电压/功率 (此处以直流电压为例)
% ==========================================
vdc_error = Vdc - vdc_measured;
integral_vdc = integral_vdc + vdc_error * Ts;
% 限幅防止积分饱和
integral_vdc = max(min(integral_vdc, 10), -10);
% 外环输出作为内环电流参考
i_d_ref = Pref / (1.5 * Vdc); % 若用功率控制 Pref
% i_d_ref = Kp_vdc * vdc_error + Ki_vdc * integral_vdc;
i_q_ref = 0; % 设定无功功率为0 (根据实际需求修改)
% ==========================================
% 3. 内环控制:电流解耦 (dq轴)
% ==========================================
error_d = i_d_ref - i_d;
error_q = i_q_ref - i_q;
integral_id = integral_id + error_d * Ts;
integral_iq = integral_iq + error_q * Ts;
% 前馈解耦电压
v_d_feedforward = -params.w0 * params.L_arm * i_q;
v_q_feedforward = params.w0 * params.L_arm * i_d;
% 内环PI输出
v_d_ref_raw = Kp_idq * error_d + Ki_idq * integral_id + v_d_feedforward;
v_q_ref_raw = Kp_idq * error_q + Ki_idq * integral_iq + v_q_feedforward;
% 反Park变换得到Alpha-Beta坐标系指令
v_alpha_ref = v_d_ref_raw * cos_theta - v_q_ref_raw * sin_theta;
v_beta_ref = v_d_ref_raw * sin_theta + v_q_ref_raw * cos_theta;
% ==========================================
% 4. 【关键】环流抑制控制 (CCS) - 准PR控制
% ==========================================
% 计算A相环流 (通常只需提取上下桥臂电流的平均值)
i_circ_a = (i_up_a + i_lo_a) / 2;
% 提取二倍频分量 (准PR控制器)
% 离散域准PR传递函数: y(k) = b0*u(k) + b1*u(k-1) + b2*u(k-2) + a1*y(k-1) + a2*y(k-2)
% 此处简略为:使用谐振控制器对两倍频误差进行积分修正
% 实际应用中建议用二阶广义积分器(SOGI)提取特定频率再送入PI/PR
error_circ = 0 - i_circ_a; % 目标是将环流抑制为0
% 准PR控制器差分方程实现
% 离散化参数 (示例,实际需根据Ts, wc, w0计算系数)
b0 = Kr_pr + Kp_pr*wc; b1 = -2*Kr_pr; b2 = Kr_pr - Kp_pr*wc;
a1 = -2*exp(-wc*Ts)*cos(w0*Ts); a2 = exp(-2*wc*Ts);
% 更新历史状态
pr_out = b0*error_circ + b1*pr_last1 + b2*pr_last2 + a1*pr_last1 + a2*pr_last2;
pr_last2 = pr_last1; pr_last1 = error_circ;
% ==========================================
% 5. 调制波合成与输出
% ==========================================
% 将内环调制波加上环流抑制修正量
% 注意:环流抑制的修正量通常需要分别加到上下桥臂的调制波上,且极性相反
delta_v = pr_out;
% 生成最终的桥臂电压参考 (以A相为例,其他相同理)
% 实际Simulink中通常分别对ABC三相进行计算
V_ref_upper = 0.5 * Vdc + v_alpha_ref + delta_v;
V_ref_lower = 0.5 * Vdc - v_alpha_ref - delta_v;
end
2.3 仿真结果分析函数 (analyze_results.m)
仿真运行后,调用此函数绘制波形验证环流抑制效果。
%% 结果分析与绘图
function analyze_results()
% 假设仿真模型输出了以下变量到工作区:
% t, i_up_a, i_lo_a, i_circ_a, vdc
figure('Position', [100, 100, 1200, 800], 'Color', 'w');
% 子图1:上下桥臂电流
subplot(3, 2, 1);
plot(t, i_up_a, 'b', 'LineWidth', 1.2); hold on;
plot(t, i_lo_a, 'r--', 'LineWidth', 1.2);
legend('上桥臂电流 i_{pa}', '下桥臂电流 i_{na}');
xlabel('时间 (s)'); ylabel('电流 (A)');
title('MMC A相桥臂电流');
grid on;
% 子图2:内部环流 (关键验证)
subplot(3, 2, 2);
plot(t, i_circ_a, 'k', 'LineWidth', 1.5);
yline(0, 'r--', 'LineWidth', 1);
xlabel('时间 (s)'); ylabel('环流 i_{diff} (A)');
title('A相内部环流 (应接近0且无二倍频纹波)');
grid on;
% 子图3:直流电压
subplot(3, 2, 3);
plot(t, vdc, 'm', 'LineWidth', 1.5);
yline(20e3, 'k--');
xlabel('时间 (s)'); ylabel('电压 (V)');
title('直流侧电压 V_{dc}');
grid on;
% 子图4:FFT分析环流频谱
subplot(3, 2, 4);
L = length(i_circ_a);
Fs = 1/(t(2)-t(1));
Y = fft(i_circ_a - mean(i_circ_a));
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);
f = Fs*(0:(L/2))/L;
plot(f, P1, 'b', 'LineWidth', 1.5);
xlabel('频率 (Hz)'); ylabel('幅值');
title('环流频谱分析 (观察100Hz分量是否被抑制)');
xlim([0, 200]); grid on;
% 子图5:总谐波失真(THD)计算
subplot(3, 2, 5);
fund_idx = find(f >= 50, 1);
harmonic_idx = find(f > 50 & f <= 250);
thd = sqrt(sum(P1(harmonic_idx).^2)) / P1(fund_idx) * 100;
bar([P1(fund_idx), sqrt(sum(P1(harmonic_idx).^2))]);
set(gca, 'XTickLabel', {'基波', '谐波'});
ylabel('电流幅值 (A)');
title(sprintf('桥臂电流 THD = %.2f%%', thd));
grid on;
% 子图6:控制指令跟踪
subplot(3, 2, 6);
area(t, abs(i_up_a) + abs(i_lo_a));
xlabel('时间 (s)'); ylabel('绝对值之和');
title('系统动态响应过程');
grid on;
sgtitle('MMC闭环无环流仿真结果分析');
end
参考代码 MMC变流器仿真 www.youwenfan.com/contentcsu/55084.html
三、 关键技术点与调试建议
-
环流抑制策略选型:
- 准PR控制 (Quasi-PR):对特定频率(如100Hz)交流量能实现零稳态误差跟踪,抗电网频率波动能力强,是目前最常用的方案。
- PI控制 + 二倍频提取:先用SOGI(二阶广义积分器)或陷波器提取100Hz分量,再用PI控制。原理简单,但动态响应稍慢。
- 虚拟阻抗法:通过在控制环路中引入虚拟阻抗,增大对环流高频分量的阻尼,常与PR控制配合使用以抑制高次谐波。
-
仿真建模技巧:
- 详细模型 vs 平均值模型:本文采用的是控制算法层面的数学模型。在 Simulink 中搭建主电路时,建议使用 MMC Detailed Model(包含实际子模块电容和开关器件)来验证电容电压平衡排序算法(Nearest Level Modulation, NLM)的效果;若仅关注外特性,可使用平均值模型提高仿真速度。
- 解耦控制:在内环电流控制中,务必加入 −ωLiq-\omega L i_q−ωLiq 和 ωLid\omega L i_dωLid 的解耦项,否则会导致 dqdqdq 轴电流耦合,引起振荡。
-
常见故障排查:
- 环流无法抑制/发散:检查准PR控制器的离散化系数是否正确推导;检查环流修正量 Δv\Delta vΔv 叠加到上下桥臂时的正负号是否正确(必须是相反的)。
- 直流电压振荡:检查外环PI控制器的积分限幅是否合理;检查功率参考值与实际物理系统的匹配度。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)