文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 0258-7998(2013)07-0028-03
土壤墑情是指土壤含水量及土壤濕度,即土壤干濕程度[1]。在水利科研、農(nóng)業(yè)生產(chǎn)、園林種植、旱情預(yù)報(bào)等方面,土壤的含水量和溫度起著不可忽略的作用,準(zhǔn)確地測(cè)量土壤含水量和溫度有助于科學(xué)指導(dǎo)生產(chǎn)科研工作,合理利用水資源,減少不必要的浪費(fèi)。傳統(tǒng)的測(cè)量土壤含水量的方法是采用烘干法,這種方法效率低,對(duì)操作者要求高,而且操作繁瑣。傳統(tǒng)的測(cè)量土壤溫度的方法則是采用溫度計(jì)來(lái)測(cè)量溫度值。隨著科學(xué)的不斷進(jìn)步,市面上也有一些多要素的自動(dòng)墑情站用于測(cè)量土壤墑情和溫度,但這些設(shè)備的不足之處就是只能測(cè)量固定位置的要素值,要測(cè)量其他沒(méi)有安裝自動(dòng)墑情站地方的要素值很不方便。而便攜式土壤墑情和土壤溫度兩要素測(cè)量?jī)x,能夠方便、準(zhǔn)確地測(cè)量待測(cè)地點(diǎn)的要素值,這樣可以減少自動(dòng)墑情站的安裝,節(jié)約成本,方便使用,并且具有功耗低、攜帶方便、穩(wěn)定可靠等優(yōu)點(diǎn)。
1 系統(tǒng)總體結(jié)構(gòu)
便攜式采集器是一款輕小便捷的兩要素手持設(shè)備采集器,主要采集土壤含水量和土壤溫度值。硬件總體框圖如圖1所示。系統(tǒng)初始化完成后,GPS模塊獲取待采集位置的地理信息和時(shí)間,并將時(shí)間更新到系統(tǒng)時(shí)鐘。使用時(shí)只需將插針式墑情傳感器和溫度傳感器插入待測(cè)土壤中便可采集要素。采集的要素值可存儲(chǔ)在EEPROM中,并在LCD上顯示測(cè)量值,實(shí)現(xiàn)即用即測(cè)。同時(shí)可讀出EEPROM的數(shù)據(jù)并顯示某一段時(shí)間內(nèi)的墑情和溫度特性曲線(xiàn)圖。設(shè)備上的USB接口有兩個(gè)功能:一是通過(guò)USB可以將EEPROM中存儲(chǔ)的數(shù)據(jù)導(dǎo)入到計(jì)算機(jī)中,便于分析和比較;二是 USB接口可供系統(tǒng)充電。
2 微處理器
ARM Cortex-M3 LPC1766是一個(gè)低成本、低功耗并且具有極高運(yùn)行能力和中斷響應(yīng)能力的處理器[2]。其操作頻率可達(dá)100 MHz,具有3級(jí)流水線(xiàn)和哈佛結(jié)構(gòu),帶獨(dú)立的本地指令和數(shù)據(jù)總線(xiàn)以及用于外設(shè)的低性能的第3條總線(xiàn),其外設(shè)組建包含512 KB的Flash存儲(chǔ)器、64 KB的數(shù)據(jù)存儲(chǔ)、以太網(wǎng)MAC、USB接口、10位DAC、內(nèi)部RTC等功能。LPC1766還有許多新的特征,包括Thumb-2指令集、低中斷延時(shí)、硬件除法、可中斷可持續(xù)的多次加載和存放指令、對(duì)中斷的自動(dòng)狀態(tài)進(jìn)行保存和恢復(fù)、緊密結(jié)合中斷控制器與喚醒中斷控制器、多條內(nèi)核總線(xiàn)可同時(shí)訪(fǎng)問(wèn)等[3]。
3 土壤墑情傳感器接口電路
土壤墑情測(cè)量接口電路如圖2所示。微控制器通過(guò)GPIO口控制墑情傳感器的電源。當(dāng)需要進(jìn)行墑情要素采集時(shí)才給傳感器供電,這樣降低了功耗,減少了傳感器插入土壤中的探針發(fā)生電解的時(shí)間[4],延長(zhǎng)了傳感器的使用壽命。傳感器采集到的電壓信號(hào)(ΔV=VT_H-VT_L)經(jīng)過(guò)放大后由微控制器進(jìn)行A/D轉(zhuǎn)換得到采樣值,在0~50%范圍內(nèi)可通過(guò)以下三次多項(xiàng)式得到土壤含水量的轉(zhuǎn)換結(jié)果。
4 溫度傳感器接口電路
DS18B20是單總線(xiàn)的工作方式,即在一根數(shù)據(jù)線(xiàn)上實(shí)現(xiàn)數(shù)據(jù)的雙向傳輸,所以DS18B20的外接電路也相對(duì)簡(jiǎn)單。典型的電路有兩種:一種是采用寄生電源供電,另一種是采用外接電源供電。無(wú)論采用哪一種方式,其DQ引腳都要外接一個(gè)上拉電阻。本文選取采用外接電源供電的方式,VCC外接3 V~5.5 V電源,GND引腳接地,DQ引腳通過(guò)上拉電阻接微控制器的I/O端口,其原理圖如圖3所示。
5 RT-Thread操作系統(tǒng)的移植
為保證系統(tǒng)的穩(wěn)定性和實(shí)時(shí)性,選用開(kāi)源RT-Thread操作系統(tǒng)。RT-Thread 內(nèi)核大致可分為對(duì)象管理、實(shí)時(shí)調(diào)度器、線(xiàn)程管理、線(xiàn)程間通信、時(shí)鐘管理、設(shè)備驅(qū)動(dòng)6個(gè)部分[5]。移植的軟件編譯平臺(tái)為Keil MDK 4.23,具體操作步驟如下:
(1)打開(kāi)Keil編譯環(huán)境,新建一個(gè)Keil編譯工程文件命名并保存,系統(tǒng)提示選擇具體的芯片型號(hào),選擇CPU為L(zhǎng)PC1766。
(2)添加RT-Thread內(nèi)核組件,將Keil工程瀏覽目錄下的Target 1更名為RT-Thread LPC1766,將RT-Thread LPC1766下的文件夾Source Group1更名為Kernel,同時(shí)新建文件夾System、Cortex-M3、finsh、Driver、Lwip。在Kernel中加入RT-Thread內(nèi)核組件;在Cortex-M3中加入內(nèi)核自帶并針對(duì)LPC176x移植的匯編文件;在Driver文件中添加設(shè)備相應(yīng)的驅(qū)動(dòng)函數(shù);在System中添加相應(yīng)的啟動(dòng)文件、中斷向量表、核心板文件等;在finsh中添加finsh shell組件;在App中添加用戶(hù)編寫(xiě)的一些應(yīng)用文件;在Lwip中添加TCP/IP協(xié)議文件。同時(shí)可以根據(jù)實(shí)際需求,在Rtconfig.h中配置系統(tǒng)時(shí)鐘、最大優(yōu)先級(jí)、是否啟用finsh等。
(3)在Project->Options for Targe′ RT-Thread LPC1766′中選擇C/C++選項(xiàng)卡,添加系統(tǒng)所需頭文件的路徑,包括內(nèi)核、驅(qū)動(dòng)以及用戶(hù)定義的所需頭文件的路徑。
至此,RT-Thread移植基本完成,用戶(hù)可以編寫(xiě)相應(yīng)的應(yīng)用程序并執(zhí)行。
6 DS18B20在RT-Thread驅(qū)動(dòng)的實(shí)現(xiàn)
6.1 DS18B20簡(jiǎn)介
DS18B20是一款數(shù)字式的溫度傳感器,它是一個(gè)單總線(xiàn)的器件,測(cè)量溫度范圍在-55 ℃~+125 ℃,在-10 ℃~
+85 ℃范圍內(nèi)的測(cè)量精度能夠達(dá)到±0.5 ℃,測(cè)量精度相對(duì)較高。通過(guò)編程可實(shí)現(xiàn)9~12位精度的數(shù)字讀方式,并且具有溫度上下限報(bào)警功能。在一個(gè)系統(tǒng)中可以?huà)旖佣鄠€(gè)DS18B20器件,每個(gè)器件都有一個(gè)唯一的序列號(hào)存儲(chǔ)在ROM中,DS18B20提供了5種ROM指令供識(shí)別器件,同時(shí)還提供了6種RAM指令來(lái)操作DS18B20。
6.2 DS18B20驅(qū)動(dòng)實(shí)現(xiàn)
一般來(lái)說(shuō),在一個(gè)測(cè)溫系統(tǒng)中,DS18B20都是作為從機(jī)供主機(jī)訪(fǎng)問(wèn),微控制器通過(guò)單總線(xiàn)訪(fǎng)問(wèn)DS18B20一般需要以下3個(gè)步驟[6]:
(1)復(fù)位初始化DS18B20。
(2)執(zhí)行ROM指令(器件識(shí)別),對(duì)于設(shè)備上只有一個(gè)DS18B20的系統(tǒng)來(lái)說(shuō),無(wú)需讀序列號(hào)來(lái)匹配設(shè)備,可以省略讀ROM指令,直接執(zhí)行功能指令。
(3)執(zhí)行RAM指令,包括寫(xiě)命令到DS18B20,啟動(dòng)溫度轉(zhuǎn)換,從DS18B20讀數(shù)據(jù)。
6.2.1 DS18B20復(fù)位流程
在對(duì)DS18B20進(jìn)行初始化時(shí),最主要的一點(diǎn)就是對(duì)時(shí)序的控制,若延時(shí)控制不當(dāng),DS18B20將不能工作或不能正確測(cè)量溫度值。DS18B20初始化流程如下:
(1)設(shè)置總線(xiàn)為輸入狀態(tài)。
(2)拉低總線(xiàn)約480 ?滋s~960 ?滋s。
(3)釋放總線(xiàn),外部上拉電阻拉高總線(xiàn)15 ?滋s~60 ?滋s,隨后DS18B20會(huì)拉低總線(xiàn)約60 ?滋s~240 ?滋s來(lái)應(yīng)答主控制器。
(4)設(shè)置總線(xiàn)狀態(tài)為輸出,主控制器讀取總線(xiàn)電平,如果為低電平則表示初始化完成。
(5)釋放總線(xiàn),初始化完成之后控制器就可對(duì)DS18B20進(jìn)行操作訪(fǎng)問(wèn)。
6.2.2 DS18B20寫(xiě)流程
寫(xiě)一個(gè)操作命令字節(jié)到DS18B20需循環(huán)8次,因?yàn)镈S18B20是一個(gè)單總線(xiàn)的設(shè)備,所以只能逐位操作。DS18B20的寫(xiě)操作流程如下:
(1)設(shè)置總線(xiàn)為輸入狀態(tài)。
(2)拉低總線(xiàn)并延時(shí)約10 ?滋s~15 ?滋s。
(3)寫(xiě)入數(shù)據(jù),寫(xiě)入的是“1”,則拉高總線(xiàn)約15 ?滋s~40 ?滋s;寫(xiě)入的是“0”,則拉低總線(xiàn)約15 ?滋s~40 ?滋s。
(4)字節(jié)數(shù)寫(xiě)入完成后釋放總線(xiàn),等待約3 ?滋s。
6.2.3 DS18B20讀流程
讀DS18B20與寫(xiě)操作類(lèi)似,也是要循環(huán)8次。若檢測(cè)到DQ的狀態(tài)為高電平,則將數(shù)據(jù)data的最高位置1,通過(guò)逐次向右移位來(lái)獲得DS18B20檢測(cè)的溫度值。DS18B20的讀數(shù)據(jù)流程如下:
(1)拉低總線(xiàn)約1 ?滋s。
(2)釋放總線(xiàn),讀取總線(xiàn)電平狀態(tài)。
(3)如果讀到的是低電平,則表示讀到的是“0”;如果讀到的是高電平,則讀到的是“1”。
(4)延時(shí)約30 ?滋s~45 ?滋s。
完成以上步驟后,將驅(qū)動(dòng)移植到RT-Thread驅(qū)動(dòng)中,其公共接口的實(shí)現(xiàn)代碼如下:
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 );
}
上述函數(shù)中,在rt_ds18b20_read函數(shù)中讀取DS18B20的溫度值的過(guò)程中就包含初始化設(shè)備,而獲取總線(xiàn)、釋放總線(xiàn)的功能與打開(kāi)設(shè)備、關(guān)閉設(shè)備類(lèi)似,因此rt_ds18b20_
init、rt_ds18b20_open、rt_ds18b20_close 3個(gè)函數(shù)的函數(shù)體可以直接返回RT_EOK。而其他函數(shù)在采樣時(shí)沒(méi)有涉及到這些功能,因此可以為RT_NULL。rt_device_register函數(shù)用于注冊(cè)設(shè)備并設(shè)置相應(yīng)的屬性,注冊(cè)的設(shè)備可以通過(guò)查找設(shè)備名稱(chēng)來(lái)找到設(shè)備,并獲得相應(yīng)的設(shè)備控制塊。整個(gè)DS18B20驅(qū)動(dòng)中,所有對(duì)DS18B20的操作都是在rt_ds18b20_read函數(shù)中完成的。rt_ds18b20_read函數(shù)中進(jìn)行了設(shè)備的初始化、執(zhí)行相應(yīng)的ROM指令和執(zhí)行相應(yīng)的RAM指令操作來(lái)實(shí)現(xiàn)DS18B20的溫度測(cè)量,rt_ds18b20_read函數(shù)的主要功能如下:
static rt_size_t rt_ds18b20_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
{
........
rt_enter_critical(); //調(diào)度器上鎖,僅響應(yīng)中斷
InitDS18B20 (); //設(shè)備初始化
WriteOneChar(0xCC); //跳過(guò)讀序列號(hào)操作
WriteOneChar(0x44); //啟動(dòng)溫度轉(zhuǎn)換
InitDS18B20 ();
WriteOneChar(0xCC);
WriteOneChar(0xBE); //讀取溫度寄存器操作
lsb = ReadOneChar(); //讀低字節(jié)
msb = ReadOneChar(); //讀高字節(jié)
rt_exit_critical(); //調(diào)度器解鎖
Temperature = ((msb << 8) | lsb) * 6.25;
//DS18B20 的溫度操作的分辨率是0.062 5
……
}
t/100為溫度值的整數(shù)部分,而(t % 100)/10為溫度值的小數(shù)部分。在上層的應(yīng)用中,軟件只需調(diào)用rt_device_read函數(shù)就能獲取相應(yīng)的溫度值,該函數(shù)的返回值是讀到數(shù)據(jù)的大小(以字節(jié)為單位),如果返回值是0,則需要讀取當(dāng)前線(xiàn)程的errno來(lái)判斷錯(cuò)誤狀態(tài)。
7 土壤墑情測(cè)量
7.1 傳感器原理[4]
干燥土壤的介電常數(shù)一般在2~4之間,而水的介電常數(shù)一般為80??梢园押耐寥揽醋鳛橐环N由干燥土壤和水混合在一起的介質(zhì),因此介電常數(shù)就會(huì)隨含水量的變化而變化。本文選用的土壤傳感器為ASW100F,它由一個(gè)100 MHz的信號(hào)源、探針以及電纜組成。根據(jù)傳輸線(xiàn)原理,電纜和探頭連接處的阻抗用下式表示:
式中,Zc為探頭在空氣中的特征阻抗;l為探針的長(zhǎng)度;?姿o為正弦波在空氣中的波長(zhǎng);?著為探針周?chē)寥赖慕殡姵?shù);j為虛數(shù)部分的表示因子。由式(2)可知,阻抗Zi與探針周?chē)寥赖慕殡姵?shù)?著有關(guān),阻抗Zi隨著土壤介電常數(shù)的不斷變化而變化,導(dǎo)致探針和電纜的阻抗不匹配,這會(huì)在電纜中產(chǎn)生駐波,而駐波的波峰和波谷也會(huì)隨著土壤介電常數(shù)的變化而變化。因此,駐波包絡(luò)的電壓就反應(yīng)了土壤含水量的情況,因此可以通過(guò)測(cè)量電纜上的電壓差得出土壤的含水量情況。
7.2 土壤墑情的采樣
土壤墑情的采樣主要是將采集的電壓信號(hào)放大,然后通過(guò)微控制器的A/D轉(zhuǎn)換來(lái)實(shí)現(xiàn)的。A/D讀取的數(shù)據(jù)通過(guò)式(1)得到土壤墑情值,具體的采樣流程為:(1)微控制器通過(guò)控制GPIO口為墑情傳感器供電。(2)墑情傳感器進(jìn)行數(shù)據(jù)采樣。(3)采樣的電壓信號(hào)經(jīng)過(guò)放大器進(jìn)行放大。(4)將放大器放大的電壓信號(hào)通過(guò)微控制器進(jìn)行A/D轉(zhuǎn)換。(5)A/D轉(zhuǎn)后的值經(jīng)過(guò)軟件運(yùn)算處理后得到土壤含水量的值。
在測(cè)量的過(guò)程中,難免會(huì)出現(xiàn)測(cè)量偏差。為此在采樣時(shí)連續(xù)測(cè)量3次,比較兩個(gè)測(cè)量值之間的差值。如果兩次測(cè)量誤差大于1%,則認(rèn)為測(cè)量失敗,反之則認(rèn)為測(cè)量值有效。然后將測(cè)量的3次有效值求平均來(lái)獲取本次測(cè)量值。軟件過(guò)濾無(wú)效值的代碼如下:
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;
……//依據(jù)式(1)計(jì)算
temp[cnt++] =value;
}
if (cnt == 3) {
//3次測(cè)得的值都有效,兩兩測(cè)量值之間不大于1% 則
//認(rèn)為有效
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;
//無(wú)效值,則選用前一次采集到的值
} else {
avgvalue = (temp[0] + temp[1] + temp[2]) / cnt;
//取平均值
SoilValue = avgvalue;
……
}
……
}
本文所設(shè)計(jì)的基于ARM Cortex-M3的嵌入式便攜機(jī)能夠?qū)崿F(xiàn)土壤墑情和土壤溫度兩要素的實(shí)時(shí)采集,采集的數(shù)據(jù)存儲(chǔ)到EEPROM并在LCD界面上實(shí)時(shí)顯示,同時(shí)可以顯示一段時(shí)間內(nèi)的墑情和溫度曲線(xiàn)圖??赏ㄟ^(guò)USB將存儲(chǔ)的數(shù)據(jù)導(dǎo)入計(jì)算機(jī)中進(jìn)行分析和比較。實(shí)踐結(jié)果表明,該設(shè)備具有操作簡(jiǎn)單、攜帶方便、功耗較低等特點(diǎn)。
參考文獻(xiàn)
[1] 陳天華,唐海弢,鄭文剛.基于S3C2410的土壤墑情檢測(cè)系統(tǒng)設(shè)計(jì)[J].電子技術(shù)應(yīng)用,2011,37(7):89-92.
[2] 周立功.深入淺出Cortex-M3——LPC1700[M].廣州:廣州致遠(yuǎn)電子有限公司,2010.
[3] 廣州周立功單片機(jī)發(fā)展有限公司.LPC1766使用手冊(cè)[Z].2010.
[4] 彭曾愉,趙燕東.基于μC/OS-II操作系統(tǒng)的土壤水分實(shí)時(shí)監(jiān)測(cè)系統(tǒng)[J].北京林業(yè)大學(xué)學(xué)報(bào),2010,32(11):114-119.
[5] 朱志國(guó).RT-Thread操作系統(tǒng)在STM32中移植的研究[J].計(jì)算機(jī)光盤(pán)軟件與應(yīng)用,2012(22):119-120.
[6] 鄭宏軍,黎昕,孟祥國(guó).1-Wire單總線(xiàn)器件技術(shù)規(guī)范及應(yīng)用研究[J].電子技術(shù),2004(9):39-42.