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一直在跳,反而引入了高频抖动。
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;
4.3 模糊PI控制
模糊PI,说白了就是把工程师的经验变成规则。你不需要精确的数学模型,只需要知道「误差大时该怎么做」「误差变化快时该怎么做」。
4.3.1 模糊控制器的结构
模糊PI的核心是三个步骤:模糊化、规则推理、解模糊。
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)来快速拉回。
4.3.3 工程实现注意事项
模糊PI在MCU上实现时,有几个坑要注意:
- 隶属度函数用查表法:三角隶属度函数可以用查表+线性插值,比实时计算快很多。
- 规则推理用加权平均:不要用最大最小法,加权平均更平滑。
- 解模糊用重心法:计算量稍大,但精度高。如果MCU性能有限,可以用面积平分法替代。
我记得有一次在STM32F103上跑模糊PI,查表加推理总共花了不到20微秒,完全够用。所以不用担心性能问题。
4.4 基于模型参考的自适应控制(MRAC)
MRAC的思路很优雅:你先设计一个理想模型,然后让实际系统去跟踪这个模型的行为。说白了,就是「你希望系统怎么动,控制器就怎么调参数让你动得跟模型一样」。
4.4.1 MRAC的基本结构
MRAC包含四个部分:参考模型、实际系统、自适应律、控制器。
4.4.2 自适应律的设计
自适应律是MRAC的核心。常用的有MIT规则和Lyapunov规则。我个人更推荐Lyapunov规则,因为它能保证稳定性。
以速度环为例,参考模型可以选一个二阶系统:
Gm(s) = ωn² / (s² + 2ζωn·s + ωn²)
其中ωn是自然频率,ζ是阻尼比。我一般选ζ=0.707,ωn根据系统带宽来定。
自适应律的更新公式:
dθ/dt = -γ · e · φ
其中θ是待调整的参数向量,e是模型输出与实际输出的误差,φ是回归向量,γ是自适应增益。
4.4.3 MRAC在FOC中的实战经验
我在一个高速主轴电机项目里用过MRAC。电机转速从0到30000rpm,负载变化范围很大。固定PI根本调不好,用了MRAC后,速度跟踪误差从±200rpm降到了±30rpm。
不过MRAC也有缺点:计算量大,对MCU性能要求高。我当时用的是Cortex-M4,180MHz主频,MRAC占用了大约15%的CPU资源。如果MCU性能有限,可以考虑简化参考模型,或者降低自适应律的更新频率。
4.5 三种方法的对比与选型
| 方法 | 计算量 | 适应性 | 稳定性保证 | 适用场景 |
|---|---|---|---|---|
| 增益自整定 | 低 | 中等 | 需限幅 | 工况变化小,MCU资源紧张 |
| 模糊PI | 中 | 较高 | 依赖规则表 | 工况变化有规律,经验丰富 |
| MRAC | 高 | 高 | Lyapunov保证 | 工况复杂,对性能要求高 |
选型时,我建议先评估你的MCU算力。如果算力够,优先考虑模糊PI,因为它实现简单、效果明显。如果算力紧张,增益自整定也能解决大部分问题。MRAC虽然强大,但调试周期长,适合对性能有极致要求的场景。