}
Else if (tx++>=ts) { PID( ); t=0; } }
5 系统的软件设计
5.1 统软件设计概述
在恒温PID控制系统中软件是整个系统的核心,在软件设计中采用分层模块化设计,其中主要的模块包含:人机交互模块、数据显示模块、PID控制器模块、信号采集模块、超、低温报警模块几部分[14]。
1、人机交互模块,是通过3位按键来实现的。第一个按键为复位按键,其他两个为调节按键,当有键按下时该键位将会处于低电平状态,按键连接上了电阻,使其当未有按键按下时,各各按键位都处于高电平[15]。本设计中的按键具体原理与操作方法,在第三章的按键单元中已经做了详细的说明。
2、数据显示模块,是通过LCD液晶实现的。采用的是通过动态显示法,分时分别控制LCD液晶的COM端,使每个位轮流显示,每位点亮的时间间隔大概为1ms左右。
3、PID控制器模块,本设计是运用PID控制算法,仿真实现一个恒温控制系统。在上一章中我们已经描述了e?t??n0?t??n?t?,电压的控制信号u?t?,从而反馈调节温度。设计中最主要的就是PID参数的选择,它决定着整个温度控制的精确度。我们可以根据具体情况的要求,来调节合适的参数。对PID函数进行初始化时,需设置函数参数,这些参数都是根据实验测定获得的,具体参数在上一章PID算法研究中有详细说明。
4、信号采集模块,本设计中是运用DS18B20进行温度采集的,在DS18B20开始运作时,首先要做的是复位工作,DS18B20在接收到这个信号后的15~60us内会回发一个芯片的存在脉冲。为了接收存在脉冲,数据当总线将会被控制器拉高,存在脉冲是一个60~240us的低电平信号。接下去将进行51单片机与DS18B20间的通信。接着51单片机发送存储器操作指令(在指令发送给DS18B20后,马上就发送存储器操作指令了)。控制DS18B20怎么样进行工作[16]。
5.2 系统软件程序流程及程序流程图
系统软件流程如图5.2所示:
开始系统初始化按键设置预设温度温度采集比较设定的温度与测量温度值的大小温度显示 PID控制 图5.2 系统软件流程图
程序流程为:
在程序开始的时,先设置初始化,通过按键设置预定温度值,然后通过数码管来显示当前的温度,再比较设定的预期温度与测量温度值的大小,将比较的信息通过继电器,去根据当前设定的温度值的上下限,当测量到的温度值未达到先前设定的预期温度值下限时,使单片机向蜂鸣器发送高电平信号使其发出警报生,再通过RELAY口向光电耦合器发送高电平时,无电流流过,光电耦合器将不导通,继电器也不能导通,继电器的线圈无电流通过,RL1打向电源处,加热棒通电开始工作加热,可以根据功率表的数据显示看出加热棒提升的温度。当测量到的温度值超出先前设定的预期温度值上限时,使单片机将向蜂鸣器发送高电平信号使其发出警报生,再通过过RELAY口向光电耦合器发送低电平时,光电耦合器将导通,有电流流过,使得继电器也导通,继电器的线圈有电流通过,RL1打向继电器线圈,加热棒断开连接,停止工作,使温度慢慢的回落。
5.3 温度数据显示模块分析
在本次软件设计中,核心的部分就是PID算法的控制与DS18B20温度采集的实现,PID算法在上文中已经做了详细的介绍,在此再具体的分析下DS18B20。
在本次设计我选择了DS18B20来继续温度检测,因为数字温度传感器DS18B20只需一个引脚,即可与单片机进行通信了,大大的减少了接线麻烦的问题,使得单片机更加具扩展性。由于DS18B20芯片的小型化,通过单条数据线,就可以和主电路连接,可把数字温度传感器DS18B20做成测温探头,可方便的探入到狭小的地方,从而增加了实用性。且本次设计采用proteus仿真软件,在proteus仿真软件里DS18B20可以随意设定温度,模仿实际环境温度值,便于实验[17]。
DS18B20数字温度传感器的内部包含了高速暂存RAM与用来存储TH、TL的E2ARM。接受到的数据先是存入RAM,经检验后传送至E2ARM。RAM中的第5个字节用与控制温度的数字转换分辨率,此分辨率决定DS18B20工作时温度转换的先对应的数值。其中要注意的是设定的分辨率越高,就需要消耗越多的转换时间。所以在设置分辨率时我们需要有所考虑[18]。
DS18B20在接收到温度转换的命令后,将温度值数据转换成以二进制补码的形式存储在RAM中,然后51单片机再通过单总线接收此数据,以地位在前高位在后的方式来读取数据。接收数据后通过温度计算,将得出的温度值与设定的TH、TL进行比较,51单片机再根据比较的结果做出相应的运行工作。
为此我们在程序设计中设计了下面主要几个子程序。 首先对DS18B20进行初始化处理 void Init_DS18B20(void) {
unsigned char x=0;
DQ = 0; //单片机将DQ拉低 delay_18B20(80); //精确延时大于480us DQ = 1; //拉高总线 delay_18B20(14);
x=DQ; //稍做延时后,如果x=0则初始化成功x=1则初始化失败
相关推荐: