怎样把LoRa终端功耗降到极致
一. 引言
能耗对于电池供电的产品来说是一个重大的问题,一旦电能耗尽设备将“罢工”,在某些场合电能意味着电子产品的生命。物联网时代将会有越来越多电池供电的设备通过无线通信连接,降低能耗再次摆在工程师的桌面上—解决它。
锐米LoRa终端(简称终端)RNDU470T(http://www.rimelink.com/pd.jsp?id=2)不但具备空旷环境传输5km的超长距离优势,还将休眠能耗降低到极致(0.4uA,带RTC为1.4uA)。我们是怎么做到的呢?接下来,一步一步解密。
二. 硬件设计
1. 选用低功耗器件
终端MCU选用STM8L151C8T6,它属于超低功耗,不带RTC休眠为400nA,带RTC下休眠为1.4uA。该MCU拥有较大的RAM(4KB)和自带EEPROM(2KB),不用扩展外部存储设备,进行一步降低功耗和成本。
终端射频芯片选用SX1278,在休眠模式下,该芯片功耗低至忽略不计。
2. 尽可能快地让射频模块休眠
SX1278属于LoRa TM扩频调制技术,它的远距离优势得益于调制增益,不是靠增大发射功率(那将消耗更多电能)。该射频芯片的电流消耗如下:休眠<0.2uA,空闲=1.6mA,接收=12mA,发射(最大功率)=120mA.
终端MCU通过“中断+定时器超时”方式控制SX1278,一旦射频完成发送或接收,立即进入休眠模式。
3. 了解MCU的工作模式与功耗
降低MCU的功耗首先尽可能少地开启外设,其次尽可能地让其休眠。我们一起看看STM8L151C8T6不同工作模式下功耗。更多信息请链接
http://blog.csdn.net/jiangjunjie_2005/article/details/47700597
模式 | 等待 | 低功耗运行 | 低功耗等待 | 主动停止 | 停止 | |
入口 | WFI | WFE | 软件代码 | 软件代码+WFE | HALT | HALT |
晶振 | 开 | 开 | LSI或LSE | LSI或LSE | LSI或LSE | 关 |
CPU | 关 | 关 | 开 | 关 | 关 | 关 |
外设 | 开 | 开 | 开 | 开 | 关,仅RTC开 | 关 |
唤醒 | 所有内部和外部中断,复位 | 所有内部和外部中断,复位,唤醒事件 | 软件代码,复位 | 内部和外部事件,复位 | 外部中断,RTC中断,复位 | 外部中断,复位 |
电压调节器 | MVR | MVR | ULP | ULP | CLK_ICKCR | ULP |
程序执行区 | FLASH | FLASH | RAM | RAM | FLASH | FLASH |
FLASH+E2 | 开 | 开 | 关 | 关 | 关 | 关 |
中断 | 允许 | 允许 | 禁止 | 禁止 | 允许 | 允许 |
中断服务后 返回状态 | AL=0:mainAL=1:WFI | WFE | / | / | AL=0:mainAL=1主动停止 | AL=0:mainAL=1:停止 |
事件处理后 返回状态 | / | Main | / | 低功耗运行 | / | / |
RAM+寄存器 | 保留 | 保留 | 保留 | 保留 | 保留 | 保留 |
@3V/25℃ | 5.9uA | 5.4uA | 3.3uA | 1.4uA | 0.4uA | |
特殊事项 | / | / | 禁止ADC | / | 清除外设悬挂中断标志位 |
上述低功耗运行模式对于开发者来说有点多,尤其刚接触STM8L处理器。我们需要一般性的指导原则,下表2是来源于实践的经验。
节能要求 | 应用场合 | 睡眠时长 | 唤醒方式 | 恢复时长 | 运行模式 |
苛刻 | CPU空闲,等待外部信号唤醒 | 长 | 外部中断 | ≥2.8us | HALT |
苛刻 | CPU空闲,等待时钟周期唤醒 | 长 | RTC周期 | ≥2.8us | Active-halt |
严格 | CPU有持续、微负荷任务运行 | / | / | ≥2.8us | 低功耗运行 |
严格 | CPU短暂等待中断发生 | 短 | 任意中断 | 短 | 等待中断 |
严格 | CPU短暂等待事件发生 | 短 | 注册事件 | 短 | 等待事件 |
需要 | CPU有持续、轻负荷任务运行 | / | / | / | 调整主频 |
4. 静态配置MCU引脚
即使MCU和RF都进入休眠模式,如果没有设置好MCU引脚,它们照样会“偷偷”地消耗电能。以STM8L151C8T6为例,它一共有48个引脚,首先需要用Excel对其进行分类,如下例所示:
序号 |
引脚 |
功能 |
上电初始化 |
进入低功耗 |
1 |
PA0 |
仿真口 |
Output push-pull, high level, 2MHz |
/ |
3 |
PA2 |
NC |
Output push-pull, low level, 2MHz |
/ |
5 |
PA4 |
CON1 |
Output push-pull, high level, 2MHz |
Input pull-up |
6 |
PA5 |
CON2 |
Input floating, external interrupt |
/ |
9 |
GND |
/ |
/ |
/ |
一般说来可以将引脚分成5类,可以借鉴“地铁颜色区别”方法,设计如下图例:
图例 |
特性 |
低功耗配置模式 |
MCU输入:输入,浮动 |
Input floating, no external interrupt |
|
MCU输出:输入,上拉 |
Input pull-up, no external interrupt |
|
3.3V引脚:输出,上拉,高电平 |
Output push-pull, high level, 2MHz |
|
未接引脚:输出,上拉,低电平 |
Output push-pull, low level,2MHz |
|
MCU电源与地引脚 |
/ |
三. 软件设计
1. 动态切换MCU引脚
有2类MCU引脚:MCU输出和MCU输入,它们需要动态进行配置。具体地说,在进入低功耗模式时,将其分别配置成:输入上拉和输入悬浮;在退出低功耗模式时,将其配置成定义的功能状态。在动态切换时需要考虑2点:
首先,动态切换引脚是需要时间的,以STM8L151C8T6为例,动态切换5个引脚需要477us,可见它一般用于休眠这种较长周期的节能模式,不适合空闲停止这种短暂节能模式。
其次,在实际开发中引脚的连接是变化的,换句话说,今天这个引脚是空闲,下次产品升级该引脚可能设计成特定功能。为减少软件维护成本,需要设计一种优秀的数据结构,它能描述MCU所有引脚,如果引脚功能改变,只需要修改数据定义,而不需要修改程序。
2. 一旦无事可干,MCU立即停止或休眠
在LoRa终端系统中MCU是能源的持续消耗者,软件设计需要考虑尽可能快地让MCU节能,STM8L151C8T6有如下2种节能模式。
短暂等待:如等待RF发送数据帧完毕,MCU执行WFI指令,一旦RF完成发送,中断将MCU唤醒继续运行;
长期等待:如等待下一次主动上报数据帧,MCU执行HALT指令,当指定时间到达时,RTC中断将MCU唤醒继续运行。
3. 采用高效率算法
软件算法效率越高,MCU计算时间更少,可以更快进入低功耗,也就更节能。在终端设计中有2个算法比较消耗时间:
CRC16:无线传输易受干扰,一般通信帧需要添加CRC16检测正确性,我们采用查表的方法减少CRC16的计算时间。下载源代码请链接:
http://www.rimelink.com/nd.jsp?id=33&_np=105_315
计算空中传输时间:该时间对于组网算法十分重要,它包含较多的浮点运算。所幸的是,大部分数据帧长度是固定的,可以提前计算好;对于变化长度的数据帧,可以采用“命中算法”来提高效率,即保存本次长度与时间的值,如果下次长度相同直接返回该时间值。下载源代码请链接:
http://www.rimelink.com/nd.jsp?id=33&_np=105_315
4. Contiki操作系统下进程低功耗设计
终端支持TDMA算法,内嵌多种无线通信健壮性技术,智能解决:通信碰撞、微弱信号、外界干扰、断网继连等挑战。这样一来,必然带来软件复杂度。
使用成熟稳定的已有软件库是人们解决软件复杂度的有效方法,因此,我们引入高效强大的Contiki物联网操作系统。
下载Contiki请链接:http://www.rimelink.com/nd.jsp?id=31&_np=105_315
这样一来,终端系统低功耗设计需要兼顾:MCU运行模式、外设中断、ContikiOS和进程。
上图展示了系统低功耗设计的时序逻辑。我们看到一个基本的思想:当所有的进程“同意休眠”,空闲时ContikiOS执行HALT命令使MCU进入休眠状态;当RTC或EXT中断唤醒MCU时,对应的进程处理该逻辑,完成后“同意休眠”。
这种设计保证了系统只有一个HALT入口,同时复杂的逻辑交给不同的进程处理,降低了设计的复杂度。
为检测是否“所有进程同意休眠”,我们设计了如下图的数据结构:
数据AgrHalt的位宽与进程数目绑定,因此使用typedef定义该数据类型。
当AgrHalt==0时,说明“所有进程同意休眠”,一旦ContikiOS进入空闲状态,它将调用HALT()命令,使MCU进入Active-HALT状态;
当AgrHalt != 0时,说明“某进程还有活要干”,此时ContikiOS进入空闲状态后,它调用WFI()命令,使MCU进入WFI状态。
5. TDMA通信算法
纵然把单个终端的功耗降到极致,在实际组网运行中该终端的功耗未必是低的,这个叫组网动态运行功耗。组网动态运行功耗依赖于无线通信协议,试想,如果终端需要争抢信道和重传数据帧,那就意味着需要N倍的电能才能完成一次通信,节能将成为空中楼阁。
锐米LoRa终端一开始就把低功耗性能作为重要设计目标,因此我们抛弃了简单但是耗能的CSMA算法,而选用TDMA算法。根据大量的实测,我们坚信这是符合LoRa特性的。实际上,当网络负荷达到中载(带宽利用率超过50%)时,CSMA的效率大减且耗能增大,因为大量的终端通信冲突,不得不延时重传。
TDMA的原理如下图所示:N个终端将一段时间分成N个时隙(Slot),每个终端在自己分配的时隙与网关通信。没有争抢,没有碰撞,节能效果自然非凡。
了解TDMA算法请链接:http://www.rimelink.com/nd.jsp?id=36&_np=105_315
您的留言或需求: