闭环控制用反馈使系统输出跟踪给定并抑制扰动,其品质用时域指标(超调、调节时间)与频域裕度(幅值裕度、相角裕度)衡量,PID 是工业上占绝对主导的控制器结构。本节用反馈的直觉解释光伏振荡案的成因——带宽与谐振点过近导致环路相互作用,并演示 PID 整定的量化效果。
一个反直觉的事实:振荡案的"加害者"与"受害者"是同一个东西——反馈。逆变器的电流环、锁相环都是反馈回路,它们让逆变器在正常工况下又快又稳;但当电网变弱(短路容量下降)、多个逆变器的环路带宽恰好落在电网谐振点附近时,这些原本各自稳定的环路通过电网耦合成了一个新的大环路,而这个大环路不稳定。每个零件都合格,系统却振荡——这是控制问题区别于元件故障的根本特征。
开环控制(调好输入、听天由命)无法抵抗扰动;闭环控制(测输出、算误差、纠输入)用误差驱动修正。负反馈的收益清单:抑制扰动(扰动被环路增益除)、改善线性、加快动态、降低对参数变化的敏感度。代价清单同样明确:可能失稳(相位滞后的环路在某频率变成正反馈)、需要量测(传感器误差直接进系统)、有带宽上限(执行机构的物理极限)。
import numpy as np # 闭环对扰动的抑制能力 for L in [1, 5, 10, 50]: # 扰动到输出的闭环传递 = 1/(1+L) print(f"环路增益 L={L:>3}: 扰动被压缩到 {100/(1+L):5.1f}%") # 灵敏度:对象参数变化的影响同样被压缩 dG_rel = 0.20 # 对象增益漂移 20% for L in [5, 20]: dT_rel = dG_rel / (1+L) print(f"L={L:>3}: 对象漂移20%只引起闭环特性变化 {dT_rel*100:.1f}%")
环路增益 20 时,对象参数漂移 20% 只引起闭环响应变化约 1%——反馈用"环路增益"买"不敏感"。这笔交易的上限由稳定性决定,于是引出全节的核心问题:多大的增益、怎样的补偿,环路才稳?
阶跃响应的三个常用指标:超调量(冲过终值的百分比,阻尼比的单调函数)、调节时间(进入 ±2% 带的时间,约与主导极点实部成反比)、上升时间(从 10% 到 90% 的时间,与带宽成反比)。频域用两个裕度说话:相角裕度(穿越频率处相位距 −180° 的余量)与幅值裕度(相位 −180° 处增益距 1 的余量)。工程经验值:相角裕度 45–60°、幅值裕度 ≥2(6 dB),对应超调 20% 上下的二阶近似行为。
import numpy as np # 相角裕度与超调的对应关系(二阶近似) for PM_deg in [30, 45, 60, 70]: PM = np.radians(PM_deg) zeta = PM / 2 if PM < np.pi/3 else 0.6 + (PM_deg-60)*0.005 zeta = min(zeta, 0.9) Mp = np.exp(-np.pi*zeta/np.sqrt(1-zeta**2))*100 print(f"相角裕度 {PM_deg} 度 ≈ 阻尼比 {zeta:.2f} → 超调约 {Mp:.0f}%")
相角裕度 30° 时超调约 35%,60° 时降到 10% 以下——裕度就是"预存的 damping"。光伏振荡案在频域的语言:逆变器的环路在 8 Hz 附近的相角裕度被电网阻抗吃掉了(弱电网的阻抗角在此频率产生大幅滞后),裕度归零甚至为负,8 Hz 分量自持。

工业控制器十有八九是 PID:比例 P 对当前误差立即反应(快但留稳态误差)、积分 I 累积历史误差(消除稳态误差但增加相位滞后)、微分 D 预测误差趋势(提供阻尼、抑制超调,但对噪声敏感)。整定的本质是在"快、准、稳"之间搬预算。
import numpy as np from scipy import signal # 二阶对象(模拟含谐振的弱电网下逆变环路等效对象) wn, zeta = 2*np.pi*8, 0.1 G = signal.TransferFunction([wn**2], [1, 2*zeta*wn, wn**2]) def closed_step(Kp, Ki, Kd): # PID: C(s) = Kp + Ki/s + Kd*s Cnum = np.polynomial.polynomial.polymul([Kd, Kp], [1, 0]) # 用多项式运算直接拼:C = (Kd*s^2 + Kp*s + Ki)/s Cnum = np.array([Kd, Kp, Ki]) Cden = np.array([1, 0]) # 开环 L = C*G,闭环 T = L/(1+L) Lnum = np.polymul(Cnum, G.num) Lden = np.polymul(Cden, G.den) Tnum, Tden = np.polymul(Lnum, Lden) and (Lnum, np.polyadd(Lden, Lnum)) T = signal.TransferFunction(Tnum, Tden) t, y = signal.step(T, T=np.linspace(0, 3, 600)) y = y[:,0] if y.ndim > 1 else y overshoot = (y.max() - 1) * 100 idx = np.where(np.abs(y - 1) > 0.02)[0] ts = t[idx[-1]] if idx.size else t[-1] return y, t, overshoot, ts for Kp, Ki, Kd in [(1, 0, 0), (1, 0, 0.2), (1, 2, 0.2), (2, 4, 0.4)]: _, _, os_, ts_ = closed_step(Kp, Ki, Kd) print(f"Kp={Kp}, Ki={Ki}, Kd={Kd}: 超调 {os_:6.1f}%, 调节时间 {ts_:5.2f} s")
读数趋势符合教科书:纯比例残留稳态误差与振荡;加微分后超调显著下降;比例积分同加,稳态误差消除、响应加快,但整定不当会重新引入振荡。整定不是玄学,是把时域指标翻译成带宽与裕度,再翻译成三个参数。工程上常用 Ziegler-Nichols 法给初值,再按指标微调;对光伏这类与电网耦合的系统,则用阻抗分析法直接校核"逆变器阻抗 + 电网阻抗"在宽频段的裕度。
方案分三层:其一,降低锁相环带宽(牺牲一点跟踪速度,换 8 Hz 附近充足裕度);其二,投入附加阻尼控制(在功率环注入与振荡频率同相位的阻尼分量,等效提高阻尼比——对应 7.2 节"把 ζ 从 0.1 提到 0.3"的目标);其三,多台逆变器参数错开整定(避免多环路带宽聚堆)。改造后复测:8 Hz 峰值从 0.6 降到 0.05 以下,振荡案全书收官。
⚠️ 常见坑:把"系统稳定"当成静态属性。稳定裕度随运行点变化——电网强弱、负荷水平、并联机组数都移动裕度。控制参数在一种工况下完美,换一种工况可能失稳,这就是规范要求宽工况扫频校核的原因。
最后一节把视野拉到系统级与未来:高比例新能源电网、储能、宽禁带器件与数字化,这套故障排查的思维如何面对新的战场。