0、前言
1、积分分离PID
1.1、为什么要使用积分分离PID
在普通PID控制中,引入积分环节的目的主要是为了消除静态误差,提供控制精度。但是在运动过程的启动、结束、以及大幅度增减设定的时候,短时间内系统的输入输出会有很大的偏差,会造成PID控制中积分累计过大,导致控制量超过执行机构可能允许的最大动作范围对应的极限控制量,引起系统较大的震荡,这在某些控制中是不允许的。
1.2、积分分离PID原理
基本思路:当被控量与设定值偏差较大时,取消积分作用,以免由于积分作用使系统的稳定性降低,超调量增大;而当被控量接近定量时,引入积分控制,以便消除静态误差,提高控制精度。
积分控制开关量数值的选取是关键,过大则达不到控制积分分离的效果,而过小则难以进入积分区间。
1.3、积分分离PID优缺点
- 优点:可以同时兼顾PD和PID的优点,当判定误差较大时,取消积分环节,可以同时减少超调量和调节时间;当判定误差较小时,增加积分环节,消除静态误差。
- 缺点:需要经验判定积分项开关系统,这是个技术活。一般为设定值的20~30%。
2、抗积分饱和PID
2.1、为什么要使用抗积分饱和PID
为了解决积分饱和现象。
当系统一直存在一个方向的偏差,PID控制器的输出由于积分环节作用而不断增大,导致执行机构达到极限位置(例如阀门开度达到最大)。此时,控制量超出了正常范围,进入饱和区。一旦系统出现反向偏差,u(k)逐渐从饱和区退出。进入饱和区越深,则退出饱和区所需要的时间越长。当系统进入深饱和区后,出现反向偏差,而执行机构仍停留在极限位置,却不能随偏差反向立即做出相应的改变,如同系统失去控制。这种现象,被称为积分饱和现象。
2.2、抗积分饱和PID原理
在计算u(k)时,判断上一时刻的控制量u(k-1)是否已超出限制范围。就可以避免控制量长时间停留在饱和区。
- 若u(k-1)>u_max,则只增加负偏差;
- 若u(k-1)<u_min,则只累加正偏差。
typedef struct {
float Kp, Ki, Kd;
float OutputMin, OutputMax;
float Integral, IntegralMax;
float PrevError;
} AntiWindupPID;
float PID_Compute(AntiWindupPID* pid, float setpoint, float feedback) {
float error = setpoint - feedback;
float derivative = error - pid->PrevError;
// 积分项更新与限幅
pid->Integral += error * pid->Ki;
if (pid->Integral > pid->IntegralMax) {
pid->Integral = pid->IntegralMax;
} else if (pid->Integral < -pid->IntegralMax) {
pid->Integral = -pid->IntegralMax;
}
// 计算输出并限幅
float output = pid->Kp*error + pid->Integral + pid->Kd*derivative;
if (output > pid->OutputMax) {
output = pid->OutputMax;
} else if (output < pid->OutputMin) {
output = pid->OutputMin;
}
pid->PrevError = error;
return output;
}
2.3、抗积分饱和PID优缺点
一般来说,只要使用到积分,都会加上抗积分饱和输出限幅。