PID算法终于弄明白原理了,原来就这么简单

看起来PID高大尚,实则我们都是被他的外表所震撼住了。先被别人唬住,后被公式唬住,由于大多数人高数一点都不会或者遗忘,所以再一看公式,简直吓死。了解了很浅的原理后,结果公式看不懂,不懂含义,所以最终没有透彻。我这里先对公式进行剖析,公式理解明白了,结合网上的一些pid讲述的例子,就明白了。

先对PID这三个系数的含义进行简单扫盲,。同时也防止自己遗忘。P是比例系数,I是积分系数、D是微分系数。下面对PID这三个系数进行详细说明。

1.比例系数P是干什么用,其实如果现在你是初中生的话,你一下子就懂了,比例系数就是用在穿过(0,0)这个坐标点直线的放大倍数k,k越大,直线的斜率越大,所以是用在y = k * x中的,其中的k就是比例系数p,大家都简称为kp,所以就变成了y = Kp * x。

x就是当前值currentValue和目标值totalValue的差值,简称误差err,则err = currentValue - totalValue。y就是执行器对应的输出值U,所以执行器对应的输出值U = Kp * ( currentValue - totalValue ) 。

所以,如果说是使用比例进行调节。

则当前第1次调节时执行器对应的输出值为U1 = Kp * ( curentValue1 - totalValue1 )。

第2次调节时执行器对应的输出值为U2 = Kp * ( currentValue2 - totalValue2 )。

这就是比例系数P的应用,也就是大家说的比例调节。比例调节就是根据当前的值与目标值的差值,乘以了一个Kp的系数,来得到一个输出值,这输出值直接影响了下次当前值的变化。如果只有比例调节的话,系统会震荡的比较厉害。比如你的汽车现在运行的速度是60km/h,现在你想通过你的执行器去控制这个汽车达到恒定的50km/h,如果你只用kp进行比例调节话。U = Kp * ( 60 - 50 ),假设Kp取值为1,此时得到U执行器的输出值是10,结果当你执行器输出后,发现汽车一下变成了35Km/h,此时U2 = Kp * (35 - 50),此时得到U执行器的输出值是-15,结果当你执行器输出后,发现汽车变成了55Km/h,由于惯性和不可预知的误差因素,你的汽车始终无法达到恒定的50km/h。始终在晃动,相信如果你在车上,你一定吐的很厉害。所以光有比例系数进行调节,在有些场合是没有办法将系统调稳定的。所以可以为了减缓震荡的厉害,则会结合使用比例P和微分D。

2.微分系数D

微分,实际上是对误差进行微分。加入误差1是err(1)。误差2是err(2)。则误差err的微分是 (err2 - err1)。乘上微分系数D,大家叫做KD,则当执行器第1次调节后有了第1次的误差,第2次调节后有了第2次的误差,则结合P系数。就有了PD结合,根据每次调节时,误差的值的经验推算,你就能选取出D的系数。假如误差是越来越小的,那么微分后肯定是一个负值。负值在乘以了一个D系数 加上了比例调节的值后肯定值要比单纯使用比例调节的值要小,所以就启到了阻尼的作用。有了阻尼的作用就会使得系统区域稳定。PD结合的公式经过上面的分析后为

U(t) = Kp * err(t) + Kd * derr(t)/dt

3.积分系数I

积分,实际上是对误差的积分,也就是误差的无限和。如何理解积分系数I,这里引用网上的例子

以热水为例。假如有个人把我们的加热装置带到了非常冷的地方,开始烧水了。需要烧到50℃。

在P的作用下,水温慢慢升高。直到升高到45℃时,他发现了一个不好的事情:天气太冷,水散热的速度,和P控制的加热的速度相等了。 
这可怎么办?

P兄这样想:我和目标已经很近了,只需要轻轻加热就可以了。 
D兄这样想:加热和散热相等,温度没有波动,我好像不用调整什么。

于是,水温永远地停留在45℃,永远到不了50℃。

作为一个人,根据常识,我们知道,应该进一步增加加热的功率。可是增加多少该如何计算呢? 
前辈科学家们想到的方法是真的巧妙。

设置一个积分量。只要偏差存在,就不断地对偏差进行积分(累加),并反应在调节力度上。

这样一来,即使45℃和50℃相差不太大,但是随着时间的推移,只要没达到目标温度,这个积分量就不断增加。系统就会慢慢意识到:还没有到达目标温度,该增加功率啦! 
到了目标温度后,假设温度没有波动,积分值就不会再变动。这时,加热功率仍然等于散热功率。但是,温度是稳稳的50℃。 
kI的值越大,积分时乘的系数就越大,积分效果越明显。

所以,I的作用就是,减小静态情况下的误差,让受控物理量尽可能接近目标值。

I在使用时还有个问题:需要设定积分限制。防止在刚开始加热时,就把积分量积得太大,难以控制。

所以最终结合PID后,公司就变成了,本人直接从网上找了截图如下

原文地址:https://www.cnblogs.com/whylinux/p/10960319.html

