龙空技术网

经典控制PID控制器C代码

风电自控 418

前言:

眼前你们对“c实现pid控制”大概比较重视,姐妹们都需要了解一些“c实现pid控制”的相关内容。那么小编也在网络上汇集了一些有关“c实现pid控制””的相关文章,希望我们能喜欢,小伙伴们快快来学习一下吧!

经典控制PID控制器-C语言代码的实现

文章logo

// 1.定义PID变量结构体

struct _pid{

float SetValue; //定义设定值

float ActualValue; //定义实际值

float err; //定义偏差值

float err_last; //定义上一个偏差值

float Kp,Ki,Kd; //定义比例、积分、微分系数

float ActuatorCtrlValue; //控制执行器变量

float integral; //定义积分值

float Umax; //定义实际值的上限

float Umin; //定义实际值得下限

float errDisIntegralVar; //定义接触积分环节的偏差限值

float ControlOutValue;//定义控制输出

}pid;

//2. PID算法实现

float PID_realize(float SetVar,float ActualVar,float UHigLim,float ULowLim,float ErrDisIntegralLim)

{

int index;

pid.SetValue=SetVar;

pid.ActualValue=ActualVar;

pid.Umax=UHigLim;

pid.Umin=ULowLim;

pid.err=pid.ActualValue-pid.SetValue;

pid.errDisIntegralVar=ErrDisIntegralLim;

//积分饱和处理

if (pid.ActualValue>pid.Umax)

{

if (abs(pid.err)>pid.errDisIntegralVar)

{

index=1;

if (pid.err>0)

{pid.integral+=1.3*pid.err;}

}

else

{

index=1;

if (pid.err>0)

{ pid.integral+=1.2*pid.err;}

}

}

else if(pid.ActualValue<pid.Umin)

{

if (abs(pid.err)>pid.errDisIntegralVar)

{

index=1;

if (pid.err<0)

{pid.integral+=1.3*pid.err;}

}

else

{

index=1;

if (pid.err<0)

{pid.integral+=1.2*pid.err;}

}

}

else

{

if (abs(pid.err)>pid.errDisIntegralVar)

{

index=1;

pid.integral+=1.1*pid.err;

}

else

{index=1;

pid.integral+=pid.err;}

}

pid.ControlOutValue=pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);

pid.err_last=pid.err;

return pid.ControlOutValue;

}

标签: #c实现pid控制