matlab simulink 在自带系统的单相MMC模型上实现了最近电平逼近调制,模型和函数是自己改的
直接打开Simulink自带的MMC案例时,看到系统默认用的载波移相调制,寻思着把调制策略换成最近电平逼近(NLC)。从Library Browser里拽出来几个Matlab Function模块就开始魔改,结果发现原模型的子模块电容电压平衡逻辑和NLC压根不兼容。
先把原模型的调制波生成部分给扬了,自己搭了个实时计算电平数的函数。关键是要根据当前时刻的调制比和电容总电压动态调整输出电平,这里有个坑——Simulink的function块里不能用persistent变量存历史状态,只能靠延时模块硬凑:
function n = NLC_Calc(u_ref, V_cap_sum) % 计算当前需要投入的子模块数量 N = 40; % 总子模块数 V_step = V_cap_sum / N; n = round(u_ref / V_step); n = max(min(n, N/2), -N/2); % 限制在±20之间 end这破函数看起来简单,实际调试时发现当调制波突变时会出现电平数跳变。后来在函数外面套了个Rate Limiter模块,把电平变化率限制在每周期最多增减2个,波形立马顺眼多了。
matlab simulink 在自带系统的单相MMC模型上实现了最近电平逼近调制,模型和函数是自己改的
子模块投切逻辑才是重头戏。原模型的排序法在NLC里完全失效,得根据方向信号动态调整排序顺序。折腾出个带权重因子的冒泡排序,把即将过压的电容往前排:
function [gate] = CapacitorBalance(capVoltages, direction) weights = abs(capVoltages - 5000) .* (1 + 0.1*direction); % 5000是目标电压 [~, index] = sort(weights, 'descend'); gate = zeros(size(capVoltages)); gate(index(1:20)) = 1; % 选前20个投入 end运行仿真时发现电容电压波动比原模型大得多,把排序算法的执行周期从50us改成20us后,电压波动从±8%降到了±3%。不过CPU占用率直接飙到90%,风扇开始鬼畜旋转。
最后在示波器上看输出波形,阶梯状特征明显多了。FFT分析显示13次谐波突然拔高,估计是固定步长仿真导致的副作用。切到变步长ode23t算法后,THD从7.2%降到5.8%,但仿真时间翻了3倍。这性能损耗和效果提升之间的平衡,够喝一壶的。