Zigbee網(wǎng)絡(luò)低占空比機(jī)制研究試驗(yàn)綜述_第1頁(yè)
Zigbee網(wǎng)絡(luò)低占空比機(jī)制研究試驗(yàn)綜述_第2頁(yè)
Zigbee網(wǎng)絡(luò)低占空比機(jī)制研究試驗(yàn)綜述_第3頁(yè)
Zigbee網(wǎng)絡(luò)低占空比機(jī)制研究試驗(yàn)綜述_第4頁(yè)
Zigbee網(wǎng)絡(luò)低占空比機(jī)制研究試驗(yàn)綜述_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、8.5 Zigbee 網(wǎng)絡(luò)低功耗模式機(jī)制研究ZigBee 網(wǎng)絡(luò)節(jié)點(diǎn)通常由電池供電,并部署在野外環(huán)境中,要求常年連續(xù)工作。因此, 低功耗設(shè)計(jì)對(duì)延長(zhǎng) ZigBee 網(wǎng)絡(luò)生存壽命具有至關(guān)重要的意義。低占空比機(jī)制是一種非常重 要的節(jié)能措施,通常應(yīng)用在網(wǎng)絡(luò)節(jié)點(diǎn)間通信頻率較低的空閑型場(chǎng)合。本文首先介紹 Z-Stack 協(xié)議棧的低功耗電源管理模式,然后在應(yīng)用層實(shí)現(xiàn) ZigBee 節(jié)點(diǎn)周期性休眠與喚醒。這對(duì)減 少 ZigBee 網(wǎng)絡(luò)能量消耗,實(shí)現(xiàn)低占空比( low duty-cycle )網(wǎng)絡(luò)具有重要參考意義。6.6.1 實(shí)驗(yàn)?zāi)康呐c器材1)實(shí)驗(yàn)?zāi)康膶W(xué)習(xí)和理解 Z-Stack 協(xié)議棧電源管理模式,睡眠機(jī)制。學(xué)會(huì)

2、使用 Z-Stack 協(xié)議棧低功耗模式。學(xué)會(huì)使用 CC2530 睡眠定時(shí)器進(jìn)行睡眠和喚醒。 學(xué)會(huì)在應(yīng)用層實(shí)現(xiàn)簡(jiǎn)單的低占空比模式。2)實(shí)驗(yàn)器材2個(gè) CC2530開(kāi)發(fā)套件( 1個(gè)協(xié)調(diào)器模塊, 1個(gè)終端模塊) ;6.6.2 實(shí)驗(yàn)原理與步驟1)實(shí)驗(yàn)原理ZigBee 網(wǎng)絡(luò)節(jié)點(diǎn)一般由能量有限的電池供電,長(zhǎng)期處于無(wú)人值守的狀態(tài)下,并且個(gè)數(shù) 多、分布區(qū)域廣、所處環(huán)境復(fù)雜,使得難以進(jìn)行電池更換。如果節(jié)點(diǎn)電池能量耗盡之后,網(wǎng) 絡(luò)連通性以及網(wǎng)絡(luò)生存時(shí)間會(huì)受到極大影響。 為使節(jié)點(diǎn)長(zhǎng)期正常工作下去, 必須從能量供應(yīng) 的角度進(jìn)行研究,采取有效的方法為無(wú)線傳感器網(wǎng)絡(luò)提供可持續(xù)的能量供應(yīng)。周全的傳感器節(jié)點(diǎn)能量管理設(shè)計(jì)方案,必

3、須從“開(kāi)源”和“節(jié)流”兩個(gè)方面采取相應(yīng)措 施,以達(dá)到能量有效使用。所謂“開(kāi)源” ,就是通過(guò)采取各種措施補(bǔ)充傳感器節(jié)點(diǎn)能量,其 中主要措施是能量收集網(wǎng)絡(luò)。例如,利用太陽(yáng)能電池板可以為傳感器節(jié)點(diǎn)供電。白天,光伏 電池在為傳感器節(jié)點(diǎn)供電,同時(shí)將富余能量?jī)?chǔ)存到電池中。夜間,太陽(yáng)光不足時(shí),由電池為 傳感器節(jié)點(diǎn)供電。所謂“節(jié)流” ,就是通過(guò)采取各種節(jié)能措施減少傳感器節(jié)點(diǎn)的能量消耗, 延長(zhǎng)網(wǎng)絡(luò)使用壽命。 “開(kāi)源”措施的目標(biāo)是最大化地?cái)U(kuò)展能量來(lái)源,而“節(jié)流”措施為了在 保證通信質(zhì)量同時(shí),盡可能地減少能量消耗。本節(jié)主要關(guān)注如何節(jié)約 ZigBee 網(wǎng)絡(luò)節(jié)點(diǎn)能量。 ZigBee 通信協(xié)議中 MAC 層,網(wǎng)絡(luò)層已 經(jīng)

