一、简介
1) 应用领域
PID控制器广泛应用于各种工业过程控制中,比如:温度控制、流量控制、压力控制、飞行器的姿态、汽车控制、机械臂的位置控制等多个领域。
2) 概念
PID控制器是一种广泛应用于过程控制的自动控制器,分别代表比例(proportional)、积分(integral)、微分(derivative),主要用于调节系统的输出,使反馈值与目标值更接近。
其中:
- Kp 是比例系数,用于放大偏差信号。
- Ki 是积分系数,用于消除稳态误差。
- Kd 是微分系数,用于预测偏差的变化趋势,提前进行控制。
二、位置式PID
PID初始化
void PID_Init(PID *pid, float Kp , float Ki , float Kd , float Limit_value) { pid->Kp= Kp; pid->Ki= Ki; pid->Kd= Kd; pid->PrevError =pid->LastError = pid->Error =pid->SumError= pid->output = 0; pid->Integralmax = pid->outputmax = Limit_value; }PID参数定义及控制输出
typedef struct PID { float Kp; // Proportional Const P系数 float Ki; // Integral Const I系数 float Kd; // Derivative Const D系数 float PrevError ; // Error[-2] float LastError; // Error[-1] float Error; // Error[0 ] float DError; //pid->Error - pid->LastError float SumError; // Sums of Errors float output; float Integralmax; //积分项的最大值 float outputmax; //输出项的最大值 } PID; //为了防止积分项过度累积,引入积分项的限幅是一种常见的做法。 //限制积分项的幅值可以防止积分项过度增加,从而限制了系统的累积误差。这样可以避免系统过度响应或者不稳定。 float abs_limit(float value, float ABS_MAX) //积分限幅,设置最大值。 { if(value > ABS_MAX) value = ABS_MAX; if(value< -ABS_MAX) value = -ABS_MAX; return value; } //函数里传入指针,修改时会修改指针里的值。 float PID_Position_Calc(PID *pid, float Target_val, float Actual_val) //位置式PID { pid->Error = Target_val - Actual_val; //与pid P系数相乘。比例误差值 当前差值=目标值-实际值 pid->SumError += pid->Error; //与pid I系数相乘。稳态误差值 误差相加作为误差总和,给积分项 pid->DError = pid->Error - pid->LastError; //与pid D系数相乘。 微分项-消除震荡 pid->output = pid->Kp* pid->Error + abs_limit( pid->Ki* pid->SumError, pid->Integralmax ) + pid->Kd* pid->DError ; pid->LastError = pid->Error; //更新误差 //限制输出最大值,防止出现突发意外。输出outputmax的最大值 if(pid->output > pid->outputmax ) pid->output = pid->outputmax; if(pid->output < - pid->outputmax ) pid->output = -pid->outputmax; return pid->output ; //输出为pwm值 }三、调参
Kp、Ki、Kd的作用。
P:增加快速性,过大会引起震荡和超调,P单独作用会一直有静态误差。
I:减少静态误差,过大会引起震荡。
D:减小超调,过大会使响应速度变慢。
(1)纯Kp调节(比例)
假设有一个高为10m的水桶需要灌满水,这里我们假设Kp=0.2(每次灌水量为剩余灌水量的0.2倍)。
第一次灌水:10×0.2, 剩余8(10-10×0.2)。
第二次灌水: 8×0.2, 剩余6.4(8-8×0.2)。
第三次灌水:6.4×0.2 ,剩余5.12。
…
这里我们发现当我们设置Kp后,一直会慢慢接近目标值,但是永远不会到达目标值,这也就是会一直有静态误差。当Kp设置过小时,消耗的时间也就会更多。这里我们可以适当的调大Kp,使得更快的接近目标值。但是当Kp大于某个定值时,就会出现抖动,如下,假设Kp=1.5。
则第一次灌水:10×1.5,剩余 -5。
第二次灌水:-5×1.5,剩余2.5(-5 - (-5×1.5))。
第三次灌水:2.5×1.5,剩余 -1.25。
…
所以,要根据实际适当调整p值,不要使得Kp过大,而出现抖动。
(2)Ki调节(积分)
作用:积分时间用于解决系统的稳态误差问题,即系统无法完全到达期望值的情况。当存在稳态误差时,积分项会不断积累偏差,并且在一段时间内持续作用于控制器的输出,直到系统到达期望状态为止。
水桶例子:假设你在使用一个PID控制系统来控制一个水桶的水位。如果水桶的出水口略微大于水龙头的流量,那么水位就会慢慢下降,形成一个稳态偏差。积分时间就像是一个将稳态偏差中的水慢慢积累起来,直到水桶完全满了。如果积分时间设置得太大,可能会导致水桶溢出,而设置得太小则可能导致水桶永远无法完全填满。
(3)Kd调节(微分)
作用:微分时间用于减小系统的超调和提高系统的稳定性。它通过监测偏差的变化速率来预测系统未来的行为,并相应地调整控制器的输出,以减少振荡和过冲现象。
水桶例子:继续以水桶控制系统为例,微分时间就像是观察水流速度的变化。如果你突然关闭水龙头,但是水桶的水位仍然在上升,那么微分项会告诉你要逐渐减小输出,以避免水位超过期望值。如果微分时间设置得太大,可能会导致系统对外部干扰过于敏感,反而引起不稳定性;而设置得太小,则可能无法有效地抑制超调和振荡。