在新能源并网的控制研究里,“同步发电机转动惯量和阻尼系数协同自适应控制”这句话,我几乎每周都会在VSG方向的EI论文里见到。说白了,它就是让逆变器模拟同步发电机的外特性,同时根据系统频率的实时波动,动态调整虚拟转动惯量和阻尼系数,让系统在扰动来的时候既能“顶得住”,又能“稳得快”。
很多人一拿到这个题目就往Simulink里拖模块,但真正复现过就明白:参数怎么给、自适应律怎么设、波形怎么解释,每一步都有坑。这篇文章就把我复现这个策略的完整过程写出来,从控制思路、公式推导到仿真实现和对比波形,最后把调试中踩过的坑一并整理。适合正在做EI论文复现、微电网频率稳定控制、并网逆变器控制的同学参考,照着搭能省不少折腾时间。
1. 控制策略为什么非要“协同自适应”
1.1 固定惯量与固定阻尼的真实痛点
先看同步发电机的转子运动方程,也叫摇摆方程:
[ J\frac{d\omega}{dt}=P_m-P_e-D(\omega-\omega_n) ]
其中 (J) 是转动惯量,(D) 是阻尼系数,(\omega) 是角频率,(P_m) 和 (P_e) 分别是机械功率和电磁功率。在实际物理发电机里,这两个参数由转子结构和阻尼绕组决定,出厂就固定了。但虚拟同步发电机(VSG)不一样,它是通过控制算法让逆变器表现出同步发电机的外特性,所以 (J) 和 (D) 本质上只是控制器里的两个可变增益,理论上可以实时改。
固定参数的问题在于:惯量J决定了系统对频率变化的“惯性支撑”能力,J越大,频率变化率越小,但系统响应越慢;阻尼D决定了振荡衰减速度,D越大,频率振荡收敛越快,但可能造成有功功率过冲变大。用生活里的话说,J像大货车的惯性,拉得重了起步慢但不会被轻易推走;D像减震器,阻尼太大虽然颠簸少,但遇到坑洼时悬挂也来不及回弹。
在传统固定参数方案里,你只能取一组折中值。扰动小的时候,大J和大D会让系统显得迟钝,频率调节半天回不来;扰动大的时候,小J和小D又根本压不住频率跌落。这就催生了“自适应”的需求:让J和D跟随系统状态自己变化。
1.2 协同自适应的核心控制逻辑
协同自适应控制的基本思想并不复杂,核心就是实时检测两个信号:频率偏差 (\Delta\omega) 和频率变化率 (d\omega/dt)。
逻辑可以拆成两条线:
- 当 (d\omega/dt) 过大时,说明系统正在经受剧烈扰动,此时应该迅速增大J,用更大的“虚拟惯量”去抑制频率的快速跌落或飞升,为一次调频争取时间。这个动作主要解决“频率变化有多快”的问题。
- 当 (\Delta\omega) 过大时,说明频率已经偏离额定值较多,此时应该重点增大D,用更强的阻尼作用吸收功率振荡,加速频率回归额定值。这个动作主要解决“频率偏差有多大”的问题。
两者为什么必须协同而不是单调一个?我刚开始复现时只调J不动D,结果是频率变化率确实压下来了,但恢复阶段的振荡迟迟不能平息;反过来只调D不调J,振荡收敛倒是快,但扰动瞬间的频率最低点仍然很难看。实际调参走一遍就明白:惯量负责“扛第一波冲击”,阻尼负责“收尾”,缺了谁都不行。
还有一个细节容易被忽略:自适应动作应该在系统接近稳态时自动退出。如果J和D一直保持大数值,系统就变成“又重又硬”的状态,后续小扰动来了反而反应迟钝。所以完整的自适应律里通常带死区,或者让J和D随着 (\Delta\omega)、(d\omega/dt) 的减小自动回落到基准值。这一点在很多论文里写得很隐晦,但仿真里非常关键。
2. 数学模型与自适应律设计
2.1 摇摆方程中各参数的物理意义与单位
在仿真搭建前,先把几个量的单位和数值关系理顺。公式里的 (J) 是有名值转动惯量,单位是 (kg \cdot m^2);(D) 是有名值阻尼系数,单位是 (N \cdot m \cdot s / rad);功率单位是 (W)。
实际工程中更常用惯性时间常数H来描述惯量,H和J的换算关系是:
[ J = \frac{2HS_n}{\omega_n^2} ]
其中 (S_n) 是额定容量,(\omega_n) 是额定角频率。假设系统额定容量 (S_n = 10kVA),额定角频率 (\omega_n = 314rad/s),取惯性时间常数 (H = 2s),算下来:
[ J = \frac{2 \times 2 \times 10000}{314^2} \approx 0.4 kg \cdot m^2 ]
这就是虚拟转动惯量的基准值。阻尼系数D的取值一般参考二阶系统的阻尼比。有功-频率环路可以近似等效为二阶振荡环节,阻尼比 (\zeta) 和J、D以及下垂系数 (K_\omega) 的关系为:
[ \zeta = \frac{D}{2\sqrt{J \cdot K_\omega}} ]
工程上把基准点阻尼比取在0.6~0.8附近比较合适,这样频率响应既不会振荡过大,也不会太慢。我在这个例子里取 (D_0 = 20),配合下垂系数大约是临界阻尼偏弱的状态,留一些调节空间给自适应量。
2.2 协同自适应律的两种常见形式
论文里出现的自适应律形式很多,但归纳起来主要就两类:连续函数型和分段开关型。
连续函数型的典型写法是:
[ J = J_0 + k_J \left| \frac{d\omega}{dt} \right| ]
[ D = D_0 + k_D |\Delta\omega| ]
这个形式的好处是参数连续变化,波形平滑,论文里解释起来很直观。(k_J) 和 (k_D) 分别是惯量调节系数和阻尼调节系数,需要配合限幅使用。缺点是参数多,整定起来要花时间。
分段开关型更偏向工程实现:
- 当 (|\Delta\omega| < 0.05Hz) 且 (|d\omega/dt| < 0.1Hz/s) 时,(J = J_0),(D = D_0);
- 当扰动超出上述范围时,J和D按斜坡或比例函数增大到限幅值。
分段形式的优点是有死区,稳态情况下不受测量噪声干扰,仿真波形更干净;缺点是参数切换瞬间可能带来轻微突变。我在复现时用的是连续函数型加死区,两者兼顾,既平滑又抗噪声。
2.3 自适应参数限幅与稳定性边界
自适应律不是越大越好,必须加限幅,否则会出现两个典型问题:一是J过大导致有功调节极其缓慢,系统像“裹了棉被”一样反应迟钝;二是D过大引起稳态时的功率过冲,严重时甚至诱发持续振荡。
J的上限可以从允许的最大频率变化率反推。设系统允许的最大频率变化率 (RoCoF_{max} = 1Hz/s),对应角频率变化率 (1.884rad/s^2),则:
[ J_{max} = \frac{\Delta P_{max}}{RoCoF_{max}} ]
负荷突变幅度如果按额定功率的20%考虑,(\Delta P_{max} = 2000W),算出来 (J_{max}) 大约在 (0.85) 左右;为了留裕度,取 (J_{max} = 0.8) 比较稳妥。D的上限我通常取基准值 (D_0) 的2到3倍,即 (D_{max} = 40)。这个范围既可以保证足够的阻尼作用,又不会让功率响应出现过大的尖峰。
稳定性边界还要注意J和D的变化速率。即使限幅设置正确,如果自适应增益 (k_J)、(k_D) 取得太大,J和D本身也会高频抖动,相当于给系统引入了新的扰动源。这一点放到第5节详细讲,因为它是调试中第一个遇到的坑。
3. Simulink仿真模型搭建实操
3.1 系统总体结构与模块选型
我的模型结构是这样的:直流电压源模拟新能源直流侧,三相全桥逆变器作为主电路,经过LC滤波器后接入线路阻抗和本地负荷,控制系统里高频部分是无功-电压环、有功-频率环、自适应模块和PWM调制。
具体用到的主要模块列个表,照着在Simulink里搜就行:
| 模块 | 库路径 | 作用 |
|---|---|---|
| DC Voltage Source | Simscape / Electrical / Specialized Power Systems | 提供直流母线电压 |
| Universal Bridge | Simscape / Electrical / Specialized Power Systems | 三相全桥逆变器 |
| Three-Phase V-I Measurement | Simscape / Electrical / Specialized Power Systems | 测量输出电压电流 |
| Series RLC Branch / Three-Phase RLC Branch | 同上 | 滤波、线路阻抗 |
| Three-Phase Programmable Voltage Source | 同上 | 模拟电网电压 |
| PWM Generator (2-level) | Simscape / Electrical / Specialized Power Systems / Control | 生成驱动脉冲 |
| Integrator / Gain / Saturation | Simulink / Continuous、Math Operations | 有功-频率环路和自适应律 |
需要提醒的是,如果用的是新版Simulink,Specialized Power Systems库里的“powergui”模块必须放在模型中,否则仿真会报错。逆变器开关管选择“Universal Bridge”时,默认的导通电阻和缓冲电路参数要留意,缓冲电阻太大可能造成电压波形畸变。
3.2 有功-频率环路的Simulink实现
有功-频率环路是整个VSG控制的核心。实际搭建时,我没有用现成的VSG库,而是用最基础的运算模块搭,这样后续改成自适应控制时改动最小。
具体接线逻辑如下:
- 有功参考值 (P_{ref}) 减去实测有功 (P_e) 得到 (\Delta P);
- (\Delta P) 除以当前J后进入积分器,输出角频率偏差 (\Delta\omega);
- (\Delta\omega) 乘以D作为阻尼项,反馈到输入端;
- (\Delta\omega) 积分得到相位 (\theta),这个 (\theta) 就是PWM调制波的同步角度。
在自适应控制场景下,J和D不再是常数,而是来自自适应模块的动态信号。实现方法很简单:把原来增益模块的常数参数改成自适应模块的输出端口即可。这里有一个我踩过的坑:如果直接接一个高速变化的J到除法或增益模块,仿真步长不够小,会出现数值振荡,建议积分器之前加一个速率限制器,给J的变化斜率设个上限。
自适应模块本身的搭建更直接。以J的生成通道为例:将 (\omega) 信号接一个Derivative模块得到 (d\omega/dt),取绝对值后用增益模块乘以 (k_J),再加上 (J_0),最后过Saturation限幅,输出就是自适应J。D通道同理,只是输入信号换成 (\Delta\omega),增益换成 (k_D)。
Derivative模块会产生一个明显问题:PWM开关纹波会让 (\omega) 信号带有高频毛刺,直接微分出来的 (d\omega/dt) 会剧烈跳动。我的处理办法是在Derivative之前先过一个低通滤波器,时间常数取 (1ms) 左右,既能保留frquency动态信息,又不会放大噪声。如果用更高的开关频率,滤波器时间常数还可以再小一些。
3.3 参数初始化脚本与关键参数配置
模型搭好后,参数不建议在模块里逐个手敲,而是写一个初始化脚本,把参数统一管理起来,后面批量扫参特别方便。下面是我用的一个m脚本片段:
% VSG自适应控制参数初始化 Vdc = 800; % 直流母线电压 fn = 50; % 额定频率 wn = 2*pi*fn; % 额定角频率 Sn = 10000; % 额定容量 H = 2; % 惯性时间常数 J0 = 2*H*Sn/wn^2; % 基准转动惯量 D0 = 20; % 基准阻尼系数 kJ = 0.02; % 惯量调节系数 kD = 5; % 阻尼调节系数 Jmax = 0.8; % 惯量上限 Dmax = 40; % 阻尼上限 Lf = 2e-3; % 滤波电感 Cf = 30e-6; % 滤波电容 Rload = 10; % 本地负荷 fc = 10000; % 开关频率脚本里定义的所有变量,Simulink模型里直接写变量名即可引用。这样改参数时不用进模块界面,改一行脚本再重新运行就行。注意脚本中 (J_0) 的计算结果大约就是0.4,这个数值和摇摆方程的固有动态是匹配的。
仿真求解器设置方面,包含PWM逆变器的模型建议用“离散”求解器,固定步长 (1e-5) 或更小;如果坚持用连续仿真,我推荐ode23tb,最大步长限制在 (1e-5),否则输出电压波形会出现非理想毛刺。功率测量模块为了滤除2倍频纹波,低通滤波器带宽取 (100Hz) 左右比较合适。
4. 仿真场景设置与结果验证
4.1 负荷突增场景下的频率响应对比
第一个标准场景是负荷突增。设置初始负荷 (P_{load1} = 8kW),(t=2s) 时切换到 (P_{load2} = 12kW),模拟本地负荷突然增加的工况。分别记录固定参数((J=J_0, D=D_0))和自适应参数下的频率响应,重点对比三个指标:最大频率偏差、最大频率变化率(RoCoF)、稳态恢复时间。
我实测的一组典型结果是:固定参数下最大频率偏差约0.5Hz,最大RoCoF约0.8Hz/s,频率恢复到49.8Hz以上大约需要1.2s;自适应参数下最大频率偏差压到了0.2Hz,最大RoCoF降到0.3Hz/s,稳态恢复时间缩短到0.5s左右。
这个结果很容易理解:扰动刚开始时,(d\omega/dt) 很大,自适应律立刻把J拉高,频率下跌势头被明显抑制;随后 (\Delta\omega) 变大,D跟着增大,振荡被很快“吸干”。固定参数在初始阶段“扛不住”,后面的恢复自然也更慢。观察电压电流波形,自适应策略下有功功率的超调量也比固定参数方案小约15%。
4.2 频率扰动场景下的自适应量变化
第二个场景是直接给电网频率或频率参考值加一个阶跃扰动,观察J和D的实时变化曲线。这是证明自适应策略确实“在动作”的最直接证据。
实际仿真里可以看到典型的时序:扰动发生瞬间,J的曲线快速抬升逼近 (J_{max}),维持约0.2s后开始回落;D的曲线则在频率偏差最大的时间段内保持高位,随着频率恢复逐渐回落到基准值附近。如果给系统加的是2Hz的短时扰动,J和D会在扰动结束后约0.4s内完全恢复基准值,说明死区和恢复逻辑设计正确,没有出现“自适应量长期锁在高位”的问题。
这个波形在论文里是非常有力的说明材料。我建议复现时把这三个信号放在同一张图的不同子图里展示,横轴统一,最上面是频率偏差,中间是J,最下面是D,评审一眼就能看出协同控制的动态过程。
4.3 结果数据的整理与对比表
仿真数据一定要记录下来,后面写论文、写报告都用得上。我习惯每跑完一组参数就更新一次表格,下面是一个整理模板:
| 场景 | 指标 | 固定参数 | 自适应参数 | 改善比例 |
|---|---|---|---|---|
| 负荷突增 | 最大频率偏差 (Hz) | 0.50 | 0.20 | 60% |
| 负荷突增 | 最大RoCoF (Hz/s) | 0.80 | 0.30 | 62.5% |
| 负荷突增 | 恢复时间 (s) | 1.20 | 0.50 | 58.3% |
| 频率扰动 | 有功超调量 | 18% | 13% | 27.8% |
| 频率扰动 | 振荡次数 | 3 | 1 | 66.7% |
这些数据不仅用于验证策略有效性,还有一个重要用途:反推自适应律的参数是否合理。比如恢复时间太短但振荡次数多了,说明D的自适应增益偏大;最大RoCoF降下来了但恢复时间没有明显改善,说明J的调节过快或死区过大导致J过早退出,需要调整回落速率。
5. 常见问题与调试心得实录
5.1 频率微分毛刺导致自适应量跳动
这是复现这个策略第一个碰到的烦人问题。由于PWM开关作用,测量得到的频率信号本身带有高频分量,直接用Derivative模块求 (d\omega/dt),得到的信号噪声大得没法看,J值跟着来回跳,系统性能反而变差。
我试过几种方案。最简单有效的一种是:在Derivative模块前串一个低通滤波器,截止频率按开关频率的1/20到1/10取。比如开关频率10kHz,滤波器时间常数取0.5~1ms就能滤掉大部分纹波,同时保留频率变化的动态信息。如果嫌低通滤波带来相位滞后,也可以用 (s/(1+Ts)) 形式的高通近似来求微分,效果类似,但毛刺更干净。
还有一个更稳的做法:不直接对瞬时角频率微分,而是取频率偏差信号过一阶滞后环节得到等效变化率。这个办法牺牲了一点快速性,但稳定性最好。
5.2 自适应增益过大引发的持续振荡
刚开始调参时,我把 (k_J) 和 (k_D) 取得比较大,想让自适应效果更明显,结果频率波形在高频段出现持续等幅振荡。把J、D曲线和频率曲线放在一起看,发现J和D在振荡期间一直处于限幅极限附近,相当于系统参数在高值和低值之间来回切换,反而失去了稳定工作点。
排查方法也不难。先在固定参数下确认基准点参数能稳定运行,然后固定D的自适应增益,只增加 (k_J),观察J曲线和频率曲线,找到J抖动但频率还能稳定的临界值;再反过来单独调 (k_D)。两个方向都调完以后,再组合到一起看整体效果。
必要的结构措施是加死区。当 (|\Delta\omega| < 0.05Hz) 且 (|d\omega/dt| < 0.1Hz/s) 时,让自适应输出直接保持为基准值,不做调节。这样稳态时J和D完全不变,系统等价于固定参数模型,振荡问题基本消失。
5.3 复现论文时容易踩的三个坑
第一个坑是标幺值和有名值混用。很多EI论文的公式用的是标幺值,但Simulink模型里通常直接用有名值,复现时必须把论文里的 (J^)、(D^) 按基准值换算成有名值,否则仿真出来的时间常数、频率偏差会差一个数量级。我最开始就是直接用论文给出的标幺值填入增益,结果频率因为积分增益太大直接发散。
第二个坑是论文参数只给一部分。很多文章只给自适应律的形式,不给 (J_0)、(k_J)、(k_D) 具体数值。这时候只能反推:先根据额定容量、惯性时间常数H算出 (J_0),再通过阻尼比范围确定 (D_0),最后根据期望的最大频率偏差和RoCoF来确定 (k_J) 和 (k_D) 的量级。从经验看,(k_J) 取 (J_0) 的5%~10%作为起始值,(k_D) 取 (D_0) 的25%左右作为起始值,基本都在合理范围内。
第三个坑是功率测量滤波对自适应输入的延迟影响。有功功率测量低通滤波器的时间常数如果取得太大,比如超过100ms,自适应模块看到的 (d\omega/dt) 和 (\Delta\omega) 都严重滞后,控制效果会大打折扣,甚至出现“扰动结束时自适应才开始动作”的尴尬情况。实测下来,功率低通滤波时间常数取20~50ms比较合适。
最后再分享一个小习惯:调参时不要把注意力全放在最终波形上,J和D的变化曲线本身就是最好的调试工具。如果仿真里发现频率响应不符合预期,先看J和D有没有按预设逻辑动作,再回头看公式和参数,通常能省下一大半排查时间。这个策略的难点不在理论,而在把理论变成一套参数稳定、波形可控的Simulink模型,把这一关过了,后面换场景、改参数都是水到渠成的事。