4、采用許多能量節(jié)約機(jī)制。其中,最常用的設(shè)計(jì)思想是當(dāng) ZigBee 節(jié)點(diǎn)空閑時(shí),盡快進(jìn)入休 眠狀態(tài)的低功耗電源模式,從而節(jié)約能量消耗。1.CC2530 電源管理電池供電的終端設(shè)備通常采用電源管理方案來(lái)最小化節(jié)點(diǎn)功耗。 一個(gè)終端設(shè)備在空閑時(shí) 會(huì)關(guān)閉大功耗外設(shè)和空閑期間進(jìn)入休眠模式。 Z-Stack 提供了兩種休眠模式,分別為輕度休 眠和深度休眠。 系統(tǒng)處于輕度睡眠模式, 會(huì)在一個(gè)預(yù)定延時(shí)后被喚醒執(zhí)行任務(wù)。 當(dāng)系統(tǒng)沒(méi)有 任務(wù)需要執(zhí)行時(shí)會(huì)進(jìn)入深度休眠模式。 系統(tǒng)進(jìn)入深度休眠模式后, 需要一個(gè)外部觸發(fā) (如按 鍵)來(lái)喚醒設(shè)備。輕度模式下工作電流通常降為幾微安,而深度模式通常降為幾微安。終端設(shè)備休眠例子有:

5、 溫濕度等傳感器周期被喚醒報(bào)告數(shù)據(jù); 監(jiān)控中心用戶通過(guò)按鍵命令向遠(yuǎn)程 控制設(shè)備索取數(shù)據(jù); 遙控器在按鍵時(shí), 才向控制設(shè)備發(fā)送命令。 這些設(shè)備共同特點(diǎn)是它們大 部分時(shí)間都處于休眠模式,最大限度地減少功耗。在 HAL/hal_sleep.c 文件中有關(guān)于 CC2530 睡眠模式的定義:#define HAL_SLEEP_OFFCC2530_PM0#define HAL_SLEEP_TIMERCC2530_PM2#define HAL_SLEEP_DEEPCC2530_PM3#define CC2530_PM0#define CC2530_PM1#define CC2530_PM2#define C

6、C2530_PM3電源管理默認(rèn)設(shè)置為0 /* PM0, Clock oscillators on, voltage regulator on */1 /* PM1, 32.768 kHz oscillators on, voltage regulator on */2 /* PM2, 32.768 kHz oscillators on, voltage regulator off */3 /* PM3, All clock oscillators off, voltage regulator off */HAL_SLEEP_OFF ,即處于正常工作模式,時(shí)鐘、電源穩(wěn)壓器都 處于工作狀態(tài)。 CC

7、2530 處于睡眠模式時(shí)會(huì)關(guān)閉系統(tǒng)時(shí)鐘、微控制單元( MCU ),不是默認(rèn) 模式,需要在 Z-Stack 中增加編譯選項(xiàng) POWER_SAVING 才能夠使用。 HAL_SLEEP_TIMER 和 HAL_SLEEP_DEEP 分別為輕度睡眠和深度睡眠模式。 CC2530 處于 HAL_SLEEP_TIMER 模式可以被睡眠定時(shí)器、 I/O 、重置喚醒,而處于深度睡眠時(shí),只能夠被 I/O 中斷和重置喚 醒。因此,輕度睡眠模式比較省功耗并能夠被定時(shí)喚醒;深度睡眠模式最省電,但只能被外 部中斷喚醒。表 CC2530 電源配置模式電源模式高頻振蕩器低頻振蕩器電源穩(wěn)壓器配置32MHz 振蕩器32.76

