McuPlayer 发表于 2012-9-5 16:09:28

扯淡一下PID控制

最近我在做一个项目中有PID控制,就搜了些网上的文章,来学习。
发现网上的文章,很多公式都是错误的,有的居然连位置式和增量式都故意搞了很多区别,甚至影响控制性能。
我虽是自动化专业,但做这方面很少,于是抱着学习的想法,说说自己的认识,也和大家交流下。


PID的所谓位置式和增量式的,从控制算法上看,没有本质区别。
Out = Out + delta;
delta = P*E+I*ξE+D*de
如果看输出的Out值,就是位置式的,如果看delta就是增量式的。

实际应用中有又位置式和增量式,
有的执行有记忆特性,就是增量式的,如步进电机
有的执行机构,没有记忆性,就是位置式的,如加热

McuPlayer 发表于 2012-9-9 18:23:14

P = kp * e(n);
I = Ki *( e(n) + e(n-1) + e(n-2) );
D = Kd * ( e(n)-e(n-1) );

P比较简单,不再赘述
I是积分项,对应几个离散误差累计,根据需要而定,误差的累计个数本质是积分周期的体现
D是微分项,一般使用最近2次的误差之差,也有使用e(n) - e(n-2)的情况

PID = P + I + D;
输出控制信号 U(n) = U(n-1) + PID;

McuPlayer 发表于 2012-9-12 09:39:30

PID的变种

标准PID可能无法实现满意的控制,此时就要变种,比如模糊控制。

最简单的模糊控制,是分段式的,每一段使用不同的PID参数。

有人的加热控制,在初始阶段只是用比例环节,以提高响应速度,到离目标温度较近时再采用PID三个环节一起上,本质上也是分段PID,就是低温段Ki和Kd的值为0

但简单的分段式,对于变化较大的系统,有时仍不能满足需要,这时可以用PID动态整定
关于PID整定的话题,我们后面讨论,这里先说下动态整定。
在温度控制中,对PID的参数,进行动态调整,相当于一个控制cycle中有几千几万次的整定。这样可以随时使用最佳的PID参数,毕竟整个cycle整定出来的PID参数不一定适合于所有的控制阶段。

zzz1367 发表于 2012-9-12 09:52:56

谢谢,帮顶上去。{:titter:}

stevenh 发表于 2012-9-12 12:52:49

谢谢,希望详细展开!

yfgww 发表于 2012-9-12 16:08:53

mark,正苦于学习PID

marshallemon 发表于 2012-9-12 16:26:22

我搞的加热也是增量式的

McuPlayer 发表于 2012-9-12 16:41:30

欢迎分享自己的经验,大家一起进步

月光疾風 发表于 2012-9-12 19:07:01

好帖,必须顶~

McuPlayer 发表于 2012-9-16 17:50:45

本帖最后由 McuPlayer 于 2012-9-16 17:52 编辑

仔细看一下,这2张图的区别,PID参数的Ki做了改变。

有个有趣的现象,积分环节越大,震荡的幅度越大,收敛得越慢。



这个是我设计的PID温度控制器的仿真工具



McuPlayer 发表于 2012-9-16 18:00:02

在加热温度控制系统中,积分环节的增大不但无法加快收敛,反而会有想反的效果。
实际应用中,很多人遇到了此问题,很多人采用变种PID解决掉了,但追究问题的来源。

加热系统是个单向温度控制系统,也就是只能主动加热,而降温只能靠被动散热。
加热的升温是很快的,而自然散热就很慢了,否则锅炉的热效率不太低了。
所以加热的温控系统,在温度稳定后,误差也基本是正误差,而非负误差。
看上面的2张图,后面的阻尼振荡的收敛过程,是不是基本在设定温度上方摆动。


这个温度仿真小工具,周末做了一个,主要是用了几个现成的,其仿真结果太漂亮,偏离实际效果。
时将匆忙,没放置坐标系,大家估摸着看吧,呵呵。
有图片的帖子,还不会编辑,本来是并排的。

McuPlayer 发表于 2012-9-16 18:06:36

细心的你应该发现了,好像温度的超调几乎是无可避免的。
没错,我是故意把这个问题暴露出来的。
实际的控制系统中,也经常有这个现象,而这来源于一个加热热量的传递过程,还有温度测量传感器的反应速度。
这个测试的是纯粹的PID计算,无法避免超调就很正常了。

当我们找到了问题的源头,解决起来就好办多了。

vjcmain 发表于 2012-9-16 18:08:33

McuPlayer 发表于 2012-9-16 17:50 static/image/common/back.gif
仔细看一下,这2张图的区别,PID参数的Ki做了改变。

