微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > 路由器 低功耗设置

路由器 低功耗设置

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

TI大神:

        小弟在测试PM2低功耗模式下,预想的是 每5s中,向外发送一次广播信息。广播信息后,保持1s的监听时间,然后再转入允许休眠的时间。周而复始的进行,使其能够降低功耗。

        实现思路:创建两个事件,一个是广播发送事件,另一个是允许进入低功耗事件。在上电入网或者建立网络后,触发广播任务。广播发送事件的周期为持续工作事件,记为T1,允许进入低功耗的周期的事件为休眠时间,记为T2,那么,整个工作周期就为T1+T2。

       代码流程如下:

 if ( event &  START_EVT )
 {
   //发送广播信息 ...
   osal_pwrmgr_device( PWRMGR_ALWAYS_ON );
   osal_pwrmgr_task_state(sapi_TaskID,PWRMGR_HOLD);
  
//确保在接下来的时间内,接收机是打开的

     #define MAC_RECEIVE_ON 1
     #define MAC_RECEIVE_OFF 0
     uint8 value = MAC_RECEIVE_ON; 
     MAC_MlmeSetReq(MAC_RX_ON_WHEN_IDLE,&value);

   osal_start_timerEx(sapi_TaskID,SLEEP_EVT,1000);         //等待1s,在这1s内,接收机始终处于开启状态。

   return event ^ START_EVT;
 }

  if ( event & SLEEP_EVT )
  {    
    osal_pwrmgr_device( PWRMGR_BATTERY );      
    osal_pwrmgr_task_state(sapi_TaskID,PWRMGR_CONSERVE);
    
    osal_start_timerEx( sapi_TaskID,START_EVT,4000);    //允许进入休眠,4s后再次发送广播周期
    
    return event ^ SLEEP_EVT;
  }
   以下的修改,在halSleep函数中。

      1  在进入MAC层休眠之前,需要手动关闭MAC层接收机,相关代码为

           uint8 value = MAC_RECEIVE_OFF;
          MAC_MlmeSetReq(MAC_RX_ON_WHEN_IDLE,&value);

     2.. 在针对路由器的低功耗中,终端的MAC休眠模式不能使用,应该改为使用MAC_PwrOffReq(MAC_PWR_SLEEP_LITE),轻度休眠模式。

  

     只要经过上述这两点的修改,路由器模式下,也是可以进入低功耗的。至于在广播数据后,等待接收数据的时间与整个广播周期的比例,则取决于你应用场景所需要的休眠占空比。

    如上面的框架代码:发送广播数据后1s内,保持接收机唤醒状态。1s后,允许当前任务进入低功耗,之后OSAL完成自己的事件处理,随机进入低功耗,在4s的时间内,会发生几次进入低功耗的情况,这是正常的。4s后,设备再次发送广播信息,周而复始重复上述操作。

    采用上述的做法,可以使路由器节省一定的功耗(协调器在建立网络后,也是可以这样来实现的)。

   

    上述是小弟在基于OSAL低功耗实现方面的摸索出来的一点心得体会,贡献出来,请大家点评,共同提高。

   

      

      

谢谢分享!

在实际应用中,路由一般是有线供电的,所以不太需要休眠。

另外路由负责转发数据,并且不知道需要转发的数据什么时候会过来。

大神您好!求让终端进入休眠的资料!我按照网上说的设置POWER_SAVING,最终LED灯闪烁的非常快,怎么控制这个时间呢?而且我的节点进入不了深度睡眠,求大神指点啊!

/* HAL_SLEEP_PM2 is entered only if the timeout is zero and

* the device is a stimulated device.
*/
halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER;

/* DEEP sleep can only be entered when zgPollRate == 0.
* This is to eliminate any possibility of entering PM3 between
* two network timers.
*/

zgPollRate=0,当系统的timeout为0的时候,就会进入PM3

无私奉献,这个很有用,谢谢

那中断 进入PM2 模式需要怎么配置   

1.开启POWER_SAVING 预编译

2.f8wConfig_cfg 中的RFD_RCVC_ALWAYS_ON=FALSE

3.f8wConfig_cfg中四个DPoll_RATE设为0

4.ZGlobals.c中三个PollRate设为0

5.Onboard.c文件中,OnboardKeyIntEnable=HAL_KEY_INTERUPT_ENABLE

6.hal_drivers.c中if(!Hal_KeyIntEnable)中的语句关掉

7.osal_pwrmgr_init(void)中pwrmgr_attribute.pwrmgr_device=PWRMGR_BATTERY

我按照这个来配置     我在连上网络的地方  调用Halsleep(4000);     然后在睡眠中断里  改变LED1  LED2 的状态    运行的时候   却是没5S LED 状态更换一次    5s是因为周期点播 周期是5s          是不是我哪里配置错了

MAC_MlmeSetReq     可以关闭网络接收机

MAC_PwrOffRwq        可以关闭mac和radio

我的目的是终端pa,在pm2模式下降低功耗,现在是0.3ma。我不知道这是什么概念,是否正常。

但我的目标是再小10倍,否则电池还是不够久。

我的想法是休眠期间关闭pa是否就能省电了呢?(因为同样的工程下载到非pa里面,电流也就1ua多点)差了100多倍。这想法是否正确呢?

我看hal_sleep里面睡眠都执行了MAC_PwrOffRwq (deep),这里有关闭pa吗?MAC_MlmeSetReq     能关闭什么呢?有什么区别呢?一些mac的看不到了。

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

网站地图

Top