8、8kHz 振蕩器PM0開(kāi)開(kāi)開(kāi)PM1關(guān)開(kāi)開(kāi)PM2關(guān)開(kāi)關(guān)PM3關(guān)關(guān)關(guān)CC2530 輕度睡眠模式通過(guò) 32.768 kHz 晶振時(shí)鐘源驅(qū)動(dòng)的 24 位硬件休眠定時(shí)器實(shí)現(xiàn)。 電源管理器在休眠定時(shí)器溢出后,喚醒MCU 。 CC2530 最大的網(wǎng)絡(luò)休眠時(shí)間為 510 S,在HAL/hal_sleep.c 定義:/* MAX_SLEEP_TIME 計(jì)算 :* Sleep timer maximum duration = 0xFFFF7F / 32768 Hz = 511.996 seconds* Round it to 510 seconds or 510000 ms*/#define MAX_SLEEP_

9、TIME 510000 /* maximum time to sleep allowed by ST */ 休眠定時(shí)器有一個(gè) 24 位計(jì)數(shù)器和一個(gè) 24 位比較器。當(dāng) SLEEP_TIMER 定時(shí)器計(jì)數(shù) 到比較器設(shè)定值時(shí),產(chǎn)生中斷喚醒MCU 。而 OSAL 定時(shí)器為 16 位,最大定時(shí)器溢出時(shí)間0xFFFFms。2.Z-Stack 低功耗模式啟動(dòng)流程(1) 操作系統(tǒng)啟動(dòng)操作系統(tǒng)在 main.c 中經(jīng)過(guò)一系列初始化過(guò)程,最后調(diào)用osal_start_system()啟動(dòng)操作系統(tǒng)。 這時(shí)系統(tǒng)并不會(huì)進(jìn)入低功耗模式, 當(dāng)遍歷完所有的任務(wù)后發(fā)現(xiàn)沒(méi)有活動(dòng)任務(wù)時(shí), 并且定 義過(guò) POWER_SAVING 編

10、譯選項(xiàng),系統(tǒng)才會(huì)考慮進(jìn)入休眠狀態(tài)。void osal_start_system( void )if (idx tasksCnt)/ 該事件處于活躍狀態(tài) events = (tasksArridx)( idx, events );#if defined( POWER_SA VING )else / 遍歷所有的任務(wù),這些任務(wù)沒(méi)有處于活動(dòng)狀態(tài),osal_pwrmgr_powerconserve(); / 將系統(tǒng)進(jìn)入休眠狀態(tài)#endif( 2 ) 總休眠函數(shù) osal_pwrmgr_powerconserve()osal_pwrmgr_powerconserve() 函數(shù)中在在嘗試進(jìn)入休眠模式前, 將

11、會(huì)進(jìn)行兩項(xiàng)檢查工作。 首先,檢查 pwrmgr_device 變量被設(shè)置為電池設(shè)備。此設(shè)置是建立在設(shè)備加入網(wǎng)絡(luò)時(shí)利用 osal_pwrmgr_device( PWRMGR_BA TTERY )函數(shù)設(shè)置,參見(jiàn) ZDApp.c 文件。其次,檢查 pwrmgr_task_state 變量以確保沒(méi)有任務(wù)的節(jié)能狀態(tài)是 “ put a hold。該機(jī)”制使得 Z - Stack 任務(wù) 在臨界區(qū)操作時(shí)禁止休眠。 當(dāng)兩個(gè)條件都符合, 預(yù)期的睡眠時(shí)間由系統(tǒng)下一次計(jì)時(shí)器移除時(shí) 間決定。最后,系統(tǒng)調(diào)用 OSAL_SET_CPU_INTO_SLEEP( next ) 進(jìn)入休眠模式。void osal_pwrmgr_p

12、owerconserve( void )/ 判斷是否進(jìn)入休眠模式if ( pwrmgr_attribute.pwrmgr_device != PWRMGR_ALWAYS_ON ) / 如果電池供電 / 電源管理任務(wù)狀態(tài): 0 允許, 1 不允許if ( pwrmgr_attribute.pwrmgr_task_state = 0 )/ Hold off interrupts.HAL_ENTER_CRITICAL_SECTION( intState ); / 屏蔽中斷 /從系統(tǒng)中獲取休眠時(shí)間next = osal_next_timeout();/ Re-enable interrupts. HA

