搜索
bottom↓
回复: 48

位置式PID、增量式PID与经典PID控温效果比较

  [复制链接]

出0入0汤圆

发表于 2012-6-6 21:03:39 | 显示全部楼层 |阅读模式
本帖最后由 coleyao 于 2012-6-7 20:20 编辑

  理想的控温曲线很多人都了解是个啥样子,但要是想用PID控温,得到理想的控温曲线就没那么容易了(通常认为延时越大,升温越快就越不容易控制)。
不过有了PID温控仿真器之后,PID温控就变得很简单了,我在附件中列举了在这三种PID控温方式得到较理想控温曲线时的PID参数(这些参数在升温速率快慢、延时长短、设定温度距离环境温度远近等各种场合适应性较广),大家有空可以自己确认一下(仿真器中温度采集和控温的周期均为1秒)或者亦可尝试寻找一下各种PID控制方式下最佳的PID参数,这三种PID控制方式我个人觉得经典式PID效果最差,尽管在大延时,高升温速率下也能稳定,但控温时间长,波动较大;位置式PID次之,在升温速率30度每分钟,延时达20秒时仍有较理想的控温曲线,缺点是继续增加升温速率或延时时间则会出现振荡;增量式PID最佳,在升温速率40度每分钟,延时达20秒时仍有较理想的控温曲线,缺点同位置式PID(当然这些是我通过仿真软件得到的结论,本人并没有用增量式或位置式PID解决过实际问题,写这个仿真软件的目的一方面是为了交流和学习,另一方面是为了将PID控制的效果和其它方法如PreF_v方法作个比较,我目前在温控系统中实际用过的是改进型的PreF_v方法)。
  当然,我个人的看法是没有最好,只有更好,使用PreF_v控制方法(仅有两个参数PreK和FdK需要调整,并且本身就是时域的方法,而不是像PID那样用频域方法解决时域问题)在升温速率达到70度每分钟,延时达100秒时仍能得到较理想的控温曲线。(注:仿真软件在51分论坛上可以下载,效果请各网友自行评估。)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出0入0汤圆

发表于 2012-6-6 23:08:51 | 显示全部楼层
位置式增量式难道不都是经典PID?

出0入0汤圆

发表于 2012-6-6 23:10:21 | 显示全部楼层
这个不是已经发过来了,有什么不同吗?

出0入0汤圆

发表于 2012-6-6 23:20:31 | 显示全部楼层
火星来的?任何一本书上不都是这样告诉你的啊 增量式PID是数字离散系统控制中最好的啊。另外你的这个程序是否考过 热传导速率?简单点说热惯性! 本来PID的整定就不是很容易。如果理论基础差点还是推荐使用实验-经验公式拟合来做。

出0入0汤圆

 楼主| 发表于 2012-6-7 06:17:19 来自手机 | 显示全部楼层
本帖最后由 coleyao 于 2012-6-7 06:35 编辑

谢谢楼上指导,我不是控制专业的,因此并没有看到所谓的增量式PID是所有离散式控制中最好的这种说法,另外就算看到了我也不认为是对的,离散式控制方法很多,我没一一见识过,不敢说谁最好,不知道你说的书作者是如何知道的。另外位置式和增量式是我在论坛中收集的,因为与一般书上介绍的不一样,所以另外加入了一种,我暂时把它叫做经典式,有谁知道确切名称的请直接告知。另外热惯性有考虑,不过可能没那么完善。

出0入0汤圆

发表于 2012-6-7 07:19:43 | 显示全部楼层
PreF_v控制方法是什么方法??之前没有听说过呀?

出0入0汤圆

发表于 2012-6-7 07:54:09 | 显示全部楼层
单纯的PID已经不怎么实用了,一般都是PID改进后的算法了.
如模糊控制

出0入0汤圆

 楼主| 发表于 2012-6-7 11:52:25 | 显示全部楼层
tiancaigao7 发表于 2012-6-7 07:19
PreF_v控制方法是什么方法??之前没有听说过呀?

  我自己整的,自我感觉优于PID算法,参数比PID少一个,没有整定的说法,同样一组参数,适应范围也要广一些。

