Zigbee低功耗设置
1.在预编译选项中使能POWER_SAVING
2.设置 :RFD_RCVC_ALWAYS_ON = FALSE; //(in f8wConfig.cfg(默认情况下就是FALSE))并执行:
else if ( ZSTACK_END_DEVICE_BUILD ) {
ZDO_Config_Node_Descriptor.CapabilityFlags = (CAPINFO_DEVICETYPE_RFD #if ( RFD_RC VC_ALWAYS_ON == TRUE) | CAPINFO_RCVR_ON_IDLE #endif ); }
实现功能:
End-Device 默认的只有CAPINFO_DEVICETYPE_RFD, 这样就设置了电池供电模式,并且在节点空闲的时候关闭射频接收器。
3.在进入sleep mode之前,2项重要的检查需要执行:
First: pwrmgr_device必须为 PWRMGR_BATTERY!
说明:{系统初始化时,调用osal_pwrmgr_init(),pwrmgr_device初始化为
PWRMGR_ALWAYS_ON}
该项的正确设置是在节点加入网络之后。
在ZDApp.c文件中,若POWER_SAVING选项已使能,则调用会 osal_pwrmgr_device(PWRMGR_BATTERY),设置为允许节电;
当器件为路由或协调器时,调用osal_pwrmgr_device( PWRMGR_ALWAYS_ON ),不允许节电(睡眠)!
Second:pwrmgr_task_state 必须为no task,这项机制有利于节点在执行重要操作时,禁止sleep mode。
说明:{系统初始化时,调用osal_pwrmgr_init(),pwrmgr_attribute.pwrmgr_task_state初始化为0,no task,允许节电}
协议栈并没有调用osal_pwrmgr_task_state()函数,即各项任务一直允许节
电。
原文如下:
If the task always wants to converse power, it doesn't need to call this function at all.(见OSAL_PwrMgr.h文件)
4.两种睡眠模式的选择
当步骤4中的两项都满足后,定时睡眠的时间决定于系统定时器(OSAL timers)的下一个终了时间,如果该时间大于0而且小于最小睡眠时间(MIN_SLEEP_TIME),则会选择定时器睡眠模式,在定时器睡眠模式下,系统定时器产生事件的唤醒中断!
最小睡眠时间定义在hal_sleep.c文件中,用来防止过短的睡眠抖动。
当协议栈没有任务和定时事件,终了时间为0( next expiration is zero),深睡眠将会被选择,这样可获得最大的节电效果。
5. OSAL_SET_CPU_INTO_SLEEP是一个用于睡眠的宏,在开始进入睡眠时被halSleep()函
数调用,该函数周期性的关断MAC、外设,进入睡眠模式,睡眠后唤醒MCU,开启外设,最终重启MAC。
由于协议栈操作系统的轮询与MAC时间(事件)表相独立,因此协议栈并不知道MAC 的运行状态。
MAC_PwrOffReq()函数的调用会请求关闭MAC。
必须注意的一点是,当空闲时若射频接收器处于使能状态,MAC将不会被关闭,这样将阻止了节点进入睡眠。
对于CC2530,深睡眠只会被外部中断或MCU复位唤醒。
这种模式适用于远程控制类器件(用外部中断的方式唤醒,比如按键);
定时睡眠会被任何中断事件终结,包括外部中断事件,定时器事件。
假如MCU被外部中断唤醒,而时间并未到唤醒时间值(timer not expired),协议栈时间系统将会自动调节( Z-
Stack timing system adjusts for the elapsed fraction of the scheduled wake-up time delay) 6. 协议栈的案例程序中默认设定的是禁止节电并且使能自动巡检已获取信息。
共有3个不同的巡检选项,每一个都由时间延时参数控制。
当POWER_SAVING被使能,任何一个巡检选项,都会对睡眠模式产生影响。
特别地,巡检会阻止进入进入深睡眠模式。
(在工程中,我们将zgPollRate、zgQueuedPollRate、zgResponsePollRate的值设为0 )
3个的巡检选项:
A. Data Request Polling (数据请求巡检)–周期性的向父节点发送数据请求信息。
间隔的时间值可以通过改变zgPollRate来设定和存储,或者
调用 NLME_SetPollRate()函数,该函数的调用会立马开始巡检,即便是之前被禁止了!
( Calling with a time interval of 1 will poll immediately, one time. )
B. Queued Data Polling (数据接受巡检)–在接到到有数据将要传来的信号后,周期性的向父
节点发送数据请求信息。
间隔的时间值可以通过调用 NLME_SetQueuedPollRate()函数改变,或者改变zgQueuedPollRate来设定和存储。
这种特点允许快速地接受(卸载)数据,而不用考虑Request Poll rate.
C. Response Data Polling(数据响应巡检)–接受到数据确认后,周期性的向父节点请求响应信息。
间隔的时间值可以通过调用 NLME_SetResponseRate()函数改变,或者改变zgResponsePollRate.来设定和存储。
这种特点允许快速地接受(卸载)响应信息
(such as APS Acknowledgements,),而不用考虑zgResponsePollRate.
polling rates的默认设定和初始化是在nwk_globals.c 文件中。
如果在polling rates处于默认的情况下使能了POWER_SAVING,定时器睡眠模式的节电将会被限制。
为了实现
DEEP sleeping 节点,最小化功耗,必须禁止巡检,将zgPollRate设置为0。
设置3个巡检值,
可不同的巡检策略。
例如,对于从来不需要接受数据的节点来说,一旦加入网络后即可将设置3的巡检值为0。
如果
使用APS acknowledge,在每一次信息传递之后 ACK接受到之前,巡检必须使能。
在一些系统中,根据相应的应用,灵活的改变polling rate是很有好处的。
7.在OnBoard.c文件InitBoard()函数中,将
OnboardKeyIntEnable to HAL_KEY_INTERRUPT_ENABLE(禁止key polling)
( The key polling is enabled at 100 millisecond rate by default.)
8.定时器睡眠模式的时间设置
CC2530的定时睡眠模式配备了24位硬件定时器(睡眠定时器),其驱动源为32.768KHz
的晶振。
电源管理使用睡眠定时器来检测已流逝的时间值并在到达终了时间后唤醒MCU。
0xFFFF7F / 32768 Hz = 511.996 seconds
睡眠定时器有24位的计数器和24位的比较器。
CC2530的睡眠定时器能够在睡眠时间累计达到512秒后追踪网络时间。
(CC2530 sleep timer is capable of keeping track network time during sleep for up to 512 se conds )因此最长的睡眠时间为510s.操作系统应用层使用16位的定时器结构。
因此,操作系统应用层(OSAL)在以1ms为最小定时单位的基础上,其最长定时时间为65秒。
睡眠定时器的比较值可以使用下方的方程进行设置,其中timeout指的是下一个OSAL/MAC 定时器的终了时间,该时间以320us为单位,ticks是指当前的睡眠定时器的计数值。
ticks += (timeout * 671) / 64 ;
32 kHz ticks1 对于 320 us ticks2 的比率为 32768/3125 = 10.48576
(ticks2=10.48576*ticks1)。
这个值非常接近 671/64 = 10.484375. 当睡眠定时器的计数值到达设定的比较值时,产生中断并唤醒MCU. 在睡眠中醒来后,以ms为单位流逝的时间值为:
ticks*1000/32768 or: ticks * 125 / 4096。
9.处理未使用的IO口,避免频繁进入中断和过多的功耗。