基本的PID算法整理(水缸的例子有问题!!)
一,先谈关于水缸漏水的问题
谈到PID原理入门的时候,大家经常会举的一个例子就是水缸漏水的例子。这里把一个解释水缸漏水的帖子放在这里:https://blog.csdn.net/qq_41736609/article/details/80035400。我就不对这个例子进行展开讲解了,这里我要首先谈的是,这个例子对大家的一个误导。我们先看一个典型的PID控制的简单系统:

我们可以看到,在这个系统下,误差函数error(t)经过PID调节后得到的e(t)。会由经过控制系统的传递函数而得到yout(t),这里我们就会发现一个问题:在水桶问题对PID调节的讲解中,我们是通过error(t)对水桶的加水情况进行了一个补正的,但是实际情况是什么呢?在PID的控制系统中,我们是直接通过PID调节得到的函数作为了控制系统的输入函数,而非补正,因为在这里我认为大家经常谈论的水桶问题对PID的入门有一个非常大的误导。下面我会从流程控制图的角度为大家解释PID控制的基本原理。
二,从流程控制图的角度对PID算法的作用进行解释
首先老规矩,列出PID控制算法的基本公式:
,只要是稍微接触PID算法的人,想必对这个公式是很熟悉了,接下来会针对PID中的三个参量,逐步进行讲解。
1.从开机以来传感器所有采样点的一个数据序列
X1、X2、X3、…Xk-2、Xk-1、Xk
2.分析采样点的数据序列,可以挖掘出3个方向上的信息
①Ek=Sv-Xk
1)Ek >0 当前未达标
2)Ek =0 已经达标
3)Ek <0 当前已经超标
我们设定OUT = Kp*Ek,为了简单起见,直接把系统的传递函数默认为1,这样得到的yout = OUT,初看时好像很难做到,但是我们首先考虑不存在外部扰动的情况,这时由前面的关系式可以推出:rin - yout = Ek,又有,yout = Kp*Ek,可以推导出表达式:rin = yout + Ek = (Kp + 1)Ek。我们发现了什么?实际上rin和yout是有一个确定的关系存在的,并且这个关系和Kp相关,Kp越大,两者便越接近。(有朋友提到P控制方案有一个缺点,也就是Ek等于0的时候不会进行控制,实际上是不存在这点的,我们可以看到当Ek等于0后,yout随之改变,系统再次出现闭环,实现了闭环的负反馈。
-------------------------------------------------------------分割线---------------------------------------------------------
这里是积分讲解部分:
②Ek=Sv-Xk
X1、X2、X3、…Xk-2、Xk-1、Xk
在每一时刻都会产生一个误差,将其记录下来即为一个误差序列:
E1、E2、E3…Ek-2、Ek-1、Ek
这些误差中有正有负,大于零说明未达标,小于零即为已达标。
Sk= E1+E2+E3…Ek+Ek-1+Ek
1)Sk>0 过去这段时间,大多数是未达标的。
2)Sk=0过去这段时间,大多数是已达标的(可能性很小)。
3)Sk<0过去这段时间,大多数是已超达标的。
我们有提到过单纯的P调节的问题:也就是当yout受到外部扰动时,单纯的P调节很难让系统稳定下来,这个时候就需要积分调节起作用了,这里可以先举一个不太恰当的比喻,也就是在yout后面放置一个-0.2t的扰动,yout = Kp*Ek - 0.2t,因为在每次的调节过后,都会受到这样一个扰动。同样我们写出yout与rin的关系式,此时这个关系式变成了:yout = (Kp*rin - 0.2t)/(Kp +1),这里才是我们应该注意的问题,就是说这个部分会有一个-0.2t的误差一直是存在的。而且随着系统运行时间的变化,这个误差还会逐渐增大。这里我们看一看下面的例子:

此为一个去掉了积分参数,然后再输出函数中加入一个时间函数进行扰动的例子,他的对比图如下所示:

我们可以看到,这里引入这个与时间正相关的扰动,会使得没有I参数的调节完全失效,输出变量将会随着时间的增长不断增加。然后我们看看在加入积分调节后,情况会变得怎么样:

与之前相比,这里引入了一个积分的调节功能,让我们看看他的调节波形:

很明显可以看到,我们之前逐渐偏离的问题,因为积分调节的引入被成功解决了。
--------------------------------分割线------------------------------------
这里是微分讲解部分:微自动控制系统在克服误差的调节过程中可能会出现振荡甚至是失稳,其原因是由于存在有较大惯性组件(环节)或滞后组件,具有抑制误差的作用,其变化总是落后于误差的变化。解决的办法是使抑制误差作用的变化“超前”,即在误差接近零时,抑制误差的作用就应该是零。而只引入P项是不够的,它仅仅是放大了误差的幅值,但是加入微分项后,它能预测误差变化的趋势,从而避免了被控量严重超调,正是D控制的预测作用,改善了系统调节过程中的动态特性,加快了调节也就是消除误差的过程。在微分D控制中,输出与输入误差信号的微分(即误差的变化率)成正比关系。
(pid联合控制时的方式为,P控制先走到98或102,然后I控制在100步处来回晃几次,而此时D的作用是减少晃的幅度、次数等振荡因素以及避免失稳情况的发生,从而改善系统调节过程中的动态特性,加快了调节过程也就是消除误差的过程,完成控制。)该部分摘自:https://blog.csdn.net/baidu_39525096/article/details/89460966?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
推荐的PID书籍:《先进PID控制MATLAB仿真(第二版)》
链接:https://pan.baidu.com/s/1dZwl6Xl7DddRnR1VsAKBeg
提取码:ipi0
基本的PID算法整理(水缸的例子有问题!!)的更多相关文章
- PID算法笔记2
总所周知,PID算法是个很经典的东西.而做自平衡小车,飞行器PID是一个必须翻过的坎.因此本节我们来好好讲解一下PID,根据我在学习中的体会,力求通俗易懂.并举出PID的形象例子来帮助理解PID.一. ...
- PID算法
所谓PID就是比例-积分-微分的英文缩写,但并不是必须同时具备这三种算法,也可以是 PD, PI,甚至只有 P算法控制,下面分别介绍每个参数的含义:首先需要明确一个事实就是,要实现PID算法,必须在硬 ...
- 单片机之PID算法
说到PID算法,想必大部人并不陌生,PID算法在很多方面都有重要应用,比如电机的速度控制,恒温槽的温度控制,四轴飞行器的平衡控制等等,作为闭环控制系统中的一种重要算法,其优点和可实现性都成为人们的首选 ...
- 四轴PID思路整理
参考资料: https://blog.csdn.net/nemol1990/article/details/45131603 https://blog.csdn.net/qq_27114397/art ...
- 广告成本控制-PID算法
今天我们来聊聊广告成本控制中常用的PID算法. 0.PID算法简介 首先我们可以看下维基百科中给PID算法的定义:由比例单元(Proportional).积分单元(Integral)和微分单元(Der ...
- 线性控制原理——PID算法应用
使用控制系统(PID)控制被控对象 PID控制的三要素:控制器,被控对象,反馈器.控制器就是一个数学模型,就PID来说,等同于PID算法.是对反馈量的一个处理与输出.通俗的说就是对于每个被控的量,我的 ...
- PID算法学习记录
最近做项目需要用到PID算法,这个本来是我的专业(控制理论与控制工程),可是我好像是把这个东西全部还给老师了. 没办法,只好抽时间来学习了. 先占个座,后续将持续更新!
- 位置式PID与增量式PID算法
位置式PID与增量式PID算法 PID控制是一个二阶线性控制器 定义:通过调整比例.积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能. 优点 ...
- PID算法(c 语言)(转)
PID算法(c 语言)(来自老外) #include <stdio.h> #include<math.h> //定义PID 的结构体 struct _pid { int pv; ...
随机推荐
- Java 泛型(参数化类型)
Java 泛型 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所 ...
- Fiddler显示指定host请求,以及过滤无用的css,js
第一步 右侧窗口点击filters 第二步 点击Use Fiters 第三步 第一个选项不动 no zone filter ,第二个选项选择 show only following hosts 第四步 ...
- 第1章 Spark SQL概述
第1章 Spark SQL概述 1.1 什么是Spark SQL Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作 ...
- 使用client-go自定义开发Kubernetes
参考链接:使用client-go自定义开发Kubernetes 1.本地运行 apiserver demo [root@wangjq demo]# apiserver-boot run local / ...
- linux下udev和mdev的使用
linux下设备文件系统有devfs.udev和mdev这三种. 一.devfs devfs是由Linux 2.4内核引入的,引入时被许多工程师给予了高度评价,它的出现使得设备驱动程序能自主地管理自己 ...
- GA教程:使用自定义变量来扩展高级细分
http://www.wocaoseo.com/thread-64-1-1.html 您可以使用自定义变量来扩展高级细分的范围. 高级细分依据的标准是用户的会话(访问)数据.如果某个访问者在指定日期范 ...
- 企业网站SEO如何选择关键词
http://www.wocaoseo.com/thread-17-1-1.html 企业网站的关键词应该如何去选择?有很多的企业老板在网上某某企业在网上做了一个网站,一天盈利多少后,觉得 ...
- UTF-8、GB2312、GBK编码格式详解和编码示例
UTF-8.GB2312.GBK编码格式详解 参考文章 UTF-8 使用1~4个字节对每个字符进行编码 128个ASCII字符字需要一个字节编码 带有附加符号的拉丁文.希腊文.西里尔字母.亚美尼亚语. ...
- 23种设计模式 - 状态变化(Memento备忘录 - State)
其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 状态变化 在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的 ...
- 超简单集成华为HMS ML Kit文本识别SDK,一键实现账单号自动录入
前言 在之前的文章<超简单集成华为HMS Core MLKit通用卡证识别SDK,一键实现各种卡绑定>中我们给大家介绍了华为HMS ML Kit通用卡证识别技术是如何通过拍照自动识别卡 ...