搜索
bottom↓
回复: 93
打印 上一主题 下一主题

扯淡一下PID控制

  [复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2012-9-5 16:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近我在做一个项目中有PID控制,就搜了些网上的文章,来学习。
发现网上的文章,很多公式都是错误的,有的居然连位置式和增量式都故意搞了很多区别,甚至影响控制性能。
我虽是自动化专业,但做这方面很少,于是抱着学习的想法,说说自己的认识,也和大家交流下。


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

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

出0入0汤圆

2
 楼主| 发表于 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;

出0入0汤圆

3
 楼主| 发表于 2012-9-12 09:39:30 | 只看该作者
PID的变种

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

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

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

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

出0入0汤圆

4
发表于 2012-9-12 09:52:56 | 只看该作者
谢谢,帮顶上去。

出0入0汤圆

5
发表于 2012-9-12 12:52:49 | 只看该作者
谢谢,希望详细展开!

出0入0汤圆

6
发表于 2012-9-12 16:08:53 | 只看该作者
mark,正苦于学习PID

出0入85汤圆

7
发表于 2012-9-12 16:26:22 | 只看该作者
我搞的加热也是增量式的

出0入0汤圆

8
 楼主| 发表于 2012-9-12 16:41:30 | 只看该作者
欢迎分享自己的经验,大家一起进步

出0入0汤圆

9
发表于 2012-9-12 19:07:01 | 只看该作者
好帖,必须顶~

出0入0汤圆

10
 楼主| 发表于 2012-9-16 17:50:45 | 只看该作者
本帖最后由 McuPlayer 于 2012-9-16 17:52 编辑

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

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



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



本帖子中包含更多资源

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

x

出0入0汤圆

11
 楼主| 发表于 2012-9-16 18:00:02 | 只看该作者
在加热温度控制系统中,积分环节的增大不但无法加快收敛,反而会有想反的效果。
实际应用中,很多人遇到了此问题,很多人采用变种PID解决掉了,但追究问题的来源。

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


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

出0入0汤圆

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

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

出0入0汤圆

13
发表于 2012-9-16 18:08:33 | 只看该作者
McuPlayer 发表于 2012-9-16 17:50
仔细看一下,这2张图的区别,PID参数的Ki做了改变。

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

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

出0入0汤圆

14
 楼主| 发表于 2012-9-16 18:39:02 | 只看该作者
不同的设定值,相同的PID参数,过冲的量当然不同了
这是被控系统决定的

出0入0汤圆

15
 楼主| 发表于 2012-9-16 18:43:26 | 只看该作者
如果你设置个一个很高的温度,比如2000度,他还永远达到不了呢

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

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

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

出0入0汤圆

16
 楼主| 发表于 2012-9-17 13:12:03 | 只看该作者
测温常用的铠装热电偶,延迟还是比较大的,甚至比空气中温度的传导更慢。
这个可以用裸露的热电偶来对比,就非常明显了。

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

出0入0汤圆

17
 楼主| 发表于 2012-9-18 10:28:16 | 只看该作者
仿真软件增加了对lua脚本的支持,可直接修改pid控制代码,观测仿真情况。

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


本帖子中包含更多资源

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

x

出0入618汤圆

18
发表于 2012-9-18 10:53:46 | 只看该作者
增量式和位置式的区别我的理解是:增量式的OUT最终是趋于0的,位置式的OUT最终是趋于一个固定值的。

出0入0汤圆

19
发表于 2012-9-18 11:53:41 | 只看该作者
同意楼上看法,我发现大多数地方讲的位置式和增量式其实是一回事,形式不一样而已,按我的理解一个可以看做是位置式PID的原始形式,另一个可以看做是位置式PID的增量形式。

出0入0汤圆

20
 楼主| 发表于 2012-9-18 12:30:09 | 只看该作者
gzhuli 发表于 2012-9-18 10:53
增量式和位置式的区别我的理解是:增量式的OUT最终是趋于0的,位置式的OUT最终是趋于一个固定值的。 ...

我的看法亦是如此

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

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

出0入0汤圆

21
发表于 2012-9-18 16:37:16 | 只看该作者
学习了!!!

出0入0汤圆

22
 楼主| 发表于 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

本帖子中包含更多资源

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

x

出0入0汤圆

23
发表于 2012-9-19 11:25:54 | 只看该作者
PID算法顶起

出0入0汤圆

24
发表于 2012-9-19 13:04:21 | 只看该作者
正在苦苦学习PID用于工控的加温,收藏了.

出0入0汤圆

25
发表于 2012-9-26 18:16:56 | 只看该作者
感谢楼主的无私帮助

出0入0汤圆

26
发表于 2012-12-1 18:23:41 | 只看该作者
学习了,顶起

出0入0汤圆

27
发表于 2012-12-11 11:37:36 | 只看该作者
感谢!多了一点理解.

出0入0汤圆

28
发表于 2012-12-11 11:46:26 | 只看该作者
顶起,这个PID工具挺有用。

出0入0汤圆

29
发表于 2012-12-11 12:53:29 | 只看该作者
帮顶下,正在学习PID中。

出0入0汤圆

30
发表于 2012-12-12 16:33:51 | 只看该作者
值得收藏
希望出更多教程

出0入0汤圆

31
发表于 2012-12-12 17:29:13 | 只看该作者
好好学习,天天向上!

出0入0汤圆

32
发表于 2012-12-12 22:03:06 | 只看该作者
顶起。
楼主说得完全正确。
在那个曲线的上升阶段积分值有害,微分值有益。
在曲线比较平稳的时候积分值有益,微分最好去掉。
从微积分的意义描述上,可以推导出以上两点。

出0入0汤圆

33
发表于 2012-12-27 17:12:07 | 只看该作者
"仿真软件增加了对lua脚本的支持,可直接修改pid控制代码"
楼主,是否可以把你修改后的PID_SIM放上来,给我们学习下,呵呵。

出0入0汤圆

34
发表于 2013-8-18 19:49:35 | 只看该作者
学习了。

出0入0汤圆

35
发表于 2013-8-19 16:52:38 | 只看该作者
学习了

出0入0汤圆

36
发表于 2013-8-19 21:46:34 | 只看该作者
顶起!!!感谢楼主!!!!

出0入0汤圆

37
发表于 2014-3-6 18:39:49 | 只看该作者

值得收藏
希望出更多教程

出0入85汤圆

38
发表于 2014-3-6 19:45:30 | 只看该作者
用增量式控制水温做到+-0.05度的飘过

出0入0汤圆

39
发表于 2014-3-6 20:32:22 | 只看该作者
mark  学习学习

出0入0汤圆

40
发表于 2014-3-11 19:51:58 | 只看该作者
顶贴,pid虽然没接触过但是希望以后学习

出0入0汤圆

41
发表于 2014-3-19 10:28:44 | 只看该作者
顶一帖!!!!!!!!!!!!!

出0入0汤圆

42
发表于 2014-3-19 11:58:55 | 只看该作者
这是好贴啊

出0入0汤圆

43
发表于 2014-3-19 21:28:01 来自手机 | 只看该作者
好帖,谢谢楼主

出0入0汤圆

44
发表于 2014-3-26 01:05:03 | 只看该作者
嗯,写得不错,确实很多地方对位置式和增量式的区别讲得不清楚。

出0入0汤圆

45
发表于 2014-7-12 23:34:09 | 只看该作者
下来看看

出0入0汤圆

46
发表于 2014-7-12 23:35:30 | 只看该作者
下来看看

出0入0汤圆

47
发表于 2014-7-12 23:38:21 | 只看该作者
下来看看

出0入0汤圆

48
发表于 2014-7-12 23:40:32 | 只看该作者
马克一下  有时间看看~~~

出0入0汤圆

49
发表于 2014-7-13 09:05:48 | 只看该作者
谢谢楼主                    

出0入0汤圆

50
发表于 2014-7-13 09:29:49 | 只看该作者
楼主  
delta = P*E+I*ξE+D*de
Out[k] = Out[k-1] + delta;
这个式子与 kp,ki,kd.有什么关系吗  
kp,ki,kd 的值都怎么设定啊

出0入98汤圆

51
发表于 2014-7-25 15:09:10 | 只看该作者
顶起,真正受教,谢谢LZ的好文章。

出0入0汤圆

52
发表于 2014-7-25 20:32:29 | 只看该作者
McuPlayer 发表于 2012-9-16 17:50
仔细看一下,这2张图的区别,PID参数的Ki做了改变。

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

请问 AC 交流如果使用 PID ?

出0入0汤圆

53
发表于 2014-7-25 22:39:01 | 只看该作者
好贴,收藏。

出0入98汤圆

54
发表于 2014-7-26 16:41:14 | 只看该作者
McuPlayer 发表于 2012-9-16 17:50
仔细看一下,这2张图的区别,PID参数的Ki做了改变。

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

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

出0入98汤圆

55
发表于 2014-7-26 16:57:24 | 只看该作者
marshallemon 发表于 2014-3-6 19:45
用增量式控制水温做到+-0.05度的飘过

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

出0入0汤圆

56
发表于 2014-7-29 14:56:28 | 只看该作者
一直想做一个温控的程序

出0入0汤圆

57
发表于 2014-7-29 17:22:35 | 只看该作者
mark  好的 不错 收藏下!!!

出0入112汤圆

58
发表于 2014-7-31 14:51:26 | 只看该作者
McuPlayer 发表于 2012-9-19 08:54
PID最简单的变种----分段式PID

请教!e0  e1  e2  sv   pv等表示什么呢?

出0入0汤圆

59
发表于 2014-7-31 15:36:33 | 只看该作者
写的挺不错的。。个人感觉PID这种东西真正想玩好还得自己在平时的调试中自己总结。。

出0入0汤圆

60
发表于 2014-8-1 14:57:48 | 只看该作者
MARK!!收藏了

出0入0汤圆

61
发表于 2014-9-28 02:58:41 | 只看该作者
McuPlayer 发表于 2012-9-19 08:54
PID最简单的变种----分段式PID

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

出0入0汤圆

62
发表于 2014-10-7 20:09:06 | 只看该作者
学习了!

出0入0汤圆

63
发表于 2014-10-8 11:52:46 | 只看该作者
学习了,顶起

出0入0汤圆

64
发表于 2014-10-9 08:16:27 | 只看该作者
学习学习,谢谢分享

出0入0汤圆

65
发表于 2014-10-9 08:31:45 | 只看该作者
楼主很强呀

出0入0汤圆

66
发表于 2014-10-20 23:15:55 | 只看该作者
一直以来都以为PID就是用来控制4轴的

出0入0汤圆

67
发表于 2014-10-20 23:27:19 | 只看该作者
谢谢,学习学习。

出0入0汤圆

68
发表于 2014-10-21 07:55:52 来自手机 | 只看该作者
学习学习,谢谢楼主

出0入0汤圆

69
发表于 2014-10-21 08:31:13 | 只看该作者
调试伺服的时候用过pid,但是还不清楚实际运用的时候怎样建立公式

出0入0汤圆

70
发表于 2014-10-21 11:13:11 | 只看该作者
谢谢分享

出0入0汤圆

71
发表于 2014-10-21 16:10:21 | 只看该作者
欢迎分享自己的经验,大家一起进步

出0入0汤圆

72
发表于 2014-12-17 14:09:04 | 只看该作者
LZ。挖个坟。
是否可以把你修改后的PID工具软件发上来,给我们学习下。
还有e0,e1,e2,e3是什么?

出0入0汤圆

73
发表于 2015-4-28 09:30:58 | 只看该作者
McuPlayer 发表于 2012-9-19 08:54
PID最简单的变种----分段式PID

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

出0入0汤圆

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

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

出0入0汤圆

75
发表于 2015-10-6 16:32:53 | 只看该作者
mobile02 发表于 2014-7-25 20:32
请问 AC 交流如果使用 PID ?

找到交流零位,斩波控制

出0入0汤圆

76
发表于 2015-10-7 13:52:12 | 只看该作者
学习了,谢谢楼主

出0入0汤圆

77
发表于 2019-1-7 21:43:54 | 只看该作者
大神,我有个疑问,你说温控系统属于非记忆要用位置式PID,但是很多帖子都用的增量式,上面的帖子也说用增量式做到了正负0.05...那岂不是有问题了?

出0入0汤圆

78
发表于 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的,那么你说温控系统属于非记忆,那么这不是冲突了吗?

出0入0汤圆

79
发表于 2019-1-22 15:23:40 | 只看该作者
学习了,谢谢楼主

出0入0汤圆

80
发表于 2019-7-29 18:03:00 | 只看该作者
好帖,学习学习。

出0入0汤圆

81
发表于 2019-11-20 11:36:10 | 只看该作者
感谢楼主分享,学习了

出0入0汤圆

82
发表于 2020-1-10 12:00:18 | 只看该作者
不错不错,感谢大侠的分享

出0入0汤圆

83
发表于 2020-3-29 10:21:01 | 只看该作者
感谢楼主分享

出0入0汤圆

84
发表于 2020-7-21 18:03:13 | 只看该作者
正在学习pid,感谢大侠的分享

出0入0汤圆

85
发表于 2020-7-21 23:59:18 | 只看该作者
标记一下,有空仔细学习学习,谢谢

出0入0汤圆

86
发表于 2020-9-10 14:36:03 | 只看该作者
只用过PID来控制加热。

出0入0汤圆

87
发表于 2020-9-19 13:46:20 | 只看该作者
PID控制不就一个芯片控制的吗?设置好参数可以让半导体制冷制热,参数都有计算公式

出0入0汤圆

88
发表于 2022-8-5 09:32:21 | 只看该作者
感谢楼主无私分享,学习了

出0入0汤圆

89
发表于 2022-8-6 12:01:32 | 只看该作者
感谢楼主

出0入8汤圆

90
发表于 2022-10-20 21:06:01 | 只看该作者
感谢楼主,讲得透彻,受益匪浅啊~~

出0入0汤圆

91
发表于 2022-10-21 13:45:48 | 只看该作者
感谢楼主无私教学 PID控制 感谢

出0入0汤圆

92
发表于 2022-11-5 10:05:52 | 只看该作者
感谢楼主无私教学 PID控制 感谢

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-19 01:03

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

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