3、PID控制基础:PID控制器原理、位置环与电流环设计、数字PID实现方法
各位工程师朋友,大家好。今天我们聊聊磁悬浮轴承控制里最核心的东西——PID控制。说实话,我入行那会儿,第一个接触的算法就是PID。当时觉得这东西太简单了,不就是比例、积分、微分三个参数嘛。后来在项目里被现实狠狠教育了一顿,才发现PID的调优,尤其是用在磁悬浮这种强非线性系统上,门道深着呢。
这一章,我会把PID的原理、位置环和电流环怎么设计、以及数字域怎么实现,掰开了揉碎了讲清楚。嗯,咱们直接开始。
3.1 PID控制器原理:从模拟到数字
PID控制器的数学表达式,大家应该都见过:
u(t) = Kp * e(t) + Ki * ∫e(t)dt + Kd * de(t)/dt
说白了,就是根据当前的误差(P)、过去的误差累积(I)、未来的误差趋势(D),来算出一个控制量。我个人的理解是:P是现在,I是过去,D是未来。你想想看,一个控制器如果能同时看到这三个维度,那它基本就能把系统稳住。
但在磁悬浮轴承里,情况有点特殊。磁悬浮系统天生不稳定,转子一旦偏离中心,电磁力会把它拉得更偏。所以PID在这里的任务,不是“优化”,而是“稳住”。
核心要点:磁悬浮的PID,首要目标是保证系统稳定,其次才是动态性能。千万别一上来就追求响应速度,那会出大问题。
我在项目中遇到过一位同事,他把Kp调得特别大,想加快响应。结果转子直接撞到保护轴承上,声音特别刺耳。嗯,从那以后,我调PID都是先保证稳定,再慢慢加增益。
3.2 位置环与电流环设计:双环结构的秘密
磁悬浮轴承的控制,通常采用双环结构:外环是位置环,内环是电流环。为什么要这么设计?
你想想看,位置环的输出是期望的电磁力,但电磁力是通过线圈电流产生的。电流环的作用,就是快速、准确地跟踪这个期望电流。说白了,位置环负责“算账”,电流环负责“干活”。
| 控制环 | 输入 | 输出 | 带宽要求 |
|---|---|---|---|
| 位置环 | 转子位置误差 | 期望电磁力(或期望电流) | 较低(通常几十Hz) |
| 电流环 | 期望电流与实际电流的误差 | PWM占空比(电压指令) | 较高(通常几百Hz到几kHz) |
我个人习惯,设计时先调电流环,再调位置环。电流环调好了,位置环的“执行器”才靠谱。我曾经在调试一个高速电机时,电流环带宽不够,导致位置环输出的力指令总是滞后,转子一直在振荡。后来把电流环的Ki加大了一些,问题就解决了。
设计技巧:电流环的PI参数,可以用“模最优”法来整定。简单说,就是让电流环的闭环传递函数近似为一个一阶惯性环节,带宽尽量高,但不要超过PWM开关频率的1/10。
3.3 数字PID实现方法:离散化与防积分饱和
现在控制器基本都是数字的,所以我们要把模拟PID变成数字PID。最常用的方法是位置式PID和增量式PID。
位置式PID直接计算完整的控制量:
u(k) = Kp * e(k) + Ki * Ts * sum(e(i)) + Kd * (e(k) - e(k-1)) / Ts
这个公式很直观,但有个大坑:积分饱和。如果执行器饱和了(比如PWM占空比到了100%),积分项还在累积,等误差反向时,控制器要花很长时间才能退饱和。嗯,这里要注意。
增量式PID只计算控制量的增量:
Δu(k) = Kp * (e(k) - e(k-1)) + Ki * Ts * e(k) + Kd * (e(k) - 2*e(k-1) + e(k-2)) / Ts
我个人更推荐增量式PID,尤其是在磁悬浮这种对积分饱和敏感的系统里。因为它天然带有抗积分饱和的特性——你只需要限制输出u(k)的上下限,积分项就不会无限累积。
避坑指南:我曾经在调试一个磁悬浮平台时,用了位置式PID,结果积分饱和导致系统在启动时剧烈超调。后来换成增量式PID,配合输出限幅,问题就解决了。记住:数字PID一定要做输出限幅和积分限幅。
下面是一个简单的数字PID实现代码,我用的是增量式:
// 增量式PID结构体
typedef struct {
float Kp, Ki, Kd;
float Ts; // 采样周期
float e_prev; // e(k-1)
float e_prev2; // e(k-2)
float u_out; // 当前输出
float u_max, u_min; // 输出限幅
} PID_Inc;
float PID_Inc_Calc(PID_Inc *pid, float setpoint, float feedback) {
float e = setpoint - feedback;
float delta_u = pid->Kp * (e - pid->e_prev)
+ pid->Ki * pid->Ts * e
+ pid->Kd * (e - 2*pid->e_prev + pid->e_prev2) / pid->Ts;
pid->u_out += delta_u;
// 输出限幅
if (pid->u_out > pid->u_max) pid->u_out = pid->u_max;
if (pid->u_out < pid->u_min) pid->u_out = pid->u_min;
// 更新历史误差
pid->e_prev2 = pid->e_prev;
pid->e_prev = e;
return pid->u_out;
}
这段代码看起来简单,但实际项目里,我还会加上积分分离和变速积分。积分分离的意思是:当误差很大时,让积分项失效,防止超调;当误差小时,再让积分项起作用,消除静差。这个技巧,我在调磁悬浮的悬浮高度时经常用。
3.4 知识体系总览
为了让大家更直观地理解本章的知识结构,我画了一张图。这张图把PID原理、双环设计、数字实现串在了一起。你一看就明白,这些知识点是怎么关联的。
这张图里,我把PID原理、双环设计、数字实现三个模块的关系画清楚了。你从PID控制器出发,左边是原理,中间是结构设计,右边是工程实现。底部是核心目标——先稳定,再追求动态性能,最后考虑抗干扰能力。这个顺序,我在每个项目里都严格遵守。
好了,这一章的内容就到这里。PID看似简单,但真正用好它,尤其是在磁悬浮这种系统里,需要大量的实践和调试。下一章我们会聊更具体的参数整定方法,到时候我会分享一些我自己的“土办法”。