zoukankan      html  css  js  c++  java
  • 温度PID控制

    硬件:


    T1的b极输入PWM波(3.6V),高电平时,三极管导通,MOSFET的栅极为低电平,MOSFET关闭;PWM为低电平时,三极管关闭,MOSFET的栅极为高电平,MOSFET导通。这里三极管有一个上拉的作用。实测N沟道增强型IRFB3607的导通电压为5V,完全导通需要12V,所以VCC应该大于12V,若VCC小于12V,则MOSFET处于半导通半不导通状态,在这上面会消耗许多的热量,效率就会变低。

    软件:

    公式1:

    公式2:

    刚开始时,用公式1来计算PID,但效果不佳,只能在温度超过阈值时才触发动作,所以会振荡得厉害。

    后来改用公式2,效果比公式1好,原因在于:公式2中的参数Kp、Ki、Kd有明显的物理意义,可以参照各个参数的物理说明进行调节。公式1中的参数物理含义不明显,所以调节起来不是很好。

    我们的调节PID的频率为每秒钟50次,向上位机发送数据的频率为每秒钟2次。

    公式2参数说明:

    Kp:Kp对运动有着反效果,不管当前温度在目标温度上方还是下方,它的效果就是使温度往相反的方向发展,效果在时间上不累加,不能消除静差。就比如从常温开始一直加热升温,但Kp会促使温度回归,温度上升缓慢,不久之后,温度会稳定在一个值,但这个值并不是我们想要的目标值。

    Ki:具有时间累加效果,由于该值直接与误差有关,所以Ki可以消除静差。当前温度在目标温度上方,就将它往下拉;当前温度在目标温度下方,就将它往上拉。

    Kd:具有稳定、快速反应的效果,与运动趋势相反(有点加速度的味道),比如向上运动变慢,Kd就往上拉;向上运动变快,Kd就往下拉。(在我们这个温控系统中没有使用微分项)

    几点改进:

    1.Bang_Bang控制:在当前温度远低于目标温度时,调节PWM的占空比为1,全速加热

    2.在当前温度高于目标温度一定值时,关闭加热,PWM占空比为0

    3.由于积分效果跟直接误差e有关,当目标温度跟当前温度还差比较大时,积分效果就占了一个比较大的比例,所以我们采用变速积分法,即当误差e在某个范围内时,才启用积分效果,这里需要注意的是,若这个积分范围过小,则温度会稳定在其他地方,存在静差,温度进入不到积分区域就消除不了静差。

    4.AD转换结果用滑动均值滤波算法,即取一个N=10的队列,每次数值从队尾进入,将比较”旧“的数据从队头挤出,这样可抑制周期性脉冲的干扰,正负抵消。

    温度测量:

    这里我们测量温度是用热敏电阻的方式,25摄氏度时的阻值是10K,B25/85=3435K(B值是温度参数,B25/85是指测试条件在25~85度),这里有两种方式获得温度:

    1.公式法:热敏电阻的阻值和温度有一个固定的关系,用公式算比较复杂,且速度慢,热敏电阻本身就不精确,用公式计算也无太大必要

    2.查表法:将各个温度值所对应的阻值列成一个表格,然后去查表,由于阻值并非唯一,所以可用while语句来查询


    图一:使用公式1进行PID调节(分辨率已记不清,只记得效果没有使用公式2的好)


    图一

    图二:使用公式2进行PID调节的升温过程(横轴50s/格,纵轴100/格),目标温度69.0度,所以纵轴应该稳定在690处,从室温28度稳定到69度大概需要10格,即500秒,误差在+-1度


    图二

    图三:给散热系统一个人为干扰,温度下降15度,之后经过几次振荡回到69度原位置


    图三

    下面给出完整版的数据曲线:(图示为稳定在69度时的曲线图,715秒时的陡降为认为扰动)

    前期为Bang-Bang控制全速加热,但曲线未能超过目标线,为非标准的PID,猜测可能是初始化时,占空比较低(占空比与此时情况不相符)且温度速度增长太快,导致P起主要作用,将温度往回拉(将占空比拉低);中期不会出现这种情况,应该是因为此时占空比跟此时情况相对应,经过调节会在合理范围内。



  • 相关阅读:
    jQuery(2)
    jQuery(1)
    underscore.js
    面向对象复习
    1.14函数复习
    面向对象(3)继承
    10.18
    1017
    js笔记二
    js笔记一
  • 原文地址:https://www.cnblogs.com/season-peng/p/6713552.html
Copyright © 2011-2022 走看看