ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

ADRC自抗扰控制:从核心原理到电机电流环实战应用

ADRC自抗扰控制:从核心原理到电机电流环实战应用 1. 项目概述从PID到ADRC控制算法的“降维打击”在工业控制、机器人、电力电子这些领域摸爬滚打久了你一定会对PID控制器又爱又恨。爱它的简单直观几个参数调来调去大部分时候都能让系统“动起来”恨它的“娇气”面对非线性、强耦合、大时滞或者外部扰动PID就像个经验不足的舵手要么反应迟钝要么剧烈震荡调参调到怀疑人生是常有的事。我当年调试一个伺服系统为了应对负载突变PID参数前前后后改了不下五十版最后还是加了前馈和各种滤波才勉强能用过程极其痛苦。后来接触到自抗扰控制ADRC感觉像是打开了一扇新世界的大门。它不像一些现代控制理论那样需要精确的数学模型也不像模糊控制、神经网络那样“黑箱”。ADRC的核心思想非常“霸道”不管系统内部具体是什么结构也不管外部来了什么妖魔鬼怪扰动我统统把它们打包成一个“总扰动”然后实时估计并补偿掉。剩下的就是一个被我“驯化”好的、简单的积分串联型系统用最简单的控制律就能搞定。这种“观测-补偿”的思路对于咱们这些一线工程师来说直观又实用。最近在搞永磁同步电机的电流环控制传统的PI调节器在高速弱磁区或者参数变化时性能下降明显。换上ADRC后动态响应和抗扰能力提升了一个档次参数也更好整定。网上流传的ADRC算法m文件我也研究过不少有的写得很精妙有的则存在理解偏差。今天我就结合自己的实战经验把ADRC从核心思想到代码实现掰开揉碎了讲清楚目标是让你看完就能理解原理并且能动手在自己的项目里尝试应用。2. ADRC核心思想与架构拆解把复杂问题“打包”解决ADRC的发明者韩京清研究员提出这一理论时目标很明确找到一种既不依赖精确模型又能实现高性能鲁棒控制的方法。它的整体架构可以概括为“三部分”跟踪微分器TD、扩张状态观测器ESO和非线性状态误差反馈NLSEF。咱们先抛开这些术语用个生活化的例子来理解。想象一下你在开车目标是让车速稳定在100km/h。传统的PID控制器就像是你只盯着速度表当前误差发现慢了就多踩点油门发现快了就松一点。但如果遇到上坡负载扰动、逆风外部扰动或者车子本身发动机响应特性变了模型不确定性你这个“只看速度表”的策略就会很被动容易产生超调或调节缓慢。ADRC的做法则像是一个经验丰富的老司机搭配一个智能副驾智能副驾TD他不满足于当前速度还会根据路况和你想要的速度规划出一条平滑过渡的理想速度曲线。比如从80加速到100他不会让你瞬间踩到底而是规划一个既快速又平缓的加速过程避免冲击。这就是TD的作用——安排过渡过程并提取出理想的系统状态比如理想位置、理想速度。超级雷达ESO这是ADRC的灵魂。这个雷达不仅能看到车的实际速度和位置系统输出还能实时“看见”并估算出所有影响车速的因素总和包括你踩的油门控制量、上坡的阻力、逆风、发动机的损耗等等。它把这些乱七八糟的东西全部打包估算成一个叫做“总扰动”的信号。ESO的强大之处在于它不需要知道坡有多陡、风有多大它只通过观察车的实际运动就能把这个“总扰动”实时算出来。决策大脑NLSEF大脑拿到两个信息一是智能副驾规划的理想状态来自TD二是超级雷达提供的实际状态和总扰动估计来自ESO。大脑计算两者的误差并根据误差的大小和变化率以一种非线性的方式比如误差很大时增益大误差很小时增益小避免高频颤振计算出最初的控制力。但是这还没完最关键的一步来了大脑会从初步控制力中减去雷达估算出的“总扰动”。这样一来实际作用到车子上的控制指令就相当于是在一个“无扰动”的理想环境下发出的指令。所以ADRC的流程就是规划理想轨迹 - 观测并估计所有内外部扰动 - 基于理想轨迹和实际状态的误差计算控制量 - 补偿掉估计的扰动 - 得到最终控制指令。经过这样的处理无论系统本身多复杂外部环境多恶劣被控对象在控制器“眼”里都近似变成了一个简单的、干净的积分器串联型系统自然就好控制了。这就是其“自抗扰”能力的根源——自己抵抗、补偿扰动。2.1 核心组件一跟踪微分器TD—— 柔化指令提取微分TD经常被初学者忽略觉得它不就是给个设定值吗其实它的作用至关重要。直接给系统一个阶跃设定值相当于要求输出瞬间跳变这对于物理系统来说意味着需要无穷大的能量和控制力必然引起剧烈冲击和超调。TD的核心作用是“安排过渡过程”。它接收一个跳变的指令信号v然后输出一个平滑的跟踪信号v1及其微分v2。最经典的TD算法是韩老师提出的最速控制综合函数fhan离散形式。它的内部是一个离散差分方程通过非线性反馈使得v1能以最快速度无超调地跟踪上v同时v2是v1的合理微分避免了直接数值微分的噪声放大问题。在实际编程中比如写那个ADRC算法m文件TD的代码可能长这样function [v1, v2] TD(v, v1, v2, h, r) % v: 当前目标值 % v1, v2: 上一时刻的跟踪值及其微分 % h: 离散积分步长 % r: 速度因子决定跟踪快慢 d r * h; d0 h * d; y v1 - v h * v2; a0 sqrt(d*d 8*r*abs(y)); a v2 (a0 - d)/2 * sign(y); if abs(y) d0 a v2 sign(y) * r; end v2 v2 h * fsg(a, d, r); % fsg是一个符号函数 v1 v1 h * v2; end注意参数r非常关键。r越大跟踪速度越快但会对噪声更敏感。通常需要根据系统响应能力和采样频率来调整。h就是你的控制周期。2.2 核心组件二扩张状态观测器ESO—— 扰动估计的灵魂ESO是ADRC实现“抗扰”的核心。它的思想是将系统的总扰动包括未建模动态和外部扰动扩张成一个新的状态变量然后设计一个观测器对这个新状态即扰动进行实时估计。假设我们有一个二阶系统很多电机、位置控制都可以简化成二阶ÿ f(y, ẏ, w, t) b*u其中f是未知的内部动态和外部扰动w的总和b是控制增益通常可粗略估计。ESO把这个系统重新表述为ẋ1 x2ẋ2 x3 b*uẋ3 ḟ假设扰动变化率有界y x1这里x1是系统输出yx2是输出的微分ẏ而x3就是我们扩张出来的状态用来代表总扰动f。然后我们设计一个龙伯格观测器Luenberger Observer来估计这三个状态e z1 - y观测误差ż1 z2 - β01 * eż2 z3 - β02 * e b*uż3 -β03 * e其中z1, z2, z3分别是x1, x2, x3的估计值。β01, β02, β03是观测器增益需要精心配置以保证观测器稳定且快速。观测器收敛后z3就会实时跟踪上总扰动f。这样我们就“看见”了扰动。在实际的ADRC电流环设计中y就是反馈的电流值u是电压指令z3估计的就是反电动势、电阻电感参数变化、死区效应等所有扰动之和。2.3 核心组件三非线性状态误差反馈NLSEF与扰动补偿有了TD给出的理想状态v1, v2和ESO给出的实际状态估计z1, z2以及扰动估计z3我们就可以计算控制了。首先计算误差e1 v1 - z1位置/电流误差e2 v2 - z2速度/电流微分误差然后NLSEF采用一个非线性函数来处理这些误差经典的是“fal”函数fal(e, α, δ) |e|^α * sign(e), 当 |e| δfal(e, α, δ) e / δ^(1-α), 当 |e| ≤ δ其中0 α 1δ 0。这个函数的特点是大误差时增益大提高响应速度小误差时增益小避免高频颤振和平滑控制。δ是一个线性区间防止在零点附近因函数不平滑导致的抖动。那么初步的控制量u0为u0 β1 * fal(e1, α1, δ) β2 * fal(e2, α2, δ)β1和β2是误差增益。最后执行关键的扰动补偿u (u0 - z3) / b这里b就是ESO里那个粗略的控制增益估计。这个公式的意义在于计算出的理想控制力u0减去观测到的扰动z3再除以增益b就得到了最终应该施加的控制量u。经过这样的补偿系统方程近似变成了ÿ ≈ u0一个简单的双重积分器非常好控制。3. ADRC参数整定与工程化实践理论很美但落到代码上参数整定是逃不过的坎。ADRC参数看起来比PID多TD的rhESO的β01, β02, β03, bNLSEF的β1, β2, α1, α2, δ但其实有很强的物理意义和整定规律并非盲目调试。3.1 “带宽法”参数整定化繁为简这是工程上最常用、最有效的方法由高志强教授提出将观测器和控制器的性能与“带宽”这一概念挂钩极大简化了调参。ESO参数整定将ESO的特征多项式配置为(s ω_o)^3其中ω_o称为观测器带宽。通过极点配置可以推导出β01 3ω_oβ02 3ω_o^2β03 ω_o^3这样一来ESO的三个增益就由一个参数ω_o决定了。ω_o越大观测器收敛越快对扰动的估计能力越强但同时对测量噪声也越敏感。一般ω_o设为系统期望闭环带宽的3~10倍。参数b需要大致估计它代表了控制量对输出的增益比如在电流环中b ≈ 1/L电感倒数估不准没关系ESO有一定的鲁棒性但偏差太大会影响性能。控制器参数整定将误差反馈律线性化即取α1α21δ设大点其闭环特征多项式可配置为(s ω_c)^2其中ω_c称为控制器带宽。可以推导出β1 ω_c^2β2 2ω_cω_c直接决定了系统的响应速度。ω_c越大响应越快但控制量会越大也可能激发未建模的高频动态。通常ω_c应小于ω_o的1/3到1/5以保证观测器比控制器更快能及时提供准确的扰动估计。TD参数整定速度因子r决定了跟踪设定值的最大加速度。理论上r可以很大但受限于执行机构物理极限和采样频率。步长h就是控制周期。通常先设一个较大的r观察v1的跟踪曲线只要不超出执行机构能力且平滑即可。通过“带宽法”我们将调参从8-9个减少到3个核心参数ω_o观测器带宽、ω_c控制器带宽、b控制增益估计。r和h相对独立。非线性参数α1, α2, δ在初步整定时可以先设为1即线性系统稳定后再微调以优化性能。α通常取0.5~0.75δ取采样周期附近的值。3.2 工程实现要点与代码结构当你动手写那个ADRC算法m文件或C代码时结构应该清晰。以下是一个面向对象的离散ADRC二阶控制器伪代码框架非常适合嵌入式实现classdef ADRC_2nd properties % TD 参数 h, r; v1, v2; % TD状态 % ESO 参数 beta01, beta02, beta03, b; z1, z2, z3; % ESO状态 % NLSEF 参数 beta1, beta2, alpha1, alpha2, delta; % 其他 u_last; % 上一拍控制量用于补偿 end methods function obj ADRC_2nd(h, r, wo, wc, b_est) % 初始化 obj.h h; obj.r r; obj.v1 0; obj.v2 0; % 带宽法设置ESO增益 obj.beta01 3*wo; obj.beta02 3*wo^2; obj.beta03 wo^3; obj.b b_est; obj.z1 0; obj.z2 0; obj.z3 0; % 带宽法设置控制器增益线性 obj.beta1 wc^2; obj.beta2 2*wc; obj.alpha1 1; obj.alpha2 1; % 先线性 obj.delta h; % 线性区间设为步长 obj.u_last 0; end function [u, states] update(obj, target, feedback) % 1. TD更新 [obj.v1, obj.v2] fhan(target, obj.v1, obj.v2, obj.h, obj.r); % 2. ESO更新 e_eso obj.z1 - feedback; obj.z1 obj.z1 obj.h * (obj.z2 - obj.beta01 * e_eso); obj.z2 obj.z2 obj.h * (obj.z3 - obj.beta02 * e_eso obj.b * obj.u_last); obj.z3 obj.z3 obj.h * (-obj.beta03 * e_eso); % 3. 计算误差和非线性反馈 e1 obj.v1 - obj.z1; e2 obj.v2 - obj.z2; fe1 fal(e1, obj.alpha1, obj.delta); fe2 fal(e2, obj.alpha2, obj.delta); u0 obj.beta1 * fe1 obj.beta2 * fe2; % 4. 扰动补偿 u (u0 - obj.z3) / obj.b; % 5. 限幅和保存 u saturate(u, umin, umax); % 执行器饱和 obj.u_last u; states [obj.v1, obj.v2, obj.z1, obj.z2, obj.z3]; end end end这个框架在每个控制周期被调用一次输入当前目标值和系统反馈输出控制量。清晰的状态更新和分离的模块便于调试和监控。4. 在电机电流环中的应用与调试实录将ADRC应用于永磁同步电机PMSM的电流环是检验其性能的绝佳场景。电流环要求响应快、抗扰强传统的PI调节器在d-q轴解耦和反电动势扰动上需要精细补偿而ADRC可以将其视为总扰动一并估计补偿。4.1 模型建立与参数设计PMSM在同步旋转坐标系下的电压方程忽略磁饱和等为u_d R*i_d L_d*di_d/dt - ω_e*L_q*i_qu_q R*i_q L_q*di_q/dt ω_e*(L_d*i_d ψ_f)其中ω_e是电角速度ψ_f是永磁体磁链。可以看到q轴电压方程中包含了反电动势项ω_e*ψ_f和耦合项ω_e*L_d*i_d这些都是PI控制器需要额外处理的前馈或解耦项。在ADRC框架下我们可以将每个电流环d轴和q轴独立建模为一个一阶系统因为电压方程本身是一阶微分方程di/dt ( -R*i 耦合项/反电动势 扰动 b*u ) / L这里我们把-R*i/L作为部分已知动态可以归入b*u或作为已知扰动补偿而把耦合项、反电动势、参数变化、测量噪声等所有其他因素都打包进“总扰动”f。于是模型简化为di/dt f b*u其中b可以粗略取为1/L或1/L_d,1/L_q。因此我们需要为每个电流环设计一个一阶ADRC因为系统是一阶的。一阶ADRC比二阶更简单TD安排电流指令的过渡过程输出平滑的指令v1。ESO扩张成一阶观测器估计电流z1和总扰动z2。NLSEF计算误差e1 v1 - z1并生成u0。补偿u (u0 - z2) / b。参数整定依然用带宽法。对于电流环响应要求很高假设期望电流环带宽为f_c 1000 Hz则ω_c 2*π*f_c。观测器带宽ω_o可取(3~5)*ω_c。b取1/L的标称值。4.2 调试步骤与问题排查在实际电机平台上调试ADRC电流环我建议遵循以下步骤准备工作确保你的电流采样、PWM驱动、Clark/Park变换等基础环节正确无误。先用一个非常保守的PI控制器让电机转起来作为基准。初始化与参数注入将一阶ADRC参数写入代码。开始时将ω_c和ω_o设小比如对应100Hz带宽b值给准NLSEF先设为线性α1。TD的r先设一个中等值。开环测试ESO这是关键一步在电机静止或低速空载下给一个很小的、恒定的电压指令u同时让ADRC算法运行但不使用其输出的u而是用你给定的那个小电压。观察ESO估计的电流z1是否跟踪实际反馈电流i估计的扰动z2是否稳定在一个值附近。如果z1跟踪良好说明ESO基本工作正常。你可以故意改变一点b值看ESO的z2如何变化来补偿这个建模误差。闭环测试与带宽提升将ADRC的输出u接入系统形成闭环。给定一个小的阶跃电流指令。逐步增大ω_c控制器带宽观察电流响应速度。同时按比例增大ω_o保持ω_o 3ω_c。你会看到电流响应越来越快。注意监控控制量u即电压指令确保没有饱和。也要观察估计的扰动z2在负载突变时它应该快速变化以抵消扰动。引入非线性与抗扰测试当线性ADRC工作稳定后可以尝试引入非线性fal函数。将α设为0.5或0.75δ设为几个采样周期的误差值。这通常能进一步平滑小误差段的控制减少高频噪声。然后进行抗扰测试突加负载、快速升降速对比ADRC和PI的电流跟踪波形和恢复时间。常见问题与排查表现象可能原因排查与解决思路系统发散、振荡1.ω_o或ω_c过大超出系统有效带宽。2. 参数b估计严重偏差。3. 控制量饱和未处理。1. 大幅降低ω_o和ω_c从很慢的响应开始调。2. 检查b值符号和量级。可通过开环ESO测试给一个阶跃u看z1的变化斜率斜率应约等于b*u。3. 在输出u后加入硬限幅并将限幅后的值反馈给ESO如上面伪代码的u_last这是关键ESO估计值z1有较大静差1. ESO增益不足观测器收敛慢。2. 测量反馈y有恒定偏差或噪声过大。1. 适当增大ω_o提高观测器带宽。2. 检查电流采样校准和滤波。ESO本身有一定滤波作用但前端噪声过大会影响估计精度。扰动估计z2噪声大1.ω_o过高放大了测量噪声。2. 反馈信号y噪声大。1. 降低ω_o在响应速度和噪声抑制间折衷。2. 对反馈信号y进行一阶低通滤波但需注意引入相位滞后。或者可以考虑使用降阶ESO等变体。动态响应慢不如PI1.ω_c设置过低。2. TD的r过小指令过渡太慢。3. 非线性参数α太小或δ太大导致误差增益始终很低。1. 在稳定前提下逐步增大ω_c。2. 增大TD的r。3. 检查fal函数输出确保在动态过程中e较大时非线性函数能输出足够大的值。可暂时切回线性α1对比。切换负载时电流恢复慢扰动估计z2响应不够快。增大ω_o提高观测器对扰动变化的跟踪速度。同时检查b值是否准确不准确的b会降低补偿效率。4.3 实测心得与进阶技巧经过多个项目的实践我总结出几点心得“b”值不必精确ESO对b有很强的鲁棒性。b的估计值在真实值的0.5到2倍范围内系统通常都能稳定工作只是性能略有差异。这大大降低了工程应用门槛。TD并非必须对于很多伺服系统指令本身变化并不剧烈或者对指令跟踪的平滑性要求不高时可以省略TD直接用目标指令作为v1其微分v2设为0。这能简化算法特别是在一阶ADRC中。注意离散化与计算延时上面给出的ESO和TD公式都是欧拉离散化。在高带宽或低采样率下可能需要更高精度的离散化方法如双线性变换。另外从采样、计算到PWM更新产生的固有延时通常1-2个控制周期会影响高带宽下的稳定性必要时需要在ESO模型或控制律中考虑延时补偿。从一阶ADRC开始很多物理系统如电流环、温度控制本质是一阶的。从一阶ADRC入手参数更少ω_o,ω_c,b调试更简单理解更深刻成功后再扩展到二阶位置/速度环。与现有框架融合你不需要完全抛弃现有的控制框架。例如可以在原有PI电流环的基础上保留PI作为误差反馈即u0的计算然后加上ESO进行扰动估计和补偿形成一种“PI扰动观测器”的复合结构这是一种平滑的迁移策略。ADRC的魅力在于它提供了一种统一、强大的框架来处理不确定性和扰动。它不一定在所有场景下都碾压PID但在模型不确定性强、扰动频繁的场合其优势非常明显。调试的关键在于理解带宽参数ω_o和ω_c的物理意义以及ESO那个“扰动估计与补偿”的核心动作。当你看到在负载突加时z2瞬间跳变并抵消了扰动电流几乎无静差地恢复跟踪那一刻你就会觉得之前所有的调试都是值得的。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表