出0入0汤圆

 楼主| 发表于 2012-6-7 11:54:53 | 显示全部楼层
86hupeng 发表于 2012-6-7 07:54
单纯的PID已经不怎么实用了,一般都是PID改进后的算法了.
如模糊控制

  PID算法其实还是挺实用的,只是参数整定比较费事,所以普及面不广。据我所知,很多硕士研究生写程序的时候都是用的Bang-Bang控制做的。

出0入0汤圆

 楼主| 发表于 2012-6-7 18:25:45 | 显示全部楼层
bg8wj 发表于 2012-6-6 23:20
火星来的?任何一本书上不都是这样告诉你的啊 增量式PID是数字离散系统控制中最好的啊。另外你的这个程序是 ...

    数字离散控制的方法很多,我也没见过几种,但是要说增量式PID是其中最好的,我不信,如果确实是书上这么讲的,我只能说这本书太不严谨,至少也要把范围限制到作者接触过验证过的范围内。
  所谓的经典式PID是我自己起的名字,并没有啥科学依据,主要原因我先做了位置式PID和增量式PID的部分,结果发现这两者和大部分上自动控制书上讲的最原始的PID定义都不符合,因此自己根据PID的原始定义做了一个,自己先把它叫做经典式PID,如果哪位知道其确切名称,还请及时告知,谢谢!

出0入0汤圆

发表于 2012-6-7 18:28:32 | 显示全部楼层
楼主能否将软件也传上来?

出0入0汤圆

 楼主| 发表于 2012-6-7 18:34:00 | 显示全部楼层
plc_avr 发表于 2012-6-7 18:28
楼主能否将软件也传上来?

就在51单片机分论坛下面,前面的是版本比较旧的,后面的版本是最新的,给个链接:
http://www.ourdev.cn/thread-5478243-1-1.html

出0入0汤圆

发表于 2012-6-7 21:39:59 | 显示全部楼层
看了你程序中的PID算法:
PID 位置: 递增量=KP*ET[CountT]-KI*ET[CountT-1]+KD*ET[CountT-2];
PID 增量: 递增量=KP*vT+KI*ET[CountT]+KD*aT;

你的位置式算法来自哪里?按我的理解这个式子有误。位置式的输出应是绝对量,不是增量;积分项应含误差累加求和;微分项应含误差的差分。
你说的经典式PID是不是这样:,这才是PID位置式算法。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-6-7 21:51:07 | 显示全部楼层
davidd 发表于 2012-6-7 21:39
看了你程序中的PID算法:
PID 位置: 递增量=KP*ET[CountT]-KI*ET[CountT-1]+KD*ET[CountT-2];
PID 增量:  ...

谢谢指正,我就说吗,怎么PID中间见不到积分分量,不过我是从本论坛中别人的帖子中间摘过来的,没有进一步查证其它书籍资料,所以这些系数有点乱,幸好我在软件中有说明,希望不致给大家带来困扰!

出0入0汤圆

发表于 2012-6-8 07:57:50 | 显示全部楼层
本帖最后由 bg8wj 于 2012-6-8 08:19 编辑
coleyao 发表于 2012-6-7 18:25
数字离散控制的方法很多,我也没见过几种,但是要说增量式PID是其中最好的,我不信,如果确实是书上 ...
但是要说增量式PID是其中最好的,我不信,如果确实是书上这么讲的,我只能说这本书太不严谨,至少也要把范围限制到作者接触过验证过的范围内。  

软件中提到的PID 位置: 递增量=KP*ET[CountT]-KI*ET[CountT-1]+KD*ET[CountT-2]怎么看也么有搞懂。看来你真的没有学过现代控制理论。
在大话一下PID:
标准的模拟系统这个是无法直接使用在计算机控制系统中的。离散数学不说啦说起来伤心。
因此我们离散化后得到:
这就是标准的离散系统的位置式PID表达式。简写一下:
试想一下每次控制时要去与过去状态位置比较,要是系统故障位置ek错乱了会如何?不死人我跟你姓。
于是需要消除ek,这个可以通过迭代消除。于是得到传说中的增量式
再变形一下得到
如此,我们的控制过程中仅需涉及到前后三次。e(k-n)
而我们需要解决的就是kp Ti Td 采样周期Ts。
if (PID>0) then if  ((pwmpointer+PID)<=pwmmax)  then pwmpointer:=pwmpointer+PID;
if (PID<0) then if  (pwmpointer+PID>=0) then pwmpointer:=pwmpointer+PID;

