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

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

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

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

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

2、算法实现

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

1)位置型PID算法实现

对于位置型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 result; //输出值
18
19   float integral;//积分值
20
21   float maximum;//最大值
22
23   float minimum;//最小值
24
25 }PID;

接下来实现PID控制器:

 1 void PIDRegulation(PID *vPID, float processValue)
 2
 3 {
 4
 5   float thisError;
 6
 7   thisError=vPID->setpoint-processValue;
 8
 9   if(vPID->result>vPID->maximum)
10
11   {
12
13     if(thisError<=0)
14
15     {
16
17       vPID->integral+=thisError;
18
19     }
20
21   }
22
23   else if(vPID->result<vPID->minimum)
24
25   {
26
27     if(thisError>=0)
28
29     {
30
31       vPID->integral+=thisError;
32
33     }
34
35   }
36
37   else
38
39   {
40
41     vPID->integral+=thisError;
42
43   }
44
45
46
47   vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+vPID->derivativegain*(thisError-vPID->lasterror);
48
49   vPID->lasterror=thisError;
50
51 }

2)增量型PID算法实现

增量型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 maximum;//最大值
24
25   float minimum;//最小值
26
27 }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=0;
18
19   dError=thisError-2*(vPID->lasterror)+vPID->preerror;
20
21
22
23   if(vPID->result>vPID->maximum)
24
25   {
26
27     if(thisError<=0)
28
29     {
30
31       iError=thisError;
32
33     }
34
35   }
36
37   else if(vPID->result<vPID->minimum)
38
39   {
40
41     if(thisError>=0)
42
43     {
44
45       iError=thisError;
46
47     }
48
49   }
50
51   else
52
53   {
54
55     iError=thisError;
56
57   }
58
59   increment=vPID->proportiongain*pError+vPID->integralgain*iError+vPID->derivativegain*dError;   //增量计算
60
61   vPID->preerror=vPID->lasterror;  //存放偏差用于下次运算
62
63   vPID->lasterror=thisError;
64
65   vPID->result+=increment;
66
67 }

3、总结

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

原文地址:https://www.cnblogs.com/foxclever/p/8995308.html

时间: 2024-10-10 06:15:56

PID控制器开发笔记之三:抗积分饱和PID控制器的实现的相关文章

PID控制器开发笔记之二:积分分离PID控制器的实现

前面的文章中,我们已经讲述了PID控制器的实现,包括位置型PID控制器和增量型PID控制器.但这个实现只是最基本的实现,并没有考虑任何的干扰情况.在本节及后续的一些章节,我们就来讨论一下经典PID控制器的优化与改进.这一节我们首先来讨论针对积分项的积分分离优化算法. 1.基本思想 我们已经讲述了PID控制引入积分主要是为了消除静差,提高控制精度.但在过程的启动.结束或大幅度增减设定值时,短时间内系统输出有很大偏差,会造成PID运算的积分累积,引起超调或者振荡.为了解决这一干扰,人们引入了积分分离

PID控制器开发笔记之四:梯形积分PID控制器的实现

从微积分的基本原理看,积分的实现是在无限细分的情况下进行的矩形加和计算.但是在离散状态下,时间间隔已经足够大,矩形积分在某些时候显得精度要低了一些,于是梯形积分被提出来以提升积分精度. 1.梯形积分基本思路 在PID控制其中,积分项的作用是消除余差,为了尽量减小余差,应提高积分项的运算精度.在积分项中,默认是按矩形方式来计算积分,将矩形积分改为梯形积分可以提高运算精度.其计算公式为: 于是如果在位置型PID算法中引入梯形积分则可以修改计算公式如下: 同样要在增量型PID算法中引入梯形积分则可以修

Kinect开发笔记之三Kinect开发环境配置具体解释

