- 缺点每次输出均与过去的状态有关,计算时要对e(k)进行累加,计算机运算工作量大
- 代码实现:
typedef struct PID
{
float Kp,Ki,Kd,Limit;
}PID_t;
typedef struct Error
{
float Current_Error; //当前误差 e(k)
float Last_Error; //上一次误差 e(k-1)
}Error_t;
//===================位置式PID控制
//返回的是实际值
float PID_Positon_control(Error_t* sptr, PID_t* pid, float NowPlace, float Point)
{
float iError; //当前误差
float Real_Output;//实际输出
iError = Point - NowPlace;//计算当前误差
sptr->Current_Error += pid->Ki * iError;// 误差积分
sptr->Current_Error = sptr->Current_Error > pid->Limit?pid->Limit:sptr->Current_Error;//积分限幅
sptr->Current_Error = sptr->Current_Error < -(pid->Limit)?-(pid->Limit):sptr->Current_Error;//积分限幅
Real_Output = pid->Kp * iError //比例P
+ sptr->Current_Error //积分I,为了安全需要做一下限幅
+ pid->Kd * (iError - spt->Last_Error);//微分
sptr->Last_Error = iError;//更新一下上次误差
return Real_Output;// 返回实际值
}
- 增量型误动作小,易于实现手动/自动的无扰动切换,不产生积分失控。
- 但是缺点在于积分截断效应大,溢出影响大。
- 代码实现:
typedef struct PID
{
float Kp,Ki,Kd,limit;
}PID_t;
typedef struct Error
{
float Current_Error; //当前误差 e(k)
float Last_Error; //上一次误差 e(k-1)
float Previous_Error; //上上次误差 e(k-2)
}Error_t;
//===================增量式PID控制
//返回的是增量
float PID_Positon_control(Error_t* sptr, PID_t* pid, float NowPlace, float Point)
{
float iError; //当前误差
float Real_Output_Increase;//实际输出
iError = Point - NowPlace;//计算当前误差
Real_Output_Increase = pid->Kp * (iError - sptr->Last_Error)//比例P
+ pid->Ki * iError//积分I,为了安全需要做一下限幅
+ pid->Kd * (iError - 2 * sptr->Last_Error + sptr->Previous_Error);//微分D
//更新误差,顺序不能反。。。。
sptr->Previous_Error = sptr->Last_Error ;
sptr->Last_Error = iError;
return Real_Output_Increase ;// 返回增量值
}
区别
- 增量式算法不需要做累加,控制量增量的确定仅与最近几次偏差采样值有关,计算误差对控制 量计算的影响较小。而位置式算法要用到过去偏差的累加值,容易产生较大的累加误差
- 增量式算法得出的是控制量的增量,例如在阀门控制中,只输出阀门开度的变化部分,误动作 影响小,必要时还可通过逻辑判断限制或禁止本次输出,不会严重影响系统的工作。而位置式的输出直接对应对象的输出,因此对系统影响较大
- 增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。
- 在进行PID控制时,位置式PID需要有积分限幅和输出限幅,而增量式PID只需输出限幅
原文链接:
https://mp.weixin.qq.com/s?__biz=MzU1NjEwMTY0Mw==&mid=2247557426&idx=1&sn=53bc279d0fea3a7560a3106bcb8efbc3&chksm=fbc99856ccbe11409d0f6ab00a3f98cdcda63eb2a453edf0547b250fb7b871cb4e1f911d1e4b&scene=27