想搞死区控制吧?一般温度系统(temp2-temp1)在2度内。比较经济。在你牛x的温控要求都能搞定。你的算法表达式很容易引起系统震荡的。
最后,不得不说的就是PID参数整定问题,这个太复杂了牵扯到好多自动控制知识。真是不好说那个好。
明白了吗?自动控制不是浙江小工拿电扇吹空包装壳雕虫小技,不是代数知识就能搞定的。既然你要搞PID模拟软件,就先好好修炼一下内功,不要误人子弟,动车咋个挂掉呢?不说啦吧你都懂得!
曾经看过坛里的大哥发过,几个if then语句的温控系统,人家说的很明白那是自家用的,孵化小鸡鸡的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-6-8 12:03:09 | 显示全部楼层
本帖最后由 coleyao 于 2012-6-8 12:10 编辑
bg8wj 发表于 2012-6-8 07:57
软件中提到的PID 位置: 递增量=KP*ET[CountT]-KI*ET[CountT-1]+KD*ET[CountT-2]怎么看也么有搞懂。看来 ...


   谢谢这位老兄/?大姐引经据典对PID公式的来龙去脉讲得这么透彻,软件我之前就讲了,主要目的不是让使用者能直接商用的,而是熟悉一下P、I、D各个参数的作用,各参数分别变化时整个系统稳定性的变动状况,给使用者一点启示,软件里面的采样速率和系统可加热上限温度固定不可调就是为了限制简单的仿真后直接商用,不知道我讲明白没有。另外尽管我在学校里面数学学得还好,可是见到一系列的公式推导还是有点头疼,这也是我做这款软件的原因之一吧,有时候直观比抽象更重要,特别是对于大多的非砖家etc.而言。
  再有,我承认对PID公式是从网上直接抓来的,理解不透彻,所以PID三个系数都是可以为任意实数的,最大限度避免影响大家的发挥。

出0入0汤圆

发表于 2012-6-8 13:19:29 | 显示全部楼层
,
coleyao

其实我也希望您能编写一个好的PID模拟软件造福下大家。我的windows 下编程早就还给老师啦。呵呵。

出0入0汤圆

 楼主| 发表于 2012-6-8 18:08:21 | 显示全部楼层
本帖最后由 coleyao 于 2012-6-8 18:14 编辑
bg8wj 发表于 2012-6-8 13:19
,
其实我也希望您能编写一个好的PID模拟软件造福下大家。我的windows 下编程早就还给老师啦 ...


  我的编程水平也就一般而已,主要是自己掏腰包培训过一段时间的Delphi(那时候我们的老师很惊讶会有做硬件研发的参加软件培训,估计更想不到我是自掏腰包的,有点心痛。。。),稍微懂点罢了,一般我也就自己写一些和下位机关系比较密切的调试软件,大的系统的没有做过。其实PID仿真软件的难点并不在编程,甚至可以说编程很简单,主要难点应该在被控系统的分析和抽象上,我也是刚好做过一段时间温控,有了一些概念,收集了一些数据,便想到了做个仿真软件,希望能对大家有帮助。

出0入0汤圆

 楼主| 发表于 2012-6-8 20:34:30 | 显示全部楼层
davidd 发表于 2012-6-7 21:39
看了你程序中的PID算法:
PID 位置: 递增量=KP*ET[CountT]-KI*ET[CountT-1]+KD*ET[CountT-2];
PID 增量:  ...

http://www.ourdev.cn/thread-4932148-1-1.html
我的仿真软件中的PID算法部分从该帖子直接摘录过来的,幸好当时留了脚印,要不然我真说不清了。。。

出0入0汤圆

