找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7731|回复: 25
收起左侧

PID精讲

  [复制链接]
ID:475247 发表于 2019-12-24 14:14 | 显示全部楼层 |阅读模式
什么是PID?
PID,就是“比例(proportional)、积分(integral)、微分(derivative)”,是一种很常见的控制算法。
PID已经有107年的历史了。
它并不是什么很神圣的东西,大家一定都见过PID的实际应用
比如四轴飞行器,再比如平衡小车......还有汽车的定速巡航、3D打印机上的温度控制器....
就是类似于这种:需要将某一个物理量“保持稳定”的场合(比如维持平衡,稳定温度、转速等),PID都会派上大用场。
那么问题来了:
比如,我想控制一个“热得快”,让一锅水的温度保持在50℃,这么简单的任务,为啥要用到微积分的理论呢。
你一定在想:
这不是so easy嘛~ 小于50度就让它加热,大于50度就断电,不就行了?几行代码用Arduino分分钟写出来。
没错~在要求不高的情况下,确实可以这么干~ But! 如果换一种说法,你就知道问题出在哪里了:
如果我的控制对象是一辆汽车呢?
要是希望汽车的车速保持在50km/h不动,你还敢这样干么。
设想一下,假如汽车的定速巡航电脑在某一时间测到车速是45km/h。它立刻命令发动机:加速!
结果,发动机那边突然来了个100%全油门,嗡的一下,汽车急加速到了60km/h。
这时电脑又发出命令:刹车!
结果,吱...............哇............(乘客吐)
所以,在大多数场合中,用“开关量”来控制一个物理量,就显得比较简单粗暴了。有时候,是无法保持稳定的。因为单片机、传感器不是无限快的,采集、控制需要时间。
而且,控制对象具有惯性。比如你将一个加热器拔掉,它的“余热”(即热惯性)可能还会使水温继续升高一小会。
这时,就需要一种『算法』:
它可以将需要控制的物理量带到目标附近
它可以“预见”这个量的变化趋势
它也可以消除因为散热、阻力等因素造成的静态误差
....
于是,当时的数学家们发明了这一历久不衰的算法——这就是PID。
你应该已经知道了,P,I,D是三种不同的调节作用,既可以单独使用(P,I,D),也可以两个两个用(PI,PD),也可以三个一起用(PID)。
这三种作用有什么区别呢?客官别急,听我慢慢道来
我们先只说PID控制器的三个最基本的参数:kP,kI,kD。
kP
P就是比例的意思。它的作用最明显,原理也最简单。我们先说这个:
需要控制的量,比如水温,有它现在的『当前值』,也有我们期望的『目标值』。
当两者差距不大时,就让加热器“轻轻地”加热一下。
要是因为某些原因,温度降低了很多,就让加热器“稍稍用力”加热一下。
要是当前温度比目标温度低得多,就让加热器“开足马力”加热,尽快让水温到达目标附近。
这就是P的作用,跟开关控制方法相比,是不是“温文尔雅”了很多。
实际写程序时,就让偏差(目标减去当前)与调节装置的“调节力度”,建立一个一次函数的关系,就可以实现最基本的“比例”控制了~
kP越大,调节作用越激进,kP调小会让调节作用更保守。
要是你正在制作一个平衡车,有了P的作用,你会发现,平衡车在平衡角度附近来回“狂抖”,比较难稳住。
如果已经到了这一步——恭喜你!离成功只差一小步了~
kD
D的作用更好理解一些,所以先说说D,最后说I。
刚才我们有了P的作用。你不难发现,只有P好像不能让平衡车站起来,水温也控制得晃晃悠悠,好像整个系统不是特别稳定,总是在“抖动”。
你心里设想一个弹簧:现在在平衡位置上。拉它一下,然后松手。这时它会震荡起来。因为阻力很小,它可能会震荡很长时间,才会重新停在平衡位置。
请想象一下:要是把上图所示的系统浸没在水里,同样拉它一下 :这种情况下,重新停在平衡位置的时间就短得多。
我们需要一个控制作用,让被控制的物理量的“变化速度”趋于0,即类似于“阻尼”的作用。
因为,当比较接近目标时,P的控制作用就比较小了。越接近目标,P的作用越温柔。有很多内在的或者外部的因素,使控制量发生小范围的摆动。
D的作用就是让物理量的速度趋于0,只要什么时候,这个量具有了速度,D就向相反的方向用力,尽力刹住这个变化。
kD参数越大,向速度相反方向刹车的力道就越强。
如果是平衡小车,加上P和D两种控制作用,如果参数调节合适,它应该可以站起来了~欢呼吧。
等等,PID三兄弟好像还有一位。看起来PD就可以让物理量保持稳定,那还要I干嘛?
因为我们忽视了一种重要的情况:
kI
还是以热水为例。假如有个人把我们的加热装置带到了非常冷的地方,开始烧水了。需要烧到50℃。
在P的作用下,水温慢慢升高。直到升高到45℃时,他发现了一个不好的事情:天气太冷,水散热的速度,和P控制的加热的速度相等了。
这可怎么办?
P兄这样想:我和目标已经很近了,只需要轻轻加热就可以了。
D兄这样想:加热和散热相等,温度没有波动,我好像不用调整什么。
于是,水温永远地停留在45℃,永远到不了50℃。
作为一个人,根据常识,我们知道,应该进一步增加加热的功率。可是增加多少该如何计算呢?
前辈科学家们想到的方法是真的巧妙。
设置一个积分量。只要偏差存在,就不断地对偏差进行积分(累加),并反应在调节力度上。
这样一来,即使45℃和50℃相差不太大,但是随着时间的推移,只要没达到目标温度,这个积分量就不断增加。系统就会慢慢意识到:还没有到达目标温度,该增加功率啦!
到了目标温度后,假设温度没有波动,积分值就不会再变动。这时,加热功率仍然等于散热功率。但是,温度是稳稳的50℃。
kI的值越大,积分时乘的系数就越大,积分效果越明显。
所以,I的作用就是,减小静态情况下的误差,让受控物理量尽可能接近目标值。
I在使用时还有个问题:需要设定积分限制。防止在刚开始加热时,就把积分量积得太大,难以控制。


