李永成,凌 青,石 春,吳 剛,陳 雷
(1.中國科學(xué)技術(shù)大學(xué)自動化系,安徽合肥230027;2.中國人民解放軍63895部隊,河南洛陽454750)
大多數(shù)電池的內(nèi)阻隨著電池電量的降低而增加。電池電量越低,內(nèi)阻越大。電池供電時,工作電流越大,內(nèi)部的電壓降也就越大,輸出電壓就越低。因此,電池電壓可以作為一種簡便的電池剩余電量的指示,通過監(jiān)測電池工作電壓達(dá)到監(jiān)測剩余電量的目的[2]。
用于無線傳感器網(wǎng)絡(luò)節(jié)點的TI公司的CC2430/31—F128芯片具有低成本、低功耗的特點,在接收和發(fā)射模式下,電流消耗分別低于27,25 mA,內(nèi)嵌8位的增強(qiáng)型8051單片機(jī)[3]。為了解決電池電量低所造成的定位精度問題,本文基于CC2430/31—F128芯片的嵌入式系統(tǒng),周期性采樣電池工作電壓并進(jìn)行判斷,當(dāng)電壓值低于預(yù)先設(shè)定的報警低限時,停止當(dāng)前工作,斷開與網(wǎng)絡(luò)的聯(lián)系,確保其他節(jié)點交互信息的可靠性,并在監(jiān)控終端顯示屏上閃爍,同時節(jié)點上的LED燈閃爍報警,避免由電池電量低而產(chǎn)生的定位誤差。
嵌入式系統(tǒng)包含硬件和軟件兩部分,硬件部分指系統(tǒng)的內(nèi)核及外圍設(shè)備,如本例中網(wǎng)絡(luò)節(jié)點上的CC2430/31—F128芯片;軟件部分指嵌入式操作系統(tǒng)[5]。當(dāng)前的嵌入式操作系統(tǒng)大致分為兩類:一類是通用的多任務(wù)操作系統(tǒng)(general-purpose multi-tasking OS),能夠很好地支持多任務(wù)或者多線程,但會隨著內(nèi)部任務(wù)切換頻率的增加而產(chǎn)生很大的開銷;另一類是事件驅(qū)動的操作系統(tǒng)(event-driven OS),能夠支持?jǐn)?shù)據(jù)流的高效并發(fā),并考慮了系統(tǒng)的低功耗要求,使其在功耗、運行開銷等方面具有優(yōu)勢,例如:TinyOS。
但是TinyOS操作系統(tǒng)不支持Chipcon公司的CC2430開發(fā)平臺,因此,Chipcon公司為自己設(shè)計的ZStack協(xié)議棧中提供了一個操作系統(tǒng)抽象層(operating system abstraction layer,OSAL)的協(xié)議棧調(diào)度程序。
Zig Bee協(xié)議棧中,每一層都執(zhí)行很多原語操作,對于整個協(xié)議棧,就有很多并發(fā)操作要執(zhí)行。為使整個協(xié)議棧能夠按照時間順序讓各種任務(wù)和事件有條不紊的運行,協(xié)議棧的每一層都設(shè)計了一個事件處理函數(shù),用于處理與該層操作相關(guān)的任務(wù)和事件。這些事件處理函數(shù)即是與協(xié)議棧每一層相對應(yīng)的任務(wù),由Zig Bee協(xié)議棧中的調(diào)度程序OSAL進(jìn)行統(tǒng)一管理。因此,對于整個協(xié)議棧,無論何時發(fā)生了何種事件,OSAL調(diào)度程序都可以通過調(diào)度協(xié)議棧相應(yīng)層的任務(wù),亦即事件處理函數(shù)進(jìn)行處理。
由于Zig Bee協(xié)議棧對實時性要求不高,因此,在設(shè)計任務(wù)調(diào)度程序時,OSAL采用了輪詢?nèi)蝿?wù)調(diào)度隊列的方法進(jìn)行任務(wù)調(diào)度的管理,如圖1所示。
圖1 OSAL任務(wù)處理流程Fig 1 OSAL task processing flow
1)OSAL建立任務(wù)的流程
OSAL采用鏈表結(jié)構(gòu)管理協(xié)議棧各層相應(yīng)的任務(wù)。這個任務(wù)鏈表在系統(tǒng)啟動的時候建立,而一旦建立便一直存在于系統(tǒng)運行的整個過程,直到系統(tǒng)關(guān)閉或硬件復(fù)位時才被刪除。鏈表中的每一項都是一個結(jié)構(gòu)體,用來記錄鏈表中相關(guān)任務(wù)的基本信息。鏈表的建立是按照任務(wù)優(yōu)先級從高到低進(jìn)行插入排列的。優(yōu)先級高的任務(wù)被插入到優(yōu)先級低的任務(wù)前面。當(dāng)兩任務(wù)優(yōu)先級相同時,則按照時間的先后順序添加到鏈表中。
2)OSAL對任務(wù)的處理流程
任務(wù)鏈表成功建立后,系統(tǒng)開始運行。如在系統(tǒng)運行過程中有事件發(fā)生,系統(tǒng)會調(diào)用相應(yīng)的任務(wù),即事件處理函數(shù)對所發(fā)生的事件進(jìn)行相應(yīng)的處理。在整個系統(tǒng)運行過程中,OSAL調(diào)度程序周而復(fù)始地輪詢?nèi)蝿?wù)隊列鏈表,以查找發(fā)生的需要處理的事件。整個過程涉及2個函數(shù)的操作:一個是調(diào)度程序循環(huán)函數(shù);一個是設(shè)置事件發(fā)生標(biāo)志函數(shù)。
Zig Bee協(xié)議棧中的每一層都有很多不同的事件發(fā)生,這些事件發(fā)生的時間順序各不相同。很多時候,事件并不要求立即得到處理,而要經(jīng)過一段時間后再進(jìn)行處理。因此,經(jīng)常會遇到這樣的情況:假設(shè)事件A發(fā)生后,要求過20 s后執(zhí)行,事件B在事件A發(fā)生5 s后產(chǎn)生,且事件B要求在10 s后執(zhí)行。從時間軸可以看出:事件B雖然在事件A之前被處理,卻在事件A之后發(fā)生。因此,為了按照合理的時間順序處理不同事件的執(zhí)行,需要對各種不同的事件進(jìn)行統(tǒng)一的時間管理。OSAL調(diào)度程序設(shè)計了與時間管理相關(guān)的函數(shù),用來管理各種不同的需要被處理的事件。
OSAL同樣采用鏈表的方式對事件進(jìn)行統(tǒng)一的時間管理。每發(fā)生一個要被處理的事件,系統(tǒng)會啟動一個邏輯定時器,并將此定時器添加到鏈表當(dāng)中。利用硬件定時器作為時間操作的基本單元,系統(tǒng)默認(rèn)設(shè)置時間操作的單位為1 ms,即每1 ms硬件定時器產(chǎn)生一次時間溢出中斷,在時間中斷處理程序中去更新定時器鏈表。每次更新,都將鏈表中的每一項事件定時器的時間計數(shù)減1,如發(fā)現(xiàn)定時器鏈表中某一表項時間計數(shù)已減到0,則設(shè)置相應(yīng)的事件標(biāo)志。這樣,OSAL任務(wù)調(diào)度程序就根據(jù)事件的標(biāo)志進(jìn)行相應(yīng)的事件處理,并將該定時器從鏈表中刪除。
利用A/D轉(zhuǎn)換器進(jìn)行節(jié)點電壓的測量和采樣,是一種常用的方法。A/D轉(zhuǎn)換器是將連續(xù)的模擬量(如電壓)通過取樣轉(zhuǎn)換成離散的數(shù)字量,分為采樣、保持、量化和編碼4個過程。
CC2430/31的A/D支持14位的模/數(shù)轉(zhuǎn)換(如圖2所示),其中包括1個參考電壓發(fā)生器、8個獨立可配置通道、電壓發(fā)生器和通過DMA模式把轉(zhuǎn)換結(jié)果寫入內(nèi)存的控制器。在對節(jié)點電壓測量時,選擇VDD/3(VDD為節(jié)點電源電壓)作為輸入端,亦即輸入電壓,以 A/D轉(zhuǎn)換器內(nèi)部1.25 V為參考電壓。
圖2 A/D轉(zhuǎn)換器框圖Fig 2 Block diagram of A/D converter
節(jié)點電壓監(jiān)測功能的實現(xiàn)(如圖3所示)是在OSAL操作系統(tǒng)中添加邏輯定時器到定時器鏈表,同時啟動定時器,利用硬件定時器的觸發(fā),更新邏輯定時器的時間,當(dāng)其溢出時,調(diào)用電壓監(jiān)測事件處理函數(shù),即讓A/D轉(zhuǎn)換器進(jìn)行電源電壓的采樣,并進(jìn)行比較:當(dāng)采樣電壓低于設(shè)定的報警下限時,該節(jié)點立即停止當(dāng)前的工作,斷開與網(wǎng)絡(luò)的連接,在監(jiān)控終端顯示屏上閃爍,同時閃爍節(jié)點上的LED燈報警;當(dāng)高于報警下限時,退出此次采樣監(jiān)測過程,并重新添加邏輯定時器到鏈表。
圖3 節(jié)點電壓監(jiān)測流程Fig 3 Node voltage monitoring flow
其中電壓的報警下限和電壓的采樣周期(定時時間)可以根據(jù)實際需要設(shè)定。在定位實驗中每個節(jié)點都是用2節(jié)1.5 V的電池進(jìn)行供電,實驗中發(fā)現(xiàn),當(dāng)節(jié)點的電源工作電壓低于2.5V的時候,定位精度即會受到影響,因此,設(shè)定報警低限為2.5 V,采樣周期為2 min。具體實現(xiàn)流程如下:
1)啟動系統(tǒng)后,在硬件初始化時進(jìn)行定時器的初始化和配置,同時定義定時器溢出時的回調(diào)函數(shù);
2)在應(yīng)用層任務(wù)初始化時添加邏輯定時器到定時器鏈表,設(shè)置其溢出時對應(yīng)的任務(wù)和事件及定時時間,并啟動該定時器;
3)邏輯定時器啟動時,其映射的硬件定時器隨之啟動,且每1 ms產(chǎn)生一次中斷;
4)系統(tǒng)輪詢定時器和各層的任務(wù):當(dāng)硬件定時器有中斷時,調(diào)用定時器的回調(diào)函數(shù),對定時器鏈表中的所有邏輯定時器計數(shù)時間統(tǒng)一進(jìn)行減1操作。當(dāng)電壓監(jiān)測定時器溢出時,設(shè)置電壓監(jiān)測事件標(biāo)志位,操作系統(tǒng)讀出其標(biāo)志位,對電壓監(jiān)測事件進(jìn)行處理;
5)處理函數(shù)中利用A/D轉(zhuǎn)換器對電源電壓采樣檢測,并與設(shè)定的報警下限比較,如果電壓過低則停止當(dāng)前的工作,斷開與網(wǎng)絡(luò)的連接,在監(jiān)控終端顯示屏上閃爍,同時節(jié)點上的LED燈閃爍報警;當(dāng)大于報警下限時退出程序,重新添加邏輯定時器到定時器鏈表,回到步驟(2)。
為了驗證監(jiān)測效果,選擇開放空間進(jìn)行定位實驗(如圖4所示)。
實驗中對其中15個節(jié)點進(jìn)行電壓監(jiān)測,為保證電壓值的穩(wěn)定,當(dāng)節(jié)點上的LED燈閃爍10次以上時再測量節(jié)點的電壓值,所得結(jié)果,如表1所示。
圖4 實驗過程Fig 4 Experimental process
表1 節(jié)點報警時測得的電壓值Tab 1 Measured voltage value while node is alarming
由表可見,當(dāng)節(jié)點電壓低于設(shè)定的報警下限時,可以報警;當(dāng)節(jié)點電壓接近報警下限時,報警狀態(tài)并不穩(wěn)定,有時閃爍十幾次,有時閃爍幾十次,只有電源工作電壓低于報警下限0.03 V右時,LED燈才會一直閃爍而完全停止當(dāng)前的工作。這是因為不同的工作狀態(tài),節(jié)點工作電流不同,造成電池內(nèi)部壓降不同,即電源的工作電壓隨著不同的工作狀態(tài)有波動。為此,設(shè)定節(jié)點電壓在低于報警下限工作20 s,即在電源工作電壓穩(wěn)定后,閃爍節(jié)點上的LED燈。這時上述現(xiàn)象消失,LED燈能夠連續(xù)閃爍,進(jìn)入報警狀態(tài)。
當(dāng)前在無線定位應(yīng)用中的CC2430/31芯片,不能定期進(jìn)行電池剩余電量監(jiān)測,本文對此進(jìn)行了功能上的完善,在Zig Bee協(xié)議棧中添加邏輯定時器,利用A/D轉(zhuǎn)換器進(jìn)行電壓的采樣,定時監(jiān)測節(jié)點電壓,以保證節(jié)點在定位應(yīng)用中不會因為電池電量的不足而出現(xiàn)定位精度偏差的現(xiàn)象。同時也為其他以電池板供電的無線傳感器網(wǎng)點節(jié)點進(jìn)行電池電量的監(jiān)測提供了一種切實可行的方法。
[1]Wang W D,Zhu Q X.RSS-based Monte-Carlo localization for mobile sensor networks[J].The Institution of Engineering and Technology,2008,2(5):673-681.
[2]Farahani S.Newnes Zig Bee wireless networks and transceivers[M].The United States:Elsevier Ltd,2008.
[3]高守偉,吳燦陽.Zig Bee技術(shù)實踐教程——基于CC2430/31的無線傳感器網(wǎng)絡(luò)解決方案[M].北京:北京航空航天大學(xué)出版社,2009.
[4]閆 沫.Zig Bee協(xié)議棧分析與設(shè)計[D].上海:復(fù)旦大學(xué),2007.
[5]Aamodt K.Using the ADC to measure supply voltage[DB/OL].[2011—06—11].http:∥www.ti.com/lit/an/swra100a/swra100a.pdf.