发表于 2012-6-9 01:44:27 | 显示全部楼层
我的仿真软件中的PID算法部分从该帖子直接摘录过来的,幸好当时留了脚印,要不然我真说不清了。。。
呵呵,看懂了,看懂了,呵呵,还真不习惯一下中文一下数学符号公式的描述。这个大哥的贴非常好,就是跳跃太大,前阵代笔朋友的硕士论文是还引用过。这个是PID公式:U(k+1) = U(k) + ( KP*E(k) - KI*E(k-1) + KD*E(k-2) )很好的说明了数字离散系统PID增量式控制量就取决于本次、上次、前次。
PID控所谓的位置、增量式对数学公式推导到不同阶段的描述。本质还是一样的就是比例环节k,积分环节I,微分环节D。我在搞
http://www.ourdev.cn/thread-5301775-1-1.htmlstc12c5a60s2+ds18b20+lcd1602 PID数字温控系统 pwm输出
时就是因为windows编程还给老师了,只能用matlab模拟。

出0入0汤圆

发表于 2012-6-9 02:08:36 | 显示全部楼层
我来冒个泡!!!!!!!

出0入0汤圆

发表于 2012-6-9 02:22:07 | 显示全部楼层
本帖最后由 bg8wj 于 2012-6-9 02:29 编辑

对于软件我仔细看来一下非常好,如果调整一下描述文字会更好,PID经典是否是就是如果是改进成模拟系统仿真为好,位置式建议取消了,PID发展50年来已经否定位置式。
增量的方法我这种算法
/************************************************
              增量控制PID函数体
51单片机最不擅长浮点数计算,转换成int型计算
*************************************************/
unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint )
{
  unsigned int dError,Error,pError;
  //增量法计算公式:
  //Pdt=Kp*[E(t)-E(t-1)]+Ki*E(t)+Kd*[E(t)-2*E(t-1)+E(t-2)]
  Error = set_temper - NextPoint;       // 偏差E(t)
  pError=Error-pp->LastError;         //E(t)-E(t-1)
  dError=Error-2*pp->LastError+pp->PrevError; //E(t)-2*E(t-1)+E(t-2)
  pp->PrevError = pp->LastError;
  pp->LastError = Error;
  return (
            pp->Proportion * pError        //比例
            + pp->Integral *Error  //积分项
            + pp->Derivative * dError          // 微分项
                        );  
}
if (PID>0) then if  ((pwmpointer+PID)<=pwmmax)  then pwmpointer:=pwmpointer+PID;
if (PID<0) then if  (pwmpointer+PID>=0) then pwmpointer:=pwmpointer+PID;
不要用了。
如果要判断的话,那就是公式推导的下一阶段从函数图象来说前期基本上是一阶线性也就是Kp作用比较大,干脆直接自由升温,我一般用目标值与初始值之差的黄金分割界定自由升温临界,过后再用PI控制温升到第二临界点与目标值之差5度,在把Kd微分项引入做完全PID增量控制。减少轻系统振荡。
这就是所谓的带死区的pid控制简单实现,没有看过你软件中的pref_v pref_av(该电脑时间还是辛苦的)不知是否是死区控。
最后
谢谢这位老兄/?大姐
不是大姐,头像是我姑娘的,现在的小孩难管教啊。这才两岁多点,就模仿老爹吸烟。

出0入0汤圆

发表于 2012-6-9 07:44:20 | 显示全部楼层
bg8wj 发表于 2012-6-8 07:57
软件中提到的PID 位置: 递增量=KP*ET[CountT]-KI*ET[CountT-1]+KD*ET[CountT-2]怎么看也么有搞懂。看来 ...

if (PID>0) then if  ((pwmpointer+PID)<=pwmmax)  then pwmpointer:=pwmpointer+PID;
if (PID<0) then if  (pwmpointer+PID>=0) then pwmpointer:=pwmpointer+PID;
这个在实际控制中还是需要的,她是对控制量的限幅,而不是死区控制。带死区的控制是:当|e(k)|小于死区时,控制量维持不变。

出0入0汤圆

发表于 2012-6-9 08:15:05 | 显示全部楼层
coleyao 发表于 2012-6-8 20:34
http://www.ourdev.cn/thread-4932148-1-1.html
我的仿真软件中的PID算法部分从该帖子直接摘录过来的, ...