评分

参与人数 7黑币 +57 收起 理由
小梁@113 + 5 赞一个!
huangchong + 5
JanJanPlay + 5 很给力!
gg666 + 5 很给力!
songhetai + 21 绝世好帖!
jinsheng7533967 + 8
yoxi + 8

查看全部评分

回复

使用道具 举报

ID:496636 发表于 2022-7-16 13:09 | 显示全部楼层
PID就是建立在偏差上的控制。
P是比例,如果偏差越大,P输出越大,但当越接近设定值时,P输出越小。P输出是这样计算的:先对当前值(反馈值)和设定值进行无纲量化处理,变成0-1之间的值(就是根据其在量程范围内的位置计算而得),如是温度计,量程是-50到150度,如果当前温度是20度,那么就是当前值就是0.35,如果设定温度为80度,设定值为0.65。偏差就是0.3,然后乘以比例系数,如比例系数是150%,那么就是0.45。这个0.45就是比例项的输出值,如果输出控制调节阀的大小,那么单比例项输出就是45%。
阀门的总输出是三项的和,比例项+积分项+微分项。
从这里面就能看出单比例项输出有个弱点,存在静态偏差没法消除的弱点。如果水温达到75度的时候,输出就只有0.0375,即调节阀输出3.75%的开度,如果此调节阀是蒸汽调节阀,在这样的开度输入的热功率是一千W,而散热功率也达到了一千W,这个时候就达到了静态的平衡,温度就上不去了。
如果你的操作者,为了达到80度的温度,就会过段时间去开大一点点调节阀,使温度慢慢地上升,这就是积分的作用。
积分项是建立在比例项基础上的,积分项中有个参数叫积分时间,何为积分时间呢?如果设积分时间为1分钟,它的意思是这样的:
先前5度的偏差,我们算出来调节阀的开度是3.75%,积分时间为1分钟的意思就是如果偏差保持5度一分钟,就积分输出增加3.75%
如我们是操作者,温度不上升,过一分钟我就把开度变成了7.5%,当然这个调节是连续进行的,如果采样时候是1秒,就是每过1秒,增加(3.75/60)%,当然如果偏差缩小了一半,增加的量也会缩小一半。
还有微分,也是建立在比例基础上的。微分的参数是微分时间,那徽分时间是什么意思呢?
微分的作用就是提前控制,如果反应釜温度控制中,控制温度120度,现在开始我滴加反应了,反应后放热很大,但前期温度变化不大,如过了一分钟,温度上升才0.5度,偏差很小,如果温度计就是先前那个量程,那么偏差才0.0025(无纲量)如果比例系数为2000%,那也只是1.25%,控制冷却的调节阀只开大了5%的开度。如果反应釜物料有5千升,是水系的,一分钟上升0.5度,每秒上升0.0083度,5000*4.2*0.0083=174.3千瓦,它的放热功率接近200千瓦,假设每1%的开度粗约可以提供5千瓦的冷量,那么起码是要增加约35%的开度。靠比例这点增加开度是远远不够的。那只能靠微分来处理这种偏差小,偏差变化速度快的应急情况了。
那微分时间啥意思?如果设为微分时间为10分钟,就是依这温度变化趋势,10分钟后能达到的偏差,通过乘以比例系数,得到的值作为微分项的输出。如上面一分钟上升0.5度,那么10分钟就能上升5度,无纲量偏差是0.025,乘以比例系数20,就是45%的输出,从而达到了对温度急速变化立即响应的目的。
比例、积分和微分三者相加就是输出,超过100%,输出就是100%,小于0,就是0.
比例是随着偏差的大小而变化,偏差越小,比例输出越小。
积分的输出是累加上去的,偏差越小,累加上去的速度越小,累加上去后,不会因为偏差缩小而撤销。只会因为负偏差而减小。如果超过设定值了,就会减弱输出。
微分不管偏差大小,只管偏差变化速度和变化方向。它的输出会随着偏差变化速度的大小而变化。如上面釜温变化从每分钟上升0.5度,变为0.1度,微分输出就会从45%减小至9%,而这个时候温度上来了,偏差大了,比例输出变大了。代替了微分的输出。如果偏差还是正,但温度变化变为降温,如每分钟下降0.5度,这个时候微分输出是-45%,它是只跟偏差变化速度相关,不与偏差相关。
回复

