首页 / 驱动算法 / 高级篇

三环ADRC控制:位置环 / 速度环 / 电流环自抗扰架构

PID 的误差驱动逻辑决定了它"总在犯错之后才补救",而自抗扰控制(ADRC)换了一条路:先把系统的总扰动——负载、摩擦、惯量变化、参数漂移——用扩张状态观测器实时估计出来,再主动补偿掉。本文从 TD/ESO/反馈律三件套讲起,用带宽法把 LADRC 变成可工程整定的算法,再分别落到伺服三环(电流环、速度环、位置环)上,最后用仿真器对比 LADRC 与 PI 的抗扰表现,并给出可编译的 C 代码。

1. 为什么要引入 ADRC:PID 的"误差驱动"天花板

三闭环(位置环→速度环→电流环)是伺服驱动的主流架构(见《三闭环带宽分配与PI整定》)。每个环都用一个 PI 控制器,靠"误差驱动"工作:先有误差,积分器再慢慢追。这种结构有三个天然短板:

上一篇文章(《转矩扰动观测与补偿》)解决了一半问题:用 DOB / 龙伯格 / ESO 把扰动估计出来前馈抵消。ADRC 把这条思路贯彻到底,并补上了另外两块拼图:过渡过程安排(TD)把对象动态本身也当作扰动的一部分

💡 ADRC 的一行总结

不知道对象长什么样不要紧——把"模型内部不确定性 + 外部扰动"合并成一个总扰动 f,用 ESO 估计它,再在控制量里减掉它(除以 b0),系统就变成了一个干净的"积分器串联",剩下交给一个简单反馈律。这就是"自抗扰"三个字的含义:自己抗掉自己的扰动

2. ADRC 三件套:TD、ESO、反馈律

经典 ADRC(韩京清,1980s–2000s)由三部分组成,线性化版本 LADRC(高志强,2003)把三者全部参数化为两个带宽,工程可调。先建立统一语言:考察一阶对象

一阶对象的一般形式

ẏ = f(y, d, t) + b·u ,    b ≈ b0(已知名义增益)

y 是被控量(如转速 ω),u 是控制量(如 iq),f 是总扰动(内部动态不确定 + 外部扰动),b0 是控制增益的名义值

2.1 TD 跟踪微分器:给参考"安排过渡过程"

阶跃参考直接进控制器,速度环会瞬间输出最大电流、位置环会瞬间要求最大速度——超调随之而来。TD 的作用是把生硬的阶跃"揉"成一条光滑、有界的过渡曲线 v(t),控制器跟踪的是 v(t) 而不是阶跃本身。

线性二阶 TD

1 = v2

2 = −r²·(v1 − vref) − 2r·v2

速度因子 r 决定过渡快慢:过渡时间 ≈ 4/r;v1→vref,v2 就是"跟踪微分"(即参考速度)

对速度环(一阶)用一阶 TD 就够:v̇ = (vref − v)/Ttd,即一个参考低通;对位置环(二阶)用上面的二阶 TD,既安排位置过渡,又顺便给出平滑的参考速度 v2。TD 还解决了另一个问题:对噪声的微分放大——直接对位置差分求速度噪声爆炸,TD 输出的 v2 是"跟踪微分",天然带滤波。

2.2 ESO 扩张状态观测器:总扰动的"第三只眼"

把总扰动 f 当作一个扩张出来的新状态,用可测的 y 和已知的 u 同时估计 y 和 f。承接上一篇的 ESO 概念,这里给出伺服工程最常用的两个规格:

一阶对象的 2 阶 LESO(速度环用)

e = y − z1

ż1 = z2 + β1·e + b0·u   (z1→y 的估计)

ż2 = β2·e   (z2→总扰动 f 的估计)

带宽法:β1 = 2ωo,β2 = ωo²

二阶对象的 3 阶 LESO(位置环用)

e = y − z1

ż1 = z2 + β1·e  (位置估计)

ż2 = z3 + β2·e + b0·u  (速度估计)

ż3 = β3·e  (总扰动估计)

带宽法:β1=3ωo,β2=3ωo²,β3o³

带宽法(高志强)是 LADRC 工程化的关键:所有观测器增益由一个参数 ωo 决定,全部极点配置在 −ωo 处(重根、临界阻尼)。物理意义:ESO 能准确估计的扰动频率上限就是 ωo,ωo 越大观测越快,但把测量噪声放大得越厉害。

2.3 反馈律 + 扰动补偿:把对象"掰直"

LADRC 控制律

u = (u0 − z2) / b0

一阶对象:u0 = kp·(v − z1) ,kp = ωc