看到了你引用的公式:  U(k+1) = U(k) + ( KP*E(k) - KI*E(k-1) + KD*E(k-2) )
这个公式不是标准的用增量表示的位置式公式,可能是某人的经验公式。

标准PID公式:U(k)=U(k-1)+Kp*[E(k)-E(k-1)]+Ki*E(k)+Kd*[E(k)-2*E(k-1)+E(k-2)],U(k)是绝对量,适用于执行机构需要全量的场合。若去掉公式中的U(k-1),U(k)输出的是增量,适用于执行机构需要增量的场合。

U(k+1) = U(k) + ( KP*E(k) - KI*E(k-1) + KD*E(k-2) )
上式有问题,探讨一下。首先, ( KP*E(k) - KI*E(k-1) + KD*E(k-2) )计算的不是增量。
积分项符号是负的,与常识不符。设K(k-1)>0,说明实际值尚未达到给定值,此项值却是削弱总控制作用。
微分项一定要有差分计算,才能算微分。
比例项也不是E(k)的差分。
总之,这个公式在我看来是对E(k)的三个采样值作了加权处理,然后得出一个控制。不能称之为PID,也许对于温度控制可以用用。

出0入0汤圆

 楼主| 发表于 2012-6-9 08:19:19 | 显示全部楼层
bg8wj 发表于 2012-6-9 02:22
对于软件我仔细看来一下非常好,如果调整一下描述文字会更好,PID经典是否是就是如果是改进成模拟系统仿真 ...

   非常感谢诸位网友对该软件的关心,根据一些提议软件作了进一步修改:
    1) 增加切入PID控制的提前量,也即在设定温度前提前多少度开启PID控制,这样实际效果与不设提前量差别多大大家可以仿真一下,我也附了一张比较图供参考;
    2) 那个PID 经典按照各位建议改为PID 模拟;
    3) PID位置没有去掉,供大家做算法比对用,另外增加一个PreF_adv,也即PreF_v的改进型,是我在产品中实际用过的,效果请大家实际仿真查看。
软件稍后会上传到51分论坛下“PID温控仿真软件”那个帖子下。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-6-9 08:23:03 | 显示全部楼层
说了半天,其实就是两种PID算法和楼主自己的一种所谓的更好的算法得比较,而我更感兴趣的是楼主所谓的那个自己整的更好的PreF_v方法的原理是什么?如果不方便就算了因为楼主这篇帖子给我的感觉就是想告诉我们PID做温控并不好,而楼主自己的PreF_v方法更加理想。如果是这个意思,那起码要在后面介绍一下PreF_v方法的原理。因为但从途中是看不出的。换句话会所,如果细心整定参数,以及加入抗饱和的话PID一样可以做到楼主PreF_v方法产生的效果。

出0入0汤圆

 楼主| 发表于 2012-6-9 10:40:31 | 显示全部楼层
tiancaigao7 发表于 2012-6-9 08:23
说了半天,其实就是两种PID算法和楼主自己的一种所谓的更好的算法得比较,而我更感兴趣的是楼主所谓的那个 ...

   解释一下,其实我对各种PID了解不多,兴趣是有点,但没经过系统的学习,只是知道个大概而已,当然,如果不是这样,也许我就不会发现PreF_v这样的方法。
  PreF_v我自认为还是不错的,特别适合懒人使用,在系统的升温速率波动大(不是指一次控制中波动,而是指类似环境影响的因素),延时比较大或不确定时,使用PreF_v控制法,PreK设大一些,FdK固定为1基本上是万金油的控制方法,当然在升温阶段升温时间没有达到最佳优化,这一点算是一个缺点吧!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-6-9 10:53:20 | 显示全部楼层
coleyao 发表于 2012-6-9 10:40
解释一下,其实我对各种PID了解不多,兴趣是有点,但没经过系统的学习,只是知道个大概而已,当然,如 ...

这个解释跟没有解释一样,看来楼主是不打算讲清楚那个所谓的简单好用的算法是什么样的了。那就算了。

