积分分离PIDsimulink仿真
积分分离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,超调量明显下降,曲线稳定时间差不多。