微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > 射频无线通信设计 > 如何实现ZigBee休眠与唤醒

如何实现ZigBee休眠与唤醒

时间:10-02 整理:3721RD 点击:

CC2530有3种睡眠模式,pm2模式比较省功耗而且可以被定时唤醒;pm3模式最省电但是只能被外部中断唤醒

1、sensordemo的sensor在入网以后,为什么灯在不断地闪?
其实,闪一次就是睡眠了一次:亮的时候睡过来,灭的时候睡下去。具体代码在halSleep函数里。要做的,就是读懂这个机制是怎么运作的。

2、为什么闪的频率那么高?
zstack的睡眠机制就是在操作系统没事干的时候才睡眠,频率高说明应用程序让操作系统不断做事。你想让它长时间睡眠,那要做的就是不要不断地给操作系统事情做,找到分配系统任务的地方。

要设置低功耗模式,先确认

1.f8wConfig.cfg文件中DRFD_RCVC_ALWAYS_ON定义为FALSE

2.Options->C/C++Compiler->Defined symbols中添加预编译POWER_SAVING

重要函数void halSleep( uint16 osal_timeout )

1.首先将osal_timeout转成以320US为单位

2.获取下一次MAC定时器到期时间

3. halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER;

//PM2PM3模式。 没有任务要执行就进入PM3深度睡眠,否则进入PM2睡眠,可以定时器唤醒。

4.唤醒

OSAL机制的ZigBee低功耗管理(CC2530)

涉及文件

OSAL_PwrMgr.h OSAL电源管理的API头文件

OSAL_PwrMgr.C OSAL电源管理的API C文件

hal_sleep.c 底层的电源管理文件

电源管理结构体

typedef struct

{

uint16 pwrmgr_task_state; //任务状态

uint16 pwrmgr_next_timeout; //下一次超时

uint16 accumulated_sleep_time; //睡眠时间

uint8 pwrmgr_device; //电源管理设备属性,有PWRMGR_ALWAYS_ON PWRMGR_BATTERY两种

} pwrmgr_attribute_t;

#define PWRMGR_ALWAYS_ON 0

#define PWRMGR_BATTERY 1

选择PWRMGR_ALWAYS_ON的话将不会进入睡眠模式,选择PWRMGR_BATTERY将允许HAL管理CPU进入SLEEP LITE或者SLEEP DEEP状态。

#define PWRMGR_CONSERVE 0

#define PWRMGR_HOLD 1

低功耗标志,主要用于osal_pwrmgr_task_state()这个函数中,用于标志每一任务是否需要低功耗。

extern pwrmgr_attribute_t pwrmgr_attribute

定义一个电源管理的全局变量。

/*********************************************************************

* @brief 初始化电源管理函数,这个函数在OSAL.C里面的osal_init_system( )调用,

也就是在OSAL系统初始化的时候将电源管理模式调成了不会进入睡眠模式的状态。

*/

void osal_pwrmgr_init( void )

{

pwrmgr_attribute.pwrmgr_device = PWRMGR_ALWAYS_ON; //默认没有睡眠模式

pwrmgr_attribute.pwrmgr_task_state = 0; //清零

}

OSAL系统在检查完所有的任务事件之后发现没有事件需要处理,这样在POWER_SAVING宏定义打开的情况下将调用osal_pwrmgr_powerconserve();函数,在这函数中将会根据选择系统进入休眠。

退出休眠

当出现IO中断或者复位时候会退出休眠,或者在休眠定时器中断时候也将会退出休眠。如果是IO中断或者休眠定时器中断退出之后将回到进入休眠的地方继续向下执行,复位退出的话进入程序的初部分执行。

路由节点能休眠么

TI的zigbee路由器不支持睡眠功能,只有终端节点支持。

这个应该主要看芯片采用什么协议的吧。我查了资料,如下:
---------------------
对于电源管理能力,Wireless HART、DigiMesh 和 WaveMesh 都能支持全部节点包括路由
节点在内都能进行休眠,相比较之下WaveMesh 的休眠技术比较灵活。ZigBee 和 Z-Wave
只能支持部分节点休眠:ZigBee的终端设备可以休眠;Z-Wave网络中传感器类设备可以休眠。
对点对多点系统的评估参考了Wi-Fi和Bluetooth网络的电池的续航能力。
----------------------
然后呢,我手上是一块昂宇的zigbee芯片,不知道版主知不知道昂宇的支持路由节点休眠不

我没用过昂宇的zigbee芯片,其实这个和什么芯片没很大关系,主要还是看你采用的哪家zigbee协议栈。你可以问下卖你芯片的采用的是哪家的协议栈。

哦?你用过啊,我用的是z-stack的

我目前用的是ZSTACK

不管是TI的z-stack还是Atmel的协议,都应该要支持低功耗模式。

嗯,有些协议栈支持路由和协调器和终端都低功耗,有些就终端低功耗,有些是路由和终端低功耗,不过目前看了下绝大多数厂家的模块仅仅终端低功耗

协调器和路由是不可以低功耗的,虽然可以让他们休眠。

其实低功耗会出很多问题,尤其是有连续的数据传输时很容易导致数据丢失

我用的是 halSleep(10000);放在了 GenericApp_ProcessEvent函数中,可以实现睡眠 但是有个问题是,睡眠唤醒一段时间就不好使了,我测试的时候差不多10分钟就会出问题,不能发数据了,为什么呢?

这个没遇到过,不太清楚。其实你根据TI的配置方法就可以实现低功耗,如果功耗还是很高就要考虑你硬件问题了

版主威武 收藏了!

时间会自己计算啊

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top