4. 自适应PI控制器:增益自整定算法、模糊PI控制、基于模型参考的自适应控制

各位做FOC的同行,你们有没有遇到过这种情况?电机空载跑得稳稳的,一加载就开始震荡。或者换个负载,PI参数就得重新调一遍。我当年调试一个伺服项目,光整定PI就花了两周,最后发现——不是参数不对,是固定参数根本应付不了工况变化。

这一章,我们就来聊聊自适应PI控制器。说白了,就是让控制器自己学会调整参数。你想想看,如果PI能根据转速误差、负载变化自动调整Kp和Ki,那该多省心。

4.1 为什么固定PI参数不够用?

先看一个典型场景。你的电机在额定负载下,PI参数调得刚刚好。突然负载减半,你会发现速度超调变大了。反过来,负载加倍,响应又变慢了。

为什么会这样?因为电机的传递函数本身是非线性的。转动惯量、反电动势、摩擦力,这些都会随工况变化。固定PI参数只能在一个小范围内表现良好。

工况变化 固定PI表现 自适应PI表现
负载突变(0→100%) 速度跌落大,恢复慢 跌落小,快速恢复
转动惯量变化 可能震荡甚至发散 自动调整,保持稳定
高速区运行 反电动势影响,增益不足 补偿反电动势,保持增益

我在做机器人关节电机时,就吃过这个亏。空载调试好的参数,装上机械臂就震荡。后来才明白,机械臂不同姿态下,折算到电机轴的惯量能差3倍。固定PI?根本扛不住。

4.2 增益自整定算法

增益自整定,是最基础的自适应方法。它不改变PI的结构,只根据系统状态实时调整Kp和Ki。

4.2.1 基于误差的自整定

最简单的思路:误差大时,加大增益快速响应;误差小时,减小增益避免超调。我习惯用这个公式:

Kp = Kp_base * (1 + α * |e|)
Ki = Ki_base * (1 + β * |e|)

其中α和β是调节系数。注意,这里有个坑——如果误差信号有噪声,增益会跟着抖。我曾经遇到过,电机在稳态时因为编码器量化噪声,导致Kp一直在跳,反而引入了高频抖动。

避坑指南: 误差信号一定要做低通滤波。我建议截止频率设在速度环带宽的5~10倍。另外,增益变化速率也要限幅,防止突变。

4.2.2 基于性能指标的自整定

更高级的做法,是实时计算系统性能指标,比如超调量、调节时间、稳态误差。然后根据这些指标反向调整PI参数。

我做过一个项目,用ITAE(时间乘以绝对误差积分)作为性能指标。每50个控制周期计算一次ITAE,然后用梯度下降法更新Kp和Ki。效果不错,但计算量稍大。

// 伪代码:基于ITAE的增益自整定
float itae = 0;
for (int i = 0; i < 50; i++) {
    itae += fabs(error[i]) * (i * Ts);
}
// 梯度下降更新
Kp -= gamma_p * (itae - itae_prev) / delta_Kp;
Ki -= gamma_i * (itae - itae_prev) / delta_Ki;
个人经验: 梯度下降的学习率gamma不要设太大。我一般从0.01开始试,如果收敛太慢再慢慢加。另外,建议给Kp和Ki设置上下限,防止参数飘到不合理范围。

4.3 模糊PI控制

模糊PI,说白了就是把工程师的经验变成规则。你不需要精确的数学模型,只需要知道「误差大时该怎么做」「误差变化快时该怎么做」。

4.3.1 模糊控制器的结构

模糊PI的核心是三个步骤:模糊化、规则推理、解模糊。

模糊PI控制器结构 误差 e 误差变化 ec 模糊化 隶属度函数 规则推理 模糊规则表 解模糊 重心法 ΔKp, ΔKi 输入:e 和 ec 的模糊子集

4.3.2 模糊规则表的设计

规则表是模糊PI的灵魂。我常用的规则是:误差大且误差变化快时,加大Kp;误差小且误差变化慢时,减小Kp防止超调。

