电机控制
直播中

贾熹

7年用户 1600经验值
私信 关注
[文章]

收藏干货 PID算法实现

这是在公众号上看到的一篇文章,整理了一下,为后面看方便。PID算法
1 什么是PID
  • PID,即比例Proportion积分Integral微分Derivative三个单词的缩写。
  • 闭环自动控制技术是基于反馈的概念以减少不确定性,在闭环自动控制原理中,我们把它叫做“PID控制器”,拿控制电机来说,参考下面模型:


  • 下面引用一段网上经典的话:
在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握PID算法的设计与实现过程,对于一般的研发人员来讲,应该是足够应对一般研发问题了,而难能可贵的是,在我所接触的控制算法当中,PID控制算法又是最简单,最能体现反馈思想的控制算法,可谓经典中的经典。经典的未必是复杂的,经典的东西常常是简单的,而且是最简单的,想想牛顿的力学三大定律吧,想想爱因斯坦的质能方程吧,何等的简单!简单的不是原始的,简单的也不是落后的,简单到了美的程度。
2 PID原理
  • 常规的模拟PID控制系统原理框图如下:

  • 该系统由模拟 PID 控制器和被控对象组成。
  • 上面框图中, r(t) 是给定值, y(t) 是系统的实际输出值,给定值与实际输出值构成控制偏差e(t) = r(t) − y(t).
  • e(t) 作为 PID 控制的输入, u(t)作为 PID 控制器的输出和被控对象的输入。 所以模拟 PID 控制器的控制规律为:

三个重要的参数:Kp:控制器的比例系数.
Ti:控制器的积分时间,也称积分系数.
Td:控制器的微分时间,也称微分系数.
  • P – 比例部分
比例环节的作用是对偏差瞬间作出反应。偏差一旦产生控制器立即产生控制作用, 使控制量向减少偏差的方向变化。 控制作用的强弱取决于比例系数Kp, 比例系数Kp越大,控制作用越强, 则过渡过程越快, 控制过程的静态偏差也就越小; 但是Kp越大,也越容易产生振荡, 破坏系统的稳定性。 故而, 比例系数Kp选择必须恰当, 才能过渡时间少, 静差小而又稳定的效果。
  • I  – 积分部分
积分环节的调节作用虽然会消除静态误差,但也会降低系统的响应速度,增加系统的超调量。积分常数Ti越大,积分的积累作用越弱,这时系统在过渡时不会产生振荡; 但是增大积分常数Ti会减慢静态误差的消除过程,消除偏差所需的时间也较长, 但可以减少超调量,提高系统的稳定性。
当 Ti 较小时, 则积分的作用较强,这时系统过渡时间中有可能产生振荡,不过消除偏差所需的时间较短。所以必须根据实际控制的具体要求来确定Ti 。
  • D – 微分部分
实际的控制系统除了希望消除静态误差外,还要求加快调节过程。在偏差出现的瞬间,或在偏差变化的瞬间, 不但要对偏差量做出立即响应(比例环节的作用), 而且要根据偏差的变化趋势预先给出适当的纠正。为了实现这一作用,可在 PI 控制器的基础上加入微分环节,形成 PID 控制器。
微分环节的作用使阻止偏差的变化。它是根据偏差的变化趋势(变化速度)进行控制。偏差变化的越快,微分控制器的输出就越大,并能在偏差值变大之前进行修正。微分作用的引入, 将有助于减小超调量, 克服振荡, 使系统趋于稳定, 特别对髙阶系统非常有利, 它加快了系统的跟踪速度。但微分的作用对输入信号的噪声很敏感,对那些噪声较大的系统一般不用微分, 或在微分起作用之前先对输入信号进行滤波。
3 PID算法代码
  • PID 控制算法可以分为位置式 PID增量式 PID 控制算法。
两者的区别
(1)位置式PID控制的输出与整个过去的状态有关,用到了误差的累加值;而增量式PID的输出只与当前拍和前两拍的误差有关,因此位置式PID控制的累积误差相对更大;
(2)增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。
(3)由于增量式PID输出的是控制量增量,如果计算机出现故障,误动作影响较小,而执行机构本身有记忆功能,可仍保持原位,不会严重影响系统的工作,而位置式的输出直接对应对象的输出,因此对系统影响较大。
  • 下面给出公式直接体现的C语言源代码(请结合项目修改源代码):
