打印

刚学PID的一点想法

[复制链接]
12797|51
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qjmxxgui|  楼主 | 2010-8-12 08:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这几天稍微看了一点点的PID,今天有了小小头绪,于是,就想把自己的想法写出来,欢迎拍砖。

     最开始的时候,是先了解什么是PID。PID实指“比例proportional”、“积分integral”、“微分derivative”,如果我们要求被控制的对象最终趋于一个稳定的结果,一般就可以使用PID算法。假设说,有一辆速度为1m/s的小车,我们要求他的速度改变为5m/s,要完成这样的一件事,我们必须要有,1.小车驱动装置(用程序控制它输出多大的电压,电压决定驱动的马力),2.被驱动器控制的部分(即小车),3.检测当前速度的装置(当前速度与目标速度的差称为误差)。本来,我们可以给小车一个驱动力让小车加速,直到检测到小车速度达到5m/s,撤去驱动力。然而,这样做会带来几个问题。1,当小车速度达到5m/s时,从装置检测到这个速度,通知控制器,让控制器改变输出的电压,这一个过程需要耗费一定时间,在这个时间里面,小车速度可能增加了不少。2,撤去驱动力后,外界条件如摩擦会让小车速度进一步改变。PID算法可以在一定误差内解决这些问题。
   使用PID算法时,大致是这样的。每一个采样周期,通过速度检测装置获得当前速度,传入程序,通过程序计算得到电压控制小车得到新速度。下一个采样周期又把新速度传入,获得新电压,再传入速度,再获得电压,如此反复。
   PID算法的关键,是如何根据当前得到的速度值,输出一个“恰当”的电压,以致小车最终能够趋于稳定。
      PID算法采用比例,积分,微分三种方法进行控制。三种方法都有自己对应的一个常量(pconst,iconst,dconst)。这三个变量都需要在实验中多次尝试得出。
  一般地,先把与算法相关的量放入一个结构体,方便调用。
  srtuct PID
     {
    double   pconst,    //比例控制常量
          iconst,     //积分控制常量
          dconst;    //微分控制常量
    double   ErrorSum;      //误差累计
    double   iMax,iMin;      //积分上下限
    double   Vnew;         //当前速度
         };
  比例:
    Vnew = GetV();            //获得当前速度
    error = aim - Vnew;      //误差=目标速度 - 当前速度
    pTerm = error*pconst;     //比例项的值就是误差乘上比例常量
    Motor(pTerm);    //让电机根据得出的值工作
        有时候,我们增大比例常数可以让小车更快的到达目标速度,但是过大的比例常数又容易产生过冲,即速度超过目标速度5m/s,然后再减速,再加速,在减速。这样,系统产生振荡,然而,振荡的结果不一定能趋于稳定。

  积分:
                Vnew = GetV();            //获得当前速度
    ErrorSum += (aim - Vnew);      //每一次的误差累计起来
    if(ErrorSum > iMax)ErrorSum = iMax;
    else if(ErrorSum < iMin)ErrorSum = iMin;
    iTerm = ErrorSum *iconst;     //误差和乘上积分常量
    Motor(iTerm);    //让电机根据得出的值工作
  一般我们都让比例配合积分一起使用,即PI算法,类似上面的程序,得出pTerm和iTerm,然后Motor(pTerm+iTerm)。PI控制一般会比纯比例控制花费更少时间使小车到达目标值,但是我们必须避免积分饱和,通常的做法是像上面程序一样设定iMax和iMin。它们和积分常量的大小相关。
  
  微分:
  我们用比例控制或者PI控制,都不能保证任何系统一定能趋于稳定。比例控制根据现在来控制。积分控制根据过去来控制。而微分能够根据将来来控制,非常强大,能使被控设备更好地趋于稳定。
    Vnew = GetV();            //获得当前速度
    dTerm = (Vnew - Vlast)*dconst;     //当前速度 - 上次速度,再乘微分常数
    Vlast = Vnew ;              //保留本次速度,下次当成上次速度使用
    Motor(dTerm);    //让电机根据得出的值工作
  同样,微分控制也是与比例,积分一起使用,形成PID算法,Motor(pTerm+iTerm+dTerm)。
  微分控制相当强大,然而也很容易出问题。具体调控和整定我想等到实际应用时再学习。
评分
参与人数 1威望 +1 收起 理由
xuyiyi + 1

相关帖子

沙发
highgear| | 2010-8-12 09:19 | 只看该作者
顶一个。

