前言

在刚接触到PID控制器的时候,我对增量式,位置式这些其实也是很懵的,然后又有什么速度环啊,位置环啊,电流环啊…巴拉巴拉一堆的,但是现在理解起来其实也就利用一些简简单单的离散数据运算出期望罢了。

首先假设我们已经知道了什么是Kp、Ki、Kd了(不知道的话那就看看我上一篇讲PID的那个文章)。

关于PID的算法可以分为两大类,一类是位置式,还有一类是增量式,下面就开始说说我对这两种算法的理解。

位置式PID

首先是位置式,也是我用得最多的一种算法。位置式PID其实就是当前系统实际位置,与你期望想要达到的位置的偏差而进行的PID控制。那么一个用位置式的系统中是什么样的呢?

看公式来理解:

Uk=Kp∗ek+Ki∑j=0kek+Kd(ek−ek−1)U_k= K_p*e_k+K_i\sum^k_{j=0}e_k+K_d(e_k-e_{k-1})Uk​=Kp​∗ek​+Ki​∑j=0k​ek​+Kd​(ek​−ek−1​)

由上式可以看出,PID的每次运算的输出都与过去的状态有关,并且积分项的误差会进行累加。如果偏差一直都是正的或者是负的,位置式PID在积分项就会一直累积,当偏差开始反向变化的时候,位置式PID需要一段时间才能从最大值减下来,会造成位置PID控制输出的滞后。所以我们还需要对积分项进行限幅(做一个最大值max和最小值min),同时也要对输出进行限幅。同时,我们输出的UkU_kUk​对应的是执行机构的实际位置,一旦控制输出出错了,也就是说我们控制的对象当前的状态值出现了问题,UkU_kUk​的大幅度变化就会影响到系统的大幅度变化。

所以我们如果单单使用位置式PID的时候,一般都是直接使用PD控制的,也正因为这样,位置式PID是用于执行机构不带积分部件的对象,像平衡车的直立控制呀、温控系统呀…等等。

下面是代码实现:

#define HAVE_PID_INTEGRAL#define LIMIT(TargetValue, LimitValue) \
if (TargetValue > LimitValue)\
{\TargetValue = LimitValue;\
}\
else if (TargetValue < -LimitValue)\
{\TargetValue = -LimitValue;\
}\typedef struct{float Kp;float Ki;float Kd;
#ifdef HAVE_PID_INTEGRALint index;            // 积分分离系数float Integral;       // 积分项float I_outputMax;    // 积分限幅
#endiffloat Last_Err;       // 上次误差float Output;         // PID输出float OutputMax;      // 位置式PID输出限幅
}Position_PID;void PositionPID_Calculate(Position_PID *pid,const float Target,const float Measure)
{if(pid == NULL)return;float Err;Err = Target - Measure;pid->Output = pid->Kp * Err + pid->Kd * (Err - pid->Last_Err)#ifdef HAVE_PID_INTEGRAL/* 积分分离 */if(abs(pid->Err) > Integraldead_zone){pid->index=0;}else{pid->index = 1;}pid->Integral += pid->Ki * Err * pid->index;LIMIT(pid->Integral,I_outputMax);pid->Output += pid->Integral;
#endifLIMIT(Output,OutputMax);pid->Last_Err = Err;}

优点:

位置式是一种非递推式算法,可以直接控制对象,U(k)的值与对象的实际当量是一一对应的,所以在不带积分部件的控制对象中可以很好应用。

缺点:

每次输出都与之前的状态有关,并且还要对误差值err进行累加,计算量大。

增量式PID

那么什么是增量式PID呢?增量式PID的输出只是控制量的增量ΔUk\Delta U_kΔUk​。当执行机构需要的控制量是增量,那么我们就可以采用增量式PID控制算法进行控制。(增量式PID的计算输出结果是增量,并不是直接作用到执行机构)

(增量式PID可以由位置式推导出,感兴趣的可以百度,这里就不浪费篇幅了。)

看公式来理解:

ΔUk=Kp(e(k)−e(k−1))+Kie(k)+KD[e(k)−2e(k−1)+e(k−2)]\Delta U_k=K_p(e(k)-e(k-1))+K_i{e(k)}+K_D[e(k)-2e(k-1)+e(k-2)]ΔUk​=Kp​(e(k)−e(k−1))+Ki​e(k)+KD​[e(k)−2e(k−1)+e(k−2)]

对于增量式PID来说,给定一个输入量,系统反馈回来的量与设定的量的偏差为Err,系统中保存上一次的偏差Last_Err和上上次的偏差Previous_Err,这三个输入量经过增量式PID可以计算得到上述说的控制量增量ΔUk\Delta U_kΔUk​。而得出的控制量ΔU(k)\Delta U(k)ΔU(k)对应的是近几次位置误差的增量,而不是对应与实际位置的偏差,也就是说没有误差累加。即在上一次的控制量的基础上需要增加控制量。

以下是代码实现:

#define LIMIT(TargetValue, LimitValue) \
if (TargetValue > LimitValue)\
{\TargetValue = LimitValue;\
}\
else if (TargetValue < -LimitValue)\
{\TargetValue = -LimitValue;\
}\#define Integraldead_zone 100 // 积分死区 根据自己的需求定义
typedef struct{float Kp;float Ki;float Kd;float p_out;float i_out;float d_out;float Err;float Last_Err;       // 上次误差float Previous_Err;   // 上上次误差float Output;float OutputMax;      // 增量式式PID输出限幅
}Incremental_PID;void IncrementalPID_Calculate(Incremental_PID *pid,const float Target,const float Measure)
{ if(pid == NULL)return;pid->Err = Target - Measure;pid->p_out = pid->Kp * (Err - Last_Err);pid->i_out = pid->Ki * Err;pid->d_out = pid->Kd * (Err - 2.0f*Last_Err + Previous_Err);pid->Output += p_out + i_out + d_out; LIMIT(pid->Output, pid->OutputMax); // 限幅pid->Previous_Err = pid->Last_Err;pid->Last_Err = Err;}

优点:

  1. 系统在误动作时影响小,并且可以利用逻辑判断来对错误数据进行去除。
  2. 冲激小,便于实现无扰动切换。
  3. 不需要累加误差值,并且控制增量的确定只与最近几次采样值有关。

缺点:

  1. 积分的阶段效应大,有稳态误差。
  2. 溢出的影响大,有的被控对象用增量式不好。

总结(增量式与位置式的区别)

  1. 增量式算法不需要做累加,增量式PID求出来的是系统需要的增量,并且增量的确定仅与最近几次偏差采样值有关,计算的误差对控制量计算的影响比较小。与位置式相比的话,位置式就需要用到偏差的累加值(Ki*err),容易产生累计误差。
  2. 增量式PID控制输出的是控制量增量,没有积分作用,所以该方法适用于带积分部件的对象。而位置式PID适用于执行机构不带积分部件的对象。
  3. 上面的代码也很清楚的显示了,位置式PID需要积分限幅和输出限幅,而增量式PID只需要输出限幅。

PID的增量式与位置式相关推荐

  1. c语言程序位置式pid算法,增量式与位置式PID算法(C语言实现与电机控制项目)...

    4.2核心代码 /************************************************************************** 函数功能:增量PI控制器 入口参 ...

  2. 用纯C语言分别实现增量式与位置式的PID自整定算法

    对于增量式PID自整定算法,C语言代码如下: #include <stdio.h>#define SAMPLE_TIME 0.1 // 采样时间 #define KP_DEFAULT 0. ...

  3. 增量式and位置式PID程序实现(内含详细注释)

    你好!这里是风筝的博客, 欢迎和我一起交流. 又是一年电赛时节.控制类必不可少的PID算法: 我也是从网上整理而来的: #include <stdio.h> #include <st ...

  4. 增量式和位置式PID

    先介绍几个概念,首先是比例带 比例带是一个无量纲的纯数值,其物理意义为:调节阀从全开到全关(输出做全量程范围变化时),输入(被控量)的变化占其全量程变化范围的百分数.如输入为温度,输出为阀门开度,1- ...

  5. 位置式PID与增量式PID的介绍和代码实现

    PID分为位置式PID与增量式PID. 一.位置式PID 1.表达式为: 2.缺点: 1).由于全量输出,所以每次输出均与过去状态有关,计算时要对ek进行累加,工作量大: 2).因为计算机输出的uk对 ...

  6. 位置式PID与增量式PID区别浅析

    1PID控制算法 什么是PID PID 控制器以各种形式使用超过了 1 世纪,广泛应用在机械设备.气动设备 和电子设备.在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法 PI ...

  7. 位置式和增量式PID控制

    PID控制是一个二阶线性控制器 定义:通过调整比例.积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能. 优点 a. 技术成熟 b. 易被人们熟悉和掌握 c. 不需要建立数学模型 d. ...

  8. 位置式PID与增量式PID区别浅析(百度百科增量式PID讲解思路概念更明确清晰)

    位置式PID与增量式PID区别浅析 Z小旋 2019-04-26 08:55:12  59882  收藏 713 分类专栏: NXP智能车学习 文章标签: 位置式PID PID 增量式PID 版权 1 ...

  9. 位置式Pid和增量式Pid的定义及应用

    PID算法是一个典型的闭环控制系统.P.I.D,比例.积分.微分. 开环:输入量对输出量没有反馈作用: 闭环:输入量对输出量有反馈作用. 位置式Pid 位置式Pid就是位置闭环控制,位置闭环控制就是根 ...

最新文章

  1. Protocol Buffer Java应用实例
  2. matlab 自动控制仿真,Matlab在自动控制系统建模与仿真中的应用
  3. 一种mac使用机械键盘的解决方案
  4. 【AWSL】之Linux源代码编译及配置yum源(tar 解包、./configure配置软件模块、make)
  5. JDK 9 REPL:入门
  6. XShell远程连接LInux服务器(地址端口映射方法)
  7. Linux下如何让普通用户具备sudo执行权限(普通用户提权)
  8. Openwrt之移动硬盘ext3/ext4格式化工具
  9. 三、主流区块链技术特点及Hyperledger Fabric V1.0版本特点
  10. 如何在 Mac 上禁用 Chrome 通知?
  11. java根据微信小程序code获取用户openId
  12. 5G关键技术之NFV
  13. 201671010443 徐明锦 词频统计软件项目报告
  14. Objectdock stacks docklet 无法启动程序快捷方式
  15. 世界上服务器最多的游戏,魔兽科普 国服人最多的几个服务器都什么来头
  16. swift php 类型判断,Swift 5.1 新特性:透明类型关键字 some
  17. GAN原理及Pytorch框架实现GAN(比较容易理解)
  18. Arduino :PWM详解和电路搭建以及示例代码
  19. 网页期末作业制作一个简单HTML电影网页设计(HTML+CSS)
  20. Android工程师应该具备的四大开发习惯

热门文章

  1. SQL语句大全—DBA数据(六)
  2. 2020中兴捧月算法大赛阿尔法赛道决赛总结(多目标检测与跟踪)
  3. AutoCAD二次开发经验总结
  4. 打开Sql数据库文件(扩展名为mdf)
  5. C++编译时提示:error: ‘x’ does not name a type
  6. 机器学习--机器学习的基本方法
  7. 安装2019Pycharm最新版本-详细教程--激活码
  8. Android | 电脑cmd中使用adb命令安装apk
  9. QGIS编译(跨平台编译)之十五:geos编译(Windows、Linux、MacOS环境下编译)
  10. cgcs2000大地坐标系地图_如下生成CGCS2000坐标系等高线