嵌入式开发--PID控制

PID简介

讲解PID的文章书籍很多,本文就不详细讲了,只讲一下我在学习过程中不容易理解的一些问题点,以供大家参考。比如很多书籍对于PID,只讲了计算,但是最后计算出来的值如何应用,则完全不讲,当时我是一头雾水,后来搞明白以后又觉得还是很简单的,但如果书籍里面能提一下,那不是让人学习起来容易很多么。
PID就是比例,积分,微分三个单词的首字母缩写,是工程上控制系统中的一个常用控制算法。以下结合我之前做过的一个温度控制的项目来介绍PID。用的是当时保留下来的一些调试图片,供参考。
PID有两种控制方式,增量式和位置式,二者在数学上完全等价,随便用一个都可以,有兴趣的可以看一下二者的公式推导。
区别在于位置式需要累加过往的所有值,所以要用一个比较大的计数器,特别是对于长滞后时间的加热系统,往往会用到Float类型或Double,这对于某些单片机来说并不友好。当然这个累加并不会无限的变大,因为系统达到稳定值以后,后续累加的值是围绕0值做正负波动的,而增量式只需要用到最近3次的值,可以用一个INT类型的变量即可,不涉及浮点计算,对单片机的要求低很多。

控制说明

目标温度为230度。用的是一个直流控交流的固态继电器,去驱动一个220V的发热线圈,通过调节PWM占空比,来改变发热状态。占空比在0-100%之间调节,0就是无输出,100就是满功率输出。
为了减小对电网的纹波影响,现在的直流控交流的固态继电器似乎都是具有过零检测的,也就是说,无论你的控制 时机如何,固态继电器都要等到交流电达到零点时才改变控制状态,最高控制精度是半个交流电周期,从时间上看就是1%的控制精度,这也直接造成最后的温度控制精度不可能太高,实际做到温度波动约为1度,如下图,蓝线是温度偏差值曲线,黄线是PID控制的占空比输出(归一化为0-10,以方便显示)
嵌入式开发--PID控制_第1张图片

比例

当前130度,差100度,那第我按1/10取比例系数的话,那P值就是10,如果当前是200度,差30度,那P值就是3,按比例取值即可,这个系数定为Kp,最后算出来的值就是比例的值。
只用比例控制的话,系统会振荡,也就是围绕目标温度230度上下波动,类似于下图这样:
嵌入式开发--PID控制_第2张图片
或者始终达不到设定值,总是差一点,当然这时把比例系数调大一些,一般就可以进入振荡状态。到了振荡状态,就可以继续往后调了。

积分

积分控制的作用是消除静差,如果不用积分控制的话,由于控制精度的问题,系统始终与目标之间有一个固定的差值,当把这个差值做一个长时间的累加以后,这个值就会影响到最终的结果,进而消除这个固定的偏差。
比如不用积分时,温度始终比期望值高1度或低1度,控制律体现为最小的占空比变化,这时引入积分,就可以在一段时间之后适时的增加1个或减小1个占空比变化,从而在长时间来看抹平这个固定偏差值。
举例,如果设定温度是230度,而实测温度229度,则偏差为1度,并将其乘以一个系数Ki(也有叫Ti),最后进行累加。这个值就是积分值。

微分

比例和积分控制都是滞后控制,这会导致系统需要很长的时间才能达到稳定。而对于长滞后时间的加热系统来说,这个时间往往是不可忍受的。而微分控制就可以解决这个问题。
比如说上上次测量时,温度偏差50度,上次测量时温度偏差45度,本次测量时温度偏差为35度,说明系统的温度正在加速上升,如果持续下去,肯定会造成过冲,使得温度大大超过设定值。
微分就是偏差减去偏差,即上一次的值是5度,本次的值是10度,再将其乘以一个系统Kd(也有叫Td),就是微分值。

PID输出

将计算出来的比例,积分,微分值三都简单相加,就是最后的PID输出值。
最后PID的整定,其实就是调节Kp,Ki,Kd这三个系数的值各取多少,就这么简单。
然后将输出值与控制系统统一起来,举例,若PID的输出值为5000,且我们归一化到2000为满功率输出,则从0到2000之间时,按1/20的比例控制PWM,大于2000则用100%占空比。也可以规定一个最低值,比如50以下始终用1%占空比的做一个功率维持。这些控制方式都可以自定。

PID的整定

整定的讲解,各种文章实在是太多了,随便看一两篇即可,都大同小异。
最后的整定结果,看下图,温度波动在1度以内,从第1次达到偏差为0值起计算,200个测试周期进入稳定值,过冲为2.5度
嵌入式开发--PID控制_第3张图片
下图为另一个参数,过冲约为3度,但稳定时间大大缩短,不到100个周期即稳定

最后放一张很有用的图

网上找来的,不清楚出处了,这个图对于整定PID参数非常有用。
嵌入式开发--PID控制_第4张图片

你可能感兴趣的:(嵌入式开发,单片机,嵌入式硬件,PID,STM32,PWM)