第2章:PID控制原理:比例、积分、微分的作用、PID的数学模型、位置式与增量式PID
大家好,我是老张。今天咱们聊聊PID控制原理。说实话,我在半导体设备这行摸爬滚打十几年,PID整定是绕不开的核心技能。你想想看,晶圆搬运机械臂、精密对准台、真空机械手,哪个离得开PID?
很多新人一上来就调参数,结果越调越乱。为什么?因为不理解PID的本质。今天我就把比例、积分、微分这三个家伙的脾气秉性,给你掰扯清楚。
2.1 比例作用:最直接的响应
比例控制,说白了就是「有多大错,使多大劲」。误差大,输出就大;误差小,输出就小。这个逻辑很直观。
数学上很简单:Pout = Kp × e(t)。其中e(t)是当前误差,Kp是比例增益。
我在调试晶圆对准台时遇到过一个问题:Kp设小了,平台半天挪不到位;Kp设大了,又抖得像筛糠。这就是比例控制的典型矛盾——快速性与稳定性不可兼得。
关键点:纯比例控制一定会产生稳态误差。为什么?因为系统需要误差来维持输出。你想想看,如果误差为零,比例输出就是零,那系统怎么保持位置?
我的经验:调试时先把I和D设为零,只调P。让系统刚好不振荡,然后记下这个Kp值。这个值就是你的「基准线」。
2.2 积分作用:消除稳态误差的利器
积分项解决的就是比例控制搞不定的稳态误差。它把过去的误差累积起来,慢慢修正。
数学表达式:Iout = Ki × ∫e(t)dt。注意这个积分符号,它意味着只要误差存在,积分项就会一直增长。
我曾经调试一台真空机械手,位置总是偏0.02mm。比例调了无数遍就是消不掉。后来加了积分项,嘿,三秒钟就拉回来了。但要注意——积分饱和是个大坑。
避坑指南:我曾经在晶圆传输系统中吃过积分饱和的亏。启动时误差很大,积分项疯狂累积,等系统到达目标位置时,积分输出还在「惯性滑行」,导致严重超调。后来加了积分限幅和抗饱和算法才解决。
积分还有一个特点:它会降低系统的响应速度。因为积分需要时间累积,所以系统会变得「慢半拍」。
2.3 微分作用:提前预判的智慧
微分项看的是误差的变化趋势。误差在变大,它就加大输出;误差在变小,它就减小输出。说白了,就是给系统加了个「刹车」。
数学形式:Dout = Kd × de(t)/dt。这个导数项对噪声特别敏感。
微分在半导体设备中非常有用。比如晶圆对准时,平台接近目标位置,微分项能提前减速,避免冲过头。但要注意,微分对高频噪声是放大器。
实战要点:我建议在传感器噪声较大的场合,要么加低通滤波,要么干脆不用微分。有时候D设得不好,比不设还糟糕。
2.4 PID的完整数学模型
把三个家伙合在一起,就是完整的PID公式:
u(t) = Kp × e(t) + Ki × ∫e(t)dt + Kd × de(t)/dt
其中:
- u(t):控制输出(比如电机电压、阀门开度)
- e(t):设定值与实际值的偏差
- Kp:比例增益
- Ki:积分增益
- Kd:微分增益
在数字系统中,我们用的是离散形式。把连续时间换成采样周期Ts:
u(k) = Kp × e(k) + Ki × Σe(i)×Ts + Kd × [e(k) - e(k-1)]/Ts
这里k表示第k个采样时刻。注意积分变成了累加,微分变成了差分。
2.5 位置式PID vs 增量式PID
这是实际工程中必须搞清楚的两种实现方式。
| 对比项 | 位置式PID | 增量式PID |
|---|---|---|
| 输出含义 | 直接输出控制量(如位置、角度) | 输出控制量的增量(变化量) |
| 计算公式 | u(k) = Kp·e(k) + Ki·Σe(i) + Kd·[e(k)-e(k-1)] | Δu(k) = Kp·Δe(k) + Ki·e(k) + Kd·[Δe(k)-Δe(k-1)] |
| 积分累积 | 需要累加所有历史误差 | 不需要累加,只依赖最近几次误差 |
| 抗积分饱和 | 需要额外处理 | 天然抗积分饱和 |
| 手动/自动切换 | 切换时可能有冲击 | 切换平滑,无冲击 |
| 适用场景 | 伺服位置控制、精密对准 | 步进电机、阀门控制、增量式执行器 |
位置式PID,我习惯用在晶圆对准台这类需要绝对位置控制的场合。但要注意积分饱和问题——我曾经在设备启动时,积分项累积到几万,输出直接饱和,平台「飞」出去了。
增量式PID,说白了就是只算「这次比上次多输出多少」。它不需要记住所有历史误差,只依赖最近三次的误差值。在步进电机控制中特别好用,因为步进电机本身就是增量式的。
我的选择原则:如果执行器是伺服电机(带编码器反馈),用位置式;如果是步进电机或阀门,用增量式。这不是绝对的,但90%的情况都适用。
2.6 增量式PID的代码实现
给你看一段我常用的增量式PID代码,简洁实用:
// 增量式PID结构体
typedef struct {
float Kp, Ki, Kd; // PID参数
float error[3]; // 误差缓存:error[0]=e(k), error[1]=e(k-1), error[2]=e(k-2)
float output; // 当前输出
} IncrementalPID;
// 增量式PID计算函数
float IncrementalPID_Calc(IncrementalPID *pid, float setpoint, float feedback) {
pid->error[2] = pid->error[1];
pid->error[1] = pid->error[0];
pid->error[0] = setpoint - feedback;
// Δe(k) = e(k) - e(k-1)
float delta_error = pid->error[0] - pid->error[1];
// Δ²e(k) = e(k) - 2*e(k-1) + e(k-2)
float delta2_error = pid->error[0] - 2*pid->error[1] + pid->error[2];
// 计算增量
float delta_u = pid->Kp * delta_error
+ pid->Ki * pid->error[0]
+ pid->Kd * delta2_error;
// 累加输出
pid->output += delta_u;
// 输出限幅(防止溢出)
if(pid->output > OUTPUT_MAX) pid->output = OUTPUT_MAX;
if(pid->output < OUTPUT_MIN) pid->output = OUTPUT_MIN;
return pid->output;
}
这段代码我用了好多年,在多个半导体设备项目中验证过。注意那个误差缓存数组,它只存最近三次的误差值,内存占用极小。
核心区别总结:
- 位置式PID:输出是绝对值,需要积分累加,适合伺服控制
- 增量式PID:输出是增量值,不需要积分累加,适合步进电机
- 增量式PID天然抗积分饱和,切换无冲击
好了,这一章的内容就到这里。比例、积分、微分这三个家伙,你只要理解了它们的脾气,整定参数就不再是玄学。下一章我们聊聊具体的整定方法,到时候我会分享一些实战中的「野路子」技巧。