VSG构网变换器自适应惯量/阻尼仿真:从控制原理到Simulink实现与调参
2026/9/10 2:55:21 网站建设 项目流程

我把VSG构网变换器的自适应惯量/阻尼仿真从头到尾撸了一遍,从控制原理到Simulink建模再到调参踩坑,全部整理在这篇文章里了。本人最近在做构网型变换器控制方向的项目,发现自适应J和D这个点特别值得拿出来聊聊,因为很多人在固定参数VSG上怎么调都顾此失彼,频率响应和功率振荡总有一个压不住,换自适应方案之后效果直接上了一个台阶。这篇文章不是那种教科书式的原理堆砌,而是从一个实际做仿真的人视角,把控制思路、模型搭建、场景设置、参数整定、发散排查整个流程说透,适合理工科研究生、电力电子方向工程师以及正在做微电网/新能源并网仿真的同学参考。

1. VSG构网变换器到底在解决什么问题

1.1 VSG的本质:给逆变器装上一个虚拟转子

很多人刚接触虚拟同步发电机(VSG,Virtual 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%,分别用J=0.5和J=2.0(单位kg·m²),D保持20不变。J=0.5时频率最大跌落约0.35Hz,但恢复时间约0.8秒,期间有2~3次明显的功率振荡;J=2.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 > 0):J快速增大,D缓慢增大
  • 扰动后期(Δω * dω/dt < 0):J回落到基础值,D继续维持一段时间
  • 稳态(|Δω| < 死区阈值):J、D恢复基础值

注意,D我加了维持逻辑,不能跟着频率恢复立刻掉下来,否则阻尼作用太短暂,系统容易出现二次振荡。

2.3 基础参数的整定方法与边界约束

先看比较关键的几个初始参数怎么取。以我的10kW、380V/50Hz三相系统为例:

J0的初始值。一种工程估算方法是根据同步发电机的惯性时间常数H来折算。H的定义是转子动能与额定容量之比,典型同步机H在2~10秒之间。对应关系是J0 = 2 * H * Sn / ω0²,取H=1.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 Electrical(Specialized 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/(1+s/fc)),同时在Matlab Function内部再做一次限幅,基本能消掉数值噪声。

做法二(喜欢框图可视化的):把自适应函数拆成基本模块:绝对值模块、增益模块、低通滤波器、饱和限幅模块、加法器。这种做法的优点是可以直接看到每个环节的信号,调试直观,缺点是比较占空间。

电压外环和电流内环都选PI控制器。电压环带宽通常取500~1000Hz,电流环带宽取2~5kHz,按周期延后一拍的整定思路做:电流环Ki = L * bw / Kpwm,Kp按阻尼比0.707整定,电压环再降一个数量级。一个容易出问题的点是VSG输出的参考电压幅值是标幺值,要和坐标变换后的电压反馈量做一致化处理,否则电压环会有很大稳态误差。

3.3 仿真场景设置与关键参数表

仿真场景我设计了三个,分别对应不同的运行状态挑战:

场景一:并网功率阶跃(有功突增)。初始状态VSG输出3kW并网运行,t=1s时有功指令阶跃到6kW,模拟光伏出力上升或负荷增加的功率不匹配。主要观察频率动态和功率动态。

场景二:有功负荷突增(负荷冲击)。VSG带RLC负荷孤立运行,t=1s时并联投入一个2kW的额外负荷。这个场景最考验频率支撑能力,VSG的频率会瞬时跌落然后恢复,自适应的作用在这里体现最明显。

场景三:电网频率跌落(弱电网/电网侧扰动)。电网电压源频率从50Hz阶跃到49.8Hz,模拟电网侧频率扰动对VSG的冲击,观察VSG的支撑输出。

Simulink求解器设置:我建议用ode23tb(刚性求解器),步长类型选可变步长,最大步长设为2e-4秒。电气开关器件加上控制算法,系统有一定的刚性,ode45经常跑着跑着就发散,换ode23tb稳定性要好很多。这个是我踩过不少次坑换来的经验,很多人仿真发散第一反应是调PI参数,其实首先应该看看求解器选得对不对。

仿真总时长设4秒,为了覆盖动态恢复过程。记录变量包括:VSG角频率、输出有功功率、三相电压电流、J和D的实时值、PCC处频率。

4. 仿真结果对比与分析

4.1 固定参数与自适应参数的三组对照实验

同样的场景分别跑固定参数和自适应参数,对比核心指标。下表是场景一(有功阶跃3kW→6kW)的数据:

指标固定参数(J=0.5, D=20)固定参数(J=2.0, D=20)自适应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的实时变化曲线。我把这组波形单独调出来分析,可以看到整个过程分三个阶段:

第一阶段(t=1s ~ 1.1s,扰动初期):负荷突增导致Pe瞬间上升,转子运动方程中的不平衡功率(Pm-Pe)变负,dω/dt快速下降。此时Δω*dω/dt的乘积为负,按我们的控制逻辑,J快速增大到上限附近,同时D也开始上升。这个阶段J的增大有效放缓了频率跌落速度。

第二阶段(t=1.1s ~ 1.5s,频率最低点附近):dω/dt从负变正,系统开始恢复,但Δω仍然很大。此时J从最大值回落但仍高于基础值,D维持在较高水平,两者配合让频率平稳触底并开始反弹,没有出现大的过冲。

第三阶段(t=1.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的自适应范围跟电网的实时短路比关联起来,目前看来可行性不错,等有更多结果了再来分享。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询