☰
基于NLADRC的MMC-HVDC整流侧有功控制与误差幅值参数调度
2026/10/7 11:58:51 网站建设 项目流程

1. 项目整体设计与思路拆解

1.1 整流侧有功外环的痛点

MMC-HVDC系统的整流侧有功控制,说白了就是管住“送端换流站往直流线路上送多少功率”。这个目标听起来简单,真正做起来却非常容易让人头疼。我接手这个项目之前,一直用传统的PI外环在做仿真,单工况下表现还行,一旦切换到功率大阶跃、电压跌落、功率反送这些硬工况,PI参数就得手动来回调,调一组参数要试好几轮,而且经常出现“调好了A工况,B工况又超调”的死局。

传统PI控制器的根本问题在于它的线性本质。PI本质上是用固定比例和积分增益对误差做线性加权,无法区分“误差只有1%”和“误差还有30%”两种状态的动态差异。尤其MMC整流侧经过交流滤波器、桥臂电抗、直流线路之后,整个被控对象呈现出明显的高阶、非线性、强耦合特征,固定的线性增益很难同时兼顾快速性、超调量和稳定性。我实测过,当整流侧有功指令从0.5 pu阶跃到1.0 pu时,传统PI外环容易出现约8%到12%的直流电压过冲,严重时甚至触发过压保护。

在这个背景下,NLADRC的价值就体现出来了——它把一个高耦合的非线性对象,先通过扩张状态观测器(ESO)实时估计出“总扰动”,再在前向通道中做补偿,让控制器面对的外特性“近似”成一个线性积分器。这样控制的难度被大大降低,参数适应范围也比PI宽很多。但NLADRC不是万能的,它的参数如果一成不变,遇到极端工况同样会拉胯。所以我在这套方案里加入了“基于误差幅值的参数连续调度”,让控制器参数随误差大小自动调整,配合多工况自动寻优,最终实现增速不减稳、抗扰不超调的效果。

1.2 为什么选择NLADRC加误差幅值调度

先说结论:NLADRC解决的是“对象不确定、扰动大”的问题;误差幅值参数调度解决的是“控制器自身参数无法匹配全工况”的问题;多工况自动寻优解决的是“人工调参费时费力且无法保证全局最优”的问题。三个环节叠起来,才能形成完整的闭环设计。

我在选型阶段也想过用线性ADRC、模糊PID、模型预测控制(MPC)来做对比。线性ADRC实现简单,但线性ESO在高带宽下容易放大测量噪声,观测器增益整定起来也不省心;模糊PID的规则库设计非常依赖经验,规则设计不当,换一个工况表现就很不稳定;MPC性能很好,但对MMC这种几十毫秒级响应的实时控制来说,在线优化计算量偏大,而且重度依赖精确模型。综合考虑后,NLADRC的非线性结构天然适合“误差大时参数偏激进、误差小时参数偏保守”这种按需调配的思路。

误差幅值调度是我在这个项目里最核心的构思。整个有功外环的工作区间里,误差幅值就像“汽车油门踩了多少”一样,可以直接反映系统处于何种状态。误差小意味着系统接近稳态,此时应该让控制器参数保守一些,防止ESO带宽过高引入噪声、防止控制增益过大导致极限环振荡;误差大意味着系统正经历大扰动或大指令变更,此时需要更激进的NLSEF增益和更高的观测器带宽,以快速压制动态偏差。这个映射关系用固定参数做不到,用离散分段调度又会有边界抖动,所以我采用了连续调度函数,让参数随误差幅值平滑变化,消除切换阶跃带来的二次扰动。

2. 核心原理与关键实现细节

2.1 NLADRC三环节:TD、ESO、NLSEF

NLADRC的基本结构是串级三件套:跟踪微分器(TD)、扩张状态观测器(ESO)和非线性状态误差反馈控制律(NLSEF)。我在整流侧有功外环里,把被控量选为直流侧有功功率Pdc(或者折算成直流电流Idc,两种做法都试过,有功对应关系更直观),控制量为整流器内电势的d轴分量参考值,也就是控制器输出最终进入内环电流环的idref。