13、L_EXIT_CRITICAL_SECTION( intState );/ 打開(kāi)中斷/ 調(diào)用休眠函數(shù)OSAL_SET_CPU_INTO_SLEEP( next );/ 休眠模式電源管理屬性狀態(tài)為:typedef structuint16 pwrmgr_task_state;/ 任務(wù)的電源管理狀態(tài)uint16 pwrmgr_next_timeout; /下一次超時(shí)時(shí)間uint16 accumulated_sleep_time; / 睡眠定時(shí)器累積的計(jì)數(shù)值uint8 pwrmgr_device; / 分 為 兩 種 設(shè) 備 模 式 : PWRMGR_ALWAYS_ON 、 PWRMGR_BATTE

14、RY pwrmgr_attribute_t;(3)休眠函數(shù)OSAL_SET_CPU_INTO_SLEEP( next ) 為宏定義函數(shù):#define OSAL_SET_CPU_INTO_SLEEP(timeout) halSleep(timeout)HalSleep 是系統(tǒng)實(shí)際調(diào)用的休眠函數(shù)。 該函數(shù)首先設(shè)置睡眠模式, 深度睡眠或者定時(shí)器 睡眠。當(dāng)設(shè)置為定時(shí)器休眠模式,系統(tǒng)會(huì)執(zhí)行一系列有序的操作:調(diào)用 MAC_PwrOffReq() 函數(shù)關(guān)閉 MAC 層,關(guān)斷外設(shè),使 MCU 進(jìn)入休眠模式,休眠結(jié)束后會(huì)喚醒 MCU ,開(kāi)啟外 設(shè),最后重啟 MAC 層。然而,當(dāng)設(shè)置空閑時(shí)接收器使能( RFD_

15、RCVC_ALWAYS_ON ) 會(huì) 導(dǎo)致 MAC 層休眠時(shí)不關(guān)閉,會(huì)阻止設(shè)備進(jìn)入休眠模式。以下是 halSleep 函數(shù), timeout 是設(shè)置的定時(shí)器溢出時(shí)間:void halSleep( uint16 osal_timeout )/ 設(shè)置睡眠模式 /*將系統(tǒng)設(shè)置的毫秒單位時(shí)間轉(zhuǎn)換為以 320 微秒單位的定時(shí)器時(shí)間 */ timeout = HAL_SLEEP_MS_TO_320US(osal_timeout);if (timeout = 0)/ 獲取 MAC 層時(shí)間鏈表 timeout 的最小值timeout = MAC_PwrNextTimeout();else/ 獲取 MAC 層時(shí)

