
我把VSG构网变换器的自适应惯量/阻尼仿真从头到尾撸了一遍从控制原理到Simulink建模再到调参踩坑全部整理在这篇文章里了。本人最近在做构网型变换器控制方向的项目发现自适应J和D这个点特别值得拿出来聊聊因为很多人在固定参数VSG上怎么调都顾此失彼频率响应和功率振荡总有一个压不住换自适应方案之后效果直接上了一个台阶。这篇文章不是那种教科书式的原理堆砌而是从一个实际做仿真的人视角把控制思路、模型搭建、场景设置、参数整定、发散排查整个流程说透适合理工科研究生、电力电子方向工程师以及正在做微电网/新能源并网仿真的同学参考。1. VSG构网变换器到底在解决什么问题1.1 VSG的本质给逆变器装上一个虚拟转子很多人刚接触虚拟同步发电机VSGVirtual Synchronous Generator时会把它理解成一种简单的下垂控制升级版其实这个理解不能说错但差了最关键的一层。下垂控制P-f、Q-V本质上是一个静态特性逆变器按比例响应频率和电压变化它没有惯性频率变化会瞬间传导到输出功率上。而同步发电机不一样转子的机械惯量决定了一个大电机在电网频率波动时不会瞬时改变出力这个物理缓冲是电网稳定性的重要来源。VSG的思路就是在逆变器的控制算法里显式地加入一个转子运动方程让逆变器在外部特性上看起来像一台同步发电机。核心的机械方程是J * dω/dt Pm - Pe - D * (ω - ω0)其中J是虚拟惯量kg·m²D是虚拟阻尼系数N·m·s/radω是VSG虚拟角频率ω0是额定角频率Pm是有功指令对应的机械功率Pe是逆变器实际输出的电磁功率。当负荷变化导致Pe突变时J和D共同决定了VSG输出频率的动态过程J决定惯性大小阻尼D决定振荡衰减快慢。把这个方程在Simulink里搭出来其实不难难的是参数怎么选。固定J和D的情况下这个二阶系统天然存在一个矛盾想要频率变化率小J就得大但J大了之后恢复过程变慢振荡持续时间变长。这种两难处境是自适应J和D策略出现的直接动力。1.2 固定参数VSG的两难困局固定J的实际问题我在仿真里用一组对比数据来说明。搭一个10kW的VSG并网模型负荷突增30%分别用J0.5和J2.0单位kg·m²D保持20不变。J0.5时频率最大跌落约0.35Hz但恢复时间约0.8秒期间有2~3次明显的功率振荡J2.0时频率跌落明显减小到0.18Hz但恢复时间拉长到2秒以上而且低频振荡持续更久。这不是参数没调好的问题是固定参数本身的缺陷——你在快速性和阻尼性之间只能选一个。阻尼D的固定参数类似D太小系统阻尼不足功率和频率容易振荡D太大相当于给系统加了很强的下垂频率稳态偏差会变大。实际运行中电网频率不会一直稳定在50Hz负荷也是随机波动的固定的D很难覆盖所有工况。这里有个关键点要搞清楚J和D不是越大越好或越小越好而是希望它们在动态过程的不同阶段各司其职扰动刚发生的瞬间需要一个较大的J来抵抗频率快速变化在频率开始恢复的阶段又希望J变小一些让系统能够尽快回到稳态。这种按需变化的思路就是自适应的核心出发点。1.3 自适应的核心控制逻辑看两个状态量就够了做一个自适应系统首先要回答的问题是根据什么信号来调节J和D我试下来最有用的两个状态量是角频率偏差Δωω - ω0和角频率变化率dω/dt。为什么选这两个因为转子运动方程本身就是关于ω的一阶微分方程这两个量直接反映了系统的动态状态Δω大说明系统偏离额定频率远dω/dt大说明频率正在快速变化。控制逻辑可以归纳成一句话频率偏离阶段频率正在远离额定值增大J抑制频率变化频率恢复阶段频率正在回到额定值减小J加速收敛。同时阻尼D在频率偏差大时适度增加吸收振荡能量。这个思路的好处是它不需要建立复杂的系统模型不需要在线辨识电网阻抗只基于本地测量的功率和频率信息就能实现。实现成本低鲁棒性好在微电网和并网场景下都很实用。下一节详细讲一下J和D的自适应函数怎么设计、参数怎么整定这一块我仿真调试花了不少时间有不少经验可以直接抄。2. 自适应J和D控制策略设计与参数整定2.1 虚拟惯量J的自适应函数怎么设计自适应J的函数形式有很多种国内文献里比较常见的是基于频率偏差Δω线性调节或者基于频率变化率dω/dt分段调节还有把两个信号组合起来的。我这里给出我在仿真中采用并验证过的一组方案兼顾效果和实现难度。第一种基于dω/dt的线性调节J J0 k1 * |dω/dt|这个方案直观——频率变化越剧烈惯量越大在扰动瞬间能非常有效地抑制频率变化率。问题在于实际运行中dω/dt含有大量噪声需要对测量信号做低通滤波否则控制量会抖动。第二种基于Δω的分段调节J J0 k2 * |Δω|这个方案更平滑。Δω经过程序计算噪声相对小但响应速度不如第一种——等到Δω变大了才增加惯量频率已经偏差出去了。第三种组合调节本文采用的方案J J0 k1 * |dω/dt| k2 * |Δω|同时考虑偏差和变化率兼顾快速性和稳态调节。实际仿真下来组合方案在负荷突变和频率跌落两类场景下都有不错表现。需要注意k1和k2的方向——如果Δω*dω/dt大于0说明频率正在远离额定点此时应该用较大的J如果两者乘积小于0说明频率在恢复J应该减小。还有一类文献里的切换型策略当Δω*dω/dt 0时把J切换到高值小于0时切回低值。这种策略响应很激进但控制量直接跳变容易给系统带来新的扰动Simulink仿真里也特别容易引起仿真发散下面第4节会专门说这个问题。我的建议是不要做硬切换用连续变化的函数让J平滑过渡。2.2 阻尼D的自适应策略与J如何配合D的自适应相对简单工程上最常用的做法是随频率偏差增大而增大D D0 kd * |Δω|物理意义很直接频率偏差越大说明系统承受的功率不平衡越严重此时加大阻尼可以更快吸收功率振荡抑制超调。当频率恢复接近额定值时D回到基础值D0避免稳态频率偏差过大。J和D的配合关系是自适应策略里最重要的部分。我踩过的最大的坑是J和D同时按同样方向大幅变化——两个参数都增大会改变系统特征方程的根轨迹在某些参数组合下系统会从欠阻尼直接变成不稳定。所以在设计时要给J和D的变化范围设限并且让D的变化幅度相对缓一些。具体来说扰动初期Δω * dω/dt 0J快速增大D缓慢增大扰动后期Δω * dω/dt 0J回落到基础值D继续维持一段时间稳态|Δω| 死区阈值J、D恢复基础值注意D我加了维持逻辑不能跟着频率恢复立刻掉下来否则阻尼作用太短暂系统容易出现二次振荡。2.3 基础参数的整定方法与边界约束先看比较关键的几个初始参数怎么取。以我的10kW、380V/50Hz三相系统为例J0的初始值。一种工程估算方法是根据同步发电机的惯性时间常数H来折算。H的定义是转子动能与额定容量之比典型同步机H在2~10秒之间。对应关系是J0 2 * H * Sn / ω0²取H1.5秒左右算出来J0大约在0.4~0.6 kg·m²我实际取0.5。这个值作为基准值确保VSG在正常运行工况下表现良好不会因为自适应导致基础动态性能太差。D0的初始值。可以做一个小信号分析二阶系统的阻尼比ξ D / (2 * sqrt(J * K))其中K是下垂系数功率-频率静态增益。想得到临界阻尼或略欠阻尼ξ≈0.7~1.0反推出D0大约在15~25之间我取20。自适应系数k1、k2、kd的整定。这一步没有标准公式我是用仿真扫描的方式做的保持J0、D0不变先让k1从很小的值往大调观察负荷突增时的频率最大偏差和恢复时间取一个两者折中的值然后固定k1调k2和kd。最后得到一组在我系统里效果不错的参数参数数值说明J00.5 kg·m²基础虚拟惯量Jmax2.5 kg·m²惯量上限Jmin0.2 kg·m²惯量下限k10.15频率变化率调节系数k20.8频率偏差调节系数D020 N·m·s/rad基础阻尼Dmax50 N·m·s/rad阻尼上限kd30阻尼调节系数死区0.02 Hz频率偏差死区这里有个重要的经验J的下限不能设得太低我试过把Jmin设到0.1频率恢复速度快了但同时高次谐波分量明显增加波形毛刺变多这是惯量过小导致控制带宽被推高后的副作用。Jmin在0.2~0.3比较合适。3. 基于Simulink的VSG仿真建模全流程3.1 主电路拓扑与控制系统整体框架我用的是MATLAB R2021b / Simulink电气部分基于Simscape ElectricalSpecialized Power Systems库搭建。整体结构分两部分主电路和控制算法。主电路直流电压源模拟光伏/储能直流母线→三相两电平逆变桥IGBT模块→LC滤波电路→并网公共连接点PCC→理想电压源形式的电网模型。负荷突增实验在PCC处并联一个可投切的电阻负荷/RLC负荷模块。控制电路输出电压电流采样→DQ坐标变换→功率计算模块瞬时功率法→VSG本体模块转子运动方程自适应J/D计算→电压外环PI→电流内环PI→SPWM调制→IGBT门极信号。整体信号流是采样→功率→VSG给定参考电压→电压电流双闭环跟踪→PWM输出VSG模块在这条链路里起到的是参考电压生成器的作用。频率和电压的支撑特性都体现在VSG本体输出的角度和幅值中——角度由机械方程积分得到构成电压矢量的相位。3.2 VSG本体与自适应模块的具体实现方式转子运动方程的Simulink实现很直接用两个积分器串联就能搭出来。第一个积分器输入是(Pm-Pe-D*(ω-ω0))/J输出是角频率ωrad/s。第二个积分器输入ω输出相位角θ。把θ送入Duty Cycle或者正弦波发生模块配合dq变换后得到三相参考电压。自适应模块我有两种推荐做法做法一推荐给大多数人用Matlab Function模块写一个函数输入Δω和dω/dt输出J和D。函数体里做低通滤波、死区判断、限幅。好处是逻辑清晰参数修改方便不用改接线。示例逻辑function [J, D] adaptiveJD(dw, ddw, J0, k1, k2, D0, kd, Jmin, Jmax, Dmin, Dmax, deadband) if abs(dw) deadband J J0; D D0; return; end J J0 k1 * abs(ddw) k2 * abs(dw); J min(Jmax, max(Jmin, J)); D D0 kd * abs(dw); D min(Dmax, max(Dmin, D)); end注意ddw这个量在Simulink里不建议直接对ω做微分噪声会被放大到无法使用。我是在dω/dt前加了一个截止频率50Hz左右的低通滤波器传递函数1/(1s/fc)同时在Matlab Function内部再做一次限幅基本能消掉数值噪声。做法二喜欢框图可视化的把自适应函数拆成基本模块绝对值模块、增益模块、低通滤波器、饱和限幅模块、加法器。这种做法的优点是可以直接看到每个环节的信号调试直观缺点是比较占空间。电压外环和电流内环都选PI控制器。电压环带宽通常取500~1000Hz电流环带宽取2~5kHz按周期延后一拍的整定思路做电流环Ki L * bw / KpwmKp按阻尼比0.707整定电压环再降一个数量级。一个容易出问题的点是VSG输出的参考电压幅值是标幺值要和坐标变换后的电压反馈量做一致化处理否则电压环会有很大稳态误差。3.3 仿真场景设置与关键参数表仿真场景我设计了三个分别对应不同的运行状态挑战场景一并网功率阶跃有功突增。初始状态VSG输出3kW并网运行t1s时有功指令阶跃到6kW模拟光伏出力上升或负荷增加的功率不匹配。主要观察频率动态和功率动态。场景二有功负荷突增负荷冲击。VSG带RLC负荷孤立运行t1s时并联投入一个2kW的额外负荷。这个场景最考验频率支撑能力VSG的频率会瞬时跌落然后恢复自适应的作用在这里体现最明显。场景三电网频率跌落弱电网/电网侧扰动。电网电压源频率从50Hz阶跃到49.8Hz模拟电网侧频率扰动对VSG的冲击观察VSG的支撑输出。Simulink求解器设置我建议用ode23tb刚性求解器步长类型选可变步长最大步长设为2e-4秒。电气开关器件加上控制算法系统有一定的刚性ode45经常跑着跑着就发散换ode23tb稳定性要好很多。这个是我踩过不少次坑换来的经验很多人仿真发散第一反应是调PI参数其实首先应该看看求解器选得对不对。仿真总时长设4秒为了覆盖动态恢复过程。记录变量包括VSG角频率、输出有功功率、三相电压电流、J和D的实时值、PCC处频率。4. 仿真结果对比与分析4.1 固定参数与自适应参数的三组对照实验同样的场景分别跑固定参数和自适应参数对比核心指标。下表是场景一有功阶跃3kW→6kW的数据指标固定参数J0.5, D20固定参数J2.0, D20自适应J/D最大频率跌落0.42 Hz0.23 Hz0.21 Hz频率恢复时间1.2 s2.5 s0.6 s功率振荡峰峰值1.8 kW0.9 kW0.7 kW稳态频率偏差0.05 Hz0.05 Hz0.05 Hz可以看到自适应方案同时做到了大J的低频率跌落和小J的快速恢复这正是固定参数无法兼顾的。功率振荡峰峰值也最小说明阻尼D的自适应调整确实起了作用。场景二的负荷突增实验结果类似但因为系统处于孤岛模式频率跌落更深自适应方案的改善幅度更大。最大频率跌落从0.85Hz缩小到0.42Hz恢复时间从原来的3秒多缩短到1.2秒效果非常明显。4.2 波形过程深度解读自适应到底在什么时候起作用看仿真波形时最容易忽略的是J和D的实时变化曲线。我把这组波形单独调出来分析可以看到整个过程分三个阶段第一阶段t1s ~ 1.1s扰动初期负荷突增导致Pe瞬间上升转子运动方程中的不平衡功率(Pm-Pe)变负dω/dt快速下降。此时Δω*dω/dt的乘积为负按我们的控制逻辑J快速增大到上限附近同时D也开始上升。这个阶段J的增大有效放缓了频率跌落速度。第二阶段t1.1s ~ 1.5s频率最低点附近dω/dt从负变正系统开始恢复但Δω仍然很大。此时J从最大值回落但仍高于基础值D维持在较高水平两者配合让频率平稳触底并开始反弹没有出现大的过冲。第三阶段t1.5s ~ 2.0s稳态恢复频率接近额定值Δω小于死区J和D快速恢复到基础值。系统不再有多余的能量注入稳态表现和固定参数保持一致。关键的启示自适应控制的价值不仅仅在于频率波形更好看还在于它不会影响系统在正常工况下的稳态特性。J和D只在需要的时候发挥作用不需要时自动退出这一点对工程应用很重要。4.3 参数极端与边界行为自适应不是万能药我也做了几组极端工况测试发现了几个必须注意的行为边界。当k1和k2调到很大的时候J上限到5以上频率响应确实变得更平缓但与此同时电流波形开始出现明显的低频振荡大约5~8Hz这是惯量过大导致控制带宽和LC滤波谐振频率耦合作出的反应。如果你看到这种低频包络振荡第一反应应该是限制J的上限而不是加阻尼D。另一个边界是dω/dt信号质量太差时的表现。如果低通滤波器截止频率设置过高比如300Hz以上dω/dt中的噪声会直接传递到J的控制量上在整个动态过程中J都以几十Hz的频率抖动。这种高频抖动在波形图上不容易看出来但会让调制信号出现细微畸变——用FFT分析输出电压时会发现在开关频率附近出现边带频谱。所以我个人的经验是dω/dt的低通滤波截止频率设在30~80Hz之间比较稳妥既要滤掉噪声又不能太滞后。5. 仿真发散、参数抖动的排查与调试心得5.1 仿真发散最常见的三个原因自适应J/D模型里仿真发散的高发原因和纯固定参数系统不太一样。第一个原因是代数环。当你在Simulink里直接用Current/Voltage Measurement模块的输出做dω/dt的微分运算再把结果同时反馈到J的计算中Simulink在求解时会出现代数环直接表现为仿真卡死或者特别慢。解决办法是在反馈路径上人为加一个Memory或Unit Delay模块切断代数环。我在刚搭好模型时也遇到过这个问题加上Unit Delay之后顺畅多了。第二个原因是求解器选择不当。前面说了用ode23tb会明显比ode45稳。另外要特别留意最大步长我建议控制在2e-4以下因为在PWM调制过程中如果步长太大开关时刻的捕获不准确会导致电压电流波形出现尖峰这些尖峰经过微分运算后会变成巨大的dω/dt从而触发自适应参数的异常跳变——然后整个仿真就像滚雪球一样发散了。第三个原因是参数限幅没做好。J和D如果不加饱和限幅模块在某个极端工况下自适应函数计算出的数值可能远超出合理范围系统特征根进入右半平面仿真自然就炸了。这种发散通常发生在调参阶段你把k1或kd调得太大仿真跑一小段时间后突然发散没有任何预兆。排查方法就是盯着J和D的示波器波形——发散前它们通常已经超出你预期的数量级了。加好限幅、加好死区这个问题基本可以避免。5.2 参数抖动的处理思路滤波、死区、变化速率限制三层防护除了发散自适应VSG最让人头疼的就是参数抖动。J和D的控制量一直在小幅波动功率波形看起来就像有一层细密的毛毛。处理这个有三个层面第一层是滤波对dω/dt做低通滤波这是最基础的一层。第二层是死区在Δω小于门限时把J和D直接设为基础值避免系统在稳态附近来回调节。第三层是变化速率限制Rate Limiter限制J和D上升和下降的斜率防止参数突变。这三个加齐了抖动问题基本能解决九成。Rate Limiter的参数我用的是上升斜率5/s、下降斜率3/s也就是说J从0.5变到2.5最快需要0.4秒下降因为要配合快速恢复速率可以快一些。这里有一个细节上升和下降速率要设成不同值上升慢下降快与自适应策略的快增慢减形成配合关系。如果对称设置恢复阶段J下降太慢会导致恢复时间被拉长。5.3 从仿真到实际系统的几条额外建议最后说几个仿真之外的经验当你要把这套控制算法往硬件平台迁移的时候特别有价值。硬件上很少直接对dω/dt做微分一般用锁相环PLL测量的频率信号做数字差分配合低通滤波来近似。噪声问题在硬件上比仿真更严重建议自适应算法的带宽整体调低一个数量级。另外硬件电流环和电压环的执行周期一般只有几十微秒自适应算法放在电压环周期里执行足够了不需要每个PWM周期都算——降低计算负担也让参数变化更平滑。调试顺序上我强烈建议“两步走”先把J和D固定成最优的定值就是自适应的基础值把整个模型调到所有场景都能稳定跑通确认双闭环参数没有问题之后再打开自适应模块。直接一上来就加自适应模块一旦发散根本分不清问题是出在底层控制还是自适应逻辑上。我最初就因为图省事跳过这步吃了不少苦头。再补一个实用的小技巧Simulink里跑多组不同参数对比时用parsim或者循环执行Simulink.SimulationInput把k1、k2、kd做成扫描变量批量跑一次脚本跑几十组参数把频率最大跌落和恢复时间打出来做成表格对比比手动一组一组改参数高到不知道哪里去了。脚本大概长这样clear; clc; k1_list [0.05 0.1 0.15 0.2]; k2_list [0.4 0.6 0.8 1.0]; kd_list [10 20 30 40]; results strings(0, 4); for k1 k1_list for k2 k2_list for kd kd_list simIn Simulink.SimulationInput(VSG_adaptive); simIn simIn.setVariable(k1, k1); simIn simIn.setVariable(k2, k2); simIn simIn.setVariable(kd, kd); simOut sim(simIn); freq simOut.logsout.get(freq).Values.Data; t simOut.logsout.get(freq).Values.Time; % 取跌落最大和恢复时间 nadir min(freq(1.0:end)); settle ... % 计算恢复到50±0.05Hz所需时间 results [results; string([k1,k2,kd,nadir,settle])]; end end end disp(results);这样批量出的结果非常直观能看出来哪些参数组合的响应性能最好。参数扫描做完之后再把选中的参数回带到模型做详细的波形验证效率会高很多。这个自适应J和D的VSG仿真工作做到这个程度基本的探索已经走通了。我个人的体会是自适应的核心价值在于平衡——它不追求把某个指标做到极致而是让系统在复杂多变的工况下都能维持一个均衡的动态性能。后续如果要做更深入的工作可以从多机并联的VSG稳定性分析、弱电网下短路比变化对自适应参数的影响、或者把自适应策略跟模型预测控制结合起来这几个方向继续做下去。我最近在尝试把J的自适应范围跟电网的实时短路比关联起来目前看来可行性不错等有更多结果了再来分享。