时间: 2024-10-26 23:51:29

PID算法终于弄明白原理了,原来就这么简单的相关文章

关于java中是引用传递还是值传递的问题!!!经常在笔试中遇到,今天终于弄明白了!

关于JAVA中参数传递问题有两种,一种是按值传递(如果是基本类型),另一种是按引用传递(如果是對象).首先以两个例子开始:1)public class Test2 { public static void main (String [] args) { StringBuffer a = new StringBuffer ("A"); StringBuffer b = new StringBuffer ("B"); operate (a,b); System.out.

形象解释PID算法

形象解释PID算法+PID算法源代码 小明接到这样一个任务: 有一个水缸点漏水(而且漏水的速度还不一定固定不变),要求水面高度维持在某个位置,一旦发现水面高度低于要求位置,就要往水缸里加水. 小明接到任务后就一直守在水缸旁边,时间长就觉得无聊,就跑到房里看小说了,每30分钟来检查一次水面高度.水漏得太快,每次小明来检查时,水都快漏完了,离要求的高度相差很远,小明改为每3分钟来检查一次,结果每次来水都没怎么漏,不需要加水,来得太频繁做的是无用功.几次试验后,确定每10分钟来检查一次.这个检查时间就

PID算法的含义及其应用,PID基础,适合不懂PID算法的人来看!

                    先插句广告,本人QQ522414928,不熟悉PID算法的可以一起交流学习,随时在线 在正式进入正文前,补充一下本人学习PID算法的背景,先自我介绍一下:本人一名大三电子专业的学生,什么学校你就别管了,学校一般,普通的二本院校.到现在可以说我已经研究了快两年的PID,这期间做过帆板角度控制系统,做过平衡车,做过倒立摆,做过板球控制系统,做过openmv小球追踪系统,还做过四旋翼等--,可以说现在已经很熟悉PID算法,包括单级的PID算法和多级的PID算法.

线性控制原理——PID算法应用

使用控制系统(PID)控制被控对象 PID控制的三要素:控制器,被控对象,反馈器.控制器就是一个数学模型,就PID来说,等同于PID算法.是对反馈量的一个处理与输出.通俗的说就是对于每个被控的量,我的输出量通过什么函数式算出,或者说,我如何描述我的输出量.现在我给定一个描述性的传递函数.从数学角度来看:它的自变量是反馈值,当这个函数的对应关系确定了之后,输出量就是个定值了.我的希望是:这个描述函数是一个透明的空箱--它既能反映系统外部特性,又可以看到其内部结构. 就拿比赛来说:假设我现在要构建这

023_STM32之PID算法

(一)PID控制算法(P:比例 I:积分 D:微分) (二)首先先说明原理,使用的是数字PID算法,模拟PID算法在计算机这样的系统中是不能够直接使用的,数字PID算法又分为位置式PID控制算法和增量式PID控制算法,那么下面从原理上说明这两种算法 (三)原理分析如图 (四)从上面图中我们可以得到定义 定义变量 用户设定值: SV 当前值(实际值): PV 偏差: E = SV - PV (五)如果我们在一段时间内就从传感器读取一个值,那么我们就可以得到一个实际值的数据序列,,那么我们也会得到一

弄明白CMS和G1,就靠这一篇了

目录 1 CMS收集器 安全点(Safepoint) 安全区域 2 G1收集器 卡表(Card Table) 3 总结 4 参考 在开始介绍CMS和G1前,我们可以剧透几点: 根据不同分代的特点,收集器可能不同.有些收集器可以同时用于新生代和老年代,而有些时候,则需要分别为新生代或老年代选用合适的收集器.一般来说,新生代收集器的收集频率较高,应选用性能高效的收集器:而老年代收集器收集次数相对较少,对空间较为敏感,应当避免选择基于复制算法的收集器. 在垃圾收集执行的时刻,应用程序需要暂停运行. 可

PID算法(C语言)

/************ PID算法(C语言) ************/ #include <stdio.h> #include<math.h> struct _pid { int pv; /*integer that contains the process value*/ int sp; /*integer that contains the set point*/ float integral; float pgain; float igain; float dgain;

PID 算法理解

PID 算法 使用环境:受到外界的影响不能按照理想状态发展.如小车的速度不稳定的调节,尽快达到目标速度. 条件:闭环系统->有反馈 要求:快准狠 分类:位置式.增量式 增量式 输入:前次速度.前前次速度.前前前次速度 输出:pwm的增加值或减少值 位置式 输入: 输出: 公式 或 Kp 比例放大系数     Ti  积分时间    Td 微分时间 Kp比例放大系数  Ki 积分系数  Kd 微分系数

小车PID算法跑直线

#include<stm32f10x.h> #include"sys.h" extern unsigned char Rec_Dat_U1; extern unsigned char Rec_String_U1[200]; extern int conut_flag_1; #define in_1(x)    x?GPIO_ResetBits(GPIOC , GPIO_Pin_0): GPIO_SetBits(GPIOC , GPIO_Pin_0) #define in_2