//增量pid
//△u = kp * (e(k)-e(k-1)) + ki * e(k) + kd * (e(k) - 2e(k-1)+e(k-2));
//比例P : e(k)-e(k-1) 当前误差-上次误差
//积分I : e(k) 当前误差
//微分D : e(k) - 2e(k-1)+e(k-2) 当前误差-2*上次误差+上上次误差
输入参数:设定值,过程值,比例,积分,微分,死区,阀位增量最大限值,当前阀位,输出下限,输出上限,控制正反作用。
输出参数:输出阀位控制
float wfpc = 0;//微分偏差
float dqpc = 0;//当前偏差
float sqpc = 0;//上前偏差
float qypc = 0;//上一偏差
float thpc = 0;//替换偏差
float bhkd = 0;//变化开度
float zlpid(float sd, float pv,float KP,float KI,float KD,float dead,float zlxz,float dqkd,float lmnxx,float lmnsx,bool kzfx)
{
float zlpidlmn = 0;//pid输出结果
dqpc = sd - pv;
wfpc = dqpc + sqpc - 2*qypc;
bhkd = KP * (dqpc- qypc) + KI * dqpc + KD * wfpc;
//pid正反作用
bhkd = bhkd * kzfx;
if(dqpc >= -dead && dqpc <= dead)
{
bhkd = 0;
}
//阀位单次输出限制
if(bhkd >= zlxz)
{
bhkd = zlxz;
}
if(bhkd <=-zlxz)
{
bhkd =-zlxz;
}
dqkd = bhkd + dqkd;
//阀位连续输出限制
if(dqkd <= lmnxx)
{
dqkd = lmnxx;
}
if(dqkd >= lmnsx)
{
dqkd = lmnsx;
}
thpc = qypc;
qypc = dqpc;
sqpc = thpc;
zlpidlmn = dqkd;
return zlpidlmn;
}
例下:
mzlpidlmn = zlpid(250000, 240000,0.2/10000,0.3/10000,0.5/10000,1000,1,50,20,80,1);