0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

经典PID控制器的积分分离优化算法

454398 来源:博客园 作者:木南创智 2020-11-04 14:24 次阅读

我们已经讲述了PID控制器的实现,包括位置型PID控制器和增量型PID控制器。但这个实现只是最基本的实现,并没有考虑任何的干扰情况。在本节及后续的一些章节,我们就来讨论一下经典PID控制器的优化与改进。这一节我们首先来讨论针对积分项的积分分离优化算法

1、基本思想

我们已经讲述了PID控制引入积分主要是为了消除静差,提高控制精度。但在过程的启动、结束或大幅度增减设定值时,短时间内系统输出有很大偏差,会造成PID运算的积分累积,引起超调或者振荡。为了解决这一干扰,人们引入了积分分离的思想。其思路是偏差值较大时,取消积分作用,以免于超调量增大;而偏差值较小时,引入积分作用,以便消除静差,提高控制精度。

具体的实现步骤是:根据实际情况,设定一个阈值;当偏差大于阈值时,消除积分仅用PD控制;当偏差小于等于阈值时,引入积分采用PID控制。则控制算法可表示为:

其中β称为积分开关系数,其取值范围为:

由上述表述及公式我们可以知道,积分分离算法的效果其实与ε值的选取有莫大关系,所以ε值的选取实际上是实现的难点,ε值过大则达不到积分分离的效果,而ε值过小则难以进入积分区,ε值的选取存在很大的主观因素。

对于经典的增量式PID算法,似乎没有办法由以上的公式推导而来,因为β随着err(k)的变化在不是修改着控制器的表达式。其实我们可以换一种角度考虑,每次系统调节未定后,偏差应该为零,然后只有当设定值改变时,系统才会响应而开始调节。设定值的改变实际上是一个阶跃变化,此时的控制输出记为U0,开始调节时,其调节增量其实与之前的一切没有关系。所以我们就可以以变化时刻开始为起点,而得到带积分分离的增量算法,以保证在启动、停止和快速变化时防止超调。公式如下:

其中β的取值与位置型PID算法一致。可能有人会担心偏差来回变化,造成积分作用的频繁分离和引入,进而使上述的增量表达式无法实现。其实我们分析一下就能发现,在开始时,由于设定值变化引起的偏差大而分离了积分作用,在接近设定值时,偏差变小就引入了积分,一边消除静差,而后处于稳态,直到下一次变化。

2、算法实现

这一部分,我们根据前面对其基本思想的描述,来实现基于积分分离的PID算法实现,同样是包括位置型和增量型两种实现方式。首先我们来看一下算法的实现过程,具体的流程图如下:

有上图我们知道,与普通的PID算法的区别,只是判断偏差的大小,偏差大时,为PD算法,偏差小时为PID算法。于是我们需要一个偏差检测与积分项分离系数β的函数。

 1 static uint16_t BetaGeneration(float error,float epsilon)
 2 
 3 {
 4 
 5   uint16_t beta=0;
 6 
 7   if(abs(error)<= epsilon)
 8 
 9 {
10 
11   beta=1;
12 
13 }
14 
15 return beta;
16 
17 }

1)位置型PID算法实现

根据前面的分析我们可以很轻松的编写程序,只需要在编写程序时判断偏差以确定是否引入积分项就可以了。同样先定义PID对象的结构体:

 1 /*定义结构体和公用体*/
 2 
 3 typedef struct
 4 
 5 {
 6 
 7   float setpoint;       //设定值
 8 
 9   float proportiongain;     //比例系数
10 
11   float integralgain;      //积分系数
12 
13   float derivativegain;    //微分系数
14 
15   float lasterror;     //前一拍偏差
16 
17   float result; //输出值
18 
19   float integral;//积分值
20 
21   float epsilon; //偏差检测阈值
22 
23 }PID;

接下来实现PID控制器:

 1 void PIDRegulation(PID *vPID, float processValue)
 2 
 3 {
 4 
 5   float thisError;
 6 
 7   thisError=vPID->setpoint-processValue;
 8 
 9   vPID->integral+=thisError;
10 
11   uint16_t beta= BetaGeneration(error, vPID->epsilon);
12 
13   if(beta>0)
14 
15 {
16 
17   vPID->result=vPID->proportiongain*thisError+vPID->derivativegain*(thisError-vPID->lasterror);
18 
19 }
20 
21 else
22 
23 {
24 
25 vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+vPID->derivativegain*(thisError-vPID->lasterror);
26 
27 }
28 
29  
30 
31   vPID->lasterror=thisError;
32 
33 }

与普通的PID算法的区别就是上述代码中增加了偏差判断,来决定积分项的分离与否。

2)增量型PID算法实现

对于增量型PID控制,我们也可以采取相同的处理。首先定义PID对象的结构体:

 1 /*定义结构体和公用体*/
 2 
 3 typedef struct
 4 
 5 {
 6 
 7   float setpoint;       //设定值
 8 
 9   float proportiongain;     //比例系数
10 
11   float integralgain;      //积分系数
12 
13   float derivativegain;    //微分系数
14 
15   float lasterror;     //前一拍偏差
16 
17   float preerror;     //前两拍偏差
18 
19   float deadband;     //死区
20 
21   float result; //输出值
22 
23   float epsilon; //偏差检测阈值
24 
25 }PID;

接下来实现PID控制器:

 1 void PIDRegulation(PID *vPID, float processValue)
 2 
 3 {
 4 
 5   float thisError;
 6 
 7   float increment;
 8 
 9   float pError,dError,iError;
10 
11  
12 
13   thisError=vPID->setpoint-processValue; //得到偏差值
14 
15   pError=thisError-vPID->lasterror;
16 
17   iError=thisError;
18 
19   dError=thisError-2*(vPID->lasterror)+vPID->preerror;
20 
21   uint16_t beta= BetaGeneration(error, vPID->epsilon);
22 
23   if(beta>0)
24 
25 {
26 
27 increment=vPID->proportiongain*pError+vPID->derivativegain*dError;   //增量计算
28 
29 }
30 
31 else
32 
33 {
34 
35 increment=vPID->proportiongain*pError+vPID->integralgain*iError+vPID->derivativegain*dError;   //增量计算
36 
37 }
38 
39   vPID->preerror=vPID->lasterror;  //存放偏差用于下次运算
40 
41   vPID->lasterror=thisError;
42 
43   vPID->result+=increment;
44 
45 }

这就实现了增量型PID控制器积分分离算法,也没有考虑任何的干扰条件,仅仅只是对数学公式的计算机语言化。

3、总结

积分分离算法的思想非常简单。当然,对于β的取值,很多人提出了改进措施,例如分多段取值,设定多个阈值ε1、ε2、ε3、ε4等,不过这些阈值也需要根据实际的系统来设定。除了分段取值外,甚至也有采用函数关系来获取β值。当然,这样处理后就不再是简单的积分分离了,特别是在增量型算法中,实际上已经演变为一种变积分算法了。已经偏离了积分分离算法的设计思想,在后面我们会进一步说明。
编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4452

    浏览量

    90746
  • PID控制器
    +关注

    关注

    2

    文章

    156

    浏览量

    18332
  • PD控制器
    +关注

    关注

    0

    文章

    20

    浏览量

    16337
收藏 人收藏

    评论

    相关推荐

    什么是pid控制,其控制作用是什么

    信号进行比例、积分和微分运算,从而实现系统的稳定控制和性能优化PID控制器由三个部分组成:比例控制器
    的头像 发表于 02-01 14:51 972次阅读

    什么是PID控制器PID控制器积分控制介绍

    PID,就是“比例(proportional)、积分(integral)、微分(derivative)”,是一种很常见的控制算法
    的头像 发表于 01-11 18:14 818次阅读
    什么是<b class='flag-5'>PID</b><b class='flag-5'>控制器</b>?<b class='flag-5'>PID</b><b class='flag-5'>控制器</b><b class='flag-5'>积分控制</b>介绍

    STM32控制中常见的PID算法总结

    在很多控制算法当中,PID控制算法又是最简单,最能体现反馈思想的控制
    发表于 12-27 14:07 417次阅读
    STM32<b class='flag-5'>控制</b>中常见的<b class='flag-5'>PID</b><b class='flag-5'>算法</b>总结

    【技术干货】PID算法原理分析及优化

    饱和优化处理 若系统持续存在一个方向的偏差时,PID控制器的输出由于积分作用不断累加而增大,从而导致控制器输出产生超调进入饱和区。 当系统出
    发表于 12-22 15:38

    飞行控制PID算法的作用解析

    PID控制器是一种线性控制器,它主要根据给定值和实际输出值构成控制偏差,然后利用偏差给出合理的控制量,目前,人们通过科学研究获得了诸多具有优
    的头像 发表于 11-27 10:57 704次阅读
    飞行<b class='flag-5'>控制</b><b class='flag-5'>PID</b><b class='flag-5'>算法</b>的作用解析

    PID算法原理分析及优化

    等行业中应用广泛。下面就跟着小编一起来学习PID算法的原理分析及优化,快来get!一、PID原理PID
    的头像 发表于 11-08 08:23 723次阅读
    <b class='flag-5'>PID</b><b class='flag-5'>算法</b>原理分析及<b class='flag-5'>优化</b>

    控制算法PID积分控制(I)的原理和示例代码

    积分(I)项是PID控制器的一个重要组成部分,它对系统的控制输出做出反应,以减小系统的静态误差,即长时间内误差积累导致的误差。积分项的作用是
    的头像 发表于 11-02 08:00 801次阅读
    <b class='flag-5'>控制</b><b class='flag-5'>算法</b><b class='flag-5'>PID</b>之<b class='flag-5'>积分控制</b>(I)的原理和示例代码

    控制算法PID之比例控制(P)的原理和示例代码

    PID是“比例-积分-微分”的缩写,是一种广泛用于控制系统的反馈控制算法PID
    的头像 发表于 11-01 08:00 1028次阅读
    <b class='flag-5'>控制</b><b class='flag-5'>算法</b><b class='flag-5'>PID</b>之比例<b class='flag-5'>控制</b>(P)的原理和示例代码

    LabVIEW中PID控制的的高级功能

    LabVIEW中PID控制的的高级功能 比例-积分-微分(PID控制占当今控制和自动化应用的9
    的头像 发表于 10-24 14:30 735次阅读
    LabVIEW中<b class='flag-5'>PID</b><b class='flag-5'>控制</b>的的高级功能

    如何使用PID控制算法优化控制系统

    当涉及到控制系统中的精确调节和稳定性,PID(比例-积分-微分)控制算法是一种不可或缺的工具。本文将简单介绍
    的头像 发表于 08-29 16:39 1337次阅读
    如何使用<b class='flag-5'>PID</b><b class='flag-5'>控制</b><b class='flag-5'>算法</b><b class='flag-5'>优化</b><b class='flag-5'>控制</b>系统

    PID经典教程

    PID算法通过误差信号控制被控量,而控制器本身就是比例、积分、微分三个环节的加和。史上最全的PID
    发表于 08-23 16:46 2次下载

    PID中比例控制积分控制的作用 PID的参数整定过程

    前面的文章已经针对PID进行过分析:PID是比例、积分、微分的三种控制方式组合成的控制算法的称谓
    的头像 发表于 08-22 11:16 5878次阅读
    <b class='flag-5'>PID</b>中比例<b class='flag-5'>控制</b>和<b class='flag-5'>积分控制</b>的作用 <b class='flag-5'>PID</b>的参数整定过程

    PID控制算法代码 PID控制算法的原理

    一. 简介 相信大家对于PID控制算法,都不感到陌生了,平衡车就是靠它平衡起来的,还有飞控的平衡算法也是它,以及FOC中的闭环控制中也是用的
    的头像 发表于 07-20 09:23 1362次阅读
    <b class='flag-5'>PID</b><b class='flag-5'>控制</b><b class='flag-5'>算法</b>代码 <b class='flag-5'>PID</b><b class='flag-5'>控制</b><b class='flag-5'>算法</b>的原理

    PID控制算法是什么

    ** PID控制算法** ,是结合比例(P)、积分(I)和微分(D)三环所提供的负反馈信号来修正系统误差,以保障系统相对稳定或平衡的控制
    的头像 发表于 05-19 16:48 1279次阅读
    <b class='flag-5'>PID</b><b class='flag-5'>控制</b><b class='flag-5'>算法</b>是什么

    一文了解透彻PID控制

    ** PID是比例(Proportional)、积分(Integral)、微分(Derivative)的缩写,将偏差的比例、积分、微分通过线性组合构成控制量,用这一
    的头像 发表于 05-19 16:44 2104次阅读
    一文了解透彻<b class='flag-5'>PID</b><b class='flag-5'>控制</b>