二阶对象:u0 = kp·(v1 − z1) + kd·(v2 − z2) ,kpc²,kd=2ωc

把 u=(u0−z2)/b0 代回对象 ẏ=f+b·u:

补偿后的等效对象

ẏ ≈ u0 + (f − z2)  ⟹  当 z2 ≈ f 时,ẏ ≈ u0

对象被"线性化"成一个纯积分器!剩余误差 (f−z2) 是观测器带宽以内的估计残差,由反馈律的 ωc 兜底

这就是 ADRC 的精髓:不消除扰动,而是把扰动"看见"后抵消,系统只剩一个干净的积分器。控制一个"积分器"只需要一个比例(一阶)或 PD(二阶),响应时间由 ωc 直接决定,与对象参数几乎无关——这就是鲁棒性(对参数不敏感)的来源。

✅ 与 PI 的对应关系

一阶 LADRC 补偿后等效于 PI + 扰动前馈:u0=kp·e 相当于 P,z2 的估计/补偿相当于"智能积分"(比普通积分快得多且不 windup),kpc 对应 P 增益。所以 LADRC 调参比 PI 还直观:一个 ωc 定响应快慢,一个 ωo 定扰动抑制带宽

3. 三环 ADRC:电流环 / 速度环 / 位置环各自怎么用

伺服三环对象特性差异很大,ADRC 的收益也不同。先给结论,再逐个展开:

控制环对象近似主要扰动ADRC 收益工程建议
电流环一阶 RL:di/dt=(u−Ri−e)/L反电动势 e、死区、R/L 温漂中(扰动可估,但电流环带宽已高)主流仍用 PI + 前馈;LADRC 是"高级选项"
速度环一阶机械:J·dω/dt=Te−Td负载突变、摩擦、惯量摄动(抗扰提升最明显)首选 LADRC,b0=Kt/J
位置环二阶:速度环等效惯性 + 积分速度环等效延迟、外部力、爬行(TD 消超调 + 抗外部力)ADRC + TD,无超调跟踪

3.1 电流环:PI 仍是主流,ADRC 是增强项

电流环对象 L·di/dt = u − R·i − eemf,是一阶、参数(R/L)相对已知、带宽要求极高(通常 1~3 kHz)。传统做法:PI + 反电动势前馈(ud/uq 解耦)。LADRC 在这里的收益是:LESO 把反电动势、死区误差、R/L 温漂全部当作总扰动估计并补偿,理论上可以省掉解耦前馈。

代价也很现实:电流环采样率高达 10~20 kHz,LESO 需要同样的执行频率;b0=1/L 标定误差会直接吃掉相位裕度;且电流环用 PI 时带宽已经足够高,抗扰提升有限。所以工程结论:电流环保持 PI(必要时加电压前馈),把 ADRC 的算力留给速度环——这是三环 ADRC 的务实起点。

3.2 速度环:LADRC 的主战场

速度环对象 J·dω/dt = Kt·iq − Td(B 与摩擦并入 Td),写成 LADRC 形式:

速度环 LADRC 映射

ẏ = f + b·u  →  y=ω,u=iq,b0=Kt/J

f = (Te·ΔKt − Td − B·ω − JΔ·dω/dt)/J —— 负载、摩擦、惯量辨识误差、转矩常数漂移全在里面

LESO(2阶):z1→ω,z2→f(量纲为加速度);控制律 u=(u0−z2)/b0

关键好处:J 不需要很准——J 的偏差只是让 b0 偏一点,LESO 会把"b0·u 与真实加速的差"也计入总扰动 f 并补偿掉,等效于自动修正模型。这是速度环 LADRC 相对 DOB/龙伯格(依赖 J 精度)的最大优势。

速度环 LADRC 的完整结构(含一阶 TD):

🔧 速度环 LADRC 信号流

ωrefTD → v(光滑参考)
                ↓                        u0c·(v−z1)  →  u=(u0−z2)/b0 → iq
ωmeasLESO → z1(滤波速度)、z2(总扰动)

3.3 位置环:二阶 ADRC + TD,无超调跟踪

位置环对象是"速度环等效一阶惯性 + 积分":θ̈ = f + b·u,二阶。位置环 ADRC 的两个亮点:

三环级联时的带宽经验(在《三闭环带宽分配》基础上给 ADRC 版本的取值):

控制器带宽观测器带宽说明
电流环(PI)fci = 1~3 kHz给速度环留 5~10 倍裕量
速度环 LADRCfc = 电流环/10 ~ /5fo = 3~5 × fcωo 上限受速度反馈噪声限制
位置环 ADRCfc = 速度环/5 ~ /3fo = 3~5 × fcTD 速度因子 r 按 4~6 倍位置环带宽选
⚠️ 三环都用 ADRC 吗?