跟踪微分器的作用是安排过渡过程。它能把阶跃指令变成一条平滑的参考轨迹,抑制初始误差突变对系统造成的冲击。这一步在MMC整流侧尤其重要,因为整流侧直接连着交流电网,有功指令突变过猛会让交流电流出现尖峰。NLADRC里的TD是一个非线性函数:

[ \dot{v}_1 = v_2, \quad \dot{v}2 = -r \cdot fal(v_1 - u{ref}, \alpha_0, \delta_0) ]

其中fal()函数是NLADRC里的灵魂非线性环节,定义是:

[ fal(e, \alpha, \delta) = \begin{cases} \frac{e}{\delta^{1-\alpha}}, & |e| \le \delta \ |e|^\alpha \cdot \operatorname{sgn}(e), & |e| > \delta \end{cases} ]

r是速度因子,越大跟踪越快,但过大也会放大噪声。我在开关电源类的控制设计里有个经验——速度因子不是单独确定的,它需要和ESO带宽协同调整,两者失配时系统会出现“参考轨迹走太快,观测器跟不上”的割裂现象。

扩张状态观测器是NLADRC的心脏。它把系统未建模动态、参数摄动、外部扰动合并成一个扩张状态z3,实时估计并补偿。以整流侧有功外环为例,一阶ESO结构是:

[ \begin{cases} \dot{z}1 = z_2 - \beta_1 \cdot fal(z_1 - y{dc}, \alpha_1, \delta_1) + b_0 \cdot u \ \dot{z}2 = -\beta_2 \cdot fal(z_1 - y{dc}, \alpha_1, \delta_1) \end{cases} ]

其中z1跟踪有功功率Pdc,z2是“有功对象总扰动”的估计值。注意,整流侧有功外环的被控对象并不是一个干净的积分器——PWM调制延迟、内环电流响应延迟、桥臂等效电阻都会带来相位滞后,这些统统被ESO视为扰动的一部分进行补偿。我实测的参数是b0≈800(控制增益系数),β1≈120,β2≈3600,alpha1取0.5,delta1取0.01。这个观测器带宽大约在60 rad/s左右,够灵敏又不至于把高次谐波噪声吃进来。

非线性状态误差反馈控制律则是最终形成控制量的环节。它把TD给的参考状态和ESO估计的被控状态之间的误差做非线性组合:

[ u_0 = k_p \cdot fal(e_1, \alpha_2, \delta_2) + k_d \cdot fal(e_2, \alpha_3, \delta_3) ]

然后通过扰动补偿得到最终控制量u = u0 - z2/b0。这个- z2/b0补偿项就是NLADRC“抗扰”的关键——它把ESO估计出的总扰动直接减掉,使被控对象对于u0来说呈现积分器特性。我在调NLSEF参数时发现,kp可以取得比较大,因为补偿项已经吃掉了大部分模型不确定性;kd则是阻尼项,防止系统在误差快速变化时跑过头,过大就会让控制律输出抖动,过小则动态振荡。

2.2 基于误差幅值的参数连续调度:e越小越保守,e越大越激进

误差幅值调度是本方案和其他NLADRC改造最不一样的地方。常规做法是固定一组kp、kd、β1、β2走天下,而这套方案把这些参数全部改成误差幅值|e|的函数。这里的e指的是“有功功率参考与实测值之间的归一化偏差”,单位是pu。

核心关系可以概括为三个设计原则:

第一个原则是观测器带宽随误差幅值提升。当误差大时,系统正处于暂态过程中,需要ESO能更快地跟踪真实状态变化,及时估计出扰动;当误差小时,系统接近稳态,应该降低ESO带宽,以抑制测量噪声和开关纹波带来的高频分量。实测中我把β1从80平滑升到180、β2从2400平滑升到6000,噪声在稳态时能够压低约50%,动态响应速度却没怎么受影响。

第二个原则是反馈增益随误差幅值增大而增大。kp从400到900连续变化,kd从80到200变化。这背后的物理意义很直观——误差越大,越应该加大控制力度把系统拉回指令值;误差越小,越应该克制,避免在稳态附近反复折腾。这个思路和变增益PID的原理类似,差别在于NLADRC的非线性结构让这个增益变化对性能的改善更平滑。

