Zigbee电源管理.docx
- 文档编号:5428629
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:12
- 大小:22.59KB
Zigbee电源管理.docx
《Zigbee电源管理.docx》由会员分享,可在线阅读,更多相关《Zigbee电源管理.docx(12页珍藏版)》请在冰豆网上搜索。
Zigbee电源管理
CC2430DB的电源管理1
1.目的
本文档介绍了使用的电源管理理念后,德州仪器在Z-Stack(TM)的ZigBee协议栈构建的应用程序的Chipcon公司CC2430DB。
电源管理是一般由电池供电的设备将通过各种睡眠模式,无活动期间使用时间的电池寿命。
2.定义
MAC-媒体访问控制软件,实现了IEEE802.15.4通信功能。
MCU-微控制器单元-8051处理器的嵌入式系统芯片CC2430片上CC2430DB板上。
OSAL-操作系统抽象层-独立于平台的任务处理提供了与Z-Stack的。
Sleep-一个行动中的某些功能被禁用,以降低功耗MCU模式消费。
CC2430的基础之上提供了三种不同的睡眠模式,其中两个是使用了Z-Stack。
EndDevice-ZigBee的设备,,加入网络但是没有路由功能,通常空闲时关闭其接收器。
这就要求其父设备持有,直至最终的信息,其信息设备调查。
3.什么是电源管理
电源管理被使用电池供电终端设备,尽量减少短暂无线电通信之间的功耗。
通常,一个终端设备禁用功耗的外设和空闲期间进入睡眠模式。
Z-Stack还提供了两种睡眠模式,轻度休眠和深度休眠指定。
轻度睡眠在系统统需要唤醒去执行与预定时间延迟的活动时被使用。
深睡眠被使用的是没有未来的活动计划,需要外部刺激(如按一个按钮)唤醒设备时。
轻度睡眠普遍降低功耗到几毫安,而深睡眠减少到几微安。
睡眠的终端设备的例子产品包括,传感器,它被定时的唤醒报到他们采集到得信息,还有远程控制设备,它被用户按键唤醒,发送邮件时。
在这些类型的设备共同特点是,他们用他们在大部分时间处于睡眠模式,最大限度地减少功耗。
4.Z-Stack怎么控制睡眠模式
电源管理是使用电池供电终端设备,尽量减少功率之间的预定活动(轻度睡眠),或在不活动(深睡眠)长期短暂消费。
系统活动在每个任务完成后被OSAL主控回路监控。
如果没有任务有一个活动计划,电源管理功能启用,该系统将决定是否睡觉。
符合下列条件都必须符合该设备进入睡眠模式,以:
-睡眠POWER_SAVING编译选项启用
-ZDO节点描述显示“RX是空闲时关闭”。
这是通过设置RFD_RCVC_ALWAYS_ON在f8wConfig.cfg为FALSE。
所有的Z-Stack的任务“同意”允许睡眠
-Z-Stack的任务,没有安排活动
-MAC没有预定活动
Z-Stack中终端设备的工程项目在默认情况下没有电源管理功能。
要启用此功能,POWER_SAVING编译选项在工程建立的时候必须被指定。
如下图所示,此选项是划归C预处理器选项卡/C++编译选项框中定义的符号:
为了减少功耗到最低程度,终端设备,需要将尽可能多地把电子电路关掉,在进入睡眠模式之前。
这包括外围设备,无线电接收器和发射器,以及单片机本身的重要部分。
为了避免在睡觉时丢失信息,终端设备的父设备需要持有子节点的信息,直至终端设备接收到这些信息。
父设备“知道”,终端将接收到信息,当能量在终端设备间交流,请求CAPINFO_RCVR_ON_IDLE关闭,在Z-Stack的工程中,默认设置,设备功能ZDO_Config_Node_Descriptor结构中被指定,在ZDConfig.c文件中。
默认的终端设备,只说明CAPINFO_DEVICETYPE_RFD,表明它是电池供电,并关闭其接收器空闲时:
NodeDescriptorFormat_tZDO_Config_Node_Descriptor=
{
#ifdefined(ZDO_COORDINATOR)&&!
defined(SOFT_START)
NODETYPE_COORDINATOR,
#elifdefined(RTR_NWK)
NODETYPE_ROUTER,
#else
NODETYPE_DEVICE, //LogicalType
#endif
0, //UserDescriptorAvailableissetlater.
0, //ComplexDescriptorAvailableissetlater.
0, //Reserved
0, //NOAPSflags
NODEFREQ_2400, //FrequencyBand
//MACCapabilities
#ifdefined(RTR_NWK)
(
#ifdefined(ZDO_COORDINATOR)||defined(SOFT_START)
CAPINFO_ALTPANCOORD|
#endif
CAPINFO_DEVICETYPE_FFD|
CAPINFO_POWER_AC|
CAPINFO_RCVR_ON_IDLE),
#else
CAPINFO_DEVICETYPE_RFD
#if(RFD_RCVC_ALWAYS_ON==TRUE)
|CAPINFO_RCVR_ON_IDLE
#endif
,
#endif
{0x00,0x00}, //ManfacturerCode-*YOUFILLIN*
MAX_BUFFER_SIZE, //MaximumBufferSize.
//Themaximumtransfersizefieldisn'tusedandspecsaystosetto0.
{0,0},
(0
#ifdefined(ZDO_COORDINATOR)&&(SECURE!
=0)
|PRIM_TRUST_CENTER
#endif
)
};
在决定是否尝试节电是主要循环结束时。
如果所有的Z-Stack的任务被检查且都没有做任何处理,活动变量将是错误的。
如下图所示,在编译选项POWER_SAVING确定是否被osal_pwrmgr_powerconserve()函数调用:
#ifdefined(POWER_SAVING)
else //Completepassthroughalltaskeventswithnoactivity?
{
osal_pwrmgr_powerconserve(); //Puttheprocessor/systemintosleep
}
#endif
在这一点上,两个或者更多检查工作将被执行再尝试进入睡眠模式之前。
首先,检查pwrmgr_device变量被设置为电池设备。
此设置是建立在设备加入网络,见例子ZDApp.c。
第二,pwrmgr_task_state变量进行检查,以确保没有任务“putahold”“在节能方面。
这种机制使每个Z-Stack的任务,在关键业务禁用睡觉。
当这些条件都符合,所需的理想的睡眠时间是由系统下次的过期时间
计时器决定。
如果下一个过期时间大于零,比MIN_SLEEP_TIME少,SLEEP_LITE模式的就被选择。
在这种模式下,系统时间被调整
提供一个“唤醒”的计时器事件中断是由于到期一次,该MIN_SLEEP_TIME是为了防止很短时间的脱离在hal_sleep.c定义。
SLEEP_DEEP模式的选择,在没有Z-Stack的事件或定时器计划,因此未来到期为零,最大允许功耗:
//Shouldweevenlookintopowerconservation
if(pwrmgr_attribute.pwrmgr_device!
=PWRMGR_ALWAYS_ON)
{
//Arealltasksinagreementtoconserve
if(pwrmgr_attribute.pwrmgr_task_state==0)
{
//Holdoffinterrupts.
HAL_ENTER_CRITICAL_SECTION(intState);
//Getnexttime-out
next=osal_next_timeout();
//Re-enableinterrupts.
HAL_EXIT_CRITICAL_SECTION(intState);
//Puttheprocessorintosleepmode
OSAL_SET_CPU_INTO_SLEEP(next);
}
}
该OSAL_SET_CPU_INTO_SLEEP宏开始被称为睡眠过程。
对于CC2430DB,此宏调用halSleep()函数执行关停MAC,关闭外设,进入MCU器休眠模式,睡眠后醒来的MCU,打开外设,最后重新启动的MAC等任务。
由于Z-Stack的系统循环运行独立的MAC调度,Z-Stack还不知道的MAC处理的状态。
对MAC_PwrOffReq()的调用会请求一个MAC关机。
应当指出,MAC不会关闭因为睡觉,当接收器空闲时启用,所以是无法入睡的设备。
在CC2430DB,深度睡眠模式终止,只有从外部中断的操纵杆和S1或从一个MCU复位。
这种模式是利用远程空竹装置类型的睡眠状态,直到外部刺激,例如按下按钮。
轻度睡眠模式可以被任何中断事件终止,包括外部事件,以及定时器事件。
如果外部中断唤醒了微控制器,而在轻度睡眠模式(计时器没有过期醒来),Z-Stack的计时系统调整为唤醒预定时间延迟,过去了一小部分。
请注意,中断只能生成当S1是按下操纵杆时是切换。
S1是旁边的绿色LED。
参照boardimage对应本笔记结束。
5。
睡眠定时器的思考
轻度睡眠在CC2430DB板上被建立,在一个24位硬件计时器(SLEEP_TIMER)被32.768kHz晶体时钟源驱动。
电源管理器使用的睡眠计时器保持轨道的运行时间计时器到期后,以唤醒了微控制器。
睡眠计时器有一个24位计数器和一个24位比较器。
CC2430的睡眠定时器能够保持在睡眠期间长达512s的跟踪网络痕迹,因此最长的睡眠时间是510秒(2秒(四舍五入)。
系统使用的16位定时器的结构。
因此,系统计时器有65s限制基于1毫秒计时器刻度秒。
在SLEEP_TIMER比较值是由下面的公式集,其中超时下系统/MAC单位在320微秒的MAC计时器到期和扁虱是当前SLEEP_TIMER数:
ticks+=(timeout*671)/64
32KHz的比例为320微秒滴答滴答是32768/3125=10.48576。
这是近671/64=10.484375。
当SLEEP_TIMER计数的比较值,产生一个中断和唤醒了微控制器。
从睡眠状态唤醒后成立,以毫秒为单位计算经过的时间是*1000/32768或:
ticks*125/4096
6.应用考虑
终端设备在Z-Stack的示例应用程序初始化被建立为,禁止电源管理,自动接收信息使能。
三种不同的接收选项被支持,每一个时间延迟参数都被控制。
当启用电源管理(POWER_SAVING编译选项),连同任何接收选项,睡眠模式将会受到影响。
具体来说,预定的接收时间延迟被深度睡眠所排除,因此限制节能。
三个时间延迟接收选项包括:
数据请求查询-定期发送数据请求父设备为排队的邮件调查。
消息之间的间隔时间可以改变存储在gNWK_POLL_RATE所需的时间,或设置立即调用函数NLME_SetPollRate()。
调用此函数将开始投票,如果以前已禁用。
为1的时间间隔调用将立即调查,一时间。
排队数据查询-民调为排队的邮件后,收到的数据显示父设备。
延迟的时间可以改变调用函数NLME_SetQueuedPollRate()或存储在gQUEUED_POLL_RATE此功能还允许快速“卸载排队邮件”,无论数据请求投票率。
响应数据查询-轮询父设备为了响应消息当接收到确认信息后,延迟的时间可以被改变通过调用函数NLME_SetResponsePollRate()或直接存储在gRESPONSE_POLL_RATE。
此功能允许迅速“卸载响应消息”,如接入点鸣谢,无论数据请求轮询率。
POLL_RATE,QUEUED_POLL_RATE,RESPONSE_POLL_RATE默认的编译选项在f8wConfig.cfg中设置,然后安装轮询率在nwk_globals.c源文件中,规定了终端设备将自动查询消息。
如果POWER_SAVING被默认的轮询率使能,节电将仅限于浅度睡眠模式。
为了尽量减少创建一个深度睡眠器件的功耗,重复查询应禁用通过设置gNWK_POLL_RATE为零。
各个查询策略可以通过适当的设置这三个值的查询率来实现。
例如,对于从来没有的设备需要接收一旦加入了这个网络应设立三个查询率为零的消息。
如果ZigBee的应用支持子层被利用,在每个信息传递至少要等到收到应答之后查询需要被使能。
在某些系统中,这可能是有益的查询率各不相同,这取决于具体的应用程序的活动。
另外一个查询活动是关键查询。
关键查询启用默认情况下,在100毫秒率。
要禁用的关键查询,要改变OnboardKeyIntEnable的HAL_KEY_INTERRUPT_ENABLE。
/*InitializeKeystuff*/
OnboardKeyIntEnable=HAL_KEY_INTERRUPT_DISABLE; //--HAL_KEY_INTERRUPT_ENABLE
HalKeyConfig(OnboardKeyIntEnable,OnBoard_KeyCallback);
Zigbee协议栈OSAL层API函数
3.信息管理API
3.1概述
这部分API提供了任务或处理单元与不同的处理环境之间的数据交换。
这部分API函数能够为任务分配和收回消息缓冲区,发送命令消息给以外一个任务并且接收应答。
3.2osal_msg_allocate()
概述:
当一个任务调用这个函数时,将为消息分配缓冲区,函数会将消息加入缓冲区,并调用osal_msg_send()将消息发送到另一个任务。
原型:
byte*osal_msg_allocate(uint16len)
参数:
len:
消息的长度
返回值:
指向消息缓冲区的指针,当分配失败时返回NULL
3.3osal_msg_deallocate()
概述:
用于收回缓冲区
原型:
byteosal_msg_deallocate(byte*msg_ptr)
参数:
Msg_ptr:
指向将要收回的缓冲区的指针
返回值:
RETURNVALUEDESCRIPTION
ZSUCCESS 回收成功
INVALID_MSG_POINTER 错误的指针
MSG_BUFFER_NOT_AVAIL 缓冲区在队列中
3.4osal_msg_send()
概述:
任务调用这个函数以实现发送指令或数据给另一个任务或处理单元。
目标任务的标识必须是一个有效的系统任务,当调用osal_create_task()启动一个任务时,将会分配任务标识。
osal_msg_send()也将在目标任务的事件列表中设置SYS_EVENT_MSG
原型:
byteosal_msg_send(bytedestination_task,byte*msg_ptr)
参数:
destination_task:
目标任务的标识
msg_ptr:
指向消息缓冲区的指针
返回值:
ZSUCCESS 消息发送成功
INVALID_MSG_POINTER 无效指针
INVALID_TASK 目标任务无效
3.5osal_msg_receive()
概述:
任务调用这个函数来接收消息。
消息处理完毕后,发送消息的任务必须调用osal_msg_deallocate()收回缓冲区。
原型:
byte*osal_msg_receive(bytetask_id)
参数:
task_id:
消息发送者的任务标识
返回值:
指向消息所存放的缓冲区指针,如果没有收到消息将返回NULL。
4.任务同步API
4.1概述
这个API使能一个任务等待一个事件的发生和返回控制而不是一直等待。
在这个API中的函数可以用来为任务设置事件,立刻通知任务有事件被设置。
4.2osal_set_event()
概述:
函数用来设置一个任务的事件标志
原型:
byteosal_set_event(bytetask_id,UINT16event_flag)
参数:
task_id:
任务标识
event_flag :
2个字节,每个位特指一个事件。
只有一个系统事件,其他事件在接收任务中定义。
返回值:
ZSUCCESS 成功设置
INVALID_TASK 无效任务
5.定时器管理API
5.1概述
这个API允许内部任务(Z-Stack)以及应用层任务使用定时器。
函数提供了启动和停止定时器的功能,定时器最小增量为1MS。
5.2osal_start_timer()
概述:
启动定时器函数。
当定时器到点时,thegiveneventbitwillbeset。
事件将在任务中设置,要指明具体任务,调用osal_start_timerEx()
原型:
byteosal_start_timer(UINT16event_id,UINT16timeout_value);
参数:
event_id:
用户定义的eventbit.当定时器到点时,事件将通知任务。
timeout_value:
定时值(ms)
返回值:
ZSUCCESSTimer 成功开启
NO_TIMER_AVAILABLE 无法开启
5.3osal_start_timerEx()
概述:
功能与osal_start_timer()相近,这个函数允许调用者为另一个任务启动定时器
原型:
byteosal_start_timerEx(bytetaskID,UINT16event_id,UINT16
timeout_value);
参数:
略
返回值:
ZSUCCESSTimer 成功开启
NO_TIMER_AVAILABLE 无法开启
5.4osal_stop_timer()
概述:
停止正在运行的定时器,停止外部事件调用osal_stop_timerEx()
原型:
byteosal_stop_timer(UINT16event_id);
参数:
event_id:
将要结束的目标事件(该事件是启动定时器的事件)
返回值:
ZSUCCESSTimer 成功停止
INVALID_EVENT_ID 无效事件
5.5osal_stop_timerEx()
概述:
结束外部事件的定时器
原型:
byteosal_stop_timerEx(bytetask_id,UINT16event_id);
参数:
略
返回值
ZSUCCESSTimer 成功停止
INVALID_EVENT_ID 无效事件
5.6osal_GetSystemClock()
概述:
读取系统时间
原型:
uint32osal_GetSystemClock(void);
参数:
无
返回值:
系统时间(ms)
6.中断管理API
6.1概述:
这个API实现任务与外部中断的接口,函数允许任务关联每一个具体的中断程序,可以开关中断。
在中断服务程序内,其他任务可以设置事件。
6.2osal_int_enable()
概述:
函数用于使能中断。
原型:
byteosal_int_enable(byteinterrupt_id)
参数:
interrupt_id:
目标中断
返回值:
ZSUCCESSInterrupt 成功使能
INVALID_INTERRUPT_ID 无效中断
6.3osal_int_disable()
概述:
关闭中断
原型:
byteosal_int_disable(byteinterrupt_id)
参数:
略
返回值:
ZSUCCESSInterrupt 成功关闭
INVALID_INTERRUPT_ID 无效中断
7.任务管理API
7.1概述
这个API用于在OSAL中增加和管理任务。
每一个任务由任务初始化函数和时间处理函数组成。
OSALcallsosalInitTasks()[applicationsupplied]toinitializethetasksandOSALusesatasktable(constpT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Zigbee 电源 管理
![提示](https://static.bdocx.com/images/bang_tan.gif)