文獻(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)的墑情和溫度特性曲線圖,。設(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í)流水線和哈佛結(jié)構(gòu),帶獨(dú)立的本地指令和數(shù)據(jù)總線以及用于外設(shè)的低性能的第3條總線,,其外設(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)核總線可同時(shí)訪問(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是單總線的工作方式,即在一根數(shù)據(jù)線上實(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í)性,選用開源RT-Thread操作系統(tǒng),。RT-Thread 內(nèi)核大致可分為對(duì)象管理,、實(shí)時(shí)調(diào)度器、線程管理、線程間通信,、時(shí)鐘管理,、設(shè)備驅(qū)動(dòng)6個(gè)部分[5]。移植的軟件編譯平臺(tái)為Keil MDK 4.23,,具體操作步驟如下:
(1)打開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中添加用戶編寫的一些應(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)以及用戶定義的所需頭文件的路徑。
至此,,RT-Thread移植基本完成,,用戶可以編寫相應(yīng)的應(yīng)用程序并執(zhí)行。
6 DS18B20在RT-Thread驅(qū)動(dòng)的實(shí)現(xiàn)
6.1 DS18B20簡(jiǎn)介
DS18B20是一款數(shù)字式的溫度傳感器,,它是一個(gè)單總線的器件,,測(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)中可以掛接多個(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ī)訪問(wèn),,微控制器通過(guò)單總線訪問(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指令,包括寫命令到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è)置總線為輸入狀態(tài),。
(2)拉低總線約480 ?滋s~960 ?滋s。
(3)釋放總線,,外部上拉電阻拉高總線15 ?滋s~60 ?滋s,,隨后DS18B20會(huì)拉低總線約60 ?滋s~240 ?滋s來(lái)應(yīng)答主控制器。
(4)設(shè)置總線狀態(tài)為輸出,,主控制器讀取總線電平,,如果為低電平則表示初始化完成。
(5)釋放總線,,初始化完成之后控制器就可對(duì)DS18B20進(jìn)行操作訪問(wèn),。
6.2.2 DS18B20寫流程
寫一個(gè)操作命令字節(jié)到DS18B20需循環(huán)8次,因?yàn)镈S18B20是一個(gè)單總線的設(shè)備,,所以只能逐位操作,。DS18B20的寫操作流程如下:
(1)設(shè)置總線為輸入狀態(tài),。
(2)拉低總線并延時(shí)約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次。若檢測(cè)到DQ的狀態(tài)為高電平,,則將數(shù)據(jù)data的最高位置1,,通過(guò)逐次向右移位來(lái)獲得DS18B20檢測(cè)的溫度值。DS18B20的讀數(shù)據(jù)流程如下:
(1)拉低總線約1 ?滋s,。
(2)釋放總線,,讀取總線電平狀態(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è)備,而獲取總線,、釋放總線的功能與打開設(shè)備,、關(guān)閉設(shè)備類似,因此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è)備名稱來(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)前線程的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ù)傳輸線原理,,電纜和探頭連接處的阻抗用下式表示:
式中,Zc為探頭在空氣中的特征阻抗,;l為探針的長(zhǎng)度,;?姿o為正弦波在空氣中的波長(zhǎng);?著為探針周圍土壤的介電常數(shù),;j為虛數(shù)部分的表示因子,。由式(2)可知,阻抗Zi與探針周圍土壤的介電常數(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)的墑情和溫度曲線圖,??赏ㄟ^(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ī)光盤軟件與應(yīng)用,,2012(22):119-120.
[6] 鄭宏軍,,黎昕,孟祥國(guó).1-Wire單總線器件技術(shù)規(guī)范及應(yīng)用研究[J].電子技術(shù),,2004(9):39-42.