积分分离PIDsimulink仿真

想使用积分分离PID在simulink中进行仿真,我们需要写S函数。关于如何写S函数构建灵活控制器,和写积分分离PID,可以看我往期博客。

S函数简单使用

PID各种算法

搭建模型

在这里插入图片描述

普通位置式PID调试:

在这里插入图片描述

进行PID参数整定:

在这里插入图片描述

积分分离式C代码

typedef struct
{
   volatile double      Proportion;             // 比例常数 Proportional Const
   volatile double      Integral;               // 积分常数 Integral Const
   volatile double      Derivative;             // 微分常数 Derivative Const
   volatile double      Error1;                 // Error[n-1]
   volatile double      Error2;                 // Error[n-2]
   volatile double      iError;                 // Error[n]
   volatile    double      Error_sum;
   volatile    double        index;                  //积分分离标志
} PID;

double PID_increase(int iError,PID* sptr) 
{

    double    iIncpid=0;
      sptr->iError=iError;                                    // 计算当前误差
    sptr->iError=iError;
    
   //积分分离处理 
  if(fabs(sptr->iError)> 180) sptr->index=1; 
  else sptr->index=1;
    sptr->Error_sum+=sptr->iError;
  iIncpid=sptr->Proportion * sptr->iError                  // P
         +sptr->Integral * sptr->Error_sum*sptr->index               // I
         +sptr->Derivative * (sptr->iError-sptr->Error1); // D
  iIncpid=PID_OutputLimit(iIncpid);//限幅处理
  sptr->Error1=sptr->iError;                    // 存储误差,用于下次计算                            
  return(iIncpid);          // 返回计算值
    
}

引入积分分离调试

if(fabs(sptr->iError)> 25) sptr->index=1; //index是积分分离标志位
 else sptr->index=1;

判断积分误差值太小,积分部分不起作用,存在较大静差。

在这里插入图片描述

对积分值的判断条件进行调整:
也就是这个判断条件进行调整,调试找到比较合适的值:

if(fabs(sptr->iError)> 150) sptr->index=1; //index是积分分离标志位
else sptr->index=1;

在这里插入图片描述

继续调整值:

  if(fabs(sptr->iError)> 150) sptr->index=1; //index是积分分离标志位
else sptr->index=1;

在这里插入图片描述

通过一简单调试,发现对比普通位置式PID,超调量明显下降,曲线稳定时间差不多。