首页 / 驱动算法 / 高级篇

速度环抗扰组合拳:PI + DOB + 角度域重复控制抑制减速器周期扰动

行星减速器的齿轮啮合误差、谐波减速器的柔轮周期形变,都会在电机轴上形成"每转重复一次"的周期性阻力扰动。单独靠 PI 速度环压不住(扰动频率远高于闭环带宽),单独靠 DOB 压不干净(Q 滤波器带宽有限),而角度域重复控制 RC 恰好"专治"随转角重复的信号。本文讲清三者为什么缺一不可、分工边界怎么划,给出 DOB 与角度域 RC 的离散实现、启停逻辑与调参顺序(行星/谐波两种减速器差异),用三方案对比仿真器看"纯PI → +DOB → +RC"的逐级改善,用 RC 收敛仿真器看学习过程,最后给出可编译的 C 模块。

1. 减速器周期阻力:特征、来源与"周期"这个关键词

装上减速器之后,电机轴的负载转矩不再是常数。除了摩擦、间隙、负载波动这些"随机或缓变"扰动,还存在一类随电机转角周期性重复的阻力扰动:

周期阻力扰动的统一表达(示例模型)

Td(θ) = Ad·sin(N·θ + φ)

扰动频率 fd = N·fmotor —— N 是"每转扰动次数"(啮合阶次),fmotor 是电机轴转频。转速恒定 → 扰动频率恒定;转速变化 → 扰动频率成正比变化

不同减速器的周期扰动来源不同,但数学特征完全一致——它是电机角度的周期函数

减速器类型周期扰动来源典型阶次 N备注
行星减速器太阳轮/行星轮齿形分度误差、啮合刚度波动≈ 太阳轮齿数 Zs,及倍频阶次高(几十次/转),幅值小
谐波减速器柔轮周期弹性形变、波发生器偏心常为 2/转 及其倍频、柔轮齿差次阶次低(几次/转),幅值大、随负载增大
轴承/联轴器滚动体通过频率、偏心1/转 或滚动体数/转常与减速器扰动叠加

为什么"周期"是关键?因为 FOC 外环的抑制能力受带宽限制,而周期扰动的频率往往远超速度环带宽:

⚠️ 带宽视角:PI 为什么压不住

示例:电机 30 rad/s(≈286 rpm),减速器扰动阶次 N=12 → 扰动频率 fd=12×30/2π≈57 Hz≈360 rad/s。而速度环带宽通常只整定到 20~50 rad/s(还要避开机械谐振)。扰动频率高于带宽 7~18 倍,PI 反馈只能衰减、无法消除——误差会以同样的周期波动透传到 Iq 指令和转速上。

还要注意区分:周期阻力 ≠ 摩擦/间隙。摩擦是速度相关非线性(见《静摩擦远大于动摩擦系统的电机驱动优化》),间隙只在换向时出现(见《关节模组减速器》专题),它们都不是"固定角度周期的连续函数";而周期阻力是转角为自变量、每转几乎完全重复的确定性信号——这个性质正是角度域重复控制的用武之地。

2. 为什么单一手段不够:三者的分工边界

针对周期扰动,三种手段各有不可替代的角色,也各有天花板。工程上不是"选一个",而是叠在一起、各管一段

控制器管什么为什么不够用分工定位
PI 速度环 跟踪速度指令、保证系统稳定、抑制带宽内的扰动 带宽受机械谐振限制,对高频周期扰动衰减有限,且 PI 不"认识"周期结构 基础闭环:先稳下来
DOB 扰动观测器 实时观测总扰动(摩擦+负载+部分周期阻力)并前馈抵消 观测带宽受 Q 滤波器限制(防止微分噪声放大),高频分量观测不准、补偿不干净 实时补偿:压低频、压随机
角度域重复控制 RC 学习并抵消"随转角重复"的残余周期纹波 只对周期信号有效,需要若干圈收敛,非周期扰动无效 周期学习:专治啮合波纹
✅ 组合拳的本质

PI 兜底稳定、DOB 压实时扰动、RC 消周期残差。DOB 把大部分扰动(摩擦、负载、低频分量)实时抵消,剩下的"高频但每转重复"的残差交给 RC 按角度学习——两者带宽互补,不打架。

3. 组合架构总览

三个控制器在速度环层面的叠加关系(电流环以下不变,见《三闭环带宽分配与PI整定》):

转矩/电流指令叠加

Tref = uPI + uDOB + uRC   →   Iq,ref = Tref / Kt

Kt:电机转矩常数。DOB 与 RC 都以"额外转矩指令"的形式前馈叠加,与 PI 的输出同量纲、直接相加

