PID算法的原理和实现(一)

1、什么是PID?能吃吗?

PID是常见的控制算法。当然算法不单单要“吃”,更要进行“消化”。PID中的P就是比例(proportional)、I就是积分(integral)、D是微分(derivative)。

其实PID在生活中非常的常见,就好比平衡小车、无人机、一部分的扫地机器人…emmmm再好比骑自行车?

总之PID主要就是控制某一个量“保持平衡”的一种算法。

我这里举一个常规的例子你大概就能够明白了:
我们想煮一壶60℃的水,你会怎么做呢?
这个答案不是很简单嘛。就当他低于60℃的时候加热,超过60℃的时候断电,这不就可以了嘛。如果用51单片机来控制不就是一个ADC和一个IO口就能解决的事情嘛。其实这个是一个正确的答案,但他并不是很准确。如果是火箭在发射是时候要求某个时刻的速度保持在10KM/S,而他的速度只有9.8KM/S,这时他要加速,由于动力系统用力猛,唰的一下就加到了10.5KM/S,这时又超过了10KM/S,又赶紧关闭动力系统,然后又开又关,宇航员在里面都快自闭了。

所以这种单纯的开关变量就非常的单一了,如果是煮水的话,加热到达60℃的时候即使能够及时断电,但加热壶也会有余热使得水温一直上升。

这个时候,就急需要一种方法来解决这个问题。(即还没有到60℃但还在加热的时候断开电源,用余热把水温加到60℃)

经过大佬们的一顿操作,于是就有了PID算法。

2、好的,我知道PID了,那他具体是怎么实现的呢?

各位看官不要着急,听我细细道来。我们知道了PID分别是比例、积分和微分,他们即可以单独使用(P、I、D),也可以两两使用(PI、PD),更可以三个一起用(PID)最后这句好像有点废话了。。

首先我们来认识一下一些基本的参数:KP、KI、KD。

KP

P就是比例的意思。KP就是比例系数,它是PID中作用效果最明显的参数了(P大哥)。那他主要是怎么控制的呢?

就拿我们的熟客水温最比方,当我们知道了它【实际的温度】和【期望的温度】,当它们差值不大的时候我们就让它轻轻的加热一下。如果差值很大就让他快速的加热,让温度能够上升的更快。

这就是我们P大哥在PID中占据的地位!KP越大,调节就会越强烈。对于一些对精度要求不高的系统,单单一个P算法就能够让系统稳定在一个平衡状态上。

但如果你在做一辆平衡小车,可能还不够。在P的作用下,小车可能会在平衡的角度上频繁抖动,如果我们这时候加入I和D的控制,就能够将小车稳定在平衡状态。

KI

KI是积分系数,这里还是以水温为例哈。我们在加热水的同时,水也在散热,如果我们把这个系统放在一个温度很低的地方,当我们加热到56℃的时候出现了一个问题:P大哥加热的速度和水温下降的速度达到了一个平衡!这时候温度就会停在56℃,想达到60℃根本就是天方夜谭。

就在这个时候,I弟站出来了:哥,你已经很棒了,剩下的就交给我吧。I算法能够将偏差进行累加,当温度停在56℃时实际温度和目标温度还是有偏差,所以I会一直累加,加热的速度也在增加,这就打破了P的一个静态平衡。当水温加热到60摄氏度的时候,偏差值为0,I也就保持住了。当然这是理想状态,实际情况会出现一定的抖动现象。I弟虽然一开始很弱,但他会一直打怪升级,新手村的怪打得很快,I弟也就成长的快。当P大哥卡在某个关卡的时候,I弟之前的努力就显现出来了,组队打怪总比一个人打怪要快的嘛。

I的作用就是减小静态误差,让被控制的量更接近目标值。但过大也不行,过大可能会导致系统难以控制,所以一般都要有个积分限制。

KI的值越大,积分的效果就越明显。

KD

KD就是微分系数啦,经过我三秒钟的思考时间决定,我这里还是用水温为例。之前已经讲了I和P了,已经能够让系统稳定在平衡状态了。如果这时候我们往水壶里加滚沸的热水,因为I已经累加了很多了,一时半会儿降不下来,这就会导致加热系统还在继续加热,而水温早就超过了目标值。

P大哥:I弟啊I弟,你就这么死脑筋的嘛,不懂得变通的嘛。看来我们要加一个新兄弟来限制一下了。

来了,来了,它真的来了,它带着它的满级装备走过来了。

D兄会根据偏差的变化来改变,可以说是这个团队的军师了,当平衡状态被某个外接条件打破了的时候D就会有所洞察,进而通过改变自己来达到稳定的状态。

KD值越大,它的制动能力就越强。

先这样吧,下一章我再做PID的实现。
拜拜。

你可能感兴趣的:(嵌入式,硬件,算法)