- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
基于I2C总线的锅炉温度测量系统的设计与实现
1 系统总体设计方案
基于I2C总线的锅炉温度测量系统结构如图1所示,系统主要由温度传感器及信号调节电路、A/D转换器、微控制器、液晶显示、报警电路、存储器电路等组成。系统首先通过温度传感器获得锅炉温度值,调节电路把传感器的输出信号转换为0~5 V的电压值,标准电压值送入A/D转换器转换为数字信号,并送入单片机数据处理,单片机将接收到的锅炉温度值存储到非易失性的E2PROM,液晶显示器1602将显示锅炉的实时温度,单片机还将当前锅炉温度与预先设定的温度范围进行比较。当温度高于设定温度最大值或小于温度极小值时,系统将自动报警。
锅炉温度测量系统是基于I2C总线标准设计的,主要通信部件之间只需要两条总线,一条是双向串行数据线SDA,另一条是串行时钟线SCL。AT89S51不具备I2C总线接口,本设计使用了两个普通I/O口来模拟I2C标准中SDA和SCL的工作,图2是测量系统I2C总线串行通信线路图,系统的多个I2C器件全部通过SDA和SCL连接并进行数据交换,不同器件之间通过总线竞争获得数据交换的权利。
2 硬件电路设计
微控制器模块使用AT89S51单片机,主要实现数据的采集、处理和控制显示等功能,单片机最小系统包括时钟电路和复位电路。设计使用单片机的P1.0产生I2C总线中的SCL时钟信号,P1.1模拟SDA数据信号线,进行数据的双向传递。SCL和SDA引脚内部漏极开路,设计时要外加约5
赘的上拉电阻。系统的硬件电路如图3所示。
A/D转换模块采用具有I2C接口的8 bit CMOS可编程转换器PCF8591,该芯片同时集成了A/D转换和D/A转换功能,这里使用其逐次比较型A/D转换功能。与传统的ADC0809转换输出需要8根并口数据线相比,PCF8591为系统节省了6根数据线。典型的I2C总线接口器件的总线地址由器件地址、引脚地址、方向位组成[1]。在锅炉温度测量系统中,为简化设计把PCF8591的A0、A1、A2三个地址引脚接地。根据其硬件设计,确定PCF8591的总线地址为91H,根据系统所需功能,确定其控制寄存器的值为00H,单片机从PCF8591中读取A/D转换值。通道输入的模拟电压U和转换结果D之间的关系为D=255U/5。在使用I2C总线的系统中,主控器发出的第一个字节信息为器件地址信息,控制寄存器信息是主控器对PCF8591访问时发出的第二个字节信息。
存储器模块采用ATMEL公司推出低功耗CMOS串行带I2C接口的E2PROM芯片AT24C01[2],主要实现温度值的存储。单片机从PCF8591读取A/D转换结果后,把温度值存储到E2PROM。此时,AT24C01地址为A0H,当系统需要从E2PROM读取温度值时,AT24C01地址为A1H。与一般存储器扩展相比,采用AT24C01为系统节省了6根数据线及大量的地址线,使得系统结构更简化,测量过程的干扰因素也大大减少。
系统工作时,AT89S51发出地址信息,PCF8591和AT24C01把自身的地址与接收到的地址信息进行比较,相同则为被访问器件,并准备数据的发送和接收。
温度传感器采用恒流源输出的AD590,不需进行冷端补偿,可进行远距离传送,有较好的抗干扰能力。信号调节电路模块将AD590输出的电流信号转换为0~5 V的电压信号,为A/D转换做准备。
显示模块使用液晶显示屏LCD1602,可以显示16×2个字符,1602的三个功能控制引脚RS、RW、E由单片机的P0.5、P0.6、P0.7三个I/O控制,数据接口D0~D7则由P2口的8 bit来控制。与采用LED显示器相比,液晶显示器的硬件连线更少,电路焊接因此变得简单。
声光报警模块由LED、蜂鸣器和电阻组成。光、声音报警分别由单片机的P1.2和P1.3控制,为提高驱动能力,发光二极管和蜂鸣器均由NPN三极管驱动。
3 系统软件设计实现
本系统的软件设计部分采用C语言编程实现,使用的软件是KeiluVision3,从功能上看,系统软件主要包括主程序、数据处理子程序、读A/D转换结果、温度比较及报警输出子程序、读写E2PROM子程序、显示子程序等,系统主程序流程图如图4所示。
系统主程序主要完成系统的初始化,及各功能模块函数的调用、等待中断。采样时间选择500 ms,使用单片机内部定时器T0实现,因此要对T0的工作方式、计时初值、中断允许、开始计时等进行初始化,T0每50 ms中断一次,中断10次即开始一次温度采样。
数据处理子程序对采集到单片机内的锅炉温度值进行处理,包括四次均值滤波和标度变换部分。
I2C总线通信的编程是系统软件设计的关键,AT89S51不具有I2C接口,I2C总线信号将通过两个独立I/O进行软件模拟。这部分总线数据通信程序编写思路为:先由单片机发出起始信号,接着通过SDA发出I2C器件的总线地址。与该地址相同的器件发出应答,应答正确后,再由单片机通过SDA向应答器件写数据或从应答器件中读取对应地址的数据,一次数据通信结束时要由单片机发出结束信号。
起始信号程序如下:
Start( )
{ SDA=1;
_NOP_( );
SCL=1; //I2C启动总线时,SCL维持高电平
FOR(I=0;I++;I<5)
_NOP_( );
SDA=0; //I2C启动总线时,SDA产生高电平到
低电平的跳变
FOR(I=0;I++;I<4)
_NOP_( );
SCL=0;//准备发送或接收数据
_NOP_( );
}
结束信号程序如下:
Stop( )
{CLR SDA;
_NOP_( );
_NOP_( );
SCL=1; //I2C总线停止时,SCL维持高电平
FOR(I=0;I++;I<5)
_NOP_( );
SDA=1; //I2C总线停止时,SDA产生低电平到
高电平的跳变
FOR(I=0;I++;I<4)
_NOP_( );
}
编写读取PCF8591的A/D转换结果子程序时,流程为:启动起始信号,发器件地址,PCF8591应答,正确则接着发送控制字节,PCF8591应答,正确则传送A/D转换后的数字量,数据传送完则发出结束信号。
本文提出了一种基于日趋流行的I2C总线的锅炉温度测量系统设计方法,经过实际测试,系统运行良好,开发周期缩短。与其他传统设计方法相比,该系统具有简化硬件设计、节省控制器I/O资源、扩展方便、便于实现等优势,提高了测量系统的抗干扰能力和测量精度,具有一定的实用价值。