0.前言: 首先说一下我的开发环境,Visual Studio是2013的,系统是win8的64位版本号,SDK是Kinect for windows SDK 1.8版本号.尽管前一篇博文费了半天劲,翻译了2.0SDK的新特性.但我还是决定要回退一个版本号. 事实上我之前一直在用2.0的SDK在调试Kinect,但无奈实验室提供的Kinect是for Windows 1.0版本号的,并且Kinect从1.8之后就好像是一个分水岭,就比方win8和win7有非常大的区别,2.0版的Kinect和S

Modbus库开发笔记之三:Modbus TCP Server开发

在完成了前面的工作后,我们就可以实现有针对性的应用了,首先我们来实现Modbus TCP的服务器端应用.当然我们不是做具体的应用,而是对Modbus TCP的服务器端应用进行封装以供有需要时调用. 这里我们不涉及TCP的协议,这部分与Modbus没有必然联系,我们只是在其应用层运行Modbus协议而已. 对于Modbus TCP的服务器我们需要实现几个功能:首先是对接收到客户端命令进行解析,我们只实现前面提到的8中常用的功能吗的支持.其次在解析完成后,我们要实现对应各种功能码的操作.具体架构如下

STM32F412应用开发笔记之三:SPI总线通讯与AD采集

本次我们在NUCLEO-F412ZG试验模拟量输入采集.我们的模拟量输入采用ADI公司的AD7705,是一片16位两路差分输入的AD采集芯片.具有SPI接口,我们将采用SPI接口与AD7705通讯.两路输入一路接氧气传感器,一路接氢气传感器. 氧气传感器有两种,一种是顺磁氧气传感器,输出信号是4-20mA.所以须在输出端并一个250欧姆的电阻然后接到AD7705的采集小板上.灰色的线和白色的线分别是正负极.其样式如下: 另一种氧气传感器是电化学方式的,由于电化学传感器输出为毫伏信号(0-60mV

Neo4j图数据库管理系统开发笔记之三:构建安全的RMI Service(Server)

RMI Server(服务端)主要包括以下功能:远程用户权限验证管理.远程服务接口实现类.Neo4j实体映射转换等.项目目录结构如下图所示: 3.2.1 远程用户权限验证管理 3.2.1.1 用户权限验证机制 用户权限验证机制分为三个层级. 第一级,远程主机IP地址验证.检查是否允许远程主机IP地址访问RMI服务. 第二级,远程用户信息验证.检查用户名称和密码是否正确,用户是否启用等. 第三级,远程服务及接口方法验证.检查用户是否有权访问某个RMI服务以及服务下的指定接口方法. 3.2.1.2

PID--抗积分饱和法--004

#include <stdio.h> #include <stdlib.h> #include <string.h> /*********************************************************************** 所谓的积分饱和现象是指如果系统存在一个方向的偏差, PID 控制器的输 出由于积分作用的不断累加而加大, 从而导致执行机构达到极限位置, 若控制器 输出 U(k)继续增大, 执行器开度不可能再增大, 此时计算机

LeapMotion控制器 java语言开发笔记--(LeapMotion控制器简介)

(1)LeapMotion系统识别和追踪手,手指,以及根手指类似的工具,这个设备运行在一个极小的范围,这个范围拥有个高精度,高跟踪频率可以记录离散的点,手势,和动作. (2)LeapMotion控制器使用的是光学传感器和红外线,当控制器在其标准操作位置,有大约150度的视野时光学传感器直接沿y轴向上.在控制器上面(2英尺到1英寸)LeapMotion控制器的有效范围从25到600毫米.控制器有一个明确的.高对比度的视图对象轮廓时,控制器的检测和追踪效果最好.                  

python运维开发笔记4

1.函数如何被调用,通过return返回值来调用 2.生成器和return区别 yield 生成器返回对象,可以迭代 可以执行 glob模块 类似shell中的正则匹配 shlex模块  Popen 将命令参数直接分词 cmd = "ps ax -o pid,ppid,cmd" shlex.split(cmd) ['ps','ax','-o','pid,ppid,cmd'] ['mysql','-u','root','-p123','-e','show processlist'] p