本来我打算过一阵也写一点关于 pid 控制的,可以在这里先探讨一下。

使用特权

评论回复
板凳
saintgreat| | 2010-8-14 20:48 | 只看该作者
强人!我看了有一点点懂,貌似不太懂!
谢谢

使用特权

评论回复
地板
原野之狼| | 2010-8-15 00:39 | 只看该作者
支持原创

使用特权

评论回复
5
渤海三叠浪| | 2010-8-15 07:38 | 只看该作者
好贴......
原创好贴
早就想知道PID是什么了

使用特权

评论回复
6
woshixinshou| | 2010-8-15 08:24 | 只看该作者
引用百度知道比较通俗的理解:
“PID算法就是在给你讲了一大堆自动控制理论以后,告诉你现实生活中控制对象的数学模型是很难建立的,大家根据经验和一定的数学计算发现了一种控制算法可以很好的满足要求,这种控制算法由三个部分组成:一个是比例相(P),一个是积分相(I),一个是微分相(D)。这三项的作用不同,举个例子,现在有一池子水,水池底开了一个洞,这个洞每秒钟排水为X,你现在要控制水龙头向池子里注水以保持水是满的。先看比例相,如果只有比例相,Y=P*X,你会发现水最多不会减少,永远不会回到满的状态(术语叫存在静差),为了消除净差就要有积分项,因为积分可以反映以前的状态(为什么可以?不是吧,翻翻高等数学吧,电路分析电容参数的计算也会有所启发)。这时候你会发现池子里的水会满出来很多又漏下去(超调量),这就要引入微分相缩小净差迅速稳定输出。因为微分能够反映将来趋势。”

使用特权

评论回复
7
fzkqi| | 2010-8-15 12:37 | 只看该作者
PID还不会,应该要学一下

使用特权

评论回复
8
linqing171| | 2010-8-15 12:44 | 只看该作者
6楼的这个不应该测量水的多少来建模。
假设X是随着水高度等会变化的。

唯一需要做的是测量X,或者能理论计算x。
你要加多少水,或者让水位怎么变,直接根据X计算,速度可以最快,而且没有过冲。

负载冲击响应随温度、环境等等都不变的情况下,不要用PID算法。

使用特权

评论回复
9
efen| | 2010-8-15 16:12 | 只看该作者
这个要顶

使用特权

评论回复
10
xuyiyi| | 2010-8-15 16:38 | 只看该作者
写的不错!

呵呵!大二大三就有这水平了,将来一定会成为第二个春阳,加油!

使用特权

评论回复
11
wwuchang| | 2010-8-15 16:42 | 只看该作者
确实厉害。mark下。

使用特权

评论回复
12
午时龙且| | 2010-8-15 19:31 | 只看该作者
佩服,现在还不太看得懂

使用特权

评论回复
13
hxdjb| | 2010-8-16 09:33 | 只看该作者
太好了,刚好要学pid

使用特权

评论回复
14
zhouyao0550| | 2010-8-16 10:37 | 只看该作者
控制理论中的控制方法很多,但是比较好用的就是PID.另外现代控制中的模糊控制也是比较好的,有机会可以学习下,以前做自平衡小车开始用PID,后来就用模糊控制了,效果还不错。

使用特权

评论回复
15
pengliang| | 2010-8-18 11:11 | 只看该作者
顶一下

使用特权

评论回复
16
SmartEnergy| | 2010-8-18 11:31 | 只看该作者
借花献佛。

参数整定寻最佳,从小到大顺序查;
先是比例后积分,最后才把微分加;
曲线振荡很频繁,比例度盘要放大;
曲线漂浮绕大弯,比例度盘往小扳;
曲线偏离回复慢,积分时间往下降;
曲线波动周期长,积分时间再加长;
曲线振荡变很快,先把微分降下来;
动差大来波动慢,微分时间要加长;
联想曲线两个波,前高后低4 比1;
一看二调多分析,调节质量不会低。

使用特权

评论回复
17
双壳蜗牛| | 2010-8-19 16:11 | 只看该作者
mark

使用特权

评论回复
18
冯冯冯冯| | 2010-10-20 16:53 | 只看该作者
嗯之前研究了半天,楼主说的很明了也。。。

使用特权

评论回复
19
utterboy| | 2010-10-24 23:47 | 只看该作者
mark

使用特权

评论回复
20
jack_icc| | 2010-10-26 20:19 | 只看该作者
很强

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

281

帖子

1

粉丝