不必。三环全 ADRC 意味着三层 LESO 叠加,观测器层数多、噪声被逐级放大、相位损失累积,整定也复杂。务实组合:电流环 PI(+前馈)+ 速度环 LADRC + 位置环 ADRC(带 TD),这是工业伺服里"抗扰收益 / 实现成本"最划算的配置。电流环的 ADRC 适合对参数漂移极敏感、且采样率充裕的场合。

4. 交互式演示

4.1 演示A:速度环 LADRC vs PI 抗扰对比

同样的机械对象(J、Kt 已知),分别用 PI 速度环(按带宽法整定)与 LADRC 速度环(ωco 带宽法),t=0.3s 施加阶跃负载。调负载、控制器带宽、观测带宽,观察两种方案的速度跌落与恢复:

速度环 LADRC vs PI · 抗扰对比仿真器
红=PI 速度环,绿=LADRC 速度环。t=0.3s 施加阶跃负载,比较速度跌落。

观察要点:

4.2 演示B:位置环 ADRC 的 TD 过渡过程

位置环用二阶 ADRC(3 阶 LESO + 线性反馈,仿真采用模型辅助 ESO(GESO):把已知的速度环时间常数注入观测器,可显著降低带宽需求),对比直接阶跃给定经 TD 安排过渡的响应,并在 t=0.5s 施加外部拖拽力看定位刚度:

位置环 ADRC · TD 过渡过程仿真器
红=无TD(直接阶跃),绿=带TD过渡。t=0.5s 施加外部拖拽。

观察要点:

5. 代码实现(C语言)

5.1 速度环 LADRC(一阶对象 + 2阶LESO + 一阶TD)

/* 速度环 LADRC:TD + LESO + 线性反馈 + 扰动补偿 对象: J*dw/dt = Kt*iq - Td -> y'=f+b*u, b0=Kt/J 整定: wc=2*pi*fc(控制器带宽), wo=2*pi*fo(观测器带宽, 取3~5*fc) 输入: w_ref(rad/s), iq_meas 需闭环反馈的电流指令(用上周期指令即可) */ typedef struct { float b0; /* 控制增益 Kt/J */ float wc, wo; /* 控制器/观测器带宽 rad/s */ float ts; /* 控制周期 s */ float v; /* TD: 参考过渡输出 */ float z1, z2; /* LESO: 速度估计, 总扰动估计(加速度量纲) */ } ladrc_t; void ladrc_init(ladrc_t *a, float kt, float j, float fc_hz, float fo_hz, float ts) { a->b0 = kt / j; a->wc = 2.0f * 3.14159265f * fc_hz; a->wo = 2.0f * 3.14159265f * fo_hz; a->ts = ts; a->v = a->z1 = a->z2 = 0.0f; } float ladrc_speed_update(ladrc_t *a, float w_ref, float w_meas) { const float ts = a->ts; const float b1 = 2.0f * a->wo; /* 带宽法: b1=2wo, b2=wo^2 */ const float b2 = a->wo * a->wo; /* 1) TD: 一阶安排过渡 v' = (w_ref - v)/Ttd, Ttd=1/wc(与闭环同量级) */ a->v += (w_ref - a->v) * (a->wc * ts); /* 2) LESO: 用上一周期控制量 u 估计速度与总扰动 */ float e = w_meas - a->z1; a->z1 += (a->z2 + b1 * e + a->b0 * u_prev) * ts; a->z2 += (b2 * e) * ts; /* 3) 反馈 + 扰动补偿: u = (wc*(v-z1) - z2)/b0 */ float u0 = a->wc * (a->v - a->z1); float u = (u0 - a->z2) / a->b0; u_prev = u; /* 供下一周期 LESO 使用(需限幅后存储) */ return u; /* iq 指令 A */ }

5.2 位置环 ADRC(二阶对象 + 3阶LESO + 二阶TD)