有个有趣的现象,积分环节越大,震荡的幅度越大,收敛 ...

楼主,用了下你的软件,同一个PID参数,但是期望值不同时,其振荡曲线差别很大啊,如何理解啊? 另这是用什么软件写的啊

McuPlayer 发表于 2012-9-16 18:39:02

不同的设定值,相同的PID参数,过冲的量当然不同了
这是被控系统决定的

McuPlayer 发表于 2012-9-16 18:43:26

如果你设置个一个很高的温度,比如2000度,他还永远达到不了呢

为何,因为加热的模型是,电功率加热,和自然散热,构成的复合模型

温度越高,散热越快。因为相同的热阻,温差越大,热量传递越快。
如果加热的热量,小于了,散热的热量,则是这个系统的极限温度了。

当然,我这个小工具,温度刻度是固定的,图形看不完整,但你可以把目标温度设成2000,看坐标原点的那个温度数据来感觉下。

McuPlayer 发表于 2012-9-17 13:12:03

测温常用的铠装热电偶,延迟还是比较大的,甚至比空气中温度的传导更慢。
这个可以用裸露的热电偶来对比,就非常明显了。

昨天有个朋友发信给我,用比例环节和较大的微分环节,基本消除了过冲,但超调严重了。
如果用分段式的PID控制,就可以兼顾了。

McuPlayer 发表于 2012-9-18 10:28:16

仿真软件增加了对lua脚本的支持,可直接修改pid控制代码,观测仿真情况。

lua代码是解释执行的,不需要编译器除错,所以语法出错时会导致整个程序挂掉。


gzhuli 发表于 2012-9-18 10:53:46

增量式和位置式的区别我的理解是:增量式的OUT最终是趋于0的,位置式的OUT最终是趋于一个固定值的。

coleyao 发表于 2012-9-18 11:53:41

同意楼上看法,我发现大多数地方讲的位置式和增量式其实是一回事,形式不一样而已,按我的理解一个可以看做是位置式PID的原始形式,另一个可以看做是位置式PID的增量形式。

McuPlayer 发表于 2012-9-18 12:30:09

gzhuli 发表于 2012-9-18 10:53 static/image/common/back.gif
增量式和位置式的区别我的理解是:增量式的OUT最终是趋于0的,位置式的OUT最终是趋于一个固定值的。 ...

我的看法亦是如此

位置式和增量式,是对执行环节的描述,而非控制算法的描述
主要是看了网上很多误导人的概念,更有甚者说某些情况下位置式和增量式的选择还会导致控制系统的性能。

delta = P*E+I*ξE+D*de
Out = Out + delta;
如果看输出的Out值就是位置式的,如果直接输出delta就是增量式的。

shi_90 发表于 2012-9-18 16:37:16

学习了!!!

McuPlayer 发表于 2012-9-19 08:54:37

本帖最后由 McuPlayer 于 2012-9-19 09:04 编辑

PID最简单的变种----分段式PID


上面加热过程中,使用P环节,会产生过冲,但静态误差达到要求,使用PD环节不过冲了,但静态误差却不达标了,
这时候,就可以考虑使用分段来切换PID参数。

我们在加热升温过程,使用PD环节,温度保持过程使用P环节
在仿真软件的LUA脚本框中增加修改PID参数的代码
function do_pid ( sv, pv )
      e3 = e2
      e2 = e1
      e1 = e0
      e0 = sv - pv

      if(e0>0.1) then
                kp = 1
                ki = 0
                kd = 20
      else
                kp = 10
                ki = 0
                kd = 0
      end

      pid = kp * e0
      pid = pid + ki * (e0 + e1 + e2 + e3)
      pid = pid + kd * (e0 - e1)
      out = out + pid
      if(out<0)      then out=0      end
      if(out>1)      then out=1      end

      return out
end

qtds67 发表于 2012-9-19 11:25:54

PID算法顶起

lryxr2507 发表于 2012-9-19 13:04:21

正在苦苦学习PID用于工控的加温,收藏了.

陈敏锐 发表于 2012-9-26 18:16:56

{:lol:}感谢楼主的无私帮助

YOU1 发表于 2012-12-1 18:23:41

学习了,顶起

gaobao_1 发表于 2012-12-11 11:37:36

感谢!多了一点理解.

wantao0916 发表于 2012-12-11 11:46:26

顶起,这个PID工具挺有用。

199003326 发表于 2012-12-11 12:53:29

帮顶下,正在学习PID中。

renmin 发表于 2012-12-12 16:33:51

