第三章:PID参数整定进阶——基于模型的自整定、模糊PID、自适应PID、神经网络PID
好,咱们进入正题。前两章我们把PID的基础和经典整定方法聊透了。你可能会问:那些方法够用吗?说实话,大部分场景确实够了。但如果你碰到一个时变系统、非线性系统,或者被控对象本身就不稳定,那经典方法就有点力不从心了。
我记得有一次在化工厂调试一个反应釜的温度控制。那玩意儿热惯性大,而且随着反应进行,内部介质的热容还在变。我用Z-N法整定,结果温度超调了15度,差点把反应搞砸了。从那以后,我就开始认真研究这些进阶方法。
这一章,我们聊聊四种进阶方案:基于模型的自整定、模糊PID、自适应PID、神经网络PID。它们各有各的脾气,也各有各的适用场景。
3.1 基于模型的自整定
说白了,就是让控制器自己“认识”被控对象。你给它一个激励,它根据响应反推出模型参数,然后自动算出PID系数。
我习惯用继电反馈法做自整定。为什么?因为它简单、可靠,而且不需要中断生产过程太久。
3.1.1 继电反馈自整定原理
做法是这样的:在控制器输出端接入一个继电器,让系统产生等幅振荡。然后测量振荡的幅值和周期,就能算出临界增益Ku和临界周期Tu。
嗯,这里要注意:继电器的滞环宽度要选好。太宽了振荡不明显,太窄了容易受噪声干扰。我一般取信号幅值的1%~2%作为滞环宽度。
核心公式:
Ku = 4h / (πa)
其中h是继电器输出幅值,a是振荡幅值。
得到Ku和Tu后,直接用Z-N法查表算出PID参数。
3.1.2 实现步骤
- 切换模式:将控制器切换到自整定模式,断开PID输出,接入继电器。
- 施加激励:继电器输出一个方波信号,让系统起振。
- 测量参数:记录振荡波形,计算幅值a和周期Tu。
- 计算PID:代入公式,算出Kp、Ki、Kd。
- 切换回PID:将计算好的参数写入控制器,切回正常PID模式。
实战技巧:
我曾经在调试一个液位系统时,发现振荡波形不对称。后来检查发现是阀门存在死区。解决办法:在继电器输出上叠加一个很小的偏置信号,把阀门“推”过死区。
3.2 模糊PID
模糊PID,说白了就是把人的经验“翻译”成控制规则。你想想看,一个老工程师调PID,是不是凭感觉?感觉超调大了就减Kp,感觉响应慢了就加Ki。模糊PID做的就是这件事。
3.2.1 模糊控制器的结构
模糊PID通常有两个输入:误差e和误差变化率ec。输出是ΔKp、ΔKi、ΔKd,也就是PID参数的修正量。
我习惯把e和ec分成7个模糊集:NB(负大)、NM(负中)、NS(负小)、ZO(零)、PS(正小)、PM(正中)、PB(正大)。
| e / ec | NB | NM | NS | ZO | PS | PM | PB |
|---|---|---|---|---|---|---|---|
| NB | PB | PB | PM | PM | PS | ZO | ZO |
| NM | PB | PB | PM | PS | PS | ZO | NS |
| NS | PM | PM | PM | PS | ZO | NS | NS |
| ZO | PM | PM | PS | ZO | NS | NM | NM |
| PS | PS | PS | ZO | NS | NS | NM | NM |
| PM | PS | ZO | NS | NM | NM | NM | NB |
| PB | ZO | ZO | NM | NM | NM | NB | NB |
表:ΔKp的模糊规则表(部分示例)
3.2.2 模糊PID的实现要点
- 隶属度函数:我推荐用三角形或高斯型。三角形计算快,高斯型更平滑。在PLC上跑的话,用三角形就够了。
- 解模糊:重心法最常用。说白了就是加权平均,算出精确的修正值。
- 量化因子:这个很关键。Ke和Kec决定了模糊控制器的灵敏度。调大了容易振荡,调小了响应慢。
避坑指南:
我曾经在一个伺服位置控制项目里用了模糊PID,结果发现系统在稳态附近有微幅振荡。查了半天,发现是量化因子设置不当,导致模糊控制器在零点附近过于敏感。解决办法:在零点附近增加一个死区,或者改用非均匀的隶属度函数。
3.3 自适应PID
自适应PID,就是让控制器“边学边调”。它实时监测系统的响应,然后自动调整PID参数。你想想看,如果被控对象的特性在变化,比如电机随着温度升高电阻变大,那固定参数的PID肯定不行。
3.3.1 模型参考自适应PID
这种方法的思路是:你先设定一个理想的参考模型,然后让实际系统的输出尽量去“模仿”这个模型。误差越小,说明PID参数越合适。
我习惯用MIT法则整定参数。它的核心思想是:让参数沿着误差梯度下降的方向调整。
// 伪代码示例:MIT法自适应律
error = reference_model_output - actual_output;
gamma = 0.1; // 自适应增益,需要现场调试
dKp = -gamma * error * (reference_model_output / (s + a));
Kp = Kp + dKp * dt;
3.3.2 自校正PID
另一种思路是:在线辨识被控对象的参数,然后根据辨识结果重新计算PID参数。这就像你一边开车,一边重新画地图。
常用的辨识方法有递推最小二乘法(RLS)。它计算量小,适合在嵌入式系统上跑。
关键点:
自适应PID的稳定性是个大问题。如果自适应增益选得太大,系统可能发散。我建议从很小的增益开始试,比如0.01,然后慢慢往上加,直到看到满意的响应为止。
3.4 神经网络PID
神经网络PID,听起来很高大上,其实本质就是用一个神经网络来“学习”PID参数。你给它一堆输入输出数据,它自己总结规律。
3.4.1 BP神经网络PID
最常用的是BP神经网络。结构一般是:输入层(e, ec, 1),隐藏层(5~10个神经元),输出层(Kp, Ki, Kd)。
训练的时候,用梯度下降法反向传播误差,不断调整网络权值。说白了,就是让网络学会“什么情况下该用什么参数”。
// 伪代码:BP神经网络前向计算
input = [e, ec, 1];
hidden_output = sigmoid(W1 * input + b1);
output = W2 * hidden_output + b2;
Kp = output[0];
Ki = output[1];
Kd = output[2];
3.4.2 实战中的坑
- 训练数据:需要覆盖所有工况。我见过有人只用阶跃响应数据训练,结果系统在斜坡输入下表现很差。
- 实时性:神经网络计算量大。在PLC上跑的话,建议用查表法代替在线计算。提前算好不同工况下的参数,存成表格。
- 收敛性:BP网络可能陷入局部最优。我习惯用遗传算法先粗调一遍网络权值,再用BP精调。
我的建议:
神经网络PID虽然强大,但不要轻易用在安全关键系统上。它的行为很难解释,万一出了问题,排查起来很麻烦。我一般先用模糊PID,实在搞不定再上神经网络。
3.5 四种方法的对比与选择
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 基于模型自整定 | 线性、时不变系统 | 简单、可靠、无需人工干预 | 需要系统能产生振荡 |
| 模糊PID | 非线性、难以建模的系统 | 可融入专家经验、鲁棒性好 | 规则库设计依赖经验 |
| 自适应PID | 时变系统、参数漂移 | 能在线调整、适应性强 | 稳定性分析复杂、可能发散 |
| 神经网络PID | 高度非线性、复杂系统 | 学习能力强、无需精确模型 | 计算量大、可解释性差 |
选哪种方法?我的经验是:先试试基于模型的自整定,不行就上模糊PID。如果系统参数变化剧烈,考虑自适应PID。神经网络PID?嗯,留作最后的大招。
好了,这一章的内容就到这儿。下一章我们聊聊多变量系统的解耦控制,那又是一个新世界。