出0入0汤圆

 楼主| 发表于 2012-6-9 11:04:36 | 显示全部楼层
   呵呵,要是讲了,做控制就简单化了,用另外的话讲就是没有技术含量了,我倒担心这样门槛低了不是好事啊!想我当年搞所谓智能建筑,三天两头在外出差,就因为技术含量低,搞的人多,工资一直都上不去,1K出头的工资拿了好几年,幸好后来转到工厂和研发这一块了,往事不堪回首啊!

出0入0汤圆

 楼主| 发表于 2012-6-11 18:55:12 | 显示全部楼层
coleyao 发表于 2012-6-9 10:40
解释一下,其实我对各种PID了解不多,兴趣是有点,但没经过系统的学习,只是知道个大概而已,当然,如 ...

纠正一下,之前的说法有误,升温速度快和传热时滞大都会导致调节困难不错,但在Pre_v方法中调节方法是反的,升温速度快时应该降低PreK系数,时滞大时应该加大PreK系数,通常升温快了时滞相应就小,如果不幸碰到升温速度快和传热时滞大同时存在时需要加大PreK系数,同时降低FdK系数,这样整个系统仍旧是稳定的,副作用是超调和调整时间都会增加,升温速度快和传热时滞大同时存在时如何通过PID系数调整,请读者自行摸索,我也不懂

出0入0汤圆

发表于 2012-6-12 07:27:18 | 显示全部楼层
coleyao 发表于 2012-6-9 11:04
呵呵,要是讲了,做控制就简单化了,用另外的话讲就是没有技术含量了,我倒担心这样门槛低了不是好事啊 ...

楼主这就不是打算交流,而是来炫耀呀。呵呵其实要打到你那个理想的响应曲线有很多算法都可以实现,比如FMAC,自抗扰控制,甚至PID如果加上抗饱和以及参数好好整定的话也可以,因此楼主的算法其实没有什么好保密的。

出0入0汤圆

 楼主| 发表于 2012-6-12 12:14:06 | 显示全部楼层
本帖最后由 coleyao 于 2012-6-12 18:28 编辑
tiancaigao7 发表于 2012-6-12 07:27
楼主这就不是打算交流,而是来炫耀呀。呵呵其实要打到你那个理想的响应曲线有很多算法都可以实现,比如FM ...


        说实话,你提的那些控制方法我一个都不懂,软件中带的PreF_v方法也不是炫耀用的,我的文化程度一般(本科),因此我能想到的很多人通过努力也能达到。另外我一开始并没有借鉴就能想到,坛里面这么多大牛我不认为有了仿真软件作参考他们会想不到,我想做研发有意义的并不是结果,而是过程,我如果直接给结果,估计大牛们也不乐意。。。(我的本意并不是要雪藏算法,因为既然仿真软件有了,琢磨出算法应该有很多办法的。。。)

出0入0汤圆

 楼主| 发表于 2012-6-18 10:00:50 | 显示全部楼层
本帖最后由 coleyao 于 2012-6-18 18:32 编辑

    PreF_v算法最大的优点我觉得并不在于其能得到理想的控制波形,而是其同一组参数能在很大范围内基本保持控制波形为细想状态,并且即使需要调整参数也相当简单,可以说是省时省力,最大限度解放劳动力。

出0入0汤圆

 楼主| 发表于 2012-6-23 08:07:23 | 显示全部楼层
本帖最后由 coleyao 于 2012-6-23 08:11 编辑

   最新发现:其实预测式负反馈控制法和位置式PID很相似,从预测式负反馈控制法的观点来看,位置式PID就是系数没有整理过的预测式负反馈控制,就如同位置式PID的位置形式和增量形式的区别。
  另外,公布一下预测式负反馈控制的核心思路与算法:预测一下未来某个时间点被控变量会出现在哪一个位置,然后根据预测的位置来调节系统的当前参数(功率等),根据预测方法不同,可以有y=y0+v*PreK和y=y0+v*PreK+a*PreK*preK/2(时域的一次逼近和二次逼近,其中PreK的单位为秒,表示预测时间的长短,从我对两种算法的仿真和分析来看,二次逼近没有必要用,一是复杂,二是系统稳定性大大下降,另外如果PreK可变,可以一定程度上优化跟踪速度,但同样会导致稳定性大幅下降),希望大家看过后能豁然开朗,从此丢掉PID参数整定的烦恼。
  更详细的请参考我的另外一篇帖子:
