跟网型逆变器在标准电网条件下几乎不会出问题,但一旦并网点离主网较远、线路阻抗变大,电流波形就开始出现十几赫兹的等幅振荡,参数稍微偏一点就从振荡变成发散。我第一次在Simulink里复现这个现象时,第一反应是PI参数没调好,后来反复排查才发现根子在小干扰稳定性——不是某一个增益"调错了",而是这个拓扑在这个工作点下,状态矩阵的特征值已经跨过了虚轴。
这篇文章围绕"跟网型逆变器小干扰稳定性分析与控制策略优化"这个主题,以一个典型的三相两电平VSC并网系统为例,完整走一遍:弱电网失稳机理、状态空间小信号模型推导、Simulink仿真平台搭建、特征值参与因子分析、控制策略优化与验证。适合正在做并网逆变器控制、储能变流器或新能源场站仿真研究的同学,也适合刚接触稳定性分析、想建立一套完整分析流程的工程师。核心工具是MATLAB/Simulink,模型结构和脚本都会拆开讲,按这个思路可以复现出属于自己的分析环境。
1. 弱电网下的振荡:问题从哪来,又该从哪里下手
1.1 跟网型逆变器的同步方式与本质缺陷
跟网型逆变器与构网型逆变器的根本区别在于同步方式。跟网型逆变器不自建电压和频率,而是通过锁相环(PLL)实时跟踪并网点电压的相位,把自己当成一个受控电流源,向电网注入功率。电网强的时候,这个策略非常有效;电网弱的时候,问题就来了。
强电网下,并网点电压主要由主网电压源决定,几乎不受逆变器注入电流的影响。PLL看到的电压是稳定的,锁相误差小,电流控制器按给定值注入功率,整个系统是解耦的。弱电网下,并网点与主网之间的线路阻抗不能忽略,逆变器注入电流会在阻抗上产生压降,反过来改变并网点电压的幅值和相位。PLL再去跟踪这个已经被自己电流影响的电压,就形成了闭环反馈通道。
这个反馈通道在特定频率范围内的增益和相位如果不对,就会把系统的阻尼吃掉,形成负阻尼效应。负阻尼意味着扰动不仅不会衰减,反而会被系统自身放大。这就是弱电网下振荡的物理根源。
1.2 小干扰失稳的物理过程:负阻尼是如何产生的
可以用一个不算太严谨但很好理解的类比:PLL就像司机盯着路面标线开车。路标线稳定的时候,司机盯着它调整方向没有任何问题。但如果路面标线会随着车身的移动而发生偏移,司机按偏移后的标线打方向,就会越打越偏。
逆变器的情形类似。弱电网下,PCC电压的相位里面包含逆变器自身电流贡献的分量。电流增大导致电压夹角变化,PLL跟踪到这个变化后调整自己的角度输出,电流参考方向又随之改变,进一步加剧电压夹角偏移。用功率传输的角度看,有功传输与电压夹角近似满足P≈(Vpcc·Vg/X)·sin(δ),当δ在小范围内波动时,PLL的动态响应会引入一个与振荡速度同相位的扰动分量,等效于一个负电阻。
负电阻是什么概念?正常的电阻消耗能量,把振荡能量耗散掉;负电阻则往振荡模态里注入能量。所以系统出现小扰动后,振荡幅值不但不衰减,反而持续增长,直到非线性环节把幅值限制住,表现为等幅振荡,或者直接发散失步。
1.3 什么时候必须做小干扰稳定性分析
很多人有一个误区,觉得把仿真跑起来、看波形稳定就说明系统稳定。实际上时域仿真只能验证你仿的那一个工作点和那一种扰动下的表现,没法回答"边界在哪里"。
工程上必须做小干扰稳定性分析的场景有三类。第一类是并网点SCR较低的项目,比如海上风电经长距离交流线路并网、偏远地区光伏电站,SCR低于3就要高度警惕。第二类是控制系统需要多工况运行的场合,比如储能变流器在全功率范围运行,不同工况下电流工作点不同,特征值也会漂移。第三类是控制参数需要整定的场合,只靠试凑法调PI,很难解释为什么某个增益下系统恰好稳定,换一个工况就失稳。
小干扰分析通过在工作点附近把非线性系统线性化,得到状态矩阵,一次性把所有振荡模态的频率和阻尼信息都给出来。它不能替代大信号分析,但它是稳定性设计的底子,先把这个底子打好,再用时域仿真做校核,才是一套完整的流程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 小信号模型搭建:从开关模型到八阶状态空间
2.1 建模对象与简化假设
小干扰模型不需要保留开关细节。用平均值模型替代开关模型,忽略PWM谐波,是行业内的标准做法。我建模时做的基本假设如下:
- 三相平衡,无零序分量,采用dq旋转坐标系建模;
- 逆变器用受控电压源(平均值模型)等效,直流母线电压视为恒定;
- 滤波环节采用L型滤波器,并网点在滤波电感与电网阻抗的交界处;
- 电网用戴维南等效电路表示,即理想电压源串联电网阻抗Rg+jXg;
- PLL采用标准同步旋转坐标系锁相环,即通过调节q轴电压为零来实现锁相。
这些假设覆盖了绝大多数小干扰研究的场景。如果滤波环节是LCL,需要额外增加两个电容电压状态,模型阶数会从八阶升到十阶以上,分析思路是一样的。
2.2 dq坐标系下的数学方程
系统的状态变量包括:逆变器侧滤波电感电流d/q分量、电网侧电感电流d/q分量、电流环PI调节器积分状态d/q分量、PLL的PI积分状态,以及PLL输出角度的偏差量。一共八个状态。
各环节的方程如下。滤波电感电流满足:
L·di_d/dt = v_id − v_pccd − R·i_d + ω·L·i_q
L·di_q/dt = v_iq − v_pccq − R·i_q − ω·L·i_d
电网侧电感电流满足:
Lg·di_gd/dt = v_pccd − V_gd − Rg·i_gd + ω·Lg·i_gq
Lg·di_gq/dt = v_pccq − V_gq − Rg·i_gq − ω·Lg·i_gd
PLL的动态方程为:
dx_pll/dt = v_pccq
Δω = kp_pll·v_pccq + ki_pll·x_pll
dΔθ/dt = Δω
电流环PI控制器方程:
dx_d/dt = i_d_ref − i_d
dx_q/dt = i_q_ref − i_q
v_id_ref = kp_i·(i_d_ref − i_d) + ki_i·x_d − ω·L·i_q + v_pccd
v_iq_ref = kp_i·(i_q_ref − i_q) + ki_i·x_q + ω·L·i_d + v_pccq
这里的核心要点是参考坐标系的统一。PLL输出的角度θ决定了整个dq变换的基准,电流环计算出来的电压也在这个坐标系下,所有方程必须站在同一个坐标系里写,否则后面线性化算出来的特征值全是错的。
2.3 关键一步:围绕工作点线性化
非线性项主要来自三个方面:dq变换带来的旋转耦合项、功率计算中的电压电流乘积、PLL角度扰动对坐标变换的影响。
线性化的做法是对每个变量写x = x0 + Δx,代入方程,略去二阶及以上小量,整理成标准状态空间形式:
dΔx/dt = A·Δx + B·Δu
A矩阵就是后续所有稳定性分析的核心对象。用MATLAB脚本实现时,我习惯先定义包含工作点计算的脚本,再调用状态矩阵组装函数,最后统一做特征值计算。示意脚本如下:
matlab复制% 工作点计算
Vg_dq = [Vg*cos(delta0); Vg*sin(delta0)];
I0 = (P0*2/3) / Vpcc_d; % 简化d轴电流初值
Q0 = -1.5 * Vpcc_d * Iq0; % q轴电流初值计算
% 组装A矩阵(8x8)
A = zeros(8,8);
% ... 按上面2.2节的方程逐项填入
% 特征值与阻尼比
lambda = eig(A);
for k = 1:length(lambda)
w(k) = imag(lambda(k)) / (2*pi);
zeta(k) = -real(lambda(k)) / abs(lambda(k));
end
这里有两个必须注意的细节。第一,工作点计算不能随意给,必须满足稳态方程,否则线性化结果对应的是一个不存在的运行点。第二,PLL的初始角度与电网电压矢量夹角要匹配,建议直接用潮流计算或者稳态得到的功率角作为初值。
3. Simulink双通道验证:时域非线性模型配合解析特征值分析
3.1 非线性时域模型:Simscape Electrical搭建要点
Simulink里的时域模型我用Simscape Electrical(原来的SimPowerSystems)搭建,模块结构如下:
- 三相电网用Three-Phase Source,关键是Source内部的阻抗不能设为零,弱电网分析必须把Rg和Lg显式加进去;
- 逆变器用Universal Bridge配合PWM脉冲,或者用平均值模型直接给受控电压源,两种方式各有用处;
- 滤波电感用Series RLC Branch,记得填寄生电阻,纯感性模型在阻尼计算上会有偏差;
- PLL用Three-Phase PLL模块,内部的PI参数要和解析模型里保持一致;
- dq变换用abc_to_dq0 Transformation模块,基准角取PLL输出角度。
搭建时最容易出问题的是坐标系方向。Simscape里的abc_to_dq0模块采用的是对齐到A相轴还是q轴,不同版本存在差异。我用的是自己写的dq变换函数,明确以PLL角度为基准,A相电压对齐d轴,这样和解析模型严格对应。
3.2 平均值模型与开关模型的取舍
做小干扰验证,我一般先跑平均值模型。平均值模型没有PWM谐波,电流电压波形干净,扰动响应容易观测,仿真速度也快。它的控制通道用连续信号表示,和状态空间模型的结构最接近,是做线性化对比的最佳参照。
开关模型用于最终校核,验证谐波条件下振荡特征是否依然吻合。但要注意,开关模型里的PWM延时是一个导致误差的主要来源。平均值模型没有这个延时,所以在对比特征值预判的阻尼比和时域波形实测的衰减率时,开关模型的结果阻尼会略大于预测值,这是正常的,不代表模型错了。
3.3 扰动设置与数据采集
在线性化模型和时域模型之间做交叉验证,扰动方式要一致。我的标准做法分三步:
- 在t=0.5s时给有功电流参考i_d_ref一个5%的阶跃扰动;
- 记录并网点电流和PCC电压波形,采样率至少1kHz以上;
- 对时域波形做Prony分析或者简单的指数衰减拟合,提取振荡频率和阻尼比,与特征值计算结果对照。
如果特征值预判的模态在时域波形里找不到,优先检查坐标变换方向、PLL角度初始值、控制增益三个地方,绝大多数不一致都是这三个原因造成的。
3.4 批量参数扫描的运行脚本
SCR扫描是弱电网分析里必须做的一步。我把电网电感Lg写成变量,在循环里逐个赋值,每个SCR下运行一次特征值计算,然后把特征值轨迹画在同一张根轨迹图上。核心脚本如下:
matlab复制SCR_list = [1.2, 1.5, 2, 3, 5, 10];
figure; hold on;
for idx = 1:length(SCR_list)
Lg = Vg^2 / (SCR_list(idx) * S_base * 2*pi*f);
% 重新组装A矩阵
[A, lambda] = build_state_matrix(Lg, kp_pll, ki_pll);
plot(real(lambda), imag(lambda)/(2*pi), 'x');
end
根轨迹画出来之后,整个系统随SCR变化的稳定性趋势一目了然。哪个模态先跨过虚轴、对应的参与因子是什么状态变量,直接决定了后续优化方向。
4. 特征值解读与模态定位:参与因子、灵敏度曲线和根轨迹
4.1 模态识别:哪个特征值对应哪个物理环节
拿到特征值之后,第一步是归类。一个典型的两电平L滤波跟网型逆变器,八阶模型的特征值大致可以分成三组:
- PLL主导模态,频率一般比较低,在10~50Hz附近,主要受PLL参数和电网阻抗影响;
- 电流环主导模态,频率在几百赫兹量级,与电流环PI参数和滤波电感有关;
- 电网阻抗与滤波电感的电气谐振模态,频率由L和Lg的串并联关系决定。
单纯看特征值很难分辨归属,分类要用参与因子。参与因子计算代码如下:
matlab复制[V, D] = eig(A);
W = inv(V);
PF = abs(V .* W'); % 每一列对应一个模态,每一行对应一个状态
PF矩阵中第j列第i行的数值表示第i个状态变量在第j个模态中的参与程度。将每个模态的参与因子按状态归一化,数值最大的状态就是这个模态的主导物理量。比如PLL模态的参与因子应该集中在Δx_pll和Δθ这两个状态上,如果出现电流状态主导的低频模态,说明PLL与电流环之间存在强耦合,这是弱电网下非常典型的现象。
4.2 参数灵敏度分析定位失稳根源
特征值对参数的灵敏度∂λ/∂k能直接告诉我们,改变哪个参数对某个模态影响最大。灵敏度不一定要用复杂的公式求,直接用数值法,在基准参数附近给参数一个微小摄动,重新计算特征值,取差值即可:
matlab复制k1 = kp_pll * 1.01;
A1 = build_state_matrix(Lg, k1, ki_pll);
lambda1 = eig(A1);
sens = (lambda1 - lambda) / (kp_pll * 0.01);
我实际做过一组扫描:固定SCR=1.5,把PLL带宽从10Hz逐步提高到80Hz,观察PLL主导模态的阻尼比。结果是一条近乎直线的下降曲线,带宽越高阻尼越差,到70Hz附近特征值直接跨过虚轴。这个结果和文献里的结论完全一致,也验证了模型建得对。
4.3 与电磁暂态仿真结果的交叉验证
特征值分析给出的是线性化系统的理论预测,最终还是要回到非线性时域模型里验证。以一个SCR=1.5、PLL带宽60Hz的工况为例,特征值分析预判PLL模态频率约24Hz、阻尼比−0.02(不稳定)。在Simulink时域模型里加5%扰动后,电流波形确实出现了约24Hz的发散振荡,两个结果完全吻合。
阻尼比的定量对照也能做。对时域振荡包络取对数,拟合直线的斜率是衰减系数σ,阻尼比大约是−σ/sqrt(σ²+ω²)。平均值模型下,时域拟合得到的阻尼比和特征值计算值能对到误差10%以内;换成开关模型,会有额外的数字延时和采样延时,误差会大一些。收敛标准我建议定在20%以内,超过这个范围就说明建模或初始化有问题。
5. 控制策略优化的三个可行方向及仿真结果对比
5.1 方向一:PLL带宽与电流环带宽匹配优化
PLL是弱电网下失稳的最主要诱因,所以参数整定的优先级最高。基本的设计原则是让PLL带宽比电流环带宽低一个数量级以上,典型做法是电流环带宽取开关频率的1/10,也就是1kHz开关频率下取100Hz左右,PLL带宽取5~30Hz。
弱电网下进一步降低PLL带宽可以显著提高阻尼,但代价是动态响应变慢,对电网频率波动的跟踪能力下降。我的建议是做一个简单的带宽-阻尼比权衡曲线,以SCR最低的工作点为约束条件,在满足阻尼比大于0.05的前提下取尽量高的带宽,兼顾动态性和稳定性。
优化的幅度通过一个具体的例子说明。在SCR=1.5工况下,将PLL带宽从50Hz降到20Hz,PLL主导模态的阻尼比从−0.015提升到0.12,系统从不稳定变为稳定,时间响应中振荡衰减时间从发散变为约80ms内收敛。
5.2 方向二:电网电压前馈补偿
电流环的交叉耦合项需要解耦,但电网电压前馈的作用往往被低估。理想情况下,把PCC电压直接前馈到电流环输出,可以消除电网电压扰动对电流控制的影响。但在弱电网下,PCC电压本身包含谐波和畸变成分,全频段前馈会把扰动引入控制通道,反而恶化系统稳定性。
工程上我用的是带低通滤波的前馈。低通截止频率取在目标振荡频率范围之上,既保留基波分量的补偿效果,又能抑制高频噪声耦合。写出来就是:
matlab复制v_ff_d = v_pcc_d_filtered;
v_ff_q = v_pcc_q_filtered;
% 叠加到电流环输出
v_id_ref_final = v_id_ref + v_ff_d;
这个措施单独使用效果有限,主要解决的是"电网电压背景谐波引发的高频振荡",与PLL带宽优化联合使用效果最好。
5.3 方向三:虚拟阻抗附加阻尼
PLL带宽压低到一定程度后,再往下降的边际效益越来越小,这时需要通过附加虚拟阻抗来改变系统输出阻抗特性,提高相位裕度。
虚拟阻抗的本质是在控制中人为增加一个阻抗项,让逆变器等效输出阻抗变大或者相位特性改善。实现方式是在参考电压中减去虚拟阻抗上的压降:
matlab复制v_id_ref = v_id_original - Rv * i_d + Lv * omega * i_q;
v_iq_ref = v_iq_original - Rv * i_q - Lv * omega * i_d;
虚拟电阻Rv提供有源阻尼,虚拟电感Lv改善低频段相位。参数整定思路是,以系统开环传递函数的相位裕度为目标,在目标频率处让虚拟阻抗补偿掉PLL带来的相位滞后。这个方向的优化空间比较大,但要注意虚拟阻抗过大会抬高等效阻抗,导致PCC电压支撑能力下降,属于"以电压换稳定"的折中。
5.4 三种方案的效果对比
我在同一工况下对比了三种优化方案,工况条件:SCR=1.5,额定有功50kW,前两种方案参数优化后,第三种方案在电流环增加虚拟电阻。结果如下表:
| 方案 | PLL主导模态频率 | 阻尼比 | 时域收敛时间 | 备注 |
|---|---|---|---|---|
| 原始参数 | 24Hz | −0.015 | 发散 | 振荡持续增长 |
| PLL带宽降至20Hz | 11Hz | 0.12 | 约80ms | 动态响应变慢 |
| PLL带宽优化+电压前馈 | 11Hz | 0.14 | 约70ms | 谐波抑制改善 |
| PLL带宽优化+虚拟电阻 | 9Hz | 0.18 | 约50ms | 综合效果最好 |
这个对比说明,单纯压PLL带宽就能解决大部分稳定性问题,但会牺牲动态性,因此实际工程中我倾向于把三种手段组合起来使用,用带宽优化解决主要模态,用前馈处理高频扰动,用虚拟阻抗补足最后的阻尼裕度。
6. 仿真调试中的高频坑与个人排查经验
6.1 求解器和步长的选择很有讲究
Simscape Electrical的开关模型在Simulink里需要变步长求解器,我在大多数工况下用ode23tb,计算精度和速度比较均衡。平均值模型就不需要用这么重的求解器,ode45足够。需要注意的是一些人追求仿真速度,强行把相对误差容限放松,这会导致电流波形上的毛刺被当成振荡,干扰稳定性判断。建议容限至少设到1e-4。
做特征值时域对照时,输出数据的采样率也要够。闭环系统振荡频率可能只有十几赫兹,但如果采样率只有几十赫兹,会引入严重的混叠。我习惯至少2000Hz以上的记录频率,再保留原始波形,方便事后做Prony分析。
6.2 初始值是仿真结果可信度的分水岭
很多复现不到别人结论的情况,根源都在初始值设置。跟网型逆变器模型的初始值必须与稳态工作点一致,否则仿真一开始就是一个大扰动过程,你看到的波形发散其实是初始暂态,和稳定性无关。
我的做法是先跑一个足够长的仿真(0.5~1s)让系统进入稳态,然后把稳态值作为初值保存下来,再在后续扰动仿真里直接调用这些初值。平均值模型中,可以用MATLAB脚本直接把状态变量初值填进去,避免启动暂态。
PLL模块的初值设置尤其关键。PLL初始角度必须等于电网电压矢量的初始相位角,否则PLL会在仿真第一步产生剧烈调节过程。我在Three-Phase PLL的参数表里会显式填入稳态角度,这个角度就是2.3节里工作点计算得到的功率角。
6.3 五个最常见的建模错误
第一,dq变换方向搞反。abc_to_dq0模块的方向设置不同,会导致d轴和q轴的物理含义互换,特征值对调,整个分析就没有意义。这个问题排查起来很隐蔽,我通常用稳态条件检查:给定纯有功输出时,q轴电流稳态值应该趋近于零。
第二,忽略滤波电感寄生电阻。纯感性模型在低频段的阻尼特性偏乐观,算出来的阻尼比往往比实际高,可能让你误判系统是稳定的。
第三,PLL带宽和电流环带宽取值没有拉开差距。两者接近时,控制环路之间会发生耦合,特征值分析会出现模态混叠,优化方向会变得模糊。
第四,Per-unit和实际值混用。Simscape Electrical的模块参数有的是标幺值有的是国际单位,混用会导致计算出的特征值完全错误。统一用实际单位,并在脚本里显式换算。
第五,弱电网仿真里电网源阻抗设成了零。有些版本的Three-Phase Source默认内阻为零,等于你建了个无穷大电网,这样无论如何都复现不了振荡。这听起来低级,但我见过不止一次。
6.4 一套顺手的排查SOP
如果特征值分析与时域仿真对不上,我按以下顺序排查,基本十分钟内能锁定问题:
- 先确认坐标变换方向,用稳态纯有功工况检查q轴电流是否归零;
- 再检查PLL初始角和初始状态,观察启动过程是否平滑;
- 对比平均值模型和开关模型,定位是否是PWM延时导致的偏差;
- 检查工作点计算是否满足稳态方程,重新核对功率角的数值;
- 最后检查A矩阵组装脚本中的符号,尤其是耦合项ωL的符号,正负号错了特征值实部方向会完全改变。
按照这个顺序,绝大多数"特征值说稳定但时域发散了"的诡异问题都能快速定位。
最后再分享一个我在实际项目里的体会:小干扰稳定性分析不是一次性工作,而是伴随整个控制器开发周期的。每当控制结构变化、参数整定、甚至仅仅是运行工况改变,特征值轨迹都会移动,有必要把状态矩阵组装脚本做成一个标准化工具,与Simulink模型绑定在一起维护。这样每次修改完控制策略,一键重算特征值,再跑一遍时域验证,整个流程就能形成闭环,而不是靠拍脑袋反复试参数。这套流程建立好之后,跟网型逆变器在任意弱电网工况下的稳定性边界、优化方向、剩余裕度,心里都会非常有底。
