PID控制原理
PID 组成
P: 比例
I:积分 消失静态误差
D:微分 具有预判的作用
pid核心代码
float PidControl::IncPIDCalc(IncPID_t *IncPID, float set_val, float cul_val)
{
//std::cout<<" "<<IncPID->Kp<<IncPID->Kp<<" set_val = "<<set_val<<" cul_val = "<<cul_val<<endl;
//printf("kp = %f ki = %f set_val= %f, cul_val = %f\n",IncPID->Kp,IncPID->Kp,set_val,cul_val);
//设定值
IncPID->set_val = set_val;
//当前值
IncPID->cul_val = cul_val;
//偏差
IncPID->Ek = set_val - cul_val;
//比例差值E[k]-E[k-1]
IncPID->Kp_err = IncPID->Ek - IncPID->Ek_1;
//积分差值E[k]
IncPID->Ki_err = 0;
//-- 抗积分饱和
//---- 上过调
if (IncPID->out_val > IncPID->val_max)
{
//防止进一步上过调
if (IncPID->Ek <= 0)
{
IncPID->Ki_err = IncPID->Ek;
}
}
//---- 下过调
else if (IncPID->out_val < IncPID->val_min)
{
//防止进一步下过调
if (IncPID->Ek >= 0)
{
IncPID->Ki_err = IncPID->Ek;
}
}
//---- 未过调
else
{
IncPID->Ki_err = IncPID->Ek;
}
//微分差值E[k]-2E[k-1]+E[k-2]
IncPID->Kd_err = IncPID->Ek - IncPID->Ek_1 - IncPID->Ek_1 + IncPID->Ek_2;
//本次输出
IncPID->out_val = IncPID->Kp * IncPID->Kp_err; //比例E[k]-E[k-1]
IncPID->out_val += IncPID->Ki * IncPID->Ki_err; //积分E[k]
IncPID->out_val += IncPID->Kd * IncPID->Kd_err; //微分E[k]-2E[k-1]+E[k-2]
//输出限位
if (IncPID->out_val < IncPID->val_min)
{
IncPID->out_val = IncPID->val_min;
}
else if (IncPID->out_val > IncPID->val_max)
{
IncPID->out_val = IncPID->val_max;
}
//更新E[k-2]
IncPID->Ek_2 = IncPID->Ek_1; //E[k-2] = E[k-1]
//更新E[k-1]
IncPID->Ek_1 = IncPID->Ek; //E[k-1] = E[k]
return IncPID->out_val;
}