PID算法中比例项(P)的作用和比例参数的选择
1.1 P的作用
在上一个实验中,我们设定的PWM的每个周期的加热时间是固定的,可以看到温度一直在上升,如图1所示。

如果我们设定某个目标温度,比如60°,然后使用一个固定占空比的PWM信号去加热加热块,要想让加热块的温度能够固定在60°是非常困难的。有效时间短,加热抵不住散热,这样温度到不了60°,加热超过散热,温度又会一直上升,超过60°。
那有没有办法让温度固定在60°呢?有的。那就是测量温度距离目标温度比较远的时候全速加热,在接近目标温度时,降低PWM信号的每个周期的有效时间(当然,这个有效时间增加的热量要超过散掉的热量),超过目标温度后不再加热。具体实现时,我们可以这样操作:
1. 温度小于目标温度时,我们让PWM的有效加热时间与目标温度-测量温度的差值正相关。
也即两者具有以下关系:
out = Kp*(Sv - Pv) (1)
其中,out代表有效加热时间。对于前面实验的设置,它就是装入定时器的捕获/比较寄存器的值。Kp是比例系数,Sv代表目标温度,Pv代表测量温度。
比如,我们设定Kp =20,Sv = 60, PWM的周期为500ms(对应的计数器次数为1000次)则
①当Pv = 30时, out = 20 * (60 - 30) = 600,此时一个PWM周期内有60%的时间是有效加热时间。
②当Pv = 40时,out = 20 * (60 - 40) = 400,此时一个PWM周期内有40%的时间是有效加热时间。
③当Pv = 50时,out = 20*(60 - 50) = 200,此时一个PWM周期内有20%的时间是有效加热时间。
可以看到,随着加热时温度的增加,目标温度和测量温度的差值变小,造成每个PWM的有效加热时间逐渐减小,这样升温慢慢变慢,温度就可以稳定在60°了。
在上面的讨论中,我们还看到,如果目标温度比测量温度大太多,比如目标温度-测量温度 = 55°,则此时out的值超过1000。由于一个计数周期最多1000,所以此时最多取1000的值装入TIM->CCRx即可。
2.测量温度大于目标温度。此时应该将PWM的有效加热时间设置为0,停止加热。
下面我们来看这样一个实验。实验参数为:
PWM周期为500ms,目标温度 = 60°(当前环境温度约为18°C)。为了增加测量精度,我们将温度值增加10倍来考虑,相应的,Kp的值要减小10倍。现在我们取Kp = 2。以下是实验结果。
实验1

由图2可以看到,稳定后,实际温度在目标温度附近震荡。
为了方便观看Kp的作用,我们给出了不同Kp时的实验结果图
实验2 Kp = 1

实验3 Kp = 5(超调严重)

实验4 Kp = 0.5(超调少,但是稳定后没有到达目标位置)

可以看到,Kp的值比较小时,加热不足以抵掉散热,所以稳定后的温度比目标温度小。而在Kp较大时,由于P的调节作用比较迟,加热时间相对较长,而温度具有很大的滞后性,停止加热后温度会继续飙升,所以会有超调现象(实际温度超过目标温度),而且Kp的值越大,超调就越严重。
1.2 Kp的选择
在实际的温度控制中,我们可能直接使用目标温度-测量温度来计算输出,也有可能增加10倍或者100倍来计算输出。那此时比例系数Kp的值如何取呢?
这个要看你想在测量温度达到什么温度时使能比例控制而定。下面我们举常见的2种情况来说明。
1.将目标温度和测量温度放大10倍来考虑。
①你想在距离目标温度有30°时使能比例控制。距离目标温度为30°才控制,意味着(Sv - 30°)是一个临界点,在这个临界点,out刚好等于1000---即还在全速加热。而当测量温度超过这个距离后,out就小于1000了,它的值将随着温度的升高越来越小。所以,在临界点有:
out = Kp * (Sv*10 - Pv*10) -> 1000 = Kp * (Sv*10 - (Sv * 10 - 30*10 )) -> Kp = 3.33
②你想在距离目标温度有40°时使能比例控制。距离目标温度为40°才控制,意味着(Sv -40°)是一个临界点,在这个临界点,out刚好等于1000---即还在全速加热。而当测量温度超过这个距离后,out就小于1000了,它的值将随着温度的升高越来越小。所以,在临界点有:
out = Kp * (Sv*10 - Pv*10) -> 1000 = Kp * (Sv*10 - (Sv * 10 - 40*10 )) -> Kp = 2.5
其它同理。
2.将目标温度和测量温度放大100倍来考虑。
①你想在距离目标温度有30°时使能比例控制。距离目标温度为30°才控制,意味着(Sv - 30°)是一个临界点,在这个临界点,out刚好等于1000---即还在全速加热。而当测量温度超过这个距离后,out就小于1000了,它的值将随着温度的升高越来越小。所以,在临界点有:
out = Kp * (Sv*100 -Pv*100) -> 1000 = Kp * (Sv*100 - (Sv * 100- 30*100 )) -> Kp = 0.333
②你想在距离目标温度有40°时使能比例控制。距离目标温度为40°才控制,意味着(Sv -40°)是一个临界点,在这个临界点,out刚好等于1000---即还在全速加热。而当测量温度超过这个距离后,out就小于1000了,它的值将随着温度的升高越来越小。所以,在临界点有:
out = Kp * (Sv*100 - Pv*100)->1000 = Kp * (Sv*100 - (Sv * 100 - 40*100 )) -> Kp = 0.25
其它同理。
由于温度具有很大的滞后性,所以距离目标温度为40°的点是一个关键点,我们可以先在这个点计算出Kp的值代入PID的公式去计算PID的输出,并观察结果,然后再根据具体结果来调节Kp。
关于PID介绍的更多内容,我们将在近期正点原子平台的第三期教学给大家分享。在这一期的教学中,我们将推出自整定方法和PID模糊控制,关于PID的模糊控制,应该是全网第一个实战的项目,结果精度非常非常高。
如果大家有兴趣,可以关注公众号: O老师讲32
或者直接扫码添加