使用道具 举报

ID:679983 发表于 2020-1-2 20:27 | 显示全部楼层
做过pid,讲的很不错
回复

使用道具 举报

ID:23606 发表于 2020-1-3 09:27 | 显示全部楼层
讲的太好了
回复

使用道具 举报

ID:508160 发表于 2020-1-17 10:27 | 显示全部楼层
讲的太好了,小白也容易理解
回复

使用道具 举报

ID:560467 发表于 2020-3-6 16:35 | 显示全部楼层
pid控制真的太重要了,最近刚刚做一个pid的设计。
回复

使用道具 举报

ID:94449 发表于 2020-3-8 21:39 | 显示全部楼层
好的科普文章就是要像这样通俗易懂,点赞.
回复

使用道具 举报

ID:707776 发表于 2020-3-13 16:27 | 显示全部楼层
太好了,如果有个程序实例就好啦。
回复

使用道具 举报

ID:696930 发表于 2020-3-27 16:26 | 显示全部楼层
讲得很精简,通俗易懂。
回复

使用道具 举报

ID:241242 发表于 2020-4-21 10:09 | 显示全部楼层
精辟!通俗易懂!
回复

使用道具 举报

ID:734188 发表于 2020-4-21 11:06 | 显示全部楼层
通俗易懂的文章可不常见
回复

使用道具 举报

ID:517998 发表于 2020-4-24 07:23 | 显示全部楼层
请收下我的
回复

使用道具 举报

ID:639290 发表于 2020-4-27 16:05 | 显示全部楼层
讲的挺细的
回复

使用道具 举报

ID:475207 发表于 2020-4-27 17:54 | 显示全部楼层
这些比喻
真的是通俗易懂,
回复

使用道具 举报

ID:748312 发表于 2020-5-10 15:49 | 显示全部楼层
通俗易懂,十分感谢
回复

使用道具 举报

ID:928589 发表于 2021-6-30 13:42 | 显示全部楼层
通俗易懂
回复

使用道具 举报

ID:731329 发表于 2021-7-20 15:15 | 显示全部楼层
讲的不错
回复

使用道具 举报

ID:677615 发表于 2021-9-1 14:06 | 显示全部楼层
讲得不错   容易理解
回复

使用道具 举报

ID:59300 发表于 2021-9-5 23:32 | 显示全部楼层
非常实用的讲解,值得点赞
回复

使用道具 举报

ID:678280 发表于 2021-12-18 11:49 | 显示全部楼层
楼主真是好人,要是举个简单的例子就完好了。
回复

使用道具 举报

ID:364721 发表于 2022-3-9 10:31 | 显示全部楼层
感谢楼主的分享,好人一生平安!!!
回复

使用道具 举报

ID:378605 发表于 2022-6-10 20:15 | 显示全部楼层
谢谢,非常详细易懂
回复

使用道具 举报

ID:38662 发表于 2022-6-23 18:26 | 显示全部楼层
讲的太好了,通俗易懂,如果有程序配合说明那更好。
回复

使用道具 举报

ID:114701 发表于 2022-7-14 11:46 | 显示全部楼层
想的太好,谢谢。
回复

使用道具 举报

ID:496636 发表于 2022-7-16 13:12 | 显示全部楼层
对于反应釜等大容量的热体系,比例系数是非常大的,比例系数为20,不要见怪。
回复

使用道具 举报

ID:614295 发表于 2022-8-13 15:36 来自手机 | 显示全部楼层
本帖最后由 peavey 于 2022-8-21 06:01 编辑

pid算法真的好神奇.. 记号
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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