/* 位置环 ADRC:二阶TD + 三阶LESO + PD反馈 + 扰动补偿 对象: theta'' = f + b*u (速度环等效一阶 + 积分), b0 = 1/(J_eq/Kt * tau_v) 整定: wc=2*pi*fc, wo=2*pi*fo=3~5*wc; TD速度因子 r = 4/Ttd */ typedef struct { float b0, wc, wo, ts; float r; /* TD 速度因子 rad/s */ float v1, v2; /* TD: 过渡位置, 过渡速度 */ float z1, z2, z3; /* LESO: 位置, 速度, 总扰动 */ } pos_adrc_t; void pos_adrc_init(pos_adrc_t *a, float b0, float fc_hz, float fo_hz, float ttd_s, float ts) { a->b0 = b0; a->wc = 2.0f * 3.14159265f * fc_hz; a->wo = 2.0f * 3.14159265f * fo_hz; a->ts = ts; a->r = (ttd_s > 1e-4f) ? (4.0f / ttd_s) : 0.0f; /* 0=禁用TD(直接阶跃) */ a->v1 = a->v2 = 0.0f; a->z1 = a->z2 = a->z3 = 0.0f; } float pos_adrc_update(pos_adrc_t *a, float pos_ref, float pos_meas) { const float ts = a->ts; const float wc = a->wc, wo = a->wo; const float b1 = 3.0f*wo, b2 = 3.0f*wo*wo, b3 = wo*wo*wo; /* 带宽法三阶 */ /* 1) TD: 二阶过渡 v1''= -r^2(v1-ref) - 2r v2 */ if (a->r > 0.0f) { float a2 = -a->r * a->r * (a->v1 - pos_ref) - 2.0f * a->r * a->v2; a->v1 += a->v2 * ts; a->v2 += a2 * ts; } else { a->v1 = pos_ref; a->v2 = 0.0f; /* 无TD: 直接给阶跃 */ } /* 2) LESO(三阶) */ float e = pos_meas - a->z1; a->z1 += (a->z2 + b1 * e) * ts; a->z2 += (a->z3 + b2 * e + a->b0 * u_prev) * ts; a->z3 += (b3 * e) * ts; /* 3) PD反馈(带TD参考速度) + 扰动补偿 */ float u0 = wc*wc * (a->v1 - a->z1) + 2.0f*wc * (a->v2 - a->z2); float u = (u0 - a->z3) / a->b0; u_prev = u; return u; /* 速度指令 rad/s */ }

5.3 参数整定与调试步骤

  1. 定 b0:速度环 b0=Kt/J(J 用辨识值即可,不必很准——误差会被 ESO 当扰动吃掉);位置环 b0 用"电流环+机械"等效增益估算
  2. 先定 ωc:把 ωo 设成 10×ωc(让观测足够快),单独调 ωc 到阶跃响应满意的快慢(等同调 P)
  3. 再调 ωo:从 3×ωc 逐步加大,观察抗扰(加载跌落)改善与噪声放大,取"跌落足够小且电流/速度不抖"的最大值
  4. 最后加 TD:位置环按"无超调 + 峰值速度可接受"选过渡时间 Ttd;速度环 TD 可选(一阶低通)
  5. 限幅必须做:u 限幅后存回 u_prev(否则 LESO 用未限幅控制量会"以为"系统执行了更大的指令,造成估计偏差)
  6. 验证:阶跃负载看跌落;给位置阶跃看超调;把 z2/z3 与已知负载对比确认收敛

6. 工程要点与常见误区

  1. ωo 不是越大越好:观测带宽上限受反馈噪声与采样率约束(工程经验 ωo ≤ 采样频率/10),超过会引入高频噪声振荡
  2. b0 偏差有裕度但不能离谱:b0 偏大 2~3 倍通常仍稳定(增益裕度),但过大过小都会影响动态;b0 上下界做工程保护
  3. 离散化:LESO 是积分器链,用欧拉法即可(TS 内稳定);如需更准用梯形法;控制周期 TS 建议 ≤ 1/(20·ωo)
  4. 别把 TD 当摆设:TD 是 ADRC 无超调的关键,也是"快速性与超调"矛盾的解——伺服定位不加 TD 等于放弃 ADRC 一半价值
  5. 与扰动观测器的关系:ESO 本质是"参数化好的龙伯格扰动观测器 + 模型不确定性吸收";07 篇的 DOB/龙伯格经验(观测带宽 3~5 倍速度环、J 辨识)在这里同样适用
  6. 电流环别轻易换 ADRC:高采样率 + 小时间常数下,PI 的相位裕度优势明显;先把速度/位置环换好,电流环作为进阶实验
  7. 抗饱和:速度/位置 LADRC 的指令 u 会顶到电流/速度限幅,务必限幅 + 限幅前存储 u_prev + 必要时 anti-windup 处理
✅ 一句话记住

ADRC = TD(把参考揉光滑)+ ESO(把总扰动看穿)+ 反馈/补偿(把对象掰成积分器)。工程上三环的务实组合是:电流环 PI+前馈、速度环 LADRC(b0=Kt/J,ωc 定响应、ωo=3~5ωc 定抗扰)、位置环 ADRC+TD(无超调定位+抗外部力)。两个带宽是全部旋钮,比 PI 更少、更直观。