文献标识码:A
文章编号: 0258-7998(2013)07-0028-03
土壤墒情是指土壤含水量及土壤湿度,即土壤干湿程度[1]。在水利科研、农业生产、园林种植、旱情预报等方面,土壤的含水量和温度起着不可忽略的作用,准确地测量土壤含水量和温度有助于科学指导生产科研工作,合理利用水资源,减少不必要的浪费。传统的测量土壤含水量的方法是采用烘干法,这种方法效率低,对操作者要求高,而且操作繁琐。传统的测量土壤温度的方法则是采用温度计来测量温度值。随着科学的不断进步,市面上也有一些多要素的自动墒情站用于测量土壤墒情和温度,但这些设备的不足之处就是只能测量固定位置的要素值,要测量其他没有安装自动墒情站地方的要素值很不方便。而便携式土壤墒情和土壤温度两要素测量仪,能够方便、准确地测量待测地点的要素值,这样可以减少自动墒情站的安装,节约成本,方便使用,并且具有功耗低、携带方便、稳定可靠等优点。
1 系统总体结构
便携式采集器是一款轻小便捷的两要素手持设备采集器,主要采集土壤含水量和土壤温度值。硬件总体框图如图1所示。系统初始化完成后,GPS模块获取待采集位置的地理信息和时间,并将时间更新到系统时钟。使用时只需将插针式墒情传感器和温度传感器插入待测土壤中便可采集要素。采集的要素值可存储在EEPROM中,并在LCD上显示测量值,实现即用即测。同时可读出EEPROM的数据并显示某一段时间内的墒情和温度特性曲线图。设备上的USB接口有两个功能:一是通过USB可以将EEPROM中存储的数据导入到计算机中,便于分析和比较;二是 USB接口可供系统充电。
2 微处理器
ARM Cortex-M3 LPC1766是一个低成本、低功耗并且具有极高运行能力和中断响应能力的处理器[2]。其操作频率可达100 MHz,具有3级流水线和哈佛结构,带独立的本地指令和数据总线以及用于外设的低性能的第3条总线,其外设组建包含512 KB的Flash存储器、64 KB的数据存储、以太网MAC、USB接口、10位DAC、内部RTC等功能。LPC1766还有许多新的特征,包括Thumb-2指令集、低中断延时、硬件除法、可中断可持续的多次加载和存放指令、对中断的自动状态进行保存和恢复、紧密结合中断控制器与唤醒中断控制器、多条内核总线可同时访问等[3]。
3 土壤墒情传感器接口电路
土壤墒情测量接口电路如图2所示。微控制器通过GPIO口控制墒情传感器的电源。当需要进行墒情要素采集时才给传感器供电,这样降低了功耗,减少了传感器插入土壤中的探针发生电解的时间[4],延长了传感器的使用寿命。传感器采集到的电压信号(ΔV=VT_H-VT_L)经过放大后由微控制器进行A/D转换得到采样值,在0~50%范围内可通过以下三次多项式得到土壤含水量的转换结果。
4 温度传感器接口电路
DS18B20是单总线的工作方式,即在一根数据线上实现数据的双向传输,所以DS18B20的外接电路也相对简单。典型的电路有两种:一种是采用寄生电源供电,另一种是采用外接电源供电。无论采用哪一种方式,其DQ引脚都要外接一个上拉电阻。本文选取采用外接电源供电的方式,VCC外接3 V~5.5 V电源,GND引脚接地,DQ引脚通过上拉电阻接微控制器的I/O端口,其原理图如图3所示。
5 RT-Thread操作系统的移植
为保证系统的稳定性和实时性,选用开源RT-Thread操作系统。RT-Thread 内核大致可分为对象管理、实时调度器、线程管理、线程间通信、时钟管理、设备驱动6个部分[5]。移植的软件编译平台为Keil MDK 4.23,具体操作步骤如下:
(1)打开Keil编译环境,新建一个Keil编译工程文件命名并保存,系统提示选择具体的芯片型号,选择CPU为LPC1766。
(2)添加RT-Thread内核组件,将Keil工程浏览目录下的Target 1更名为RT-Thread LPC1766,将RT-Thread LPC1766下的文件夹Source Group1更名为Kernel,同时新建文件夹System、Cortex-M3、finsh、Driver、Lwip。在Kernel中加入RT-Thread内核组件;在Cortex-M3中加入内核自带并针对LPC176x移植的汇编文件;在Driver文件中添加设备相应的驱动函数;在System中添加相应的启动文件、中断向量表、核心板文件等;在finsh中添加finsh shell组件;在App中添加用户编写的一些应用文件;在Lwip中添加TCP/IP协议文件。同时可以根据实际需求,在Rtconfig.h中配置系统时钟、最大优先级、是否启用finsh等。
(3)在Project->Options for Targe′ RT-Thread LPC1766′中选择C/C++选项卡,添加系统所需头文件的路径,包括内核、驱动以及用户定义的所需头文件的路径。
至此,RT-Thread移植基本完成,用户可以编写相应的应用程序并执行。
6 DS18B20在RT-Thread驱动的实现
6.1 DS18B20简介
DS18B20是一款数字式的温度传感器,它是一个单总线的器件,测量温度范围在-55 ℃~+125 ℃,在-10 ℃~
+85 ℃范围内的测量精度能够达到±0.5 ℃,测量精度相对较高。通过编程可实现9~12位精度的数字读方式,并且具有温度上下限报警功能。在一个系统中可以挂接多个DS18B20器件,每个器件都有一个唯一的序列号存储在ROM中,DS18B20提供了5种ROM指令供识别器件,同时还提供了6种RAM指令来操作DS18B20。
6.2 DS18B20驱动实现
一般来说,在一个测温系统中,DS18B20都是作为从机供主机访问,微控制器通过单总线访问DS18B20一般需要以下3个步骤[6]:
(1)复位初始化DS18B20。
(2)执行ROM指令(器件识别),对于设备上只有一个DS18B20的系统来说,无需读序列号来匹配设备,可以省略读ROM指令,直接执行功能指令。
(3)执行RAM指令,包括写命令到DS18B20,启动温度转换,从DS18B20读数据。
6.2.1 DS18B20复位流程
在对DS18B20进行初始化时,最主要的一点就是对时序的控制,若延时控制不当,DS18B20将不能工作或不能正确测量温度值。DS18B20初始化流程如下:
(1)设置总线为输入状态。
(2)拉低总线约480 ?滋s~960 ?滋s。
(3)释放总线,外部上拉电阻拉高总线15 ?滋s~60 ?滋s,随后DS18B20会拉低总线约60 ?滋s~240 ?滋s来应答主控制器。
(4)设置总线状态为输出,主控制器读取总线电平,如果为低电平则表示初始化完成。
(5)释放总线,初始化完成之后控制器就可对DS18B20进行操作访问。
6.2.2 DS18B20写流程
写一个操作命令字节到DS18B20需循环8次,因为DS18B20是一个单总线的设备,所以只能逐位操作。DS18B20的写操作流程如下:
(1)设置总线为输入状态。
(2)拉低总线并延时约10 ?滋s~15 ?滋s。
(3)写入数据,写入的是“1”,则拉高总线约15 ?滋s~40 ?滋s;写入的是“0”,则拉低总线约15 ?滋s~40 ?滋s。
(4)字节数写入完成后释放总线,等待约3 ?滋s。
6.2.3 DS18B20读流程
读DS18B20与写操作类似,也是要循环8次。若检测到DQ的状态为高电平,则将数据data的最高位置1,通过逐次向右移位来获得DS18B20检测的温度值。DS18B20的读数据流程如下:
(1)拉低总线约1 ?滋s。
(2)释放总线,读取总线电平状态。
(3)如果读到的是低电平,则表示读到的是“0”;如果读到的是高电平,则读到的是“1”。
(4)延时约30 ?滋s~45 ?滋s。
完成以上步骤后,将驱动移植到RT-Thread驱动中,其公共接口的实现代码如下:
void rt_hw_ds18b20_init(void)
{
……
ds18b20->parent.init = rt_ds18b20_init;
ds18b20->parent.open = rt_ds18b20_open;
ds18b20->parent.close = rt_ds18b20_close;
ds18b20->parent.read = rt_ds18b20_read;
ds18b20->parent.write = RT_NULL;
ds18b20->parent.control = RT_NULL;
ds18b20->parent.user_data = RT_NULL;
rt_device_register(&ds18b20->parent, "ds18b20",
RT_DEVICE_FLAG_RDWR );
}
上述函数中,在rt_ds18b20_read函数中读取DS18B20的温度值的过程中就包含初始化设备,而获取总线、释放总线的功能与打开设备、关闭设备类似,因此rt_ds18b20_
init、rt_ds18b20_open、rt_ds18b20_close 3个函数的函数体可以直接返回RT_EOK。而其他函数在采样时没有涉及到这些功能,因此可以为RT_NULL。rt_device_register函数用于注册设备并设置相应的属性,注册的设备可以通过查找设备名称来找到设备,并获得相应的设备控制块。整个DS18B20驱动中,所有对DS18B20的操作都是在rt_ds18b20_read函数中完成的。rt_ds18b20_read函数中进行了设备的初始化、执行相应的ROM指令和执行相应的RAM指令操作来实现DS18B20的温度测量,rt_ds18b20_read函数的主要功能如下:
static rt_size_t rt_ds18b20_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
{
........
rt_enter_critical(); //调度器上锁,仅响应中断
InitDS18B20 (); //设备初始化
WriteOneChar(0xCC); //跳过读序列号操作
WriteOneChar(0x44); //启动温度转换
InitDS18B20 ();
WriteOneChar(0xCC);
WriteOneChar(0xBE); //读取温度寄存器操作
lsb = ReadOneChar(); //读低字节
msb = ReadOneChar(); //读高字节
rt_exit_critical(); //调度器解锁
Temperature = ((msb << 8) | lsb) * 6.25;
//DS18B20 的温度操作的分辨率是0.062 5
……
}
t/100为温度值的整数部分,而(t % 100)/10为温度值的小数部分。在上层的应用中,软件只需调用rt_device_read函数就能获取相应的温度值,该函数的返回值是读到数据的大小(以字节为单位),如果返回值是0,则需要读取当前线程的errno来判断错误状态。
7 土壤墒情测量
7.1 传感器原理[4]
干燥土壤的介电常数一般在2~4之间,而水的介电常数一般为80。可以把含水的土壤看作为一种由干燥土壤和水混合在一起的介质,因此介电常数就会随含水量的变化而变化。本文选用的土壤传感器为ASW100F,它由一个100 MHz的信号源、探针以及电缆组成。根据传输线原理,电缆和探头连接处的阻抗用下式表示:
式中,Zc为探头在空气中的特征阻抗;l为探针的长度;?姿o为正弦波在空气中的波长;?着为探针周围土壤的介电常数;j为虚数部分的表示因子。由式(2)可知,阻抗Zi与探针周围土壤的介电常数?着有关,阻抗Zi随着土壤介电常数的不断变化而变化,导致探针和电缆的阻抗不匹配,这会在电缆中产生驻波,而驻波的波峰和波谷也会随着土壤介电常数的变化而变化。因此,驻波包络的电压就反应了土壤含水量的情况,因此可以通过测量电缆上的电压差得出土壤的含水量情况。
7.2 土壤墒情的采样
土壤墒情的采样主要是将采集的电压信号放大,然后通过微控制器的A/D转换来实现的。A/D读取的数据通过式(1)得到土壤墒情值,具体的采样流程为:(1)微控制器通过控制GPIO口为墒情传感器供电。(2)墒情传感器进行数据采样。(3)采样的电压信号经过放大器进行放大。(4)将放大器放大的电压信号通过微控制器进行A/D转换。(5)A/D转后的值经过软件运算处理后得到土壤含水量的值。
在测量的过程中,难免会出现测量偏差。为此在采样时连续测量3次,比较两个测量值之间的差值。如果两次测量误差大于1%,则认为测量失败,反之则认为测量值有效。然后将测量的3次有效值求平均来获取本次测量值。软件过滤无效值的代码如下:
void SoilDataDetec(void)
{
……
for (j = 0; j < 3; j++) {
value = Multi_Detect(); //从A/D读出采样值
……
value = 0.111 * pow(value, 3) - 0.2338 * pow
(value, 2)+ 0.2756 * value - 0.0211;
……//依据式(1)计算
temp[cnt++] =value;
}
if (cnt == 3) {
//3次测得的值都有效,两两测量值之间不大于1% 则
//认为有效
if ((fabs(temp[0] - temp[1]) > 0.01f) || (fabs(temp[0]
- temp[2]) > 0.01f) ||
(fabs(temp[1] - temp[2]) > 0.01f) ) {
SoilValue = Pre_SoilValue;
//无效值,则选用前一次采集到的值
} else {
avgvalue = (temp[0] + temp[1] + temp[2]) / cnt;
//取平均值
SoilValue = avgvalue;
……
}
……
}
本文所设计的基于ARM Cortex-M3的嵌入式便携机能够实现土壤墒情和土壤温度两要素的实时采集,采集的数据存储到EEPROM并在LCD界面上实时显示,同时可以显示一段时间内的墒情和温度曲线图。可通过USB将存储的数据导入计算机中进行分析和比较。实践结果表明,该设备具有操作简单、携带方便、功耗较低等特点。
参考文献
[1] 陈天华,唐海弢,郑文刚.基于S3C2410的土壤墒情检测系统设计[J].电子技术应用,2011,37(7):89-92.
[2] 周立功.深入浅出Cortex-M3——LPC1700[M].广州:广州致远电子有限公司,2010.
[3] 广州周立功单片机发展有限公司.LPC1766使用手册[Z].2010.
[4] 彭曾愉,赵燕东.基于μC/OS-II操作系统的土壤水分实时监测系统[J].北京林业大学学报,2010,32(11):114-119.
[5] 朱志国.RT-Thread操作系统在STM32中移植的研究[J].计算机光盘软件与应用,2012(22):119-120.
[6] 郑宏军,黎昕,孟祥国.1-Wire单总线器件技术规范及应用研究[J].电子技术,2004(9):39-42.