PI + DOB + 角度域 RC 组合控制框图(示意)
ω* 指令 PI 速度环 u_PI Σ 电流环+逆变器 Iq* → Te 电机+减速器+负载 J·dω/dt = Te−Td(θ) 编码器 ω, θ DOB 扰动观测器 u_DOB = T̂d 前馈 角度域 RC 查表 u_RC = LUT[θ mod 2π] ω 反馈(编码器差分/速度观测器) Tref 取点 ω +u_DOB e = ω*−ω θ 角度索引 +u_RC Td(θ) 周期阻力
示意结构:DOB 取 Tref 与 ω 观测总扰动并前馈;RC 用误差 e 与角度 θ 查表学习,把补偿叠加回转矩指令。

注意 DOB 与 RC 的输入完全不同:DOB 是"模型+测量"的实时观测,不依赖信号是否周期;RC 是"上一圈的经验",输入是误差和角度索引——它根本不"看"扰动,只按角度把历史误差学进表里。这就是两者能叠加而不冲突的原因。

4. PI 速度环:基础闭环的带宽选择

PI 速度环承担基础稳定与指令跟踪(整定方法见《三闭环带宽分配与PI整定》),在带减速器的场合有两个额外约束:

  1. 惯量要用折算值:Jeq = Jm + JL/N²(减速比越大,负载惯量折算到电机轴越小)。PI 参数必须按 Jeq 整定,否则动态偏离设计值。
  2. 带宽要避开机械谐振:减速器(尤其谐波)带来电机轴—弹性—负载的双惯量谐振点。速度环带宽取谐振频率的 1/3~1/2 以下,必要时加陷波(见《转矩扰动观测与补偿》)。

带宽一旦定死,高于带宽的周期扰动就只能靠 DOB/RC 解决——这就是为什么"PI 调好了"不等于"纹波没了"。

5. DOB 扰动观测器:实时观测与前馈

DOB 的核心思想一句话:把实际系统与名义模型的输出差当作总扰动。电机轴动力学(全部折算到电机轴):

对象与名义模型

J·dω/dt = Tref − Td   (Td:周期阻力+摩擦+负载的总扰动)

Jn·dω̂/dt = Tref − T̂d   (名义模型,Jn 取辨识的总等效惯量)

用速度测量误差驱动扰动估计收敛(龙伯格型,嵌入式最常用):