值得收藏
希望出更多教程

RAYING_PX 发表于 2012-12-12 17:29:13

好好学习,天天向上!

jing43 发表于 2012-12-12 22:03:06

顶起。
楼主说得完全正确。
在那个曲线的上升阶段积分值有害,微分值有益。
在曲线比较平稳的时候积分值有益,微分最好去掉。
从微积分的意义描述上,可以推导出以上两点。

eddia2012 发表于 2012-12-27 17:12:07

"仿真软件增加了对lua脚本的支持,可直接修改pid控制代码"
楼主,是否可以把你修改后的PID_SIM放上来,给我们学习下,呵呵。

hwie 发表于 2013-8-18 19:49:35

学习了。{:smile:}{:smile:}{:smile:}

小汪88 发表于 2013-8-19 16:52:38

学习了{:lol:}

jqbkl007 发表于 2013-8-19 21:46:34

顶起!!!感谢楼主!!!!

EysTech 发表于 2014-3-6 18:39:49


值得收藏
希望出更多教程

marshallemon 发表于 2014-3-6 19:45:30

用增量式控制水温做到+-0.05度的飘过

黑白记忆 发表于 2014-3-6 20:32:22

mark学习学习

Smartist 发表于 2014-3-11 19:51:58

顶贴,pid虽然没接触过但是希望以后学习

苹果520 发表于 2014-3-19 10:28:44

顶一帖!!!!!!!!!!!!!

wangyeqing333 发表于 2014-3-19 11:58:55

这是好贴啊

jz701209李 发表于 2014-3-19 21:28:01

好帖,谢谢楼主

xuanfeng201035 发表于 2014-3-26 01:05:03

嗯,写得不错,确实很多地方对位置式和增量式的区别讲得不清楚。

szzhangjianmin 发表于 2014-7-12 23:34:09

下来看看

szzhangjianmin 发表于 2014-7-12 23:35:30

下来看看

szzhangjianmin 发表于 2014-7-12 23:38:21

下来看看

pdd083051 发表于 2014-7-12 23:40:32

马克一下有时间看看~~~

moxue10 发表于 2014-7-13 09:05:48

谢谢楼主                  

moxue10 发表于 2014-7-13 09:29:49

楼主
delta = P*E+I*ξE+D*de
Out = Out + delta;
这个式子与 kp,ki,kd.有什么关系吗
kp,ki,kd 的值都怎么设定啊

cdust 发表于 2014-7-25 15:09:10

顶起,真正受教,谢谢LZ的好文章。

mobile02 发表于 2014-7-25 20:32:29

McuPlayer 发表于 2012-9-16 17:50
仔细看一下,这2张图的区别,PID参数的Ki做了改变。

有个有趣的现象,积分环节越大,震荡的幅度越大,收敛 ...

请问 AC 交流如果使用 PID ?{:titter:}

xckhmf 发表于 2014-7-25 22:39:01

好贴,收藏。

cdust 发表于 2014-7-26 16:41:14

McuPlayer 发表于 2012-9-16 17:50
仔细看一下,这2张图的区别,PID参数的Ki做了改变。

有个有趣的现象,积分环节越大,震荡的幅度越大,收敛 ...

楼主,冒昧的问下,你的KI,KD的单位是什么?分还是秒?

cdust 发表于 2014-7-26 16:57:24

marshallemon 发表于 2014-3-6 19:45
用增量式控制水温做到+-0.05度的飘过

怎么控制这么牛的,能讲讲经验吗?

rengh 发表于 2014-7-29 14:56:28

一直想做一个温控的程序

qah397466976 发表于 2014-7-29 17:22:35

mark好的 不错 收藏下!!!

xunke 发表于 2014-7-31 14:51:26

McuPlayer 发表于 2012-9-19 08:54
PID最简单的变种----分段式PID




请教!e0e1e2sv   pv等表示什么呢?

Arthur244 发表于 2014-7-31 15:36:33

写的挺不错的。。个人感觉PID这种东西真正想玩好还得自己在平时的调试中自己总结。。

zhoust 发表于 2014-8-1 14:57:48

MARK!!收藏了

Junsea 发表于 2014-9-28 02:58:41

McuPlayer 发表于 2012-9-19 08:54
PID最简单的变种----分段式PID




老兄,最近研究PID,你这个带脚本的PID_SIM是否可以共享下呢?谢谢!!

SCS_Super 发表于 2014-10-7 20:09:06

学习了!

adalim 发表于 2014-10-8 11:52:46

学习了,顶起

yuzhongbing121 发表于 2014-10-9 08:16:27

