Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 103492|回复: 27

使用PID库,轻松搞定PID(上)

  [复制链接]
发表于 2015-4-13 15:27 | 显示全部楼层 |阅读模式
最近才知道有PID库这个东西,既然有PID库,那就可以像其他的库一样,通过调用库里的函数,就可以轻松地实现PID了。pid库可以在https://github.com/br3ttb/Arduino-PID-Library/这里下载。

然后配合着库里给的例程和这篇帖子http://www.arduino.cn/thread-3826-1-1.html,应该就会使用PID了。
——————————————————————————————————————————————————————————————————
我很好奇地看了一下库给的介绍。我觉得写得很基础、易懂。于是就翻译到这儿吧,给自己也备一个份。
原文的地址在这儿:http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/
还参考了syl312的帖子:http://www.arduino.cn/thread-4535-1-1.html

每个接触PID的人,都知道PID的公式吧:
pidalgorithm.png

然后根据这个公式,就可以编出计算output的arduino程序如下:
图像 4.png

注:程序源码可以在原文上复制。

可是在上面的程序中,当PID不规则的调用时就会出现两个问题:
1.有时候定时调用,有时候又停止调用,将得不到PID的持续稳定特性。
2.需要额外对积分和微分进行数学计算,因为他们都是和时间息息相关的。

解决方法:保证PID在一个固定的的时间间隔内被调用,我通过每个周期内事先设置好的采样时间调用compute函数,PID再决定是计算还是立即返回数值。一旦我们知道PID在固定时间间隔内被调用,积分和微分的计算就能被简化。
于是我们的程序就变成了:

图像 5.png

灰色部分是新加的语句。
在这个新的程序中,作者在29行把时间转化为秒。这样可以简化运算。同时新加入后面两个函数把PID参数转化为以秒为基准的参数。

当上面的PID程序在运行中,可能会出现微分过冲的问题。
DonE.png
看上面的图,因为error=Setpoint-Input,只要Setpoint发生改变,就会导致error的值发生一个突变。在微分运算里这种微分值的突变是无穷大的。
解决方法:
DonMExplain.png

于是我们的程序就变成了:
图像 6.png

可以看到我们只是用-dInput代替掉了+dError。


当我们的PID在运行的时候,这个时候改变PID的参数,会导致输出发生变化,如:
BadIntegralCode.png

我们只是把ki的值减少一半,输出就减少了一半。为什么会这样呢?可以从下面的积分公式里找到原因:
1.png

这就解释了为什么KI没改变之前系统工作的一直很稳定。突然,你乘了一个新的KI值与之前的偏差累计总和。这样带来的变化不是我们所希望的,我们只想改变后能朝着我们希望的方向发展。
解决方法:解决的方法有很多,我在最新的Arduino PID库里使用的方法是重新调整errSum(偏差总和).KI变为原来的两倍时,把errSum变为原来的一半,虽然这个方法有点笨拙,下面有更加明智的方法。这个方法要求有基础的代数基础或者计算技巧。
3.png

把KI乘到里面,虽然看起来没什么变化,但是我们将会看到这个小变化带来了很大的不同。现在我们将error和Ki相乘。并且把乘积和保存起来,当Ki变化时,这时不会有很大的变化了,因为之前的KI的乘积和值已经存储起来了。
于是我们的程序就变成了:
2.png

这样,我们再改变参数,输出也不会发生很大的变化。
4.png











发表于 2016-6-24 10:54 | 显示全部楼层
还是搞不懂一个事。。。就是只有Kp  Kd改变时为什么不会对输出有影响?Ki的影响是主要的?
发表于 2015-4-13 15:50 | 显示全部楼层
请教一个困扰我很久的问题:单纯的比例调节,为什么不能消除静差?能用数学公式推到出来就更好了!谢谢!
发表于 2015-4-13 17:15 | 显示全部楼层
z586 发表于 2015-4-13 15:50
请教一个困扰我很久的问题:单纯的比例调节,为什么不能消除静差?能用数学公式推到出来就更好了!谢谢! ...

输出=误差*比例系数。所以静态误差是永远不能为零的。比例加积分的话可以把静态误差搞得比较小,因为积分环节会维持基本输出。
发表于 2015-4-20 17:08 | 显示全部楼层
mark,学习一下
发表于 2015-9-3 16:08 | 显示全部楼层
这个最后的目标是output输出为0????
发表于 2016-5-11 16:32 | 显示全部楼层
学习了,谢谢提供
发表于 2016-5-11 17:39 | 显示全部楼层
谢谢分享~         
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|Arduino中文社区

GMT+8, 2022-10-7 20:57 , Processed in 0.033099 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表