主程序的流程图如图11所示:
图11 主程序流程图
3.2 温度采集子程序
温度测量通过DS18B20数字温度传感器测量水槽温度,将水槽温度值转化为数字量接入AT89C52单片机中。再通过与控制温度比较对继电器进行精确控制。
读出温度值DS18B20温度采集的流程图如图12所示:
图12 温度采集流程图
3.3 显示子程序
水温温度值和键盘设定值都要通过LCD液晶显示出来,显示子程序必不可少,将要显示的水温温度和控制温度所对应的BCD码存入AT89C52单片机储存单元中,通过控制信号显示在相应的显示器上。
显示数据有2行,每行的前部为固定英文字符,每行的后部为变化数值,每行字符都有对应的显示位置和显示内容,这些参数已在程序中设定完成。程序直接利用查表方法来得到显示段码[8]。
3.4 温度设定子程序
首先调用扫描子程序,检查有无闭合键。若无闭合键,则对数码显示器扫描显示一遍;若有闭合键,则先消抖。接着进行扫描判断,判别闭合键的具体位置以及获取对应的键值。
设计电路中有两个按键,分别是温度温度上调、温度下调,按PLUS或SUBS行调节,设置一个上限温度,这个设定值会保存在DS18B20 中,掉电后也不会丢失,下次上电时,单片机会自动读入上次的温度设定值[9]。
3.5 控制算法
由于此温度控制系统并没有冷却装置,所以根据实际情况判断,水温不能存在超调现象,温度值必须要求从低到高逐渐逼近设定值。
开始考虑使用PID算法,由于此算法结合比例、积分、微分算法,可使控制量以最短的时间到达指定数值[10],但是考虑到本系统并没有冷却装置,温度一旦超调则无法冷却使其在设定值间震荡,而冷却只能依靠本身与周围环境的热交换来完成,降温速度很慢,无法完成迅速冷却,故本系统考虑用预先设定与温度相对应的PWM数值。
当设定温度和实际温度的差值的绝对值小于10℃时,则立即跳入相应PWM值控制热阻进行加热。当设定温度和实际温度的差值的绝对值大于10℃,热阻持续加热。当设定温度小于实际温度则立即停止加热。
热电阻加热的过程中,被加热的水向上流动,导致炉子上部的温度大于下部温度,如将传感器放在底部,则当温度到达设定温度时,冷热水充分混合之后往往大于设定温度,如果将传感器放在顶部,加热过程中顶部的水先到达指定温度,等冷热水混合之后实际温度会小于设定温度。同样是产生偏差,应选取后者,因为将传感器放在炉子的顶部,这样当冷热水混合之后实际温度小于设定温度,这样可以再次加热以精确达到指定温度;而前者一旦温度超调则降温很慢,造成较大偏差[11]。
将温度传感器放在炉子的上部,但根据水温上升的规律,设定温度和实际温度一度如按照线性升温,会使温度超过设定值而产生偏差,因为加热停止的时候还会产生一部分热量,此热量还会使水温上升。所以在相差一度的时候减小PWM低电平时间会使温度值更精确,所以经过反复测试,最后相差一度时高电平时间设定为50ms。T表示设定温度与实际温度之差,t表示一个周期的低电平时间。控制算法如表3:
表3 控制算法表
T(℃) t(ms)
4. 温度控制系统Proteus仿真
4.1 仿真说明
整体系统仿真使用Proteus软件搭建仿真平台,输入单片机的软件经过KeilC51软件生成hex文件。单片机P1.5端口输出的PWM脉冲方波对继电器进行控制,当输出的高电平出现时,继电器开始工作。 51单片机的锅炉温度控制器的设计+Proteus仿真+电路图(5):http://www.youerw.com/zidonghua/lunwen_1270.html