http://www.amobbs.com/thread-5482928-1-1.html

出0入0汤圆

发表于 2012-6-23 08:19:08 | 显示全部楼层
而我更感兴趣的是楼主所谓的那个自己整的更好的PreF_v方法的原理是什么?


very simple: it is trying to predict the future value of the status variable. Except by assuming the system's response to any shock is linear.

the basic principal makes sense in that if you know there there is going to be a overshot in the future, you dial back the control a little to prevent it.

Except that your assumed system response may be totally different from the actual system response and such deviations may actually cause the system to oscillate.

出0入0汤圆

 楼主| 发表于 2012-6-23 09:56:24 | 显示全部楼层
  感觉预测式反馈才是PID的本来面目,有点像盲人摸象,PID算法前人探索总结了那么多,不过使那头大象更像大象罢了,而预测式反馈就是那头大象。

出0入0汤圆

发表于 2012-6-25 14:57:31 | 显示全部楼层
预测式反馈,PID中的D参数是这个作用么?

出0入0汤圆

发表于 2012-10-6 10:54:22 | 显示全部楼层
预测式反馈式PID,实际上就是经典的增量PID去去"D"项的结果,也就是PI控制,只是它的恩路与原来的有一些不一样的地方

出0入0汤圆

 楼主| 发表于 2012-10-7 09:17:04 | 显示全部楼层
