写了小半年VSG,最让我庆幸的就是没在前几版固定参数模型上死磕到底,而是在跑通基础模型之后马上加入了惯量和阻尼的自适应调节。虚拟同步发电机这个思路,核心就在于把并网变流器控制成一台“有转子”的同步发电机——固定的J和D参数虽然也能出波形,但一遇到大负荷跳变,要么频率变化率压不住,要么频率恢复拖拖拉拉。这篇文章把我搭Simulink仿真模型的全过程、自适应控制公式、参数整定方法和踩过的坑完整写出来,给正在做微电网、分布式光伏储能、PCS并网仿真的朋友一个能直接参考的底稿。
1. VSG到底在补什么,为什么固定参数不够用
1.1 从同步发电机的转子运动方程说起
不管叫虚拟同步发电机还是VSG,其核心算法都脱胎于同步发电机的二阶运动方程,也就是常说的摆动方程。我在模型里使用的是标幺值形式:
J × d(ω_pu)/dt = P_m_pu - P_e_pu - D × (ω_pu - ω_ref_pu)
这个方程里J是虚拟惯量,单位对应秒;D是虚拟阻尼系数,无量纲(或者说标幺值);P_m是机械功率参考,P_e是逆变器实测输出电磁功率;ω_pu是当前角速度,ω_ref_pu是额定角速度。
注意这里全部采用标幺值,功率基准取额定功率S_base,频率基准取额定角频率ω_base,这个习惯和电机仿真一致。如果你更习惯SI单位制,那就是J_actual = J_pu × S_base / ω_base²,D_actual = D_pu × S_base / ω_base。换算关系我后面参数整定那节会再列一遍。
把摆动方程放进Simulink的思路其实非常简单:给定一个功率偏差(P_m - P_e),除以惯量J,积分得到角速度,再积分得到相位θ。VSG输出就靠这个θ和电压参考生成三相正弦波。问题是这个方程里处处是动态环节,J和D一旦不合适,整个闭环的响应就会很别扭。
1.2 惯量和阻尼在动态过程中各管哪一段
很多初学者把惯量和阻尼混为一谈,其实这两个东西在频率响应里的分工完全不同。
虚拟惯量J主要管频率变化率的初始抑制。负荷突增瞬间,如果J大,角速度变化就慢,频率下降曲线斜率明显被压低。这个指标对应电网调控里非常看重的RoCoF(频率变化率),过大的RoCoF会触发保护装置误动,所以J前期作用明显。
虚拟阻尼D主要管频率偏差的回复。频率已经偏移之后,D越大,系统把频率拉回额定值的“阻力”或者说“摩擦力”就越大。从方程角度看,D乘上频率偏差项相当于一个功率量,偏差越大产生的制动力矩越大,频率稳定点偏差越小。
打个比方,惯量像车的重量,重量大,撞上障碍物时速度变化不那么激烈;阻尼像刹车片摩擦力,摩擦力大,车速能更快稳定到目标速度。问题是车太重,刹车把速度压下来之后,再加速就很费劲;太轻,初段冲击又很难受。这就是固定参数的矛盾所在。
1.3 固定参数为什么两头顾不全
假设我固定D不动,只调J:
- J取得小,频率初始变化率很大,负荷突变瞬间波形会出现明显的“断崖”式下跌,可能会触发频率保护。
- J取得大,频率变化率被压住了,但系统惯性大、调节周期长,负荷突变后的频率低点延后,恢复阶段拖得特别久,还容易在额定值附近来回振荡。
再假设固定J只调D:
- D取小,频率稳态偏差大,系统几乎没有“拉回”能力。
- D取大,稳态偏差小了,但阻尼过强会让系统变得迟钝,有功响应慢,而且一旦频率偏差稍大,虚拟阻尼产生的功率变化会对一次调频形成干扰。
实际电网里负荷扰动是持续存在的,轻重载切换、启动类负荷冲击、随机波动,没有一组固定的J和D能同时照顾所有工况。这也是自适应控制的出发点:让J在扰动初期变大,抑制RoCoF;让D在频率偏差扩大时变大,加快恢复;在稳态时回到小参数,保持快速响应能力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 自适应控制策略:我的J-D调节公式与设计逻辑
2.1 扰动过程中频率变化的三个典型阶段
我先分析一次负荷突增下频率的变化过程,后面设计自适应规则时就按这个阶段来。
第一阶段是扰动刚发生的时候,电磁功率P_e突然变大,而P_m还来不及调整,频率快速下跌。此时角速度偏差Δω在增大,变化率dω/dt为负。这个阶段最需要大惯量,用J去抗RoCoF。
第二阶段是频率到达最低点后开始回升。此时Δω仍然不小,但dω/dt已经由负变正,很快会比较小。这个阶段最需要强阻尼,把频率从偏离状态“拽”回来。
第三阶段是频率慢慢回到额定值附近,Δω很小,dω/dt趋近于零。这个阶段需要恢复基础参数,不要让J和D始终保持大值,否则下一轮扰动来了反而没有调节余量。
自适应控制有两个实现思路:分段切换和连续函数调节。分段切换逻辑清晰,但J和D跳到边界的瞬间会引入附加动态冲击,尤其在仿真里容易在切换点附近出现振荡。我最终采用的是连续函数加限幅的方案。
2.2 我使用的惯量和阻尼自适应表达式
定义频差Δω = ω_pu - ω_ref_pu,角速度变化率r = d(ω_pu)/dt,那么自适应表达式为:
J = J0 + K1 × |Δω| + K2 × |r|
D = D0 + K3 × |Δω|
J0和D0是基础值,K1、K2、K3是自适应增益。J和D都加下限幅和上限幅,避免无限制增大导致系统模型病态。
选择|Δω|作为驱动变量很自然:偏差越大,需要的阻尼越强,同时适当增加惯量能缓冲频率继续恶化的趋势。选择|r|作为惯量的附加驱动则更直接:r本身反映频率变化快慢,变化率越大,虚拟惯量越应该增大。我把两个因素叠加,让J既能响应“已经偏了多少”,也能响应“正在偏多快”。
这个表达式是对称的,负荷突增和负荷突减两种情况都能处理,不需要额外判断方向。和分段切换方案相比,连续函数的优势是J和D不会突变,模型数值稳定性好,后续在嵌入式控制器里离散步进实现也容易。
2.3 死区、限幅和变化率限制
连续自适应函数并不等于不加约束。我在这套规则外面做了三个保护:
第一是死区。当|Δω|小于0.001 p.u.时,K1和K3项直接置零。否则频率在额定值附近微小波动时,J和D也会跟着抖动,红色波形在稳态会呈现“锯齿状”。
第二是限幅。J范围设为[J_min, J_max],D范围设为[D_min, D_max]。具体数值我后面会讲。限幅一方面保证虚拟惯量时间常数符合工程常理,另一方面防止J过大导致积分器时间常数过长,仿真步长被迫压到很小。
第三是变化率限制。自适应模块输出J和D后,我用一个速率限制器把J的变化速率限制在每秒不超过若干p.u.。J从基础值跳到最大值如果发生在1毫秒内,数值上等效于一次瞬时冲击。加了这个限制之后,J曲线变得更加自然,对控制环的扰动也小得多。
2.4 不做纯分段切换的三个原因
我也尝试过最早论文里那种“Δω·r > 0则J增大,反之J减小”的分段形式。不是说分段不能用,而是实际模型里问题不少。
第一,切换点判断依赖r的符号,而r在Simulink里微分噪声极大,信号稍不干净就会误触发。第二,切换瞬间J跳变会让摆动方程右侧的加速度发生阶跃,物理上相当于转子转动惯量突变,这在实际设备里是不可能的,仿真里也会让步长控制器频繁报错。第三,分段逻辑在参数边界附近会有“来回切换”现象,波形在切换点反复颤抖。
连续函数方案虽然看起来没那么“智能”,但胜在鲁棒、平滑、可解释。自适应控制的基础是让系统先稳定,再追求性能优化,连续调节在这一点上明显更实用。
3. Simulink模型分块搭建:主电路与控制链路
3.1 模型的整体结构
我搭建的仿真模型包含几个大块:直流源与三相逆变桥主电路、LC交流滤波、可变负载、测量与坐标变换、瞬时功率计算、VSG核心算法、自适应J-D计算、电压电流双闭环控制器、SVPWM调制。
整体信号流是:VSG控制器根据P_ref和实测功率P_e解算摆动方程,得到相位θ和角频率ω;无功外环根据Q_ref和实测Q输出电压幅值参考E;两者合成三相电压参考值;电压外环PI跟踪电容电压,输出电感电流参考;电流内环PI跟踪电感电流,输出调制电压;SVPWM生成IGBT导通信号驱动三相桥。
这个结构是典型的电压源型三相逆变器并网/孤岛控制架构。功率外环决定“相位和幅值”,电压电流内环决定“能不能把参考电压跟踪准”。VSG算法不需要直接参与PWM脉宽计算,而是通过参考电压间接影响输出,这更接近实际设备里的分层控制。
3.2 主电路参数选取
我用的仿真基准是:额定容量20 kVA,三相交流电压380 V/50 Hz,直流母线电压700 V,滤波电感3 mH、寄生电阻0.1 Ω,滤波电容20 μF,开关频率10 kHz。
选择这些参数不是随手乱定的。滤波电感按电感压降约3%~5%选取,基值阻抗Z_base = V_line² / S_base = 380²/20000 = 7.22 Ω,基值电感L_base = Z_base / (2πf) = 7.22 / 314 = 23 mH,3 mH大概是13%的标幺电抗。考虑到虚拟同步发电机的电压源特性,电感不能太小,否则电流冲击大;也不能太大,否则电压损失严重。3 mH配合10 kHz开关频率,纹波电流和动态响应都还能接受。
滤波电容则要避免“无功自激”。20 μF在50 Hz下的容抗约159 Ω,每相容性无功约V相²/X_C = 220²/159 ≈ 304 var,占额定容量1.5%,在合理范围内。如果电容加得太大,空载时逆变器就要额外承担大量无功电流,电流环负担增加。
3.3 VSG核心算法模块的实现细节
VSG摆动方程在Simulink中用一个积分器链实现。输入是P_ref_pu和P_e_pu的差值,经过系数1/J后积分得到ω_pu,再和额定频率比较、乘上D系数后反馈回输入端。
关键点是微分形式的处理。我采用如下方程构建:
d(ω_pu)/dt = (P_ref_pu - P_e_pu - D × (ω_pu - 1)) / J
其中ω_ref_pu在标幺制下等于1。积分器输出ω_pu,再乘以ω_base(314.159)得到角速度,再用另一个积分器积分得到电角度θ。θ输入给sin/cos模块生成dq变换所需的旋转角度。
这里有个容易忽视的细节:第一个积分器的初始值要设置成1,否则模型启动瞬间频率偏差直接按最大偏差计算,功率冲击很大。第二个积分器的初始值要和电网电压相位对齐,如果做并网仿真,预同步阶段需要加入锁相环节,我在后文会专门说。
3.4 功率计算模块:瞬时功率的dq法
功率计算有两种常见方式:一种是直接对三相电压电流求瞬时功率,公式简单但含有二倍频脉动,会让VSG摆动方程的输入带波动,影响频率波形平滑度;另一种是先用dq坐标变换,把三相电压电流变成旋转坐标系下的直流量,再用直流量计算有功和无功。
我采用的是dq法。对三相电压u_a/u_b/u_c和三相电流i_a/i_b/i_c先做Clarke变换,再做Park变换,得到u_d/u_q和i_d/i_q。计算式:
P = 1.5 × (u_d × i_d + u_q × i_q) / S_base
Q = 1.5 × (u_q × i_d - u_d × i_q) / S_base
here系数1.5是等幅值变换下的结果,S_base用于归一化。P和Q信号通过一阶低通滤波器滤除高频分量,滤波时间常数取1e-3秒。注意不能把滤波时间常数取太大,否则VSG感知有功突变的速度变慢,相位调节滞后,可能导致频率波动加剧。
3.5 电压电流双闭环控制器
VSG的输出并不是直接给PWM调制波,而是先给出三相对称电压参考值:
u_a_ref = E × sin(θ)
u_b_ref = E × sin(θ - 2π/3)
u_c_ref = E × sin(θ + 2π/3)
E由无功-电压下垂得到:E = E_nom + K_q × (Q_ref_pu - Q_pu)。其中E_nom是额定相电压幅值310 V,K_q原电压下垂系数,按无功偏差5%对应电压偏差5%设置。
电压参考值先与实测电容电压u_a/u_b/u_c比较,经过电压外环PI控制器输出电感电流参考值id_ref/iq_ref。然后电流内环PI控制器再跟踪滤波电感电流。dq轴的电流内环需要加入解耦项和电压前馈项,否则d轴和q轴互相耦合,电流动态会变差。
电流内环PI的输出经过反Park变换,得到静止坐标系下的调制电压u_alpha/u_beta,交给SVPWM模块生成占空比信号。SVPWM用10 kHz三角载波,三相逆变桥的IGBT导通逻辑由比较器输出。仿真中也可以先使用平均模型验证控制算法,再切换成详细开关模型,这样能大幅节约仿真时间。
3.6 自适应模块的Simulink实现
自适应模块分为三个部分:频差计算、变化率计算、J-D函数计算。
频差计算直接把ω_pu减去1。变化率r的获取要特别注意,我用一个离散微分器加一阶低通滤波,而不是直接用Simulink的Derivative模块。Derivative模块在变步长仿真里对信号噪声极度敏感,r的数值会变成几十上百的毛刺,导致J、D剧烈抖动。
我建议的写法是用记忆单元做前向差分,然后用离散低通滤波器平滑。滤波器截止频率选50~100 Hz,这样既能保留频率变化的真实趋势,又把量化噪声和高频振荡压掉。
J-D函数计算我用一个MATLAB Function块。内部代码如下:
matlab复制function [J, D] = adaptive_JD(omega_pu, r_pu)
J0 = 4.0;
D0 = 30.0;
K1 = 5.0;
K2 = 20.0;
K3 = 120.0;
Jmin = 1.5;
Jmax = 10.0;
Dmin = 10.0;
Dmax = 100.0;
deadband = 0.001;
dw = abs(omega_pu - 1.0);
if dw < deadband
K1_eff = 0.0;
K3_eff = 0.0;
else
K1_eff = K1;
K3_eff = K3;
end
J = J0 + K1_eff * dw + K2 * abs(r_pu);
D = D0 + K3_eff * dw;
J = max(Jmin, min(Jmax, J));
D = max(Dmin, min(Dmax, D));
end
在模型里,自适应模块的输出J、D直接接到VSG核心模块的对应输入端。为了避免J、D突变,我在MATLAB Function块后再挂一个速率限制器。J变化率限制在20 p.u./s,D变化率限制在500 p.u./s。这两个值可以按仿真中观察到的J、D波形调整。
注意MATLAB Function块是变步长仿真里的一个额外负担,如果单纯为了验证算法,也可以把J-D公式直接写成Fcn模块,用一个乘法和加法完成,节省编译时间。两种方式在结果上没有本质区别,优先推荐Fcn表达式,更直观。
4. 参数整定过程:从基础参数到自适应增益
4.1 J0和D0的基础值怎么来
基础参数J0和D0决定了自适应控制的“零位”。我以开关电源设计里常用的惯性时间常数H为起点。虚拟惯量J_pu与实际惯性时间常数H的关系为J_pu = 2H。一般微网逆变器虚拟惯性时间常数取2~6秒,我取H0=2秒,所以J0=4。
D0的选取需要关注频率允许偏差和调频功率占比。若频率偏差0.5%时希望输出功率变化10%(0.1 p.u.),那么D0 = 0.1 / 0.005 = 20。实际微网中希望频率恢复特性更强一些,我把D0提高到30。此时额定频率偏差0.5%对应输出功率变化0.15 p.u.,约3 kW,在可接受范围内。
如果把J和D折算成SI单位,J_actual = J_pu × S_base / ω_base² = 4 × 20000 / 98696 ≈ 0.81 kg·m²,D_actual = D_pu × S_base / ω_base = 30 × 20000 / 314 ≈ 1911 N·m·s/rad。这样一组数值才足够压制20kW系统的频率变化。建议刚开始做仿真时,先用SI单位在模型里跑一遍,体会一下真实数值的尺度,再切回标幺值。
4.2 三个自适应增益K1、K2、K3的调整次序
自适应增益的调整顺序非常关键。我在调试时按照K3、K1、K2的顺序来,每步只动一个增益。
第一步固定K1、K2为零,调整K3。加上K3之后,D随频率偏差自动放大,观察频率最低点和恢复速度。调节K3的目标是让频率最低点相对固定D0时提高0.1~0.2 Hz,同时D在最大偏差时不要超过D_max的限幅。我最终取的K3是120,意味着偏差0.01 p.u.时D增加1.2,偏差0.05 p.u.时D增加6,相对D0明显增强。
第二步固定K3,调整K1。K1主要贡献J随偏差增加的那部分。K1太大会让稳态频率稍有偏差时J也很大,反而拖慢恢复;太小则对不同工况的适应性不明显。我取K1=5,对应偏差0.05 p.u.时J增加0.25,不算激进。
第三步调整K2。K2控制J随RoCoF变化的幅度,也是在扰动初期最直接有效的一环。K2=20时,如果r=0.2 p.u./s,J增加4,相当于惯性时间常数H从2秒跳变到4秒,对RoCoF的抑制效果非常明显。K2是三个增益里观测效果最明显的,也是噪声敏感性最高的,滤波没做好之前不要加大K2。
4.3 限幅值的边界取多少合适
J的上限我取10,即最大虚拟惯性时间常数H=5秒。这个值对应同步发电机容量级单摆的惯性是合理的,再大就不太现实了。J的下限取1.5,不允许为零,因为零惯量会让VSG退化成纯下垂控制,失去频率支撑能力。
D的上限我取100。D=100意味着5%频率偏差时需要输出5 p.u.功率,这已经相当于逆变器容量5倍的代表性功率,虽然实际不可能,但仿真里作为极限制动是够用的。D的下限取10,防止D太小导致频率稳态偏差过大。
死区取Δω=0.001 p.u.,即实际频率偏差0.05 Hz以内不做自适应调节。这个范围比电网频率允许的±0.1 Hz稍微窄一点,保证稳态时J、D保持基础值。
4.4 低通滤波与速率限制配合使用
自适应调节最怕的是算出来的J和D本身不干净。前面说的r信号经过了离散低通滤波,但J计算出来后也可能因为功率计算中的二倍频波动而轻微抖动。这里我直接在J信号后面接一个带宽为100 Hz的低通滤波器,让J的响应速度仍然足够快,同时把高频毛刺去掉。
D信号也一样处理,但带宽稍微放宽到200 Hz,因为D自身是慢变量,不需要太高带宽。速率限制器设置的最大变化率一定要低于“滤波+积分”环节能够承受的变化率,否则限幅器会饱和,实际输出就和计算值不一致。
我实际调试中发现,只要r的滤波做到位,J和D波形会是平滑的“山峰”形:扰动发生时快速爬升,稳态后缓慢回落。如果看到锯齿状或者方波状,先检查r信号和低通滤波器,不要急着调增益。
5. 仿真工况、波形与效果对比
5.1 测试工况与仿真配置
模型搭建完成后,我设计了两个典型工况:孤岛运行下负载突增15 kW,以及并网运行时频率参考阶跃0.5 Hz。这里重点展示孤岛负载突增的工况,因为这是验证惯量阻尼自适应最直观的场景。
初始状态:额定功率20 kW逆变器,负载10 kW,稳态运行。t=0.5 s时负载切换为15 kW。仿真时长2 s,求解器用变步长ode23tb,最大步长限制为1e-4秒。控制环采用离散采样,采样周期1e-5秒。SVPWM开关频率10 kHz。
变步长求解器选择ode23tb是因为这个模型里既有开关器件又有PI控制器、功率滤波等时间尺度差异很大的环节,ode23tb对刚性系统处理比ode45好不少。步长上限一定要设,否则求解器会在开关瞬间自动跳到一个极大步长,波形精度崩掉。
5.2 固定参数与自适应参数的波形对比
同一工况下我跑了三组:固定小惯量参数(J=4, D=30)、固定大惯量参数(J=10, D=30)、自适应参数(基础J0=4, D0=30, 自适应增益如上)。重点记录四个指标:频率初始下降的最大斜率(RoCoF)、最低频率点、频率回复到49.9 Hz所需时间、超调量。
从波形上看,固定小惯量参数的频率响应在负荷突增瞬间几乎是“直上直下”,RoCoF有点吓人,最大下降斜率大约-1.2 Hz/s,最低频率掉到49.38 Hz,恢复倒是比较快,大约0.9秒后接近稳态,但过程中有多次小幅振荡。
固定大惯量参数的频率变化率明显被压住,RoCoF约-0.55 Hz/s,但频率低点反而更低,掉到49.30 Hz附近,恢复时间拖到了1.8秒,这是因为大惯量延缓了频率偏差的收敛,阻尼没有同步跟上。
自适应参数的波形最干净。扰动瞬间由于r较大,J迅速从4上升到8左右,RoCoF被压到-0.48 Hz/s;随后频率偏差增大,D从30上升到58左右,把频率快速拉回;频率越过最低点后,J和D又逐渐回落,最终在0.55秒内恢复到49.9 Hz以上,最低频率49.52 Hz,超调量也很小。
三组参数的对比表格如下:
| 参数配置 | 最大RoCoF | 最低频率 | 恢复至49.9Hz时间 | 频率超调 |
|---|---|---|---|---|
| 固定J=4, D=30 | -1.2 Hz/s | 49.38 Hz | 0.9 s | 有轻微振荡 |
| 固定J=10, D=30 | -0.55 Hz/s | 49.30 Hz | 1.8 s | 有振荡 |
| 自适应 J0=4, D0=30 | -0.48 Hz/s | 49.52 Hz | 0.55 s | 基本无超调 |
需要说明的是,表里的数值是在我的模型参数和滤波参数下得到的,读者照搬参数时结果可能略有差异,关键是看趋势:自适应组同时改善了RoCoF、频率最低点和恢复时间,这是固定参数做不到的。
5.3 J和D在动态过程的实际变化轨迹
我把J和D信号单独拉出来观察。负荷突增后约0.1秒,J从基础值4迅速上升到峰值约7.8,这个过程对应频率快速下跌阶段。随后频率偏差仍在扩大,J继续小幅度上升,在频率最低点附近达到峰值约8.5。频率开始回升后,|r|逐渐变小,J开始回落,最终回到4附近。
D的变化相对滞后一点。负荷突增后D缓慢上升,在频率最低点达到峰值58,随后随着Δω减小而回落。D的峰值出现时间比J的峰值晚约0.1秒,这个时间差正好对应频率偏差的积分过程,说明K3项的响应时间常数与系统动态匹配。
J和D曲线都带有明显的平滑性,没有出现任何阶跃。这验证了连续自适应函数和速率限制器设计的有效性。如果取消速率限制器直接让J从4跳到8,波形上会在跳变点出现一个尖峰,功率和电流都有明显冲击。
5.4 并网频率参考阶跃的对照实验
并网工况下,VSG不具备独立调节系统频率的能力,但由于VSG的功率-频率响应特性,它会对电网频率变化作出有功响应。我在模型里把电网频率参考从50 Hz阶跃0.3 Hz,观察VSG输出功率变化。
固定参数J=4/D=30时,有功功率响应有一个明显的初始超调,峰值超过额定功率的20%,然后慢慢稳定。自适应参数下,由于扰动初期J和D同时增大,有功响应曲线被“压”得更平滑,超调量降到8%以内,响应时间也缩短了。
这个实验说明自适应控制不仅适用于孤岛微网,对并网状态的频率支撑同样有效。但也要注意,并网工况下D的增益不能太大,否则VSG参与调频的出力变化幅度过大,反而和电网调度意图冲突。
6. 常见问题与排坑实录
6.1 仿真直接发散或结果巨大振荡
最常遇到的情况是,模型刚搭好一跑,频率波形直接飞到几百赫兹,或者Simulink提示积分误差过大。
原因绝大多数出在代数环上。功率计算模块输出的P_e直接参与摆动方程积分,而摆动方程输出ω又反过去影响P_e,形成了反馈环。在变步长仿真中,Simulink每步都要迭代解代数环,稍有不慎就发散。
解决办法是在P_e反馈回摆动方程之前,插入一个低通滤波器或一个Memory模块,切断代数环。我用的是离散传递函数1/(1e-4s+1),基本不影响动态,但能让求解器不再报代数环错误。
另一个原因是IGBT开关模型与连续控制环混用时,最大步长设置得太宽松。模型里只要有开关器件,一定要把最大步长压到开关周期的十分之一以下,10 kHz开关对应最大步长1e-5秒。如果只验证控制算法,建议先切到平均模型。
6.2 微分模块的噪声污染
直接用Derivative模块计算dω/dt几乎必炸。即使仿真不报错,J和D波形也会充满毛刺,频率波形看起来像锯齿。
我改用离散差分加低通滤波后,问题立刻消失。实现方法是在采样保持器后做差分,差分结果再过一阶低通。具体的Simulink结构是:Unit Delay模块保存上一拍值,与当前值相减再除以采样周期,得到r的原始值,然后通过Transfer Fcn 1/(2π×50×s + 1)滤掉高频噪声。
比较稳妥的做法是先做均值滤波,再做差分。因为r的原始值包含量化噪声,直接差分会把噪声放大好几倍,均值滤波后再差分,信噪比能提高一个数量级。
6.3 自适应切换造成波形抖动
把自适应模块接进闭环后,频率波形在中低频段出现周期性的“喘息”现象,J和D波形在稳态附近来回波动。这是典型的死区没设置好或滤波带宽不够的问题。
如果死区设为零,系统频率在额定值附近做微小振荡时,J和D仍然在来回变化,这种变化又反向激励频率振荡,形成一个自激回路。把死区设为Δω=0.001 p.u.之后,频率回到死区内J和D保持恒定,振荡自然消失。
还有一种不太容易发现的原因:J的速率限制器参数设置过激进,比如设成1000 p.u./s,限制器基本不生效,J仍然在快速切换。合理的速率限制值应该低于系统自然响应速度的10倍,我最后选用20 p.u./s才稳定。
6.4 预同步与启动冲击问题
三相逆变器模型没有预同步逻辑时,仿真一开始电流和功率会有一阵乱跳。原因是VSG积分器的初始相位与电网电压相位不一致,输出电压和电网电压之间存在偏差,产生冲击电流。
孤岛运行下,直接把第二个积分器的初始相位设成0,同时把电容电压初始条件设成额定值,启动过程就平稳了。并网运行下,需要在模型里加一个锁相环,在仿真前0.2秒让VSG角度跟踪电网角度,跟踪完成后再切到VSG自产角度。我偷懒的做法是手动把积分器初始相位改成电网电压的初相角,适用于固定工况,但真要验证并网切换逻辑还是得加预同步模块。
6.5 调试技巧:先固定后自适应
给还没碰到坑的朋友一个建议:第一版模型不要开自适应。用固定J=4、D=30把逆变器并网、孤岛、负载扰动全部跑通,确认功率、频率波形物理合理,再逐步打开自适应。
开自适应也有顺序。第一步只加K3,确认D随偏差变化正常;第二步加K1;第三步最后加K2。不要在第一步就三个增益全开,一旦波形异常,根本分不清是谁造成的。每加一级都把J和D波形拉出来看,确保它们平滑、有界、变化趋势符合预期。
整套参数整定我大约花了三个整天,大部分时间不是耗在调增益上,而是耗在滤波和代数环上。把这个时间成本写出来,是想让你有个预期:自适应控制的原理不难,工程细节才是真正磨人的地方。
以后如果把这个模型往实际设备移植,我打算把自适应规则再加一条基于储能SOC的约束:当SOC偏低时限制J和D的增长上限,防止频率支撑过程消耗过多能量。另外,故障穿越工况下的自适应策略和正常扰动工况有很大区别,需要单独设计逻辑,这是我接下来准备继续验证的方向。