16、間鏈表 timeout 最小值與 OSAL 層 timeout 比較大小取得最小值 macTimeout = MAC_PwrNextTimeout();if (macTimeout != 0) & (macTimeout HAL_SLEEP_MS_TO_320US(PM_MIN_SLEEP_TIME) |(timeout = = 0 & zgPollRate = = 0)#elseif (timeout HAL_SLEEP_MS_TO_320US(PM_MIN_SLEEP_TIME) |(timeout = = 0)#endif/ 使能睡眠模式 /關(guān)閉所有中斷HAL_DISABLE_INTER

17、RUPTS();/請(qǐng)求關(guān)閉 MAC 層/* always use deep sleep to turn off radio VREG on CC2530 */if (halSleepPconValue != 0 & MAC_PwrOffReq(MAC_PWR_SLEEP_DEEP) MAC_SUCCESS)/ 使能睡眠定時(shí)器 /* 外設(shè)進(jìn)入休眠狀態(tài) */#if (defined HAL_KEY) & (HAL_KEY = TRUE)HalKeyEnterSleep();#endif/進(jìn)入休眠狀態(tài)前,關(guān)閉 LED3#ifdef HAL_SLEEP_DEBUG_LEDHAL_TURN_OFF_LE

18、D3();#elseHalLedEnterSleep();#endif/ 使能輕度睡眠模式 /* 如果 timeout 不為 0,使能睡眠定時(shí)器;如果 timeout 等于 0,進(jìn)入深度休眠模式 */if (timeout != 0)/ 設(shè)置睡眠定時(shí)器時(shí)間if (timeout HAL_SLEEP_MS_TO_320US( MAX_SLEEP_TIME )timeout -= HAL_SLEEP_MS_TO_320US( MAX_SLEEP_TIME ); halSleepSetTimer(HAL_SLEEP_MS_TO_320US( MAX_SLEEP_TIME ); else halSle

19、epSetTimer(timeout);/* 設(shè)置睡眠定時(shí)器中斷 */ HAL_SLEEP_TIMER_CLEAR_INT(); HAL_SLEEP_TIMER_ENABLE_INT();#ifdef HAL_SLEEP_DEBUG_LED/如果是 PM1 模式(正常工作模式) , LED 燈亮 if (halPwrMgtMode = CC2530_PM1) HAL_TURN_ON_LED1();Else /如果是睡眠模式, LED1 燈滅 HAL_TURN_OFF_LED1();#endif/* 設(shè)置功率模式 */ HAL_SLEEP_PREP_POWER_MODE(halPwrMgtMod

20、e);/* 使能所有中斷 */ HAL_SLEEP_IE_BACKUP_AND_DISABLE(ien0, ien1, ien2); HAL_ENABLE_INTERRUPTS();/* 設(shè)置 CC2530 功率 */ HAL_SLEEP_SET_POWER_MODE();/* 禁止所有中斷 */ HAL_DISABLE_INTERRUPTS();/* 恢復(fù)中斷,使能寄存器 */ HAL_SLEEP_IE_RESTORE(ien0, ien1, ien2);/* 禁止所有定時(shí)器中斷 */ HAL_SLEEP_TIMER_DISABLE_INT();/* 退出睡眠狀態(tài),打開(kāi) LED3*/#ifd

21、ef HAL_SLEEP_DEBUG_LED HAL_TURN_ON_LED3();#elseHalLedExitSleep();#endif/* 如果有按鍵中斷,處理按鍵中斷 */#if (defined HAL_KEY) & (HAL_KEY = TRUE) (void)HalKeyExitSleep();#endif/* 使能 MAC 層*/MAC_PwrOnReq();HAL_ENABLE_INTERRUPTS(); macMcuTimer2OverflowWorkaround();/ 使能輕度睡眠模式 / 使能深度睡眠模式 /else /如果 timeout=0 ,進(jìn)入深度休眠模式i

22、f (halSleepPconValue = 0)HAL_ENABLE_INTERRUPTS();elsehalSleepEnterIdleMode(timeout);/ 使能深度睡眠模式 / 使能睡眠模式 /else/ 設(shè)定的休眠時(shí)間太小則不進(jìn)入休眠模式,處于空閑狀態(tài)HAL_DISABLE_INTERRUPTS();halSleepEnterIdleMode(timeout); 系統(tǒng)預(yù)期休眠時(shí)間取決于 OSAL 定時(shí)器下一次溢出時(shí)間 timeout 。下一次溢出時(shí)間一般 是取所有打開(kāi)的定時(shí)器中最小時(shí)間作為睡眠時(shí)間。舉個(gè)例子,如果設(shè)定的睡眠時(shí)間為6 秒,但是數(shù)據(jù)請(qǐng)求輪詢時(shí)間間隔為100ms,那

23、么 100ms 就是睡眠時(shí)間。如果下一次溢出時(shí)間大于 0 而小于系統(tǒng)定義的最小睡眠時(shí)間 PM_MIN_SLEEP_TIME ,系統(tǒng)將進(jìn)入定時(shí)器休眠狀態(tài), 燈 LED1 將被關(guān)閉。當(dāng)進(jìn)入休眠狀態(tài)時(shí),燈 LED3 關(guān)閉,退出休眠狀態(tài)時(shí),燈 LED3 重新開(kāi) 啟。因此,如果睡眠定時(shí)器設(shè)定時(shí)間較小(如幾百毫秒)時(shí),燈 LED3 處于閃爍狀態(tài)。如果 睡眠定時(shí)器設(shè)定時(shí)間較大(如數(shù)秒或者更長(zhǎng))時(shí),燈 LED3 處于時(shí)而閃爍,時(shí)而關(guān)閉狀態(tài)。 如果下一次溢出時(shí)間設(shè)為 0,系統(tǒng)將進(jìn)入深度休眠模式,所有的燈處于關(guān)閉狀態(tài)。如果下一 次溢出時(shí)間小于系統(tǒng)定義的最小時(shí)間,將不會(huì)進(jìn)入休眠模式,繼續(xù)處于空閑狀態(tài)。3.應(yīng)用層周期