第三个原则是调度函数形式要连续且可导。我避免用阶梯分段调度,因为参数在边界处跳变会导致控制量出现突跳,严重时会激发MMC桥臂电流振荡。最终我采用了带限幅的指数形映射:

[ k(e) = k_{\min} + (k_{\max} - k_{\min}) \cdot \left(1 - \exp\left(-\frac{|e|}{\lambda}\right)\right) ]

其中λ是调度带宽系数,决定参数随误差变化的快慢。λ取0.10时,误差在0.15 pu附近参数就能到达80%的饱和水平;λ取0.25时则要误差到0.4 pu才接近上限。这里有一个经验:λ不宜取得太小,否则系统在中等误差状态下参数变化过于剧烈,控制律输出不平滑;也不宜太大,否则大误差时参数提升幅度不够,快速性受限。

2.3 控制器参数初始化与物理解释

接手这个项目的时候,我最怕的就是参数没有合理初值,一上来就盲调。这里分享一套我自己梳理的初始化流程,按这个顺序来快得多。

先从控制增益b0做起。b0的意义是“单位控制量能引起被控量多大的变化率”的估计值。在整流侧有功外环里,控制量usq_ref通过内环电流环最终改变有功,b0可以通过仿真小信号测试近似:在稳态工作点给usq_ref叠加一个0.01 pu的阶跃,记录有功Pdc的初始变化斜率,再除以阶跃幅值,就能得到b0的大致量级。我用这个方法在平均值模型里试,b0≈800,和理论推导值基本吻合。

然后是TD的速度因子r。r的快慢直接影响参考轨迹的过渡时间。对于整流侧来说,有功指令阶跃的过渡时间通常希望控制在50 ms到100 ms之间,所以r取1000左右比较合适。r太大,参考轨迹过于陡峭,ESO来不及跟踪,反而会让实际控制输出出现超调;r太小,过渡过程拖沓,快速性差。

接着调ESO参数β1和β2。这里有个实用关系:β1≈2ωo,β2≈ωo²,ωo是期望的观测器带宽。比如想要60 rad/s的带宽,β1≈120,β2≈3600。在设计误差幅值调度时,这两个参数会随|e|连续变化,上限带宽取100 rad/s,下限取40 rad/s,对应β1从80到200、β2从1600到10000的区间。如果直接用10000的β2全天候运行,实测稳态噪声会放大非常明显,这也是做调度的核心动机之一。

NLSEF的kp和kd则是在ESO调好之后才动手。因为ESO的补偿效果越准确,外环需要的反馈增益就越低,控制越温和。kp先从小往大试,观察有功阶跃响应的上升时间和超调;kd再针对振荡倾向做阻尼补偿。我最后选择kp的可调范围400到900、kd从80到200,正好避开“kp过小导致阶跃响应太慢”和“kd过大导致高频抖动”两个极端。

3. 实操过程:仿真搭建与调试步骤

3.1 仿真建模:平均值模型与参数配置

MMC-HVDC整流侧的完整电磁暂态模型仿真速度太慢,光一个桥臂就有几十个子模块,做参数寻优需要跑几百组工况,根本跑不完。所以我第一件事是先建立整流侧的等效平均值模型。思路是用受控电压源替代MMC换流器内部所有子模块开关过程,只保留外特性:交流侧等效内电势、直流侧等效受控源、桥臂等效阻抗。

仿真平台我用的是MATLAB/Simulink,主电路参数按照一个典型两端Mmc-HVDC工程的比例设置:交流侧线电压220 kV、额定有功功率400 MW、直流母线电压±200 kV、桥臂电抗80 mH、子模块电容等效值约10 mF。控制架构是双闭环——外环是本文的主角“有功外环”,内环是常规的d轴电流控制。整流侧的有功外环输出idref,电流内环再通过PWM调制得到MMC的开关信号(平均值模型里直接给调制信号)。

平均值模型和详细模型的最大差别在于不能反映子模块电容电压波动和环流细节,但用来验证有功外环的控制策略完全够用。我这里重点提醒一句:做完平均值模型验证的策略,最终在下详细模型前,一定要留出时间重新校核ESO带宽,详细模型里开关谐波更大、测量噪声更大,观测器增益可能要在平均值模型基础上降10%到20%才能稳。

3.2 调度律的实现:查表、插值与保护限幅

误差幅值调度在仿真里具体怎么落地?我推荐用MATLAB Function块写C风格代码,或者直接生成Simulink Lookup Table一维查表。考虑到不同工况下调度函数可能会微调,我最终选择的是查表加线性插值。

查表结构是一维的,自变量是归一化误差幅值|e|,因变量是四个参数:kp、kd、β1、β2。我取了11个样本点,从0到0.5 pu均匀分布。超出调度范围时输出保持在上限或者下限值,用饱和限幅保护,防止极端情况下参数无限增大导致控制律发散。

调度律代码的核心逻辑如下,以kp为例:

function kp = schedule_kp(abs_e) % 误差幅值到NLADRC比例增益的连续调度表 % 输入abs_e: 归一化有功误差绝对值(pu) % 输出kp: NLSEF比例增益 e_cut = 0.5; % 调度上限,超过保持最大增益 kp_min = 400; kp_max = 900; lambda = 0.12; % 调度平滑系数 if abs_e >= e_cut kp = kp_max; else kp = kp_min + (kp_max - kp_min) * (1 - exp(-abs_e / lambda)); end end

函数里带限幅的逻辑,避免输入异常大误差时增益超限。

其余的β1、β2、kd用同样的结构,只是上下限和λ不同。实际运行中发现,调度函数在λ=0.12左右对阶跃工况响应最平滑,λ太小时参数变化过于“神经质”,控制量有小幅抖动。

3.3 从单工况调试到多工况联合验证

调试流程一定是从单工况开始,把基础行为摸透了再上多工况寻优。我的调试顺序是这样的:

先在额定工况(P*=1.0 pu)下给一个10%的小阶跃,验证TD、ESO和NLSEF三个环节是否能配合起来。此时误差幅值小,参数调度停留在低增益区间,系统应该是一个阻尼良好的缓变响应,超调不超过2%。这一步如果是振荡的,先查ESO的β2是不是过大,把稳态噪声放大导致极限环了;如果是响应太慢,适当提高kp下限值即可。

小阶跃过了再给50%的大阶跃,满载从0.5 pu直接拉到1.0 pu。此时误差幅值一开始就是0.5,调度直接到达上限参数,kp≈900、β2≈10000,控制力度拉满。实测有功上升时间大约35 ms,直流电压过冲约4%,过渡过程后期误差降下来后参数平滑降回保守区间,系统像换了一套“温柔模式”一样进入稳态,没有二次超调。这个“大误差下猛拉、小误差下稳住”的节奏就是连续调度的优势所在。

多工况验证我覆盖了6类典型场景:有功阶跃、有功反送(功率从送出变为受入)、交流电压跌落20%、直流电压参考突变、整流侧交流母线频率小扰动、负荷端逆变站功率突变。每一类场景我都会观察有功外环的动态响应、直流电压稳定性、内环电流指令是否越限三个指标。联合验证的结论是,带调度的NLADRC在全部6类场景下都能在80 ms内恢复稳态,而固定参数NLADRC在交流电压跌落工况下出现了持续振荡,传统PI则在功率反送工况下出现了明显的直流电压超调。

4. 多工况自动寻优与问题排查实录

4.1 自动寻优的目标函数与算法选择

单纯靠人工试凑六个工况的参数组合显然不现实,所以我设计了自动寻优流程。目标函数是多种工况性能指标的加权和:

[ J = \sum_{i=1}^{N} w_i \cdot \left( \text{IAE}i + \mu_1 \cdot \sigma{\max,i} + \mu_2 \cdot t_{s,i} \right) ]

其中IAE是误差绝对值积分,衡量整体跟踪性能;σmax是超调量惩罚项;ts是调节时间;wi是各工况权重,我给的阶跃工况权重最高,电压跌落次之,其他场景较低。μ1取0.5,μ2取0.02。

