通过Excel学习PID算法(一步步理解它的KP,KI,KD)

 PID原理

 PID控制算是应用非常广泛的经典控制算法。但是怎么理解PID这三个参数呢?在参考了别人的文章之后,我还是有点一知半解,这时候发现不自己动手算一算是很难理解PID了,但是我又不想做这种重复的计算,于是想到了通过Excel来举个例子。

接下来,我们通过一个很简单的例子来表示一个PID控制,并用Excel来计算PID带来的好处等等。这个例子就是,我们要往桶里倒水,并且我们的目标是把水位维持在1米高,初始水位为0.5米,只能往桶里一次一次的倒水。那么我们开始我们的学习吧。

比例控制算法

对于比例控制算法,我们可以简单的理解为,每次倒入水前计算当前的误差(error),然后给这个误差乘以一个比例系数kp。那么我们水位的改变量u与error之间的关系为:u=kp*error。然后就不停的计算误差,不停的往桶里倒水。在这里,通过excel表格计算可很直观的看出来,误差越来越小的,实际越来越接近1。

 

目标11111
实际(=上一次实际+kp*当前的error)0.50.50.750.8750.9375
error(上一次的目标-上一次的实际) 0.50.250.1250.0625
kp0.50.50.50.50.5

我们的比例算法很好的完成了它的任务,随着倒的次数越来越多,那么我们实际也更加接近于我们的目标值。那么我们为什么还需要使用到KI和KD呢?那么我们接下来提出一个假设,假设桶在漏水,每次往桶里倒水的同时,桶都会流失0.1米水高的水。因此每次的变化量为u=kp*error-0.1,继续用excel进行一次计算吧。

目标11111多次后1
实际(=上一次实际+kp*当前的error-0.1)0.50.40.550.6750.73750.799939
error(上一次的目标-上一次的实际) 0.50.450.3250.26250.200061
kp0.50.50.50.50.50.5

可以看到,我们每次往桶里加水之后,由于我们的桶漏水了,所以导致在多次倒水之后,我们的实际水高维持到0.8m附近,所以导致了一个稳态误差,这意味着我们通过比例控制算法是永远都不能实现到1米水高的愿望。 (在实际情况中,这种类似水缸漏水的情况往往更加常见,比如控制汽车运动,摩擦阻力就相当于是“漏水”,控制机械臂、无人机的飞行,各类阻力和消耗都可以理解为本例中的“漏水”)所以,单独的比例控制,在很多时候并不能满足要求。

积分控制算法

由于比例控制算法在实际应用过程中的局限性很大,因此我们就需要想个办法去消除这个稳态误差,而如何去消除这个稳态误差呢?我们可以想一个办法,我们把每次计算出来的误差累加起来,当如果遇到了稳态误差,那我们这个数据就会越来越大,因此每次更新数据时,就可以把它添加上去,就能把稳态误差解决啦。每次添加的水量的计算公式为u=kp*error-0.1+ ki∗积分

目标111111111111111
实际(=上一次实际+kp*当前的error-0.1+ki*积分)0.50.450.7051.01451.195051.2013451.0972310.9802450.9172930.9211040.9642811.0091241.0314661.028241.011019
error(上一次的目标-上一次的实际) 0.50.550.295-0.0145-0.19505-0.20135-0.097230.0197550.0827070.0788960.035719-0.00912-0.03147-0.02824
kp0.50.50.50.50.50.50.50.50.50.50.50.50.50.50.5
ki0.10.10.10.10.10.10.10.10.10.10.10.10.10.10.1
积分(=上一次的积分+本次的误差)00.51.051.3451.33051.135450.9341050.8368750.8566290.9393361.0182321.0539511.0448281.0133610.985121

这里我们取了一段很长的数据来分析一下,可以看到我们的实际值在1m附近不断的波动。我们的想法是,无限的趋进于1。但是看图表中的第九次(标红)和第十次(标红),我们可以发现我们的误差不是在缩小反而还更大了。那么为什么会有这种问题呢?这个肯定不是kp*error的问题,因为error非常小了。我们可以看到,由于积分维持在0.8左右,因此每次改变的量对于趋紧稳定后的数值来说,其变化量是很大的,因此其稍微改变一点,就会导致其误差变大。

同时可以看到在初期,对于使用积分控制算法来说,其超过了我们的目标值(超调量),最大达到了1.2m,如果我们的桶只有1.1m高,那么可能就会导致我们的水往外溢出来,这是我们不想看到的情况。如果在实际过程中,可能就因为温度过高或者电压过高,发生不可逆的后果。

而且我们可以看到u=kp*error-0.1+ki∗积分。当error趋紧为0时,那么每次添加的u为0。那么ki∗积分≈0.1。因此积分趋进于1。

通过百度百科我们可以知道:

1.比例环节 即时成比例的反映控制系统的偏差信号,偏差一旦产生,控制器立即产生控制作用,以减少偏差。通常随着值的加大,闭环系统的超调量加大,系统响应速度加快,但是当增加到一定程度,系统会变得不稳定。

2.积分环节 主要用于消除静差,提高系统的无差度(型别)。 [1]  积分作用的强弱取决于积分常数,积分常数越大,积分作用越弱,反之越强。闭环系统的超调量越小,系统的响应速度变慢。

微分控制算法

引进了积分项之后,我们的控制模型虽然解决了稳态误差,但是还是有问题。这个问题就是实际值在不断的波动。同时它还有一个超调量的东西。这是我们不希望看到的,那么我们该如何去解决这个问题呢?这里就需要引进微分的概念了。其理解可以想象成在往桶里加水时,我们可能能够预感到其会超过我们想要的数值,然后在加水之前,把一部分水给倒掉,从而达到降低其超调量的作用。微分在这里可以用相邻的error的差值进行表示,因此微分可以表示为:kd*(error(t)-error(t-1)),在这里我们的u=kp*error-0.1+ ki∗积分+kd*(error(t)-error(t-1))。值得注意的是,由于误差是越来越小的,因此其微分的值一般为负值。

 

目标111111111111111
实际(=上一次实际+kp*当前的error-0.1+ki*积分+kd*微分)0.50.450.710.9931.14441.153021.0849161.0116830.9718460.9681020.9838571.0011481.0102931.0105781.006119
error(上一次的目标-上一次的实际) 0.50.550.290.007-0.1444-0.15302-0.08492-0.011680.0281540.0318980.016143-0.00115-0.01029-0.01058
kp0.50.50.50.50.50.50.50.50.50.50.50.50.50.50.5
ki0.10.10.10.10.10.10.10.10.10.10.10.10.10.10.1
kd0.10.10.10.10.10.10.10.10.10.10.10.10.10.10.1
积分(=上一次的积分+本次的误差)00.51.051.341.3471.20261.049580.9646640.9529810.9811351.0130331.0291761.0280291.0177351.007157
微分(=本次的误差-上次的误差)  0.05-0.26-0.283-0.1514-0.008620.0681040.0732330.0398370.003744-0.01575-0.01729-0.00915-0.00029

其最大值为1.15,超调量得到了减小。至此,PID的每个过程的功能能够简单的理解到了。

excel文件:https://github.com/zengqz98/excelforpid

  • 18
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值