e \ ec NB(负大) NS(负小) ZO(零) PS(正小) PB(正大)
NB PB / NB PB / NS PM / ZO PS / PS ZO / PB
NS PB / NB PM / NS PS / ZO ZO / PS NS / PB
ZO PM / NB PS / NS ZO / ZO NS / PS NM / PB
PS PS / NB ZO / NS NS / ZO NM / PS NB / PB
PB ZO / NB NS / NS NM / ZO NB / PS NB / PB

表格中每个单元格的格式是「ΔKp / ΔKi」。比如第一行第一列,误差负大且误差变化负大,说明系统正在快速偏离目标,需要大幅增加Kp(PB)并减小Ki(NB)来快速拉回。

核心要点: 模糊PI的规则表不是一成不变的。我建议先根据经验设计初始表,然后在实际系统上微调。特别是边界区域(比如NB和PB),增益变化要平滑,避免切换时产生冲击。

4.3.3 工程实现注意事项

模糊PI在MCU上实现时,有几个坑要注意:

  • 隶属度函数用查表法:三角隶属度函数可以用查表+线性插值,比实时计算快很多。
  • 规则推理用加权平均:不要用最大最小法,加权平均更平滑。
  • 解模糊用重心法:计算量稍大,但精度高。如果MCU性能有限,可以用面积平分法替代。

我记得有一次在STM32F103上跑模糊PI,查表加推理总共花了不到20微秒,完全够用。所以不用担心性能问题。

4.4 基于模型参考的自适应控制(MRAC)

MRAC的思路很优雅:你先设计一个理想模型,然后让实际系统去跟踪这个模型的行为。说白了,就是「你希望系统怎么动,控制器就怎么调参数让你动得跟模型一样」。

4.4.1 MRAC的基本结构

MRAC包含四个部分:参考模型、实际系统、自适应律、控制器。

模型参考自适应控制(MRAC)结构 参考模型 Gm(s) 实际系统 Gp(s) 控制器 C(s, θ) 自适应律 参数更新 参考输入 r ym yp e 核心:让实际输出yp跟踪参考模型输出ym

4.4.2 自适应律的设计

自适应律是MRAC的核心。常用的有MIT规则和Lyapunov规则。我个人更推荐Lyapunov规则,因为它能保证稳定性。

以速度环为例,参考模型可以选一个二阶系统:

Gm(s) = ωn² / (s² + 2ζωn·s + ωn²)

其中ωn是自然频率,ζ是阻尼比。我一般选ζ=0.707,ωn根据系统带宽来定。

自适应律的更新公式:

dθ/dt = -γ · e · φ

其中θ是待调整的参数向量,e是模型输出与实际输出的误差,φ是回归向量,γ是自适应增益。

注意: γ不能太大,否则系统会震荡。我习惯从0.1开始试,观察误差收敛速度。如果收敛太慢,每次增加50%。另外,MRAC对模型误差比较敏感,参考模型不要选得太理想,要留有余量。

4.4.3 MRAC在FOC中的实战经验

我在一个高速主轴电机项目里用过MRAC。电机转速从0到30000rpm,负载变化范围很大。固定PI根本调不好,用了MRAC后,速度跟踪误差从±200rpm降到了±30rpm。

不过MRAC也有缺点:计算量大,对MCU性能要求高。我当时用的是Cortex-M4,180MHz主频,MRAC占用了大约15%的CPU资源。如果MCU性能有限,可以考虑简化参考模型,或者降低自适应律的更新频率。

我的建议: 如果系统工况变化不大,用增益自整定就够了。如果变化范围大但规律明确,用模糊PI。如果变化范围大且规律复杂,再上MRAC。不要一上来就用最复杂的方案,够用就好。

4.5 三种方法的对比与选型

方法 计算量 适应性 稳定性保证 适用场景
增益自整定 低 中等 需限幅 工况变化小,MCU资源紧张
模糊PI 中 较高 依赖规则表 工况变化有规律,经验丰富
MRAC 高 高 Lyapunov保证 工况复杂,对性能要求高

选型时,我建议先评估你的MCU算力。如果算力够,优先考虑模糊PI,因为它实现简单、效果明显。如果算力紧张,增益自整定也能解决大部分问题。MRAC虽然强大,但调试周期长,适合对性能有极致要求的场景。