PID温度控制
PID中P的作用假设设定温度为 60℃然后使用一个固定占空比的 PWM 信号去加热加热块要想让加热块的温度能够固定在 60℃是非常困难的。有效时间短加热抵不住散热这样温度到不了 60℃加热超过散热温度又会一直上升超过 60℃。那有没有办法让温度固定在 60°呢有的。那就是测量温度距离目标温度比较远的时候全速加热在接近目标温度时降低 PWM 占空比(当然这个有效时间增加的热量要超过散掉的热量)超过目标温度后不再加热。具体实现时我们可以这样操作1.温度小于目标温度时我们让 PWM 的有效加热时间与目标温度-测量温度的差值正相关。也即两者具有以下关系:out Kp*(Sv - Pv) 1其中out 代表有效加热时间。 也就是PWM的占空比。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。以下是实验结果。实验 2 Kp 2由上图可以看到稳定后实际温度在目标温度附近震荡。为了方便观看 Kp 的作用我们给出了不同 Kp 时的实验结果图实验 2 Kp 1实验 3 Kp 5超调严重实验 4 Kp 0.5超调少但是稳定后没有到达目标位置。实验 5 Kp 0.8可以看到稳定后的温度在 58.7°C 附近。可以看到Kp 的值比较小时加热不足以抵掉散热所以稳定后的温度比目标温度小。而在 Kp 较大时由于 P 的调节作用比较迟加热时间相对较长而温度具有很大的滞后性停止加热后温度会继续飙升所以会有超调现象(实际温度超过目标温度)而且 Kp 的值越大超调就越严重。1.2 Kp 的选择在实际的温度控制中我们可能直接使用目标温度-测量温度来计算输出也有可能增加 10 倍或者 100 倍来计算输出。那此时比例系数 Kp 的值如何取呢这个要看你想在测量温度达到什么温度时使能比例控制而定。下面我们举常见的 2 种情况来说明。1.将目标温度和测量温度放大 10 倍来考虑。①你想在距离目标温度有30°时使能比例控制。距离目标温度为30°才控制意味着(Sv- 30°)是一个临界点在这个临界点out 刚好等于 1000—即还在全速加热。而当测量温度超过这个距离后out 就小于 1000 了它的值将随着温度的升高越来越小。所以在临界点有:out Kp * (Sv10 - Kv10) - 1000 Kp * (Sv10 - (Sv * 10 - 3010 )) - Kp 3.33②你想在距离目标温度有40°时使能比例控制。距离目标温度为40°才控制意味着(Sv-40°)是一个临界点在这个临界点out 刚好等于 1000—即还在全速加热。而当测量温度超过这个距离后out 就小于 1000 了它的值将随着温度的升高越来越小。所以在临界点有:out Kp * (Sv10 - Kv10) - 1000 Kp * (Sv10 - (Sv * 10 - 4010 )) - Kp 2.5其它同理。2.将目标温度和测量温度放大 100 倍来考虑。①你想在距离目标温度有30°时使能比例控制。距离目标温度为30°才控制意味着(Sv- 30°)是一个临界点在这个临界点out 刚好等于 1000—即还在全速加热。而当测量温度超过这个距离后out 就小于 1000 了它的值将随着温度的升高越来越小。所以在临界点有:out Kp * (Sv100 - Kv100) - 1000 Kp * (Sv100 - (Sv * 100- 30100 )) - Kp 0.333②你想在距离目标温度有40°时使能比例控制。距离目标温度为40°才控制意味着(Sv-40°)是一个临界点在这个临界点out 刚好等于 1000—即还在全速加热。而当测量温度超过这个距离后out 就小于 1000 了它的值将随着温度的升高越来越小。所以在临界点有:out Kp * (Sv100 - Kv100)-1000 Kp * (Sv100 - (Sv * 100 - 40100 )) - Kp 0.25其它同理。由于温度具有很大的滞后性所以距离目标温度为 40°的点是一个关键点我们可以先在这个点计算出 Kp 的值代入 PID 的公式去计算 PID 的输出并观察结果然后再根据具体结果来调节 Kp。PID中I( 积分项) 的作用在前面的比例项输出实验中当 Kp 0.8 时可以看到稳定后的温度在 58.7°C 附近没有达到目标温度 60°此时出现的这种差值我们叫稳态误差。那有没有一种办法能够让它稳定后达到 60°呢有就是将误差的积累转为输出叠加到比例项上一起参与对 PWM 的有效时间进行控制。我们举一个简单的例子来说明。假设稳定后的温度为 58°比目标温度少 2°。我们将这个 2°进行累加每 500ms 累加一次则有 2222…,该累加项叠加到比例项使得输出为out Kp*2 Ki *(2 2 2 …) (1)式(1)中Ki 为积分系数。由式(1)可以看到当误差积累到一定程度后out 将会是一个比较大的值有效加热时间增加温度会重新慢慢提升并到达 60°C 处。而当温度超过 60°后由于设定值-测量值为负所以比例项和积分项都为负out 的输出为 0系统不对加热块进行加热加热块温度下降。这样反复加热散热最终使得温度被稳定在目标温度处。我们将这种差值进行累加并和比例项一起影响输出 PID 算法的输出 out可以使得系统能够比较好地稳定于目标温度处。这种累加就是数学上的积分将该积分离散后叠加上比例项的结果如式(2)所示。out Kp*E(k) Ki *(E(k1) E(k 2) E(k 3) …) (2)其中E(k)为目标值 - 第 k 次的测量值。下面我们设置 Ki 0.004,Kp 仍然取 0.8然后看一下实验结果。由图可以看到增加积分项后稳态误差被消除了。但是由于整个过程都使用了积分所以导致超调严重而且振荡 1 个多小时才达到稳定。所以在使用积分的时候一定要注意一定要根据具体的情况来使用积分项。比如先使用 Kp 调整使得稳态误差比较小然后再根据稳态误差来确定何时使用积分。下面我们再来看一个实验就是在目标温度 - 测量温度在±5°时才使用积分的情况结果如图所示。可以看到使用积分限制后超调大大减小到达稳定的时间也大大缩短。PID 中 D (微分项) 作用在前面的学习中我们知道了如果 Kp 比较大则由于 PWM 调制点比较迟导致加热时间比较久进而产生较大的超调。而在很多工业设备中过高的温度是不允许的。比如一些纸浆机过高的温度会导致设备/模具损坏所以超调的抑制非常重要。那怎么样才能抑制超调呢我们来分析一下加热棒被加热时的特点。1.当测量温度小于目标温度时无论是比例项还是积分项它们对有效加热时间的贡献都是正的所以叠加后会延长整体的加热时间并进而导致温升过快–当然我们考虑的是加热大于散热的情况。2.当测量温度大于目标温度时。比例项和积分项都是负的对有效加热时间的贡献是负的。由加热棒的加热特点可知我们需要对测量温度小于目标温度时的情况进行重点关注。当测量温度小于目标温度时我们需要在 PID 的输出中增加一个对温度增加敏感的项温度增加快它的值就大温度增加小它的值就小而且它起的作用和比例项、积分项的作用相反也就是说它对有效加热时间的贡献是负的。那该选项应该是怎么样的呢下面我们结合图来分析。图中为单纯比例项作用时的情况。由图可见①当时间从 1 增加到 2 时温度增加 4°。②当时间从 2 增加到 3 时温度增加 8°。③当时间从 3 增加到 4 时温度增加 10°。可以看到时间从 1 到 4 时温度增加越来越快所以抑制项也要越来越强也就是说新增加的抑制项应该与温度的变化率成正比即具有如下关系:Dout Kd’ * ΔEk/Δt (1)其中Dout 为抑制项的输出Kd’为比例系数ΔEk lastPv - Pv 为前后相邻两次测量出的温度的差(温度的变化)Δt 为前后两次测量的时间差。lastPv 为上一次测量出的温度Pv为当前测量出来的温度。因为ΔEk lastPv - Pv (2)( Sv - Pv) - (Sv - lastPv)其中 Sv-Pv 为当前测量温度和目标温度之差。Sv - lastPv 为上一次的测量温度和目标温度之差。所以ΔEk 又可以写成ΔEk lastEk -Ek (3)该公式就是当前各大教材、各大网站给出的温差变化的公式。不过在本教程中我们直接使用公式(2)而不是公式(3)。下面我们回到式(1)继续讨论如下①从 t 1 到 t 2 时Dout Kd’ * (32 - 34) /1 Kd’*(-2);②从 t 2 到 t3 时Dout Kd’ * (34 - 42)/1 Kd’ * (-8);由于通常情况下 Kd’都是正直所以升温时 Dout 的结果是一个负值。实际上式(1)可以做如下变化Dout Kd’ * ΔEk/Δt Kd’ * dEk/dt (4))由(4)式可以看到这是一个微分方程用于描述 Dout 变化趋势所以 Dout 实际上就是微分项的输出而 Kd’为微分系数。加入微分项后PID 的输出变为了式(5)的样子out Kp * Ek Ki * SEk Kd *ΔEk (5))其中Kd Kd’/dt 为重新定义后的微分系数。由于微分项和温度的变化率相关所以它只能阻碍而不能阻止温度的变化。下面我们假设 Kd 300然后来看一下微分项的抑制效果。其中 Kp 2, Ki 0先去掉积分效果。先来看没有微分项时的结果如图所示。下面是增加微分项后的结果。由图可以看到增加微分项后能够有效抑制超调。但是在温度反转的时候由于微分项会非常大所以反转非常困难这时候就需要积分项的累积去抵消掉这个大的反转使得温度能够回到目标位置。如果没有积分项结果很可能是曲线一直发散。“如果你不去追逐自己的梦想有一天你会被雇来帮助别人实现他们的梦想。” - 扖夫·乔布斯Steve Jobs