龙伯格型 DOB 离散递推(采样周期 Ts

ω̂(k+1) = ω̂(k) + Ts/Jn·(Tref(k) − T̂d(k))

d(k+1) = T̂d(k) + Lo·(ω(k) − ω̂(k))

观测器增益 Lo 决定扰动观测带宽(≈ √(Lo/Jn)),工程上取速度环带宽的 3~10 倍

补偿方式:直接把估计出的扰动前馈回转矩指令,抵消扰动:

DOB 补偿

uDOB = +T̂d   →   Tref = uPI + T̂d + uRC

DOB 的"天花板"来自观测带宽:Lo 越大越能观测高频扰动,但速度测量噪声(编码器差分)会被放大——这就是周期扰动"观测不准、补偿不干净"的根本原因。典型取舍:

工程实现提醒:速度信号用观测器/滤波器输出而非编码器直接差分;Jn 用辨识值,模型误差会直接限制 DOB 效果。

6. 角度域重复控制 RC:专治随转角重复的纹波

重复控制(Repetitive Control)的思路和 DOB 完全不同:周期信号上一圈什么样、这一圈还什么样——把上一圈的误差存下来,这一圈提前补。普通时间域 RC 的周期是固定时间,转速一变就失效;角度域 RC 把周期定义为"电机一转",按角度查表,转速任意变化都自动跟随。

角度域 RC 离散实现(一转 M 格 LUT)

idx = ⌊θ / (2π/M)⌋ mod M

uRC(k) = LUT[idx]

LUT[idx] ← LUT[idx] + Krc·e(k)   (e = ω* − ω,学习律)

Krc:学习增益。速度偏低(e>0)→ 该角度位置需要更多转矩 → 表值增加;下一圈转到同一角度时提前补上

加上稳定性低通 Qrc(z)(对更新后的表值做一阶平滑),滤除高频噪声、防止学习发散:

带 Q 滤波的学习律

LUT[idx] ← (1−q)·LUT[idx] + q·(LUT[idx] + Krc·e(k))

q∈(0,1),典型 0.3~0.8。q 越小越稳、收敛越慢

RC 的三个工程要点:

  1. 收敛需要时间:学习律逐圈更新,通常需要 5~20 圈收敛到稳定抑制——所以它适合"长期恒速/往复运行"的工况,不适合要求瞬时响应的场合;
  2. 启停逻辑必加:电机静止或转速突变时冻结 LUT 更新,防止把瞬态误差大量写进表里造成震荡(见代码实现);
  3. 只对周期信号有效:间隙、突变负载这类非周期非线性,RC 学不进去(它没有固定角度周期),仍需 DOB 与机械消隙配合。

RC 与 DOB 的配合节奏:先让 DOB 把能观测的扰动实时抵消,剩下高频周期残差由 RC 学——DOB 是"当场抵消",RC 是"上一圈的经验",两者带宽互补、互不抢功。

7. 交互式仿真器

仿真模型:单惯量 + 周期阻力(示例参数,非真实测量)。Jeq=2e-3 kg·m²,Kt=0.4 N·m/A,速度环带宽约 25 rad/s,周期扰动 Td(θ)=Ad·sin(N·θ)。默认 N=6、ω=30 rad/s 时扰动频率约 180 rad/s,远高于速度环带宽——这就是"PI 压不住"的真实场景。

7.1 演示A:纯PI → +DOB → +DOB+RC 三方案对比

同样的扰动、同样的速度环参数,切换三种配置看稳态波动逐级减小。上图为转速,下图为 Iq 指令:

三方案对比:周期阻力抑制效果
红=转速,绿=Iq。稳态峰峰值见下方标注。

观察要点:

7.2 演示B:角度域 RC 的学习收敛过程

配置固定为 PI+DOB+RC,LUT 从全零开始。看转速波动随圈数增大而收敛,以及学习曲线的下降包络:

角度域 RC 收敛过程(LUT 从零开始学习)
上:转速(波动逐圈收敛);下:每转转速波动 RMS 包络(学习曲线)。

观察要点:

8. 代码实现(C语言,可编译模块)

8.1 DOB 扰动观测器:龙伯格型 + Q 平滑

/* DOB 扰动观测器(龙伯格型,适配带减速器系统) 输入: 转矩指令 tref(N·m), 实测速度 w(rad/s), 采样周期 ts 输出: 扰动估计 td_hat, 前馈量 u_dob = +td_hat 整定: jn 取电机+减速器+负载折算总惯量(辨识值); lo 决定观测带宽, 从 30 起步缓慢加大, 出现噪声放大/谐振立即回退 */ typedef struct { float jn; /* 名义惯量 kg·m^2 */ float lo; /* 观测器增益 */ float q; /* Q平滑系数 0~1, 滤高频噪声 */ float ts; /* 采样周期 s */ float w_hat; /* 模型速度估计 rad/s */ float td_hat; /* 扰动转矩估计 N·m */ } dob_t; void dob_init(dob_t *d, float jn, float lo, float q, float ts) { d->jn = jn; d->lo = lo; d->q = q; d->ts = ts; d->w_hat = d->td_hat = 0.0f; } float dob_update(dob_t *d, float tref, float w) { /* 1) 名义模型速度传播 */ d->w_hat += d->ts / d->jn * (tref - d->td_hat); /* 2) 速度误差驱动扰动估计 */ float td_new = d->td_hat + d->lo * (w - d->w_hat); /* 3) Q 平滑: 抑制噪声与高频分量 */ d->td_hat = d->td_hat + d->q * (td_new - d->td_hat); return d->td_hat; /* 前馈量 +td_hat 叠加到转矩指令 */ }

8.2 角度域重复控制:LUT 学习 + 冻结逻辑

/* 角度域重复控制 (RC): 按电机转角查表, 学习抵消每转重复的周期扰动 输入: 速度误差 e(rad/s), 电机角度 theta(rad), 冻结标志 frozen 输出: 补偿转矩 u_rc(N·m), 直接叠加到转矩指令 整定: krc 从 0.02 起步, 观察波动收敛, 出现振荡立即回退; m 取 64~1024 (分辨率), 转速高/阶次高取大值 */ #define RC_M 256 typedef struct { float lut[RC_M]; /* 角度补偿表 */ float krc; /* 学习增益 */ float q; /* 学习低通 0~1 */ uint8_t frozen; /* 1=冻结学习 */ } rc_t; void rc_init(rc_t *r, float krc, float q) { r->krc = krc; r->q = q; r->frozen = 0; for (int i = 0; i < RC_M; i++) r->lut[i] = 0.0f; } float rc_update(rc_t *r, float e, float theta) { /* 角度索引: 0~RC_M-1 对应一转 */ uint32_t idx = (uint32_t)(theta * RC_M / 6.2831853f) % RC_M; float u = r->lut[idx]; /* 学习: 仅在未冻结时更新 (静止/转速突变时冻结) */ if (!r->frozen) { float u_new = r->lut[idx] + r->krc * e; r->lut[idx] = r->lut[idx] + r->q * (u_new - r->lut[idx]); } return u; } /* 冻结逻辑示例: 转速过低或转速突变时冻结, 防止瞬态误差写入表内 */ void rc_set_frozen(rc_t *r, float w, float w_prev, float ts) { float acc = (w - w_prev) / ts; /* 估算加速度 */ r->frozen = (w < 1.0f) || (acc > 200.0f); /* 阈值按工况调整 */ }

8.3 速度环整合:PI + DOB + RC 叠加

/* 速度环一周期调用: 输出 q 轴电流指令 pi: 速度环 PI (kp/ki 按 J_eq 整定, 见《三闭环带宽分配与PI整定》) dob: 8.1 节模块; rc: 8.2 节模块; kt: 转矩常数 */ void speed_loop_run(float w_ref, float w, float theta, float kt, float ts, float *u_pi, float *integral, dob_t *dob, rc_t *rc, float *iq_ref) { /* 1) PI 速度环 (抗积分饱和) */ float e = w_ref - w; *integral += e * ts; *u_pi = 1.2f * e + 30.0f * (*integral); /* kp/ki 示例值, 按 J_eq 重新整定 */ /* 2) DOB 实时扰动前馈 */ float u_dob = dob_update(dob, *u_pi, w); /* 3) 角度域 RC 周期补偿 (e 取速度误差) */ float u_rc = rc_update(rc, e, theta); /* 4) 叠加为转矩指令, 折算为 q 轴电流 */ float t_ref = *u_pi + u_dob + u_rc; *iq_ref = t_ref / kt; }

9. 调参顺序:行星 vs 谐波差异

同一套组合拳,两种减速器的调参重点完全不同——根源是行星刚度高、有背隙;谐波刚度软、无背隙但摩擦大、谐振低

步骤行星减速器谐波减速器
0 基础脱开减速器单独调好电机电流环/速度环,排除电机齿槽转矩干扰同左(齿槽转矩见《齿槽转矩补偿》)
1 惯量辨识总等效惯量 Jeq,按 Jeq 重调速度环 PI同左;Jn 辨识不准会直接限制 DOB 效果
2 谐振谐振频率较高,速度环带宽可相对开高先扫频找低频谐振,速度环带宽保守(谐波极易啸叫)
3 DOBLo 可开较高,抑制摩擦与冲击扰动Lo 必须保守,Q 平滑更重,防止激励弹性谐振
4 RC主要抑制齿轮啮合阶次波纹(N≈Zs);注意换向背隙 RC 无效,需预载转矩Krc 更小,优先靠 DOB 补偿弹性形变,RC 只收尾柔轮周期残差
⚠️ 谐波减速器的红线

谐波刚度软、谐振频率低,DOB 与 RC 增益严禁同时拉满——两个前馈叠加极易激发低频弹性振荡,轻则啸叫、重则损伤柔轮。谐波上先保守 DOB,RC 增益从 0.02 量级起步。

10. 工程要点与常见误区

  1. 不要指望电流环压制周期阻力:电流环只跟踪 Iq 指令,周期扰动是机械侧扰动,必须在外环(速度环)或转矩指令前馈层面补偿
  2. 先确认扰动来自减速器:拆掉减速器空转电机,Iq 做 FFT;波动消失 → 扰动来自减速器;波动仍在 → 是电机齿槽转矩(换用《齿槽转矩补偿》)
  3. 速度信号质量决定一切:DOB 与 RC 都吃速度误差,编码器差分噪声会直接进入观测与学习——用速度观测器输出(见《速度观测器》),不要直接差分
  4. 补偿增益从零往上加:DOB 的 Lo、RC 的 Krc 都从最小值起步,出现啸叫/振荡立即回退——尤其谐波减速器
  5. RC 表会漂移:温度、磨损会改变阻力曲线,RC 表慢慢失准;可在空闲时自动重新学习(清表重跑)
  6. RC 不治背隙:换向空程是非周期非线性,RC 无效;行星减速器的换向冲击靠预载转矩(bias torque)解决
  7. 辨识阶次 N 用 FFT:恒速运行抓 Iq,FFT 找峰并验证"频率 ∝ 转速",确认扰动阶次后再设 RC 分辨率与 LUT 格数
✅ 一句话记住

周期阻力 = 随转角每转重复的确定性扰动,频率往往远高于速度环带宽 → PI 压不住;DOB 实时观测、当场抵消,但带宽有限压不干净;角度域重复控制按转角查表、一圈一圈学,专治残余周期纹波——三件套叠起来:PI 兜底、DOB 压实时、RC 消周期。记住分工边界:DOB 看"现在",RC 记"上一圈"。