位置式PID

typedef struct{  float Kp;                       //比例系数Proportional  float Ki;                       //积分系数Integral  float Kd;                       //微分系数Derivative  float Ek;                       //当前误差  float Ek1;                      //前一次误差 e(k-1)  float Ek2;                      //再前一次误差 e(k-2)  float LocSum;                   //累计积分位置}PID_LocTypeDef;/************************************************函数名称 : PID_Loc功    能 : PID位置(Location)计算参    数 : SetValue ------ 设置值(期望值)            ActualValue --- 实际值(反馈值)            PID ----------- PID数据结构返 回 值 : PIDLoc -------- PID位置作    者 : strongerHuang*************************************************/float PID_Loc(float SetValue, float ActualValue, PID_LocTypeDef *PID){  float PIDLoc;                                  //位置  PID->Ek = SetValue - ActualValue;  PID->LocSum += PID->Ek;                         //累计误差  PIDLoc = PID->Kp * PID->Ek + (PID->Ki * PID->LocSum) + PID->Kd * (PID->Ek1 - PID->Ek);  PID->Ek1 = PID->Ek;  return PIDLoc;}增量式PID
​ △u(k) = u(k) – u(k-1)
​ = Kp[ e(k) – e(k-1)] + Ki*e(k) + Kd[e(k) – 2e(k-1) + e(k-2)]
typedef struct{  float Kp;                       //比例系数Proportional  float Ki;                       //积分系数Integral  float Kd;                       //微分系数Derivative  float Ek;                       //当前误差  float Ek1;                      //前一次误差 e(k-1)  float Ek2;                      //再前一次误差 e(k-2)}PID_IncTypeDef;/************************************************函数名称 : PID_Inc功    能 : PID增量(Increment)计算参    数 : SetValue ------ 设置值(期望值)            ActualValue --- 实际值(反馈值)            PID ----------- PID数据结构返 回 值 : PIDInc -------- 本次PID增量(+/-)作    者 : strongerHuang*************************************************/float PID_Inc(float SetValue, float ActualValue, PID_IncTypeDef *PID){  float PIDInc;                                  //增量  PID->Ek = SetValue - ActualValue;  PIDInc = (PID->Kp * PID->Ek) - (PID->Ki * PID->Ek1) + (PID->Kd * PID->Ek2);  PID->Ek2 = PID->Ek1;  PID->Ek1 = PID->Ek;  return PIDInc;}




回帖(1)

贾熹

2020-6-22 12:04:31
在实际工程中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。
PID控制器问世至今以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。
当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定,这时应用PID控制技术最为方便。即当我们不完全了解一个系统和被控对象,或不能通过有效的测量手段来获得系统参数时,最适合用PID控制技术。
PID控制,实际中也有PI和PD控制。PID控制器就是根据系统的误差,利用比例、 积分、微分计算出控制量进行控制的。PID控制器的参数整定是控制系统设计的核心内容!
如果你从来没有接触过PID,看完这篇文章你就会明白PID控制到底是怎么回事了!
1.假设我们面对的系统是一个简单的水箱液位,要从空箱开始注水达到某个高度,而你能控制的变量就是注水笼头的开关大小。这个简单的数学模型就是:dx=u。
对于这个系统,我们只需要一个比例环节u=kpe就能将其控制住。
此时,kp的大小代表了水龙头的粗细(即出水量大小对液位误差的敏感程度,假设水龙头开度与误差正比关系),越粗调的越快,也就是所谓的"增大比例系数一般会加快系统响应"。如下图:

2.假设这个水箱不仅仅是装水的容器了,还需要持续稳定的给用户供水。这个系统的数学模型就需要增加一项:dx=u-c,这里的c是个正的常数。
我们发现如果控制器只有一个比例环节,那么当系统稳定,也就是dx=0的时候,恰好e=c/kp,在系统稳定时不为0,液位离我们想要的高度总是差那么一点,这也就是所谓的稳态误差,或者叫静差。
这时候c是固定的,那么当然kp越大,e就越小。这也就是所谓的增大比例系数P在有静差的情况下有利于减小静差。如下图:

3.从上面的公式e=c/kp可以看出,kp再大也不可能把e变成0。老是调不到预定位置老板是会骂人的,这可咋办?
然后有人就想到,第二小节里头水箱跟第一小节的相比,就多了一个漏水的窟窿。它漏多少我给它补多少,那不就成了第一小节里的简单系统了么!靠谁补呢?积分环节这时候就派上用场了。
我们把之前的控制器变成比例环节+积分环节:

积分环节的意义就相当于你增加了一个水龙头,这个水龙头的开关规则是水位比预定高度低就一直往大了拧,比预定高度高就往小了拧。如果漏水速度不变,那么总有一天这个水龙头出水的速度恰好跟漏水的速度相等了,系统就和第一小节一样了。那时,静差就没有了。这就是所谓的积分环节可以消除系统静差。
4.什么叫积分时间常数呢?一般PID控制里,表示积分环节敏感度的那个系数中,Ti就是积分时间常数。从这个式子我们可以看出,积分时间常数越大,积分环节系数就越小,积分环节就越不敏感(也就是第二个水龙头越细)。
当只有一个比例环节的水龙头注水的时候,是不会注水注多的,因为离得越近水龙头关的越小。
但是当用两个水龙头注水的时候,在没到预定高度前第二个积分环节的水龙头可以一直往大了拧,当到达预定高度的时候它恰好拧到最大,自然而然就会注水注多了,而多出去的这部分水叫做“超调”。第二个水龙头越粗,多注的水就会越多,它调到恰好等于漏水速度的时间就会越快,同时会多更多波折。
于是,老师告诉我们增大积分时间I有利于减小超调,减小振荡,使系统的稳定性增加,但是系统静差消除时间变长。如下图:

5.接下来看点有意思的东西。还是上面这个系统,假如我们选用相同的积分时间常数,但是选择不同的比例系数会如何呢?

看到上面这幅图,一些记性好的童鞋可能会有疑问。因为老师明明说过”过大的比例系数会使系统有比较大的超调,并产生振荡,使稳定性变坏“,但是上面这幅图里怎么比例大的反而超调小呢?
其实上面这幅图很好解释,小节4里我们说明了PI控制器超调出现原因是积分这个水龙头在到达目标液位时也恰好开到了最大。而比例这个水龙头越粗,那么它在超出目标液位时对超调的抑制也就越明显。
这里,我想强调的是:PID参数整定的结论是根据普遍经验总结的,但是针对某个具体的系统不一定完全适用。
6.在上面的系统中,我们假设用户用水的固定的一个值,但是实际情况中用户的用水量往往是变化的。假如我们的系统是dx=u-c(t)呢?
我们试着来分析一下:
我们的控制目标是让x=xd,系统误差的定义是:e=xd-x;
那么,误差状态方程就是:;
我们设定的控制目标是个常数,所以xd=0;
,从这个式子可以看出,当e=0时,不再变化,而c(t)是始终变化的。
此时de不恒为零,也就是说e不恒为零。
当c变成c(t)的时候,e=0就不再是系统的稳定平衡点了,经典意义上系统不再稳定。
7.这里加一个微分环节D变成PID控制会不会让系统重新稳定呢?
当加入微分环节,

,那么,

,对于任意,微分环节都让de的变化减慢了。
这也就是“微分环节主要作用是在响应过程中抑制偏差向任何方向的变化”,“微分常数不能过大,否则会使响应过程提前制动,延长调节时间”。
至于“微分环节会提高系统抗扰动能力,降低系统抗噪声能力”,更多指的是大多数细微测量噪声造成的e很小,但瞬时的de较大,微分环节相对于PI环节更容易收到这些细微噪声的影响。
但是,无论如何选取微分参数,PID控制都不能使系统稳定。
从这里,我们可以看到PID控制的局限。
希望大家不要死记口诀,多用所学到的控制理论来针对具体问题具体分析。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分