(配套源码、软件、开发板等资源,可移步博客同名QQ群:拿破仑940911)
之前在网上看过一些关于如何配置终端设备,使其进入低功耗模式的,但大多讲的比较复杂,最后也没有明确的结果可以看得到的功耗是否真的降下来了。所以,我决定亲自做一下实验,并且写一篇有图有真相的博客,与大家分享~
上一节主要是关于ZigBee设备的低功耗相关理论的讲解。
本节将讲述如何对终端设备进行低功耗配置,以及使用Monsoon公司的Power Monitor软件实时测量终端设备的功耗和估算电池寿命。
一、实验目的
本次实验的目的是配置Z-Stack协议栈,让ZigBee终端设备可以进入低功耗模式。并且通过精密的仪器,给出“普通模式”下和“低功耗模式”下确切的规功耗情况。
二、实验准备
1、硬件准备
(1)Power Monitor仪器一台,如下图所示:
(2)ZigBee协调器一个,如下图所示:
(3)ZigBee终端设备一个(用的是上次中等规模组网实验的ZigBee模块),如下图所示;
(4)SmartRF04EB下载器一个;
(5)USB线(供电线)一根;
2、软件准备
(1)EW8051 8.10.3;
(2)SmartRF Flash Programmer 1.12.8;
(3)Power Tool 4.0.4.12,软件界面如下:
三、代码修改
1、选取模板工程
选取网盘分享的各个版本的源代码中任意一个都可以,并以此为基础进行本次实验。
2、ZigBee终端设备(EndDevice)修改
(1)选择终端设备
既然我们是要对终端设备进行配置修改,那么肯定就是在IAR软件界面上的Workspace位置选择EndDeviceEB,如下图所示:
(2)开启低功耗模式
之前在网上看的教程中讲的是要配置很多参数,但后来实际仔细分析过代码后发现,很多网上提及需要配置的地方Z-Stack协议栈中都是默认配置好了的,实际真正关键的、需要我们修改的地方只有一处,如下图所示:
将预编译选项中原本的“xPOWER_SAVING”前面的“x”去掉,修改为“POWER_SAVING”。这样,编译下载之后,终端设备即可自动进入低功耗模式!
(3)编写功能代码
我们实际关心的应该是终端设备在ZigBee网络中的功耗表现。为了直观地体现出ZigBee终端设备的在网状态,我们编写代码实现终端设备入网成功后,以2s为周期向ZigBee协调器发送测试数据。ProjectApp.c文件和user_api.c文件中的关键代码分别如下:
uint16 ProjectApp_ProcessEvent( uint8 task_id, uint16 events ) { ...... if ( events & PROJECTAPP_SEND_MSG_EVT ) { ProjectApp_SendUnicast16(); return (events ^ PROJECTAPP_SEND_MSG_EVT);// return unprocessed events } ...... }void user_state_change( afIncomingMSGPacket_t *pkt ) { ...... if((devStates_t)(pkt->hdr.status) == DEV_END_DEVICE) { osal_start_reload_timer( ProjectApp_TaskID, PROJECTAPP_SEND_MSG_EVT, 2000); } ...... }3、ZigBee协调器修改
(1)选择ZigBee协调器
按照上面同样的方法,在IAR软件界面上的Workspace位置选择CoordinatorEB即可。
(2)编写功能代码
ZigBee协调器收到数据后,只要将收到的数据通过串口打印出来即可。ProjectApp.c文件中的关键代码如下:
static void ProjectApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) { switch ( pkt->clusterId ) { case PROJECTAPP_CLUSTERID: HalLedSet(HAL_LED_1,HAL_LED_MODE_TOGGLE); printf("%s",pkt->cmd.Data); break; } }
四、实验验证
1、ZigBee协调器
(1)烧写固件
可以选择直接用Flash Programmer烧写hex文件,或者是在IAR中编译成功后直接下载。
(2)连接至Power Monitor
将ZigBee协调器上的核心模块连接至Power Monitor,如下图所示:
(3)功耗测试
测得其功耗情况如下图所示:
可见图中交点处的电流为27.371mA。
(4)连接至电脑
将烧好程序的ZigBee协调器模块从Power Monitor上取下,并插回ZB502底板。通过串口转USB连接到电脑,在电脑端运行串口调试助手。复位之后,可见串口调试助手界面如下图所示:
2、ZigBee终端设备
(1)普通模式测试
a、烧写固件
针对于没有做过任何更改的终端设备的程序,可以选择直接用Flash Programmer烧写hex文件,或者是在IAR中编译成功后直接下载。
b、连接至Power Monitor
将ZigBee终端设备连接至Power Monitor,如下图所示:
c、功耗测试
测得其功耗情况如下图所示:
可见图中交点处的电流为 8.087mA。以及软件估算得出: 3.3V且300mAh的电池在当前这种功耗的情况下,使用寿命约为32.44小时。PS:有兴趣的朋友可以仔细分析上面这张图,里面包含了ZigBee终端设备入网的整个过程中的功耗情况!d、ZigBee协调器情况
此时,我们通过串口调试助手可以看到,终端设备正在不断地向协调器发送数据。如下图所示:
由此可见,终端设备目前在ZigBee网络处于正常工作状态。
(2)低功耗模式测试
a、烧写固件针对于开启了低功耗模式的终端设备的程序,可以选择直接用Flash Programmer烧写hex文件,或者是在IAR中编译成功后直接下载。b、连接至Power Monitor与前面相同。c、功耗测试测得其功耗情况如下图所示:可见图中交点处的电流为 0.011mA,即 11uA。以及软件估算得出: 3.3V且300mAh的电池在当前这种功耗的情况下,使用寿命约为142.93小时!果然,进入低功耗模式后,电池寿命会大幅增长!尽管如此,但和实际产品开发中的要求还是有一定差距的,需要进一步降低功耗!PS:有兴趣的朋友同样可以仔细分析上面这张图,里面包含了ZigBee终端设备入网的整个过程中的功耗情况!d、ZigBee协调器情况与ZigBee终端设备在普通模式下工作时,是完全一样的情况,此处就不再赘述~e、补充进一步测试:将OnBoard.c文件中的InitBoard()函数中的这行代码(在Z-Stack协议栈最原始的代码里,此处是用的HAL_KEY_INTERRUPT_DISABLE,后来实验中改为了HAL_KEY_INTERRUPT_ENABLE):HalKeyConfig(HAL_KEY_INTERRUPT_ENABLE, OnBoard_KeyCallback);修改成如下:HalKeyConfig(HAL_KEY_INTERRUPT_DISABLE, OnBoard_KeyCallback);再测得ZigBee终端设备的功耗如下:可见图中交点处的电流为 0.014mA,即 14uA。以及软件估算得出: 3.3V且300mAh的电池在当前这种功耗的情况下,使用寿命约为134.78小时。PS:感兴趣的朋友可以对比一下这张图与前一张图之间的区别。
(配套源码、软件、开发板等资源,可移步博客同名QQ群:拿破仑940911)