Zigbee网络低占空比机制研究实验综述.docx
《Zigbee网络低占空比机制研究实验综述.docx》由会员分享,可在线阅读,更多相关《Zigbee网络低占空比机制研究实验综述.docx(14页珍藏版)》请在冰豆网上搜索。
Zigbee网络低占空比机制研究实验综述
8.5Zigbee网络低功耗模式机制研究
ZigBee网络节点通常由电池供电,并部署在野外环境中,要求常年连续工作。
因此,低功耗设计对延长ZigBee网络生存寿命具有至关重要的意义。
低占空比机制是一种非常重要的节能措施,通常应用在网络节点间通信频率较低的空闲型场合。
本文首先介绍Z-Stack协议栈的低功耗电源管理模式,然后在应用层实现ZigBee节点周期性休眠与唤醒。
这对减少ZigBee网络能量消耗,实现低占空比(lowduty-cycle)网络具有重要参考意义。
6.6.1实验目的与器材
1)实验目的
◆学习和理解Z-Stack协议栈电源管理模式,睡眠机制。
◆学会使用Z-Stack协议栈低功耗模式。
◆学会使用CC2530睡眠定时器进行睡眠和唤醒。
◆学会在应用层实现简单的低占空比模式。
2)实验器材
◆2个CC2530开发套件(1个协调器模块,1个终端模块);
6.6.2实验原理与步骤
1)实验原理
ZigBee网络节点一般由能量有限的电池供电,长期处于无人值守的状态下,并且个数多、分布区域广、所处环境复杂,使得难以进行电池更换。
如果节点电池能量耗尽之后,网络连通性以及网络生存时间会受到极大影响。
为使节点长期正常工作下去,必须从能量供应的角度进行研究,采取有效的方法为无线传感器网络提供可持续的能量供应。
周全的传感器节点能量管理设计方案,必须从“开源”和“节流”两个方面采取相应措施,以达到能量有效使用。
所谓“开源”,就是通过采取各种措施补充传感器节点能量,其中主要措施是能量收集网络。
例如,利用太阳能电池板可以为传感器节点供电。
白天,光伏电池在为传感器节点供电,同时将富余能量储存到电池中。
夜间,太阳光不足时,由电池为传感器节点供电。
所谓“节流”,就是通过采取各种节能措施减少传感器节点的能量消耗,延长网络使用寿命。
“开源”措施的目标是最大化地扩展能量来源,而“节流”措施为了在保证通信质量同时,尽可能地减少能量消耗。
本节主要关注如何节约ZigBee网络节点能量。
ZigBee通信协议中MAC层,网络层已经采用许多能量节约机制。
其中,最常用的设计思想是当ZigBee节点空闲时,尽快进入休眠状态的低功耗电源模式,从而节约能量消耗。
1.CC2530电源管理
电池供电的终端设备通常采用电源管理方案来最小化节点功耗。
一个终端设备在空闲时会关闭大功耗外设和空闲期间进入休眠模式。
Z-Stack提供了两种休眠模式,分别为轻度休眠和深度休眠。
系统处于轻度睡眠模式,会在一个预定延时后被唤醒执行任务。
当系统没有任务需要执行时会进入深度休眠模式。
系统进入深度休眠模式后,需要一个外部触发(如按键)来唤醒设备。
轻度模式下工作电流通常降为几微安,而深度模式通常降为几微安。
终端设备休眠例子有:
温湿度等传感器周期被唤醒报告数据;监控中心用户通过按键命令向远程控制设备索取数据;遥控器在按键时,才向控制设备发送命令。
这些设备共同特点是它们大部分时间都处于休眠模式,最大限度地减少功耗。
在HAL/hal_sleep.c文件中有关于CC2530睡眠模式的定义:
#defineHAL_SLEEP_OFFCC2530_PM0
#defineHAL_SLEEP_TIMERCC2530_PM2
#defineHAL_SLEEP_DEEPCC2530_PM3
#defineCC2530_PM00/*PM0,Clockoscillatorson,voltageregulatoron*/
#defineCC2530_PM11/*PM1,32.768kHzoscillatorson,voltageregulatoron*/
#defineCC2530_PM22/*PM2,32.768kHzoscillatorson,voltageregulatoroff*/
#defineCC2530_PM33/*PM3,Allclockoscillatorsoff,voltageregulatoroff*/
电源管理默认设置为HAL_SLEEP_OFF,即处于正常工作模式,时钟、电源稳压器都处于工作状态。
CC2530处于睡眠模式时会关闭系统时钟、微控制单元(MCU),不是默认模式,需要在Z-Stack中增加编译选项POWER_SAVING才能够使用。
HAL_SLEEP_TIMER和HAL_SLEEP_DEEP分别为轻度睡眠和深度睡眠模式。
CC2530处于HAL_SLEEP_TIMER模式可以被睡眠定时器、I/O、重置唤醒,而处于深度睡眠时,只能够被I/O中断和重置唤醒。
因此,轻度睡眠模式比较省功耗并能够被定时唤醒;深度睡眠模式最省电,但只能被外部中断唤醒。
表CC2530电源配置模式
电源模式
高频振荡器
低频振荡器
电源稳压器
配置
32MHz振荡器
32.768kHz振荡器
PM0
开
开
开
PM1
关
开
开
PM2
关
开
关
PM3
关
关
关
CC2530轻度睡眠模式通过32.768kHz晶振时钟源驱动的24位硬件休眠定时器实现。
电源管理器在休眠定时器溢出后,唤醒MCU。
CC2530最大的网络休眠时间为510S,在HAL/hal_sleep.c定义:
/*MAX_SLEEP_TIME计算:
*Sleeptimermaximumduration=0xFFFF7F/32768Hz=511.996seconds
*Rounditto510secondsor510000ms
*/
#defineMAX_SLEEP_TIME510000/*maximumtimetosleepallowedbyST*/
休眠定时器有一个24位计数器和一个24位比较器。
当SLEEP_TIMER定时器计数到比较器设定值时,产生中断唤醒MCU。
而OSAL定时器为16位,最大定时器溢出时间0xFFFFms。
2.Z-Stack低功耗模式启动流程
(1)操作系统启动
操作系统在main.c中经过一系列初始化过程,最后调用osal_start_system()启动操作系统。
这时系统并不会进入低功耗模式,当遍历完所有的任务后发现没有活动任务时,并且定义过POWER_SAVING编译选项,系统才会考虑进入休眠状态。
voidosal_start_system(void)
{
…….
{
…….
if(idx{
………
events=(tasksArr[idx])(idx,events);
………..
}
#ifdefined(POWER_SAVING)
else//遍历所有的任务,这些任务没有处于活动状态,
{
osal_pwrmgr_powerconserve();//将系统进入休眠状态
}
#endif
}
}
(2)总休眠函数osal_pwrmgr_powerconserve()
osal_pwrmgr_powerconserve()函数中在在尝试进入休眠模式前,将会进行两项检查工作。
首先,检查pwrmgr_device变量被设置为电池设备。
此设置是建立在设备加入网络时利用osal_pwrmgr_device(PWRMGR_BATTERY)函数设置,参见ZDApp.c文件。
其次,检查pwrmgr_task_state变量以确保没有任务的节能状态是“putahold”。
该机制使得Z-Stack任务在临界区操作时禁止休眠。
当两个条件都符合,预期的睡眠时间由系统下一次计时器移除时间决定。
最后,系统调用OSAL_SET_CPU_INTO_SLEEP(next)进入休眠模式。
voidosal_pwrmgr_powerconserve(void)
{
……
//判断是否进入休眠模式
if(pwrmgr_attribute.pwrmgr_device!
=PWRMGR_ALWAYS_ON)//如果电池供电
{
//电源管理任务状态:
0允许,1不允许
if(pwrmgr_attribute.pwrmgr_task_state==0)
{
//Holdoffinterrupts.
HAL_ENTER_CRITICAL_SECTION(intState);//屏蔽中断
//从系统中获取休眠时间
next=osal_next_timeout();
//Re-enableinterrupts.
HAL_EXIT_CRITICAL_SECTION(intState);//打开中断
//调用休眠函数
OSAL_SET_CPU_INTO_SLEEP(next);//休眠模式
}
}
}
电源管理属性状态为:
typedefstruct
{
uint16pwrmgr_task_state;//任务的电源管理状态
uint16pwrmgr_next_timeout;//下一次超时时间
uint16accumulated_sleep_time;//睡眠定时器累积的计数值
uint8pwrmgr_device;//分为两种设备模式:
PWRMGR_ALWAYS_ON、PWRMGR_BATTERY
}pwrmgr_attribute_t;
(3)休眠函数
OSAL_SET_CPU_INTO_SLEEP(next)为宏定义函数:
#defineOSAL_SET_CPU_INTO_SLEEP(timeout)halSleep(timeout)
HalSleep是系统实际调用的休眠函数。
该函数首先设置睡眠模式,深度睡眠或者定时器睡眠。
当设置为定时器休眠模式,系统会执行一系列有序的操作:
调用MAC_PwrOffReq()函数关闭MAC层,关断外设,使MCU进入休眠模式,休眠结束后会唤醒MCU,开启外设,最后重启MAC层。
然而,当设置空闲时接收器使能(RFD_RCVC_ALWAYS_ON)会导致MAC层休眠时不关闭,会阻止设备进入休眠模式。
以下是halSleep函数,timeout是设置的定时器溢出时间:
voidhalSleep(uint16osal_timeout)
{
//---------------------------------------设置睡眠模式--------------------------------------------//
/*将系统设置的毫秒单位时间转换为以320微秒单位的定时器时间*/
timeout=HAL_SLEEP_MS_TO_320US(osal_timeout);
if(timeout==0)
{//获取MAC层时间链表timeout的最小值
timeout=MAC_PwrNextTimeout();
}
else
{//获取MAC层时间链表timeout最小值与OSAL层timeout比较大小取得最小值
macTimeout=MAC_PwrNextTimeout();
if((macTimeout!
=0)&&(macTimeout{
timeout=macTimeout;
}
}
//如果timeout等于0,设置睡眠模式为深度睡眠模式
//如果timeout不为0,设置睡眠模式为定时