打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
PID控制器开发笔记之三:抗积分饱和PID控制器的实现

积分作用的引入是为了消除系统的静差,提高控制精度。但是如果一个系统总是存在统一个方向的偏差,就可能无限累加而进而饱和,极大影响系统性能。抗积分饱和就是用以解决这一问题的方法之一。这一节我们就来实现抗积分饱和的PID算法。

1、抗积分饱和的基本思想

所谓积分饱和就是指系统存在一个方向的偏差,PID控制器的输出由于积分作用的不断累加而扩大,从而导致控制器输出不断增大超出正常范围进入饱和区。当系统出现反响的偏差时,需要首先从饱和区退出,而不能对反向的偏差进行快速的响应。

为了解决积分饱和的问题,人们引入了抗积分饱和的PID算法。所谓抗积分饱和算法,其思路是在计算U(k)的时候,先判断上一时刻的控制量U(k-1)是否已经超出了限制范围。若U(k-1)>Umax,则只累加负偏差;若U(k-1)<Umin,则只累加正偏差。从而避免控制量长时间停留在饱和区。

2、算法实现

抗积分饱和的思想很简单,解释在控制器输出的最大最小值附近限制积分的累积情况,以防止在恢复时没有响应。根据前面得分系我们可以得到如下的流程图:

2.1、位置型PID算法实现

对于位置型PID的抗积分饱和算法其实就是在基本的PID基础上加上抗积分饱和的操作,增加量个机锋的极限值。首先定义PID对象的结构体:

  1. /*定义结构体和公用体*/
  2. typedef struct
  3. {
  4.   floatsetpoint;       //设定值
  5.   floatproportiongain;     //比例系数
  6.   floatintegralgain;      //积分系数
  7.   floatderivativegain;    //微分系数
  8.   floatlasterror;     //前一拍偏差
  9.   floatresult; //输出值
  10.   floatintegral;//积分值
  11.   floatmaximum;//最大值
  12.   floatminimum;//最小值
  13. }PID;

接下来实现PID控制器:

  1. void PIDRegulation(PID *vPID, float processValue)
  2. {
  3.   floatthisError;
  4.  thisError=vPID->setpoint-processValue;
  5.  if(vPID->result>vPID->maximum)
  6.   {
  7.    if(thisError<=0)
  8.     {
  9.      vPID->integral+=thisError;
  10.     }
  11.   }
  12.   elseif(vPID->result<vPID->minimum)
  13.   {
  14.    if(thisError>=0)
  15.     {
  16.      vPID->integral+=thisError;
  17.     }
  18.   }
  19.   else
  20.   {
  21.    vPID->integral+=thisError;
  22.   }
  23.  vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+vPID->derivativegain*(thisError-vPID->lasterror);
  24.  vPID->lasterror=thisError;
  25. }

2.2、增量型PID算法实现

增量型PID的抗积分饱和的实现也是一样在最基本的增量型PID算法中引入极大极小的限值,并在算法中通过比较限值实现抗饱和的操作。

首先定义PID对象的结构体:

  1. /*定义结构体和公用体*/
  2. typedef struct
  3. {
  4.   floatsetpoint;       //设定值
  5.   floatproportiongain;     //比例系数
  6.   floatintegralgain;      //积分系数
  7.   floatderivativegain;    //微分系数
  8.   floatlasterror;     //前一拍偏差
  9.   floatpreerror;     //前两拍偏差
  10.   floatdeadband;     //死区
  11.   floatresult; //输出值
  12.   floatmaximum;//最大值
  13.   floatminimum;//最小值
  14. }PID;

接下来实现PID控制器:

  1. void PIDRegulation(PID *vPID, float processValue)
  2. {
  3.   floatthisError;
  4.   floatincrement;
  5.   floatpError,dError,iError;
  6.  thisError=vPID->setpoint-processValue; //得到偏差值
  7.  pError=thisError-vPID->lasterror;
  8.   iError=0;
  9.  dError=thisError-2*(vPID->lasterror)+vPID->preerror;
  10.  if(vPID->result>vPID->maximum)
  11.   {
  12.    if(thisError<=0)
  13.     {
  14.      iError=thisError;
  15.     }
  16.   }
  17.   elseif(vPID->result<vPID->minimum)
  18.   {
  19.    if(thisError>=0)
  20.     {
  21.      iError=thisError;
  22.     }
  23.   }
  24.   else
  25.   {
  26.    iError=thisError;
  27.   }
  28.  increment=vPID->proportiongain*pError+vPID->integralgain*iError+vPID->derivativegain*dError;   //增量计算
  29.  vPID->preerror=vPID->lasterror; //存放偏差用于下次运算
  30.  vPID->lasterror=thisError;
  31.  vPID->result+=increment;
  32. }

3、总结

所谓抗积分饱和就是防止由于长期存在一个方向的偏差而对相反方向的偏差迟滞响应。本文的方法是在达到极值后将不再对这一方向的偏差做出反应相反只对另一方向的偏差做出反应。事实上由于偏差的存在有可能造成输出值超限的情况,所以还需要对输出值作出限制。

欢迎关注:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
PID控制器开发笔记之一:PID算法原理及基本实现
增量式PID控制C语言代码
电子控制经典不衰的算法——PID,附上国电赛的核心程序和建议
PID控制器开发笔记之十二:模糊PID控制器的实现
PID(偏差比例-积分-微分 控制器)
PID通俗教程
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服