24、性睡眠實(shí)現(xiàn)Z-Stack 低功耗模式由操作系統(tǒng)調(diào)度運(yùn)行。如果不改變協(xié)議棧代碼,讀者理論上是不能 夠控制低功耗模式。 這種低功耗模式顯然不能實(shí)現(xiàn)節(jié)點(diǎn)每隔 60s 上報(bào)一次傳感器數(shù)據(jù), 其余 時(shí)間都處于深度睡眠模式狀態(tài)的任務(wù)。 讀者可以在 CC2530 裸機(jī)上控制睡眠定時(shí)器實(shí)現(xiàn)上述 任務(wù)。首先,手動(dòng)初始化睡眠定時(shí)器,并設(shè)定預(yù)期睡眠時(shí)間,當(dāng)睡眠定時(shí)器溢出時(shí),喚醒節(jié) 點(diǎn)進(jìn)行數(shù)據(jù)收發(fā), 然后再讓節(jié)點(diǎn)進(jìn)入睡眠模式。 另一種類似方法是讀者可以利用上文進(jìn)入休 眠模式的宏函數(shù) OSAL_SET_CPU_INTO_SLEEP(timeout) ,設(shè)定預(yù)期休眠時(shí)間。當(dāng)睡眠定時(shí) 器溢出時(shí), 節(jié)點(diǎn)被喚醒進(jìn)行數(shù)據(jù)收發(fā)。

25、為了使得節(jié)點(diǎn)能夠周期性地進(jìn)入睡眠狀態(tài), 應(yīng)用層程 序需要向系統(tǒng)注冊(cè)一個(gè)進(jìn)入睡眠狀態(tài)的任務(wù)事件( TASK EVENT ),并每隔一段時(shí)間觸發(fā)一 次該任務(wù)事件,使得節(jié)點(diǎn)進(jìn)入睡眠狀態(tài)。2)程序流程本實(shí)驗(yàn)基于 Sensor Demo 原版例程。 Sensor Demo 分為 CollectEB 和 SensorEB 兩個(gè)子工 程。 CollectEB 一般定義為協(xié)調(diào)器和路由器類型, SensorEB 定義為終端設(shè)備類型。協(xié)調(diào)器和 路由器的電源設(shè)備常設(shè)置為 PWRMGR_ALWAYS_ON ,不使用電源管理方案。低功耗模式設(shè)置針對(duì)終端設(shè)備工程,即 SensorEB。1. 低功耗設(shè)置(1) 添加編譯選項(xiàng)

26、: POWER_SAVING 、HAL_SLEEP_DEBUG_LED 、 HAL_KEY 默認(rèn)情況下, Z-stack 工程 終端設(shè)備電源管理是處于關(guān)閉狀態(tài)。啟動(dòng)該功能需在編譯器 中添加編譯選項(xiàng) POWER_SA VING 。為了便于觀察節(jié)點(diǎn)進(jìn)入睡眠模式, LED 燈用來(lái)指示節(jié)點(diǎn)睡眠模式和進(jìn)入 /退出定時(shí)器睡 眠模式,需要定義 HAL_SLEEP_DEBUG_LED 編譯選項(xiàng)。為了通過(guò)按鍵喚醒處于睡眠狀態(tài)下的節(jié)點(diǎn),需要定義編譯選項(xiàng) HAL_KEY 。(2) 在 f8wConfig.cfg 配置文件中,設(shè)置終端設(shè)備在空閑時(shí),接收機(jī)處于關(guān)閉狀態(tài) -DRFD_RCVC_ALWAYS_ON=FALS