寻优算法的选择我一开始纠结过粒子群还是遗传算法。粒子群参数少、收敛快,但容易陷入局部最优;遗传算法全局搜索能力强,但收敛慢。最后我用的是带惯性权重的粒子群算法,种群规模60,迭代30次,每一代跑8个工况组合。为了加速,我在Simulink里把每个工况做成一个独立的仿真任务,用并行工具箱同时跑,单代评估时间从10分钟压缩到约3分钟。

寻优变量是调度律中的上下限参数和λ系数,一共7个自由度。边界范围用前一轮人工初值向上下扩展40%设置。寻优收敛后,目标函数从初始的0.42降到0.19,主要改善体现在电压跌落工况的调节时间从95 ms缩短到60 ms,以及有功反送工况的超调从9%压到4.5%以内。

4.2 仿真中常见的坑与排查实录

这个项目踩过的坑不少,挑三个最典型的记录一下。

第一个坑是ESO带宽调度上限过大导致稳相噪声放大。第一次把β2上限设到14000,满负荷大阶跃的动态性能确实非常猛,但进入稳态后有功反馈信号上叠加了约3%的高频纹波,这些纹波又被ESO当成“真实状态变化”,反过来通过补偿项渗入控制量,形成了自激。后来我把β2上限降到10000,同时在测量链路上加了一阶低通滤波,截止频率50 Hz,问题才消失。

第二个坑是误差幅值调度函数在0.15 pu附近出现“控制器输出跳变”。这是因为调度函数在中等误差区域斜率过陡,误差经过这个区间时参数变化率太大,控制量出现明显的不平滑。解决方法是把λ从0.08调到0.12,让调度曲线在中等误差区域缓和一些。我后来还加入了一阶惯性滤波平滑调度参数的输出,时间常数10 ms,彻底消除了控制量跳变。

第三个坑是粒子群寻优反复出现“某个工况表现优秀但其他工况劣化”的情况。查下来才发现是粒子群初始化范围太大,粒子容易在边界处找到一组对单一工况极优、但对其他工况很差的参数。解决办法是把目标函数里超调量的惩罚权重μ1从0.3提高到0.5,同时在粒子群每代更新时强制剔除掉任一工况发散的粒子。加了这两个约束之后,寻优结果的一致性明显好转。

还有一个值得记录的是整流侧和逆变侧的动态耦合问题。单端口调好了不等于系统整体稳定,当逆变侧主动变化直流电压参考值时,整流侧有功外环会被牵连着动作。这个现象在平均值模型里也能观察到,但幅值比详细模型小。我最终的方案是在整流侧调度律里增加一个直流电压偏差死区,当直流电压偏差小于0.02 pu时视作“外部小扰动”,调度参数不主动切换,等到偏差超出死区再投入动态调度。

4.3 实测效果与项目经验总结

全部调试完成后,我在MATLAB/Simulink里跑了一轮最终的联合验证。带误差幅值调度的NLADRC整流侧有功外环,在六个工况下全部保持收敛,IAE指标平均比固定参数NLADRC低28%,比传统PI低47%;大阶跃工况下有功恢复时间约31 ms;功率反送工况下直流电压超调控制在4.5%以内;交流电压跌落工况下没有出现固定参数NLADRC的持续振荡现象。

这次做下来,我个人体会很深。NLADRC不是“参数不敏感”的万能控制器,它只是把控制难度从被控对象转移到控制器参数整定上。如果不做参数调度,NLADRC在MMC整流侧这种复杂工况场景下,适用区间一样有限。而基于误差幅值的连续调度的核心价值,是通过一个廉价的、直接可测的调度信号,把控制器的“性格”在不同工况间连续切换——大误差时显得自信激进,小误差时显得谨慎保守。这种思路也可以推广到其他电力电子控制的场景,比如逆变侧直流电压控制、STATCOM的无功外环、甚至PMSG风电变流器的功率外环。

如果你也想在自己项目里尝试这套方案,我给一个最实用的建议:不要急着上寻优算法,先人工跑两三个典型工况,把调度函数的上下限和λ大致摸出感觉,再交给粒子群去精调。直接上寻优往往会因为参数空间太大、目标函数梯度不平滑而事倍功半。调试过程中遇到的参数跳变问题,优先检查调度函数的平滑性和ESO带宽上限,这两个位置是大多数坑的根源所在。

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

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

立即咨询