学习学习,谢谢分享

zenger_xu 发表于 2014-10-9 08:31:45

楼主很强呀

blavy 发表于 2014-10-20 23:15:55

一直以来都以为PID就是用来控制4轴的{:sleepy:}

cdfs_shangxiao 发表于 2014-10-20 23:27:19

谢谢,学习学习。

zhutao7589 发表于 2014-10-21 07:55:52

学习学习,谢谢楼主

deeplly 发表于 2014-10-21 08:31:13

调试伺服的时候用过pid,但是还不清楚实际运用的时候怎样建立公式

second_chan 发表于 2014-10-21 11:13:11

谢谢分享

yaho007 发表于 2014-10-21 16:10:21

欢迎分享自己的经验,大家一起进步

qqq_147258 发表于 2014-12-17 14:09:04

LZ。挖个坟。
是否可以把你修改后的PID工具软件发上来,给我们学习下。
还有e0,e1,e2,e3是什么?

popo_new 发表于 2015-4-28 09:30:58

McuPlayer 发表于 2012-9-19 08:54
PID最简单的变种----分段式PID




请问一下楼主:
1.仿真软件中,上冲的据烈程度和衰减程度您是如何得来的,这些和加热能力,散热能力,介质的质量,工作温度,容器形状都有关
2.Tm=300具体表示什么意思?

McuPlayer 发表于 2015-4-28 10:00:08

popo_new 发表于 2015-4-28 09:30
请问一下楼主:
1.仿真软件中,上冲的据烈程度和衰减程度您是如何得来的,这些和加热能力,散热能力,介 ...

仿真的模型是个加热系统,主要是惯性模型,而且参数是固定的
如果有种简单的方法,能够推算出实际被控系统的模型参数,那样的仿真才有实用价值,现在这个只能演示用,或者学习用

liuchuanxhu 发表于 2015-10-6 16:32:53

mobile02 发表于 2014-7-25 20:32
请问 AC 交流如果使用 PID ?

找到交流零位,斩波控制

NR4ein 发表于 2015-10-7 13:52:12

学习了,谢谢楼主{:lol:}

我是250 发表于 2019-1-7 21:43:54

大神,我有个疑问,你说温控系统属于非记忆要用位置式PID,但是很多帖子都用的增量式,上面的帖子也说用增量式做到了正负0.05...那岂不是有问题了?

我是250 发表于 2019-1-7 21:47:45

McuPlayer 发表于 2012-9-9 18:23
P = kp * e(n);
I = Ki *( e(n) + e(n-1) + e(n-2) );
D = Kd * ( e(n)-e(n-1) );


按照gzhuli的说法,增量式输出是趋于0的,那么你说温控系统属于非记忆,那么这不是冲突了吗?

TKZXJ 发表于 2019-1-22 15:23:40

学习了,谢谢楼主

土三安 发表于 2019-7-29 18:03:00

好帖,学习学习。

STM32的竹子 发表于 2019-11-20 11:36:10

感谢楼主分享,学习了

city_rip99 发表于 2020-1-10 12:00:18

不错不错,感谢大侠的分享

way2888 发表于 2020-3-29 10:21:01

感谢楼主分享

min_x91 发表于 2020-7-21 18:03:13

正在学习pid,感谢大侠的分享

lijianxing 发表于 2020-7-21 23:59:18

标记一下,有空仔细学习学习,谢谢

wangrudan 发表于 2020-9-10 14:36:03

只用过PID来控制加热。

sunny-2819 发表于 2020-9-19 13:46:20

PID控制不就一个芯片控制的吗?设置好参数可以让半导体制冷制热,参数都有计算公式

xyn1 发表于 2022-8-5 09:32:21

感谢楼主无私分享,学习了

qq78929709 发表于 2022-8-6 12:01:32

感谢楼主

nic_911 发表于 2022-10-20 21:06:01

感谢楼主,讲得透彻,受益匪浅啊~~

liang16888 发表于 2022-10-21 13:45:48

感谢楼主无私教学 PID控制 感谢

lpx280666373 发表于 2022-11-5 10:05:52

感谢楼主无私教学 PID控制 感谢

cnxh 发表于 2022-11-8 05:24:28

qqq_147258 发表于 2014-12-17 14:09
LZ。挖个坟。
是否可以把你修改后的PID工具软件发上来,给我们学习下。
还有e0,e1,e2,e3是什么? ...
(引用自74楼)

看程序应该是,依次把最新相差温度送到e0,e0的送到e1,e1的送到e2,e2的送到e3
页: [1]
查看完整版本: 扯淡一下PID控制