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