, , ,
(北京物资学院 信息学院, 北京 101149)
我国是农业大国且每年的粮食产量巨大,加上部分旧粮积压,大量粮食存储在粮库中,粮库是保证粮食储存安全的重要基础设施[1-2],是粮食流通领域中一个重要环节。但是由于粮温、仓温、仓内相对湿度、通风条件、虫害发生情况以及气温、和空气的相对湿度等原因的影响,会导致的粮食的陈化、劣变、霉变,给粮食质量造成了严重的损失[3-4],据世界粮农组织调查,每年因为虫食、储存不当、变质的粮食占世界总量的8.5%,几乎等于非洲饥荒的粮食需求量[5]。粮食的霉变和虫害等的发生有时会直接反映到粮温的变化上,反之,粮仓的温度变化也会加速粮食的霉变和虫害的发生,因此仓温是判断粮仓储粮现状的一个重要判断标志,是全面衡量和判断粮仓粮情的重要依据,为了保证库存粮食的质量,最大限度减少粮食在储存过程中的损失,粮库管理人员必须实时检测储存粮食的温度情况,将粮仓内温度控制在一定范围内[6]。大型粮库的粮仓分布在一定距离内,在几十甚至上百个仓库中有上万个测温点,对于如此规模的粮库粮食检测采用分区取样的人工方法,显然已经不适应粮库管理的需要[7]。近年来,随着电子技术的发展和测量技术的提高,传统的人工查看粮温的方法,已逐步被电子测温设备所取代[8],各种利用电子测温设备对粮仓的温湿度进行监控的系统被设计出来。刘雪梅[9]等就以MSP430F149单片机为核心,利用传感器DHT11对粮仓内的温湿度进行了检测,并分别采用蓝牙模块和GSM网络将测量结果实时近距离或远程传送至用户手机;吴海滨[10]以STM32F103单片机为主控芯片,利用DS18B20、RF433无线模块,单总线通信方式,最大允许接入5120个测量点,设计了一粮仓测温及通风系统,可实现上位机显示所有点温度,并通过设置温度报警阈值进行自动报警,开启超温部分的风机,实现对温度的调整。赵懿琨[11]等利用DS18B20数字温度传感器和HIH3605湿度传感器来检测粮仓环境,并将实时嵌入式操作系统μC/OS-II移植到LPC2103的处理器平台,实现了对粮仓的多点温湿度数据的采集,实验结果表明该系统可以实现对温度达到60-70度的夏季堆积湿粮的温度进行35度高温的报警。金晓龙[12]利用Zigbee技术,结合ATmegal128L单片机和CC2420芯片,对粮仓的测温系统进行了软硬件设计,可实现对粮仓的温度检测,并将检测结果动态显示并报警的功能。也有学者对粮仓的测量另辟蹊径,利用光栅和声波等对粮仓温度进行测量,如王高[13]等为满足粮仓的大范围温度测量的要求,就利用了光纤布拉格光栅所测温度与中心波长之间的线性关系,利用光谱线性频移函数获得粮仓各点的温度,结果表明此系统所测温度基本与标准温度接近,但其抗干扰性能更强;陈冠男[4]利用声波在粮食中通过粮食颗粒之间的孔隙的气体进行传播的原理,定义了相同温度、相同传感器间距下自由空间声速与粮食中实测声速比值为声速转换因子,针对粮食中温度检测的要求,提出基于Markov径向基函数和Tikhonov正则化的温度场重建算法,可以对粮仓中任意位置出现一个或多个热点进行准确定位,探索了利用声学法检测粮仓温度的可能。
各学者对粮仓测温问题都进行了深入的研究,并建立了相应的监测系统,对于不同的应用场景具有一定的适用性,但也存在一定的局限性,如是否能应用于大型粮仓、是否适用于任何粮食等,本文针对粮库测温系统的需求特点,采用基于CAN总线和DS18B20传感器的方案,设计了一套温度采集系统,该系统可以有效减少现场布线,具有成本低、可扩展性好、可靠性高等特点。
总线可以选择CAN总线和RS485总线,但相比RS485总线,CAN总线具有自身的一些特点和优势,在传输距离与速度方面,在高速率传输时,两者的传输距离相差不大,但在低速率传输时,RS485的最大传输距离为1219米左右,CAN总线的传输距离却可达到10 km,因此CAN总线在长距离传输方面具有绝对优势;在总线利用率方面,RS485是单主从结构,一个总线上只能有一台主机,通讯均由该主机发起,发出命令后,要求即时回答,收到答复后再发下一个命令,它若没有发命令,则下面的节点不能发送数据,以免造成数据错乱,而CAN总线是多从结果,可以多节点发送,一个节点发送完后,另一节点探测到总线空闲,即可以发送,提高了总线的利用效率;错误识别方面RS485无法识别错误,而CAN总线可以对任何错误进行检测,因此在安全性方面CAN总线也具有一定的优势;另外CAN总线也不会发生RS485网络中,系统发生错误后,多节点同时向总线发送数据导致总线短路,使总线处于死锁的现象,CAN总线还具有完善的通信协议,开发的周期也大大的被缩短了。正是由于CAN总线的这些高性能、高可靠性和突出的数据传输等性能[13-14],本文的粮仓温度测量系统选用CAN总线作为数据传输总线。
DS18B20是一款常用的数字温度传感器,它输出的数字信号,适应于3.0~5.5 V的电压范围;它具有独特的单线接口方式,在与微处理器连接时,仅用一IO口条线就可以实现两者的双向通讯;它还可实现组网多点测温,在使用中不需要任何外围元件,可测温度范围达到为-55 ℃~+125 ℃,可编程的分辨率为9~12位,可完成对温度的高精度测量,另外该传感器还具有体积小、硬件开销低、抗干扰能力强等特点,因此本文设计的粮仓测温系统选择DS18B20作为温度传感器,来测量粮仓中粮垛内的温度场,且传感器的数量根据粮垛的大小来进行确定。
本粮仓测温系统由测量层和控制层两部分组成,测量层由一系列的测量单元并联组成,每个测量单元包括微控制器、温度传感器组、CAN收发器等;控制层由带CAN接口卡的计算机组成。两部分由CAN总线相联接,系统的结构如图1所示。多个DS18B20并联在唯一的单线上,实现多点测温。考虑温度传感器单总线的驱动能力和现场应用需求,每个微控制器的IO引脚并联8个温度传感器。具体电路如图2所示。
图1 粮仓测温系统结构图
图2 温度传感器电路
微控制器STM32F407ZET6是本系统的核心,通过CAN总线与计算机进行通信,接收计算机的命令、上传数据;通过IO接口与多组并联的温度传感器相联。与单总线相连的接口须为漏极开路或3态输出,因此STM32F407ZET6的IO设置为漏极开路(open-drain)输出模式,其电路如图3所示。
CAN通信模块实现与上位机的数据通信,本文选用STM32F407ZET6自带的CAN控制器,采用SN65HVD230作为CAN收发器。为了增强抗干扰能力,在收发器和对外接口之间加入了共模电感、瞬态电压抑制二极管和100皮法电容。
图3 单片机和CAN网络收发器电路图
DS18B20需要严格的单总线协议以确保数据的完整性。协议包括如下信号类型:复位脉冲、存在脉冲、写0、写1、读0和读1。这些信号都有严格的时间要求,除存在脉冲外,都是由总线控制器发起的【datasheet】。其时序如图4~5所示。
图4 DS18B20的复位和存在脉冲时序
图5 DS18B20的读写时序(线型含义同图4)
分析图4和图5可知,下降沿或上升沿后加一定的保持时间间隔是单总线信号的基本组成单位。协议包括的所有信号都是这些基本单位的一种组合。对DS18B20的任何一种功能操作又都是这些信号的一种组合。其伪代码如下:
复位和读存在脉冲函数序列:
ResetFallingEdge(void) {
Gpio output zero;
Set the timer counter so that the timing cycle is 640us;
}
ResetRisingEdge(void){
Gpio output one;
Set the timer counter so that the timing cycle is 70us;
}
ReadPresencePulse(void){
Read gpio input;
Set the timer counter so that the timing cycle is 570us;
}
写“1”的函数序列:
WriteOneFallingEdge(void){
Gpio output zero;
Set the timer counter so that the timing cycle is 10us;
}
WriteOneRisingEdge(void){
Gpio output one;
Set the timer counter so that the timing cycle is 70us;
}
写“0”的函数序列:
WriteZeroFallingEdge(void){
Gpio output zero;
Set the timer counter so that the timing cycle is 70us;
}
WriteZeroRisingEdge(void){
Gpio output one;
Set the timer counter so that the timing cycle is 10us;
}
读操作的函数序列:
ReadFallingEdge(void){
Gpio output zero;
Set the timer counter so that the timing cycle is 5us;
}
ReadRisingEdge(void){
Gpio ouput one;
Set the timer counter so that the timing cycle is 10us;
}
ReadValue(void){
Read gpio input;
Set the timer counter so that the timing cycle is 65us;
}
为了实现控制器在单总线上以精确的时间输出这些信号组合,本文采用定时器驱动的方法。利用2个定时器,第一个定时器确定温度的转换周期,第2个定时器实现操作时序。在第2个定时器的中断处理函数中依次调用上述的一种函数序列即可实现对DS18B20的复位操作、写“1”操作、写“0”操作或读操作。下面以温度转换操作为例叙述其实现方法。DS18B20的温度转换的命令序列如表1所示。
表1 DS18B20的温度转换的命令序列表
将上表中命令序列所组成的位序列所需要的函数的指针放到函数指针数组中,构成一个实现温度转换的指针数组。代码如下:
typedef void (*pf)(void);
pf pcSequenceTx[163] ={
ResetFallingEdge, ResetRisingEdge, ReadPresencePulse,//复位及读存在操作
WriteOneFallingEdge, WriteOneRisingEdge, //写1
WriteOneFallingEdge, WriteOneRisingEdge, //写0
WriteZeroFallingEdge,WriteZeroRisingEdge,
WriteZeroFallingEdge,WriteZeroRisingEdge,
……
};
定义指向函数指针数组的指针:pf(*ppf)[],将pcSequenceTx数组的首地址赋给ppf,在第2个定时器的中断服务程序中调用ppf(n)即可实现对DS18B20的操作,中断服务程序的代码如下:
Timer2_irqhandler(){
Disable interrupt;
n = n + 1;
ppf(n);
Enable interrupt;
}
同理,其他操作都可以构成一个函数指针数组,再将其数组的首地址赋给ppf,启动定时器2即可实现所需要的操作。如温度读取操作,其命令序列如下表2所示。
表2中命令序列所组成的位序列所需要的函数的指针放到函数指针数组中,构成一个读取温度值的指针数组。代码如下:
表2 DS18B20的温度读取命令序列表
typedef void (*pf)(void);
pf pcSequenceRx[211] ={
ResetFallingEdge,
ResetRisingEdge,
……
}
系统需要温度转换时,启动第一个定时器,第一个定时器的定时周期即是温度采集的间隔周期,第一个定时器的中断函数中设置标志位,主程序中根据此标志位启动第2个定时器,先把上次转换的温度结果读出,再启动本次的转换。以上述操作顺序先对同一IO口的温度传感器进行操作,再操作另一IO口的温度传感器。所有IO的读取温度值和转换命令结束后,把标志位清除。第一个定时器的中断服务程序代码如下:
Timer1_irqhandler(){
Disable interrupt;
ttflag = 1;
Enable interrupt;
}
建立在CAN总线之上的数据传输可以根据具体的实际情况构建自己的数据交换规则,即应用层协议。粮仓测温系统的工作包括了控制层计算机向测量单元发送控制命令、参数设置及测量单元根据命令进行温度转换和上传温度数据。因此,本系统的控制层计算机和测量单元的微控制器间的通信采用主从结构,控制层计算机为主站,测量单元为从站。从站不主动发送数据,只有接到主站的命令后才根据命令进行温度转换或上传温度数据。
CAN规范的帧格式分为标准格式与扩展格式,且均有4种不同的帧类型,本应用层协议只用到CAN标准帧中的数据帧。数据帧标识符的定义如表3所示。
表3 数据帧标识符的定义
帧类型定义如表4所示。
主站发出的广播帧优先级最高,其从站地址可忽略,用于向所有的测量单元发送相同的操作命令,如相同的温度采样间隔时间设置命令等。
表4 帧类型定义
从站地址标识了不同的测量单元,每个测量单元分配一个从站地址。主站可依次给每个测量单元发送上传数据命令,从而得到测量单位的数据。
图6 通信流程
测量单元作为被动通信方,只接收处理并回复控制层计算机发送的命令包,而不主动向控制层计算机发送命令。通信流程如图6所示。控制层计算机向测量层控制器发送命令包,测量层控制器判断ID是否匹配,若不匹配择不做任何响应,若匹配,则进行命令包的解析和处理,并构建回复包后发送回控制层,控制层也要进行ID匹配的判断,若不匹配,则不做任何响应,若匹配,则再继续发送下一个命令包。
系统启动后,程序进行初始化,包括了CPU的初始化和系统工作参数的初始化,如温度测量间隔、温度测量精度等初始化为系统默认值,以及识别每个IO口上的DS18B20,完成后程序一直处于接收状态。上位机下发给下位机的命令主要包括:温度测量间隔设置命令、温度测量精度设置命令、温度单次测量命令、传感器识别命令、温度连续测量命令、读取温度命令等,下位机接受到上位机的命令后,要对命令进行相应的识别,并在识别后执行该命令,上传回复包。主程序的软件流程如图7所示。
图7 主程序流程图
为了验证该系统温度采集的可靠性和准确性,设计了采集单元数据采集试验、CAN通讯试验和对该系统在室温下进行了温度采集的准确性实验。
首先利用仿真器使得采集单元的MCU在仿真下运行,可指定对每个IO上的一个DS18B20进行温度读取和温度转换。同时利用逻辑分析仪采集该IO线上的数据,把获得的数据与MCU软件中发出的数据进行比较,如果一致则证明该IO线上的温度转换操作正确,否则说明软硬件存在问题。通过这种方法,验证了采集单元采集温度是正确的、可行的。
为了验证CAN通信的可行性和可靠性,利用CANScope-Pro型CAN分析仪对CAN通信的物理层、数据链路层和应用层进行了验证。物理层主要验证节点及系统在电路设计、物理电平特性等方面的性能,这是保证节点能够正确连接入总线的基础。数据链路层测试包括了位定时测试、采样点测试、SJW测试等,各个节点中这些参数保持一致才能使网络正常有效的工作。应用层测试用于验证应用层协议运行正确与否。通过试验测试验证了系统网络工作稳定可靠。
实验时先将测温系统放到实验台上,开机十分钟后开始测量,每5s测量读出一次温度值,测量精度设置为12位。实验中用标准水银温度计检测室温并用配套的读数装置读出水银温度计的指示温度,每10s读出记录一次。实验结果如表5所示。
表5 实验测量值 ℃
由表可知,系统能够可靠的测量到各温度点的温度值,且最大偏差小于0.3,系统测温方案的可靠性较强。
通过电子测温设备对粮仓储存粮食的温度情况进行检测,可有效提高粮库的工作效率和管理质量,文章充分利用CAN总线高性能、高可靠性传输数据的性能,利用DS18B20作为温度传感器,设计了一款粮仓测温系统,系统分为测量层和控制层两部分,并通过CAN总线连接,实现了现场布线的简化和数据的远距离传输。实验结果表明,该测量系统测量结果可保持在0.3的偏差范围内,验证了系统测温方案的可靠性,可较好的应用于粮仓的测温中。