前言:
眼前你们对“c实现pid控制”大概比较重视,姐妹们都需要了解一些“c实现pid控制”的相关内容。那么小编也在网络上汇集了一些有关“c实现pid控制””的相关文章,希望我们能喜欢,小伙伴们快快来学习一下吧!经典控制PID控制器-C语言代码的实现
// 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控制