27、E(3) 如果終端設(shè)備需要進(jìn)入深度睡眠,還需在 f8wConfig.cfg 里設(shè)置三個(gè)參數(shù): -DPOLL_RATE=0-DQUEUED_POLL_RATE=0-DRESPONSE_POLL_RATE=0Z-stack 工程終端設(shè)備默認(rèn)情況下,這三個(gè)輪詢選項(xiàng)處于開(kāi)啟狀態(tài),每一個(gè)輪詢選項(xiàng)都 由一個(gè)不同的時(shí)間延遲參數(shù)控制。 由于 halSleep 函數(shù)的睡眠時(shí)間一般是取所有打開(kāi)的定時(shí)器 中最小時(shí)間,電源管理功能開(kāi)啟后(添加 POWER_SAVING 選項(xiàng)),輪詢選項(xiàng)的設(shè)置會(huì)影響 到睡眠模式。 如果使用默認(rèn)的輪詢頻率, 終端設(shè)備只能進(jìn)入輕度睡眠模式。 對(duì)于一個(gè)不需要 接收消息的設(shè)備,為使其進(jìn)入深度睡

28、眠模式,須將這三個(gè)輪詢速率設(shè)為。如果 APS 層使用 ACK 機(jī)制,則必須確保在發(fā)送消息后到收到 ACK 命令幀的這一段時(shí)間內(nèi),輪詢是使能的。另一種查詢操作是按鍵查詢。默認(rèn)情況下,按鍵查詢每100 ms 被使能。如果設(shè)備需要進(jìn)入深度睡眠,需要禁止按鍵查詢。*ZMain/onboard.c*Initialize Key stuff*Hal_KeyIntEnable=HAL_KEY_INTERRUPT_ENABLE;HalKeyConfig(Hal_KeyIntEnable, OnBoard_KeyCallback);但是,為了偏于觀察節(jié)點(diǎn)進(jìn)入 /退出睡眠狀態(tài),編者將這三個(gè)參數(shù)設(shè)為2000,即 2

29、s。-DPOLL_RATE=2000 -DQUEUED_POLL_RATE=2000 -DRESPONSE_POLL_RATE=20002. 應(yīng)用層周期性睡眠實(shí)現(xiàn) 為了使得節(jié)點(diǎn)能夠周期性地進(jìn)入睡眠狀態(tài),在DemoSensor.c 中需要定義睡眠觸發(fā)事件#define MY_CHANGE_SLEEP_EVT 0x0008/ 定義睡眠改變事件程序中,通過(guò)按鍵觸發(fā)休眠函數(shù):if ( keys & HAL_KEY_SW_4 )/ 進(jìn)入休眠模式,休眠時(shí)間為 54 秒 OSAL_SET_CPU_INTO_SLEEP( 54000 );/ 醒來(lái) 6 秒后觸發(fā)事件 osal_start_timerEx( sa

30、pi_TaskID, MY_CHANGE_SLEEP_EVT, 6000 ); 當(dāng)睡眠定時(shí)器溢出時(shí), 會(huì)觸發(fā)睡眠改變?nèi)蝿?wù)事件。 操作系統(tǒng)接收到睡眠改變事件后, 會(huì) 對(duì)該事件進(jìn)行處理。 在事件處理函數(shù)中, 程序繼續(xù)進(jìn)入休眠模式, 并再次觸發(fā)睡眠改變?nèi)蝿?wù) 事件。這樣,節(jié)點(diǎn)睡眠 54秒之后,醒來(lái)后,發(fā)送數(shù)據(jù)包, 6 秒之后,又進(jìn)入休眠狀態(tài)。void zb_HandleOsalEvent( uint16 event ) if(event & MY_CHANGE_SLEEP_EVT)OSAL_SET_CPU_INTO_SLEEP( 54000 );/ 休眠模式 6s 時(shí)間/ 必須在事件處理程序中調(diào)用才能