本帖最后由 coleyao 于 2012-10-7 09:18 编辑
eddia2012 发表于 2012-10-6 10:54
预测式反馈式PID,实际上就是经典的增量PID去去"D"项的结果,也就是PI控制,只是它的恩路与原来的有一些不一样 ...


   呵呵,你说的是线性预测(函数近似y=x0+x*y'),从实际控制效果上来说是与PI控制一样的,但物理意义不一样了。
  如果是非线性预测(函数近似y=x0+x*y'+0.5*x*x*y''+...),那么实际上预测式负反馈比PID更全面,只是更高阶的预测效果会不会更好,有没有必要,倒是一个值得探索的问题。。。。

出0入0汤圆

发表于 2012-10-7 17:42:59 | 显示全部楼层
楼主的这个思路很好,我现在完全理解了它的妙处,这个比PID要好调些,理论上可以做到不超调,这点是很重要的!
另外想请教下楼主:
PreF_adv:               递增量= FdK*(ET[CountT]+vT*PreK(T));
这个PreK(T))有没有一个算法?是通过实测还是?
谢谢

出0入0汤圆

 楼主| 发表于 2012-10-7 18:03:32 | 显示全部楼层
eddia2012 发表于 2012-10-7 17:42
楼主的这个思路很好,我现在完全理解了它的妙处,这个比PID要好调些,理论上可以做到不超调,这点是很重要 ...

Pre(K)  的确定,请参考我的另一个帖子:http://www.amobbs.com/thread-5484520-1-1.html  。

出0入0汤圆

发表于 2014-1-3 14:35:06 | 显示全部楼层
这是本人按照公式写的一个增量式PID的程序,和测试程序,不知正确与否,恳请懂的人指出错误和建议。
想用在小车直流电机的控制上来,直流电机上有挡光片测速。MCU PWM调节转速。

按照推荐的调节PID的步骤,先将Ki=Kp*T/Ti置位0,将Kd=Kp*Td/T=0,当作纯比例控制器来调节,
因此让Ti=10000000.0(足够大就行,让Ki接近0),Td=0。此时A=Kp,B=-Kp;C=0;
增量计算(根据后面的程序改的伪代码):
        e_0 = Set - Get;//目标值-本次测量值
        delta = A*e_0 + B*e_1 + C*e_2 = Kp(e_0 - e_1) ;
        e_2 = e_1;
        e_1 = e_0;
        out += delta;
那么,按照以上推导,在纯比例控制中,增量=Kp*(前两次误差的差值);
我的疑问是:
        假设目标值是100,初始状态e_0=0,e_1=0;
        时刻1测量值是10,那么误差就是90,e_0=90,e_1=0;那么delta增量会有一个值,同时实际输出量out也有一个值
        如果时刻2测量值还是10,那么e_0=90,e_1=90; Kp(e_0 - e_1) =0;delta增量=0,此时out不增加。
        试想,当输出量out还不足以驱动电机或者电机被负载堵转时,误差恒定不变,但是delta却等于0,输出out不变,电机也不会增加力矩,这似乎有悖我们控制电机转速的初衷。

以上是我的理解,不知道正确么,恳请大家指导。

/************************************************************************/
#include <math.h>

#define Kp   (1.0)                //PID调节的比例常数
#define Ti   (10000000.0)       //PID调节的积分常数
#define Td   (0.0)              //PID调节的微分时间常数
#define T    (0.1)              //采样周期

#define AA  (Kp * (1 + (T / Ti) + (Td / T)))   //A
#define BB   ((-Kp) * (1+(2 * Td / T)))        //B
#define CC   (Kp * Td / T)                    //C

//误差的阀值,小于这个数值的时候,不做PID调整,避免误差较小时频繁调节引起震荡
#define Emin 3

//调整值限幅,防止积分饱和
#define Umax 20
#define Umin -20

//输出值限幅
#define Pmax 245
#define Pmin 0


typedef struct PID
{
        int Set;  //目标值
        int Get;  //当前测量值

        int e_1;
        int e_2;
        
        double A;
        double B;
        double C;
        
        int delta;
        int out;
}PID_t;


void pid_init(PID_t * pPID);
void pid_ctrl(PID_t * pPID);


void pid_init(PID_t * pPID)
{
        pPID->Set = 0;
        pPID->Get = 0;
        pPID->e_1 = 0;
        pPID->e_2 = 0;
        pPID->delta = 0;
        pPID->out = 0;
        
        pPID->A=AA;
        pPID->B=BB;
        pPID->C=CC;
}


void pid_ctrl(PID_t * pPID)
{

        int e_0 = pPID->Set - pPID->Get;//求差值
        
        pPID->delta = (int)(pPID->A*e_0 + pPID->B*pPID->e_1 + pPID->C*pPID->e_2);
        pPID->e_2 = pPID->e_1;
        pPID->e_1 = e_0;
        pPID->out += pPID->delta;
}


PID_t PID_A;

void main(void)
{
        int i;
        pid_init(&PID_A);
        
        printf("Kp=%f,Ki=%f,Kd=%f\n",Kp,(Kp*T/Ti),(Kp*Td/T));
        printf("A=%f,B=%f,C=%f\n\n",AA,BB,CC);

        printf("input the set val\n");
        scanf("%d",&PID_A.Set);
        printf("Set=%d\n",PID_A.Set);


        while(1){
                scanf("%d",&PID_A.Get);
                pid_ctrl(&PID_A);
                printf("get=%8d\n",PID_A.Get);
                printf("delta=%8d, out=%8d\n",PID_A.delta,PID_A.out);
                printf("e_1  =%8d, e_2=%8d\n",PID_A.e_1,PID_A.e_2);
        
        }        
        printf("leave");
}




出0入0汤圆

发表于 2014-1-11 01:51:20 | 显示全部楼层
大家都好好算吧,算好了,我用就行了,呵呵

出0入0汤圆

发表于 2014-1-13 16:11:53 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2014-1-22 13:44:59 | 显示全部楼层
FuARM 发表于 2014-1-3 14:35
这是本人按照公式写的一个增量式PID的程序,和测试程序,不知正确与否,恳请懂的人指出错误和建议。
想用在 ...

我也在调增量PID,遇到和你一样的问题。这个是不是就是稳态误差?因为必须上I才能有效果。

出0入0汤圆

发表于 2014-1-27 16:58:11 | 显示全部楼层
PID,好复杂!!!

出0入0汤圆

发表于 2014-8-18 09:12:50 | 显示全部楼层
小弟也是刚毕业,PID大学时学过,那点理论已经变成“翔”了,还在努力补课中

出0入0汤圆

发表于 2017-9-27 13:25:10 | 显示全部楼层
PID 参数比较难调!

出0入0汤圆

发表于 2019-6-20 16:18:26 | 显示全部楼层
增量式PID控制的输出初值是怎么确定的?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-17 07:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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