(1)位置型PID算法实现
对于位置型PID的抗积分饱和算法其实就是在基本的PID基础上加上抗积分饱和的操作,增加量个机锋的极限值。首先定义PID对象的结构体:
/*定义结构体和公用体*/
typedef struct
{
floatsetpoint; //设定值
floatproportiongain; //比例系数
floatintegralgain; //积分系数
floatderivativegain; //微分系数
floatlasterror; //前一拍偏差
floatresult; //输出值
floatintegral;//积分值
floatmaximum;//最大值
floatminimum;//最小值
}PID;
接下来实现PID控制器:
void PIDRegulation(PID *vPID, float processValue)
{
floatthisError;
thisError=vPID->setpoint-processValue;
if(vPID->result>vPID->maximum)
{
if(thisError<=0)
{
vPID->integral+=thisError;
}
}
elseif(vPID->resultminimum)
{
if(thisError>=0)
{
vPID->integral+=thisError;
}
}
else
{
vPID->integral+=thisError;
}
vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+vPID->derivativegain*(thisError-vPID->lasterror);
vPID->lasterror=thisError;
}
(2)增量型PID算法实现
增量型PID的抗积分饱和的实现也是一样在最基本的增量型PID算法中引入极大极小的限值,并在算法中通过比较限值实现抗饱和的操作。
首先定义PID对象的结构体:
/*定义结构体和公用体*/
typedef struct
{
floatsetpoint; //设定值
floatproportiongain; //比例系数
floatintegralgain; //积分系数
floatderivativegain; //微分系数
floatlasterror; //前一拍偏差
floatpreerror; //前两拍偏差
floatdeadband; //死区
floatresult; //输出值
floatmaximum;//最大值
floatminimum;//最小值
}PID;
接下来实现PID控制器:
void PIDRegulation(PID *vPID, float processValue)
{
floatthisError;
floatincrement;
floatpError,dError,iError;
thisError=vPID->setpoint-processValue; //得到偏差值
pError=thisError-vPID->lasterror;
iError=0;
dError=thisError-2*(vPID->lasterror)+vPID->preerror;
if(vPID->result>vPID->maximum)
{
if(thisError<=0)
{
iError=thisError;
}
}
elseif(vPID->resultminimum)
{
if(thisError>=0)
{
iError=thisError;
}
}
else
{
iError=thisError;
}
increment=vPID->proportiongain*pError+vPID->integralgain*iError+vPID->derivativegain*dError; //增量计算
vPID->preerror=vPID->lasterror; //存放偏差用于下次运算
vPID->lasterror=thisError;
vPID->result+=increment;
}
3、总结
所谓抗积分饱和就是防止由于长期存在一个方向的偏差而对相反方向的偏差迟滞响应。本文的方法是在达到极值后将不再对这一方向的偏差做出反应相反只对另一方向的偏差做出反应。事实上由于偏差的存在有可能造成输出值超限的情况,所以还需要对输出值作出限制。
欢迎关注:
`
0