前言 近日刚接触PID,于是查找了所有资料(PID是经典算法,有很多文章),理解一大堆资料后,整理总结才写下在这篇博客。
自己也用STM32F103写些代码实现验证,先是单纯比例控制,后来PI控制,到最后PID控制,后续慢慢理解PID的改进及专家PID和模糊PID。

PID算法理解

首先,先理解PID指的是什么,PID即比例Proportion、积分Integral和微分Derivative的英文缩写。


这是算法的流程图。

接下来参考下面的博客,讲的已经很详细了,举了个例子方便理解PID。(比例部分的例子挺好的,讲的挺精彩的)
一文读懂PID控制算法(抛弃公式,从原理上真正理解PID控制)
(初学建议先看上面推文再继续阅读)

连续PID算法

先摆公式。


上面博客讲到了,不再赘述了。

PID算法离散化

在实际上用的最多的是,离散化的PID,也叫数字化PID。
将PID算法离散化,

离散化中,用K代替次数,表示第1,2,3…采样

偏差err(K)=设定值-实际值;
积分环节,连续用积分,离散用求和。即err(K)+err(K+1)+……;
积分时间,连续用周期T,离散用K表示(K是正整数);
微分环节,连续用微分,离散用差分。即[err(K)-err(K-1)];

离散化公式就变成:


Kp,Ki,Kd只是个系数,表现为比例、积分、微分环节的力度。

位置式PID

上面的式子就叫做位置式PID,它是根据你预期的设定位置,如速度在某个位置。
公式再贴一遍

增量式PID

增量式PID其实是位置式PID公式的变型
公式1:

在这里建议初学者,自己动手算一下,印象才会深刻。

按照上式后计算到下一步是,合并同类项,将所有的e(k)和e(k-1),e(k-2)合并起来,再将前面的系数修改为Kp,Ki,Kd得:
公式2:
注意:
1)公式1和2都是增量式PID,用哪个都行。
2)Kp,Ki,Kd只是系数,根据不同的控制系统设置不同的参数,公式照套,代码照搬,要变的是这些系数,PID的难点也在这些系数的设置,但是要先理解好PID的每个环节。下篇会讲到这些参数的整定。

3)由公式可以看出,增量式的表达结果和最近三次的偏差有关,这样就大大提高了系统的稳定性。需要注意的是最终的输出结果应该为

   u(K)+增量调节值;

位置式和增量式的区别

(1)位置式PID控制的输出与整个过去的状态有关,用到了误差的累加值;而增量式PID的输出只与当前拍和前两拍的误差有关,因此位置式PID控制的累积误差相对更大;
(2)增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。
(3)由于增量式PID输出的是控制量增量,如果计算机出现故障,误动作影响较小,而执行机构本身有记忆功能,可仍保持原位,不会严重影响系统的工作,而位置式的输出直接对应对象的输出,因此对系统影响较大。

(4)从嵌入式的角度分析,从C语言内存角度看,增量式不需要累加误差,而位置式累加误差会造成占用内存的增大,不利于程序长期运行,这点增量式更优。

位置式PID代码

第一步:定义PID变量结构体,代码如下
控制算法中所需要用到的参数在一个结构体中统一定义,方便后面的使用。

struct _pid{float SetSpeed;      //定义设定值float ActualSpeed;        //定义实际值float err;          //定义偏差值float err_last;      //定义上一个偏差值float Kp,Ki,Kd;      //定义比例、积分、微分系数float voltage;      //定义电压值(控制执行器的变量)float integral;      //定义积分值
}pid;

第二步:初始化变量,代码如下:

统一初始化变量,尤其是Kp,Ki,Kd三个参数,调试过程当中,对于要求的控制效果,可以通过调节这三个量直接进行调节。

void PID_init(){//printf("PID_init begin \n");pid.SetSpeed=0.0;pid.ActualSpeed=0.0;pid.err=0.0;pid.err_last=0.0;pid.voltage=0.0;pid.integral=0.0;pid.Kp=0.2;pid.Ki=0.015;pid.Kd=0.2;//printf("PID_init end \n");
}

第三步:编写控制算法,代码如下:

注意:这里用了最基本的算法实现形式,没有考虑死区问题,没有设定上下限,只是对公式的一种直接的实现,后面的介绍当中还会逐渐的对此改进。

float PID_realize(float speed){pid.SetSpeed=speed;pid.err=pid.SetSpeed-pid.ActualSpeed;pid.integral+=pid.err;pid.voltage=pid.Kp*pid.err+pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);pid.err_last=pid.err;pid.ActualSpeed=pid.voltage*1.0;return pid.ActualSpeed;
}

增量式PID代码

