积分分离PIDsimulink仿真
想使用积分分离PID在simulink中进行仿真,我们需要写S函数。关于如何写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,超调量明显下降,曲线稳定时间差不多。