注意:任何算法使用程序表示,都得将算法离散化,以下的算法公式及代码都是将连续函数离散化后的表示结果。
问题一:位置式pid与增量式pid差别?
位置式PID将误差累加,增量式PID与当前及前两派误差有关。
问题二:位置式PID计算公式是什么?
问题三:增量式PID计算公式是什么?
由问题二的位置式的PID计算公式可知,u(k)和u(k-1)的计算公式。将二者做差,即得到增量式PID的计算公式。
问题四:位置式PID实现C语言代码?
typedef struct{
float kp,ki,kd;
float ek,ek1,ek2; //ek1 是 ek 的前一次误差
float eSUM;
}PID;
结构体PID的初始化:
PID pid = {10.0,10.0,0.0,0.0,0.0,0.0};
float PID_Loc(float SetValue, float ActualValue, PID *pid){
float PIDLoc;
pid->ek = SetValue - ActualValue;
pid->eSum += pid->ek; //累计误差
PIDLoc = (pid->kp*pid-ek)
+ (pid->ki*pid->eSUM)
+ [pid->kd*(pid->ek1 - pid->ek)]
pid->ek1 = pid->ek;
return PIDLoc;
}
问题五:增量式PID的实现代码?该pid计算结果如何使用?
//PID结构体的定义见问题四,
float PID_Inc(float SetValue, float ActualValue, PID *pid){
float PIDInc;
pid->ek = SetValue - ActualValue;
PIDInc = [pid->kp * (pid->ek - pid->ek1)]
+ (pid->ki * pid->ek)
+ [pid->kd * (pid->ek - 2*pid->ek1 + pid->ek2)];
//注意:可以将公式化简,这是一种思维,不要简单的将下面化简的kp,ki,kd。理解为书上的PID。这里是提了公因式的
PIDInc = (pid->kp * pid->ek)
- (pid->ki * pid->ek1)
+ (pid->kd * pid->ek2)
pid->ek2 = pid->ek1;
pid->ek1 = pid->ek;
return PIDInc;
} //由于计算结果是属于增量,那么计算后,该PIDInc需要叠加到原PWM的占空比上面,具体是加还是减看具体情况。
问题六:为什么在使用增量式PID的时候,反馈的调节现象是正反馈?
增量式的pid,在实际的应用上,需要根据具体的情况判断是加还是减,弄错了就成为了正反馈。
问题七:实际应用中,PID三个参数该如何确定?
先调P值,P从小往大了调,调到临界振荡,取临界振荡的70%
再调I值,I值从大往小了调,调到消除稳定误差。
D值,视情况来调。默认为零。
参考文献:
[1] 何俊龙,杜封.微缩智能车路径跟踪的增量式PID控制[J].天津职业技术师范大学学报.2018,28(2):5-9