第一步

    struct _pid{float SetSpeed;      //定义设定值float ActualSpeed;        //定义实际值float err;          //定义偏差值float err_next;      //定义上一个偏差值float err_last;      //定义最上前的偏差值float Kp,Ki,Kd;      //定义比例、积分、微分系数}pid;

第二步

void PID_init(){pid.SetSpeed=0.0;pid.ActualSpeed=0.0;pid.err=0.0;pid.err_last=0.0;pid.err_next=0.0;pid.Kp=0.2;pid.Ki=0.015;pid.Kd=0.2;}

第三步

float PID_realize(float speed){pid.SetSpeed=speed;pid.err=pid.SetSpeed-pid.ActualSpeed;incrementSpeed=pid.Kp*(pid.err-pid.err_next)+pid.Ki*pid.err+pid.Kd*(pid.err-2*pid.err_next+pid.err_last);pid.ActualSpeed+=incrementSpeed;pid.err_last=pid.err_next;pid.err_next=pid.err;return pid.ActualSpeed;
}

总结PID算法,位置式增量式理解以及C代码实现相关推荐

  1. 搭建机器人电控系统——PID算法——位置式、增量式、模糊式PID

    PID算法 PID算法介绍,不同系数仿真,优缺点 位置式.增量式.模糊式PID 大林算法.史密斯算法和PID算法的区别 文章目录 PID算法 位置式PID和增量式PID 位置式PID: 增量式PID: ...

  2. 位置式\增量式PID、模糊PID、BRF-PID的Matlab实现以及封装

    位置式\增量式PID.模糊PID.BRF-PID的Matlab实现以及封装 位置式\增量式PID.模糊PID.BRF-PID的Matlab实现以及封装 简要 Model类 Strategy 类 PID ...

  3. 增量式速度pid调节策略_增量式PID是什么?不知道你就落伍了

    目录 1 什么是增量式PID? 2 举个例子 2.1 位置式PID 2.2 增量式PID 3 伪算法 4 C语言实现 5 总结 在之前一篇博客中( 简易PID算法的快速扫盲 )简单介绍了PID算法的基 ...

  4. PID算法实现及参数整定图解(附代码)

    一. PID含义 PID是英文单词比例(Proportion),积分(Integral),微分(Differential coefficient)的缩写.PID调节实际上是由比例.积分.微分三种调节方 ...

  5. c语言程序位置式pid算法,位置式PID算法的C语言代码

    描述 位置式PID的C语言写法详解 PID调节口诀: 参数整定找最佳,从小到大顺序查 先是比例后积分,最后再把微分加 曲线振荡很频繁,比例度盘要放大 曲线漂浮绕大湾,比例度盘往小扳 曲线偏离回复慢,积 ...

  6. 数字PI调节器_位置式/增量式_区别原理

    PI调节器是电力拖动自动控制系统中最常用的一种控制器 数字控制器需要对模拟控制器进行离散化 位置式PI 时域表达式转差分方程后的表达式: u(k)第K次的输出:e(k)第k次的误差:Tsam采样周期: ...

  7. 基于自适应算法和增量式PID算法的模拟直升飞机控制系统

    基于自适应算法和增量式PID算法的模拟直升飞机控制系统 文章目录 基于自适应算法和增量式PID算法的模拟直升飞机控制系统 控制系统硬件 单片机系统 传感器系统介绍 直升机模拟系统介绍 系统模块介绍 A ...

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

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

  9. 入门智能车 | 带你认识PID闭环控制 - 增量式PID实现电机速度闭环

    带你认识PID闭环控制 - 增量式PID实现电机速度闭环 闭环控制是指控制论的一个基本概念.指作为被控的输出量以一定方式返回到作为控制的输入端,并对输入端施加控制影响的一种控制关系.带有反馈信息的系统 ...

最新文章

  1. 转:Object-Runtime的基本数据类型
  2. USB Kill v2.0,一个可以瞬间烧毁电脑或平板的“U盘”
  3. unity 继承了 获取_获取继承链
  4. 【CyberSecurityLearning 30】Linux操作系统的用户和组、文件及目录权限
  5. php 查看方法来源,总结查看当前的方法分享
  6. AppCompat DayNight theme
  7. Java线程 Thread 的6种状态以及转变过程
  8. 最小公倍数和最大公约数
  9. 深度学习需要注意的11个方面
  10. 软考计算机基础:存储系统
  11. vss2005管理vs2010项目
  12. androidsettitle方法_Android 去掉title bar的3个方法
  13. 什么是OPTEE-OS
  14. Flash CS4运行时提示:Java运行时环境初始化时出现错误。您可能需要重新安装 Flash。解决方案
  15. 波利亚《如何解题 How to Solve It》
  16. 物联网NB-IoT技术商用正全面铺开 竞争日趋激烈
  17. win11、10下安装eNSP最新版(1.3.00.200T)并完美运行(转载)
  18. 欧姆龙CP系列PLC以太网通讯连接SCADA介绍
  19. [zz]yum缓存安装的软件
  20. Handler基本使用(一) new Handler

热门文章

  1. lingo3d学习之路
  2. 科学家破解卫星电话加密算法
  3. “当迷茫时就回到原点,或者退一步再思考” | 技术人金句系列
  4. 吴恩达-机器学习-一元线性回归模型实现
  5. Java 基于Excel模板实现导出Excel并插入数据
  6. token过期与使用步骤
  7. 程序员们,你们再这样下去会没朋友的。
  8. 神话新手卡ny0002
  9. 向上管理(中高层核心能力的表现)
  10. linux 安装 oracle 11g 数据库