CC2530如何实现(1.1uA)低功耗?

​ZigBee网络低功耗运行一直是苦逼攻城狮们要解决的问题,TI的CC2530可以说已经把终端的休眠功耗降低到了极致,现在我们就来体验这颗芯片的魅力!文章末尾分享完整源码和PCB工程文件。

一、CC2530供电模式

CC2530芯片有五种运行模式,分别为主动模式、空闲模式、PM1、PM2和PM3。从参考手册上可以看到不同模式下的供电方式。

  1. 主动模式是完全功能的运行模式,CPU、外设和RF 收发器都是活动的。数字稳压器是开启的

  2. 空闲模式除了CPU内核停止运行外,其他和主动模式一样

  3. PM1模式稳压器的数字部分开启。32MHz XOSC和 16MHz RCOSC都不运行。32kHz RCOSC或 32kHz XOSC运行。复位、外部中断或睡眠定时器过期时系统将转到主动模式

  4. PM2模式稳压器的数字内核关闭。32MHz XOSC和 16MHz RCOSC都不运行。32kHz RCOSC或 32kHz XOSC运行。复位、外部中断或睡眠定时器过期时系统将转到主动模式

  5. PM3模式稳压器的数字内核关闭。所有的振荡器都不运行。复位或外部中断时系统将转到主动模式

 

二、CC2530模式选择

PM1、PM2、PM3是低功耗运行模式,CC2530通过关闭不必要的部分和调整系统时钟来达到低功耗的效果。

在PM1模式下,高频振荡器(32MHz XOSC和16MHz RCOSC)是掉电的。稳压器和使能的32kHz振荡器是开启的。当进入PM1模式,就运行一个掉电序列。由于PM1使用的上电/掉电序列较快,等待唤醒事件的预期时间相对较短(小于3ms),就使用PM1。

PM2具有较低的功耗。在PM2下的上电复位时刻,外部中断、所选的32 kHz 振荡器和睡眠定时器外设是活动的。I/O引脚保留在进入PM2之前设置的I/O模式和输出值。所有其它内部电路是掉电的。稳压器也是关闭的。当进入PM2模式,就运行一个掉电序列。当使用睡眠定时器作为唤醒事件,并结合外部中断时,一般就会进入PM2模式。相比较PM1,当睡眠时间超过3ms 时,一般选择PM2。比起使用PM1,使用较少的睡眠时间不会降低系统功耗。

PM3用于获得最低功耗的运行模式。在PM3模式下,稳压器供电的所有内部电路都关闭(基本上是所有的数字模块,除了中断探测和POR电平传感)。内部稳压器和所有振荡器也都关闭。PM3模式可被外部中断和复位唤醒。

PM2模式其功耗是毫安级别的,多用于需要定时唤醒的场合,比如周期性地唤醒传感器来进行数据的采集,PM2模式可被睡眠定时器,外部中断和复位唤醒。PM3模式功耗最低,是微安级别的,多用于数据收发不频繁的场合。Z-STACK提供了两种低功耗运行模式,PM2和PM3。

 

三、CC2530低功耗代码设置

  1. 准备一份CC2530官方示例代码(也可使用本文已经修改好的代码),并打开

  2. 添加预编译项POWER_SAVING

    ZigBee功耗主要是针对终端设备的,因此只需要修改终端设备代码即可,将IAR编译器的Workspace处选项改为EndDeviceEB,在项目名称上右键选择Options,如图添加预编译项POWER_SAVING来使能睡眠模式

  3. 修改f8wConfig.cfg文件

    将以下参数修改(在文件的最后)

    参数的作用代码中有注释,不过多解释了

    -DRFD_RCVC_ALWAYS_ON=FALSE    //default True-DPOLL_RATE=0   //default 1000-DQUEUED_POLL_RATE=0    //default 100-DRESPONSE_POLL_RATE=0  //default 100-DREJOIN_POLL_RATE=0    //default 440
  4. 修改OnBoard.c文件

    将函数InitBoard()改为如图所示

  5. 修改OSAL_PwrMgr.c文件

    将函数osal_pwrmgr_init()改为如图所示

    PWRMGR_BATTERY将允许HAL管理CPU进入SLEEP LITE或者SLEEP DEEP状态

  6. 周期性发送数据

    每间隔3秒发送一次数据

    void SampleApp_Send_P2P_Message( void ){    uint16 i = 0;    uint8 data[10] = {0};    uint16 father_short_addr = 0;    uint16 myself_short_addr = 0;    static uint8 count = 0;    father_short_addr = NLME_GetCoordShortAddr();    myself_short_addr = NLME_GetShortAddr();    data[0] = ( father_short_addr >> 8 ) & 0xff;    data[1] = father_short_addr & 0xff;    data[2] = ( myself_short_addr >> 8 ) & 0xff;    data[3] = myself_short_addr & 0xff;    data[4] = count;     count++;    if( AF_DataRequest( &SampleApp_P2P_DstAddr, &SampleApp_epDesc,                        SAMPLEAPP_P2P_CLUSTERID,                        5,                        data,                        &SampleApp_TransID,                        AF_DISCV_ROUTE,                        AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )    {      HAL_TURN_ON_LED1();      for (i=0; i<50400; i++) asm("NOP");      HAL_TURN_OFF_LED1();    }    else    {        // Error occurred in request to send.    }}

四、实验现象

    代码编译完成,通过CCDebugger将程序烧写到芯片里,打开协调器,然后给终端上电,协调器打印数据如下:

使用万用表测量,其休眠功耗为1.1uA

使用电化学工作站测量其发送数据功耗,可以看出基本在12-18mA左右。

好了,至此CC2530低功耗实现,需要源代码的可以在下方留言邮箱

 

关注微信公众号 小白技术栈 ,后台回复【CC2530】获取源代码和PCB工程文件,欢迎关注哦!

  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白技术栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值