31、實(shí)現(xiàn)事件的重復(fù)觸發(fā)osal_start_timerEx( sapi_TaskID, MY_CHANGE_SLEEP_EVT, 6000 );OSAL_SET_CPU_INTO_SLE宏EP定義函數(shù)包含在 OnBoard.h 中。因此,程序中需要定義 O nBoard.h 頭文件。#include OnBoard.h/ 定義 OSAL_SET_CPU_INTO_SLEE包P含函數(shù)3)實(shí)驗(yàn)步驟本實(shí)驗(yàn)使用三個(gè)開(kāi)發(fā)套件,一個(gè)節(jié)點(diǎn)下載 Collect 程序,成為協(xié)調(diào)器,建立 PAN網(wǎng)絡(luò)。 另外兩個(gè)節(jié)點(diǎn)下載 Sensor 程序,成為終端設(shè)備。終端設(shè)備能夠進(jìn)入低功耗模式,且能夠通 過(guò)按鍵周期性發(fā)送數(shù)據(jù)包。(

32、 1)將實(shí)驗(yàn)?zāi)夸浵碌南鄳?yīng)代碼依照 readme.txt 的說(shuō)明拷貝到 Sensor Demo 對(duì)應(yīng)的文件 夾下。在 SensorEB 工程中加入 POWER_SAVING ,HAL_SLEEP_DEBUG_LED ,HAL_KEY 編譯選項(xiàng)。(2)將 CollectEB 和 SensorEB工程分別下載到節(jié)點(diǎn) 1 和節(jié)點(diǎn) 2中。按下節(jié)點(diǎn) 1 SW1(上) 鍵和 SW2(右)鍵 , 節(jié)點(diǎn) 1 成為協(xié)調(diào)器設(shè)備,建立網(wǎng)絡(luò),并進(jìn)入網(wǎng)關(guān)模式。按下節(jié)點(diǎn) 2 重啟 鍵,節(jié)點(diǎn) 2 會(huì)加入節(jié)點(diǎn) 1 建立的網(wǎng)絡(luò)。按下節(jié)點(diǎn) 2 的 SW3(下)鍵,觀察節(jié)點(diǎn) 2 是否向節(jié)點(diǎn) 1 發(fā)送數(shù)據(jù)包。( 3)觀察節(jié)點(diǎn) 2 的燈

33、 LED1以及燈 LED3狀態(tài)。分析節(jié)點(diǎn)是否進(jìn)入睡眠模式,進(jìn)入/退出定時(shí)器睡眠模式。( 4)按下節(jié)點(diǎn) 2 的 SW4(左)鍵,觀察節(jié)點(diǎn) 2 的燈 LED1、 LED2、 LED3狀態(tài)。如果燈全 熄滅,等待一分鐘左右,觀察節(jié)點(diǎn)是否醒來(lái)。(5)將節(jié)點(diǎn) 1 通過(guò)串口與 PC連接,在串口調(diào)試助手中觀察節(jié)點(diǎn)2 向節(jié)點(diǎn) 1 發(fā)送的周期性數(shù)據(jù)包。(6)當(dāng)節(jié)點(diǎn) 2 進(jìn)入休眠模式時(shí),按下節(jié)點(diǎn) 2 的 SW1(上)鍵,觀察節(jié)點(diǎn)能否被喚醒。6.6.3 實(shí)驗(yàn)結(jié)果1.節(jié)點(diǎn) Z-Stack 協(xié)議棧睡眠模式按下節(jié)點(diǎn) 2 的重啟鍵之后,燈 LED1 、LED2 和 LED3 會(huì)不斷閃爍。燈 LED1 停止閃爍, 說(shuō)明節(jié)點(diǎn)已進(jìn)入休眠模式。 燈 LED3 大約每隔兩秒閃爍一次, 說(shuō)明節(jié)點(diǎn)周期性進(jìn)入睡眠狀態(tài)。 預(yù)期休眠時(shí)間取決于操作系統(tǒng)定時(shí)器時(shí)間鏈表的最小時(shí)間。我們定義的輪詢速率全為2s,并禁用了鍵盤(pán)輪詢,因此, LED3 休眠、閃爍周期為 2 秒。進(jìn)入睡眠模式前, LED3 關(guān)閉, 退出睡眠模式時(shí), LED3 開(kāi)啟。LED 指示燈狀態(tài)指示亮 - 關(guān)閉周期性閃爍( 2s)節(jié)點(diǎn)協(xié)議棧 啟動(dòng)后,進(jìn)入低 功耗睡眠模式節(jié)點(diǎn)周期

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論