怎样把LoRa模块功耗降到极致

news/2024/12/21 21:08:53/

                                怎样把LoRa模块功耗降到极致

一.   引言

能耗对于电池供电的产品来说是一个重大的问题,一旦电能耗尽设备将“罢工”,在某些场合电能意味着电子产品的生命。物联网时代将会有越来越多电池供电的设备通过无线通信连接,降低能耗再次摆在工程师的桌面上 ---- 解决它!

锐米 LoRaWAN 模块(简称模块) RNDU470LAS (http://www.rimelink.com/pd.jsp?id=22#_pp=2_306) 不但具备空旷环境传输 6km 以上的超长距离优势,还将休眠能耗降低到极致(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:main

AL=1:WFI

WFE

/

/

AL=0:main

AL=1主动停止

AL=0:main

AL=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操作系统下进程低功耗设计

终端支持 LoRaWAN 算法,内嵌多种无线通信健壮性技术,智能解决:通信碰撞、微弱信号、外界干扰、断网继连等挑战。这样一来,必然带来软件复杂度。

使用成熟稳定的已有软件库是人们解决软件复杂度的有效方法,因此,我们引入高效强大的Contiki物联网操作系统。

 这样一来,终端系统低功耗设计需要兼顾: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.   产品超低功耗实测

下图是锐米 LoRaWAN 节点休眠功耗的实测,请参考《ArduinoLoRa 休眠极限 1.4uA》  https://blog.csdn.net/jiangjunjie_2005/article/details/103685860

 


http://www.ppmy.cn/news/503404.html

相关文章

安卓系统耗电太快?针对wakelock(唤醒锁)的设置优化教程

导读: android为了确保应用程序的正确执行&#xff0c;提供了wakelock(唤醒锁)的api&#xff0c;wakelock是一种锁的机制&#xff0c;只要有应用拿着这个锁&#xff0c;系统就无法进入休眠&#xff0c;手机耗电的问题&#xff0c;其实大部分是这个锁正不正常的问题。 手机上应…

root后待机耗电,手机root后耗电

手机获取了root对手机耗电有影响? 手机获取ROOT权限后一般情况下都不会对手机耗电有影响&#xff0c;甚至将ROOT权限授予安全软件后&#xff0c;还可以一定程度上减少耗电量&#xff0c;增加手机待机时间。 手机获取ROOT权限的主要危害&#xff1a; 1.第三方的恶意软件可以利用…

待机唤醒实验

在系统或电源复位以后&#xff0c;微控制器处于 运行状态。运行状态下的 HCLK 为 CPU 提供时钟&#xff0c;内核执行程序代码。当 CPU 不需继续运行 时&#xff0c;可以利用多个低功耗模式来节省功耗&#xff0c;例如等待某个外部事件时。 STM32的3种低功耗模式&#xff1a; ①…

STM32L0系列单片机低功耗(STOP)使用+RTC唤醒+LPUART(DMA方式)唤醒+LPTIM唤醒

文章目录 STM32L0低功耗应用1.睡眠模式2.低功耗运行模式3.低功耗睡眠模式4.带RTC的停止模式5.不带RTC的停止模式6.带RTC待机模式7.不带RTC待机模式 进入STOP模式LPUART在DMA模式下唤醒STOP STM32L0低功耗应用 STM32L0支持7种低功耗模式&#xff0c;本文重点讨论停止(STOP)模式…

在 iPhone 上使用 “抬起唤醒”功能

今天给大家带来的是如何在 iPhone 上使用 “抬起唤醒”功能&#xff0c;还不知道如何操作的朋友&#xff0c;可以按照这个方法试试哦。 抬起激活 “提起激活”的优势在于&#xff0c;您只需拿起iPhone并查看屏幕即可。这很有用&#xff0c;例如&#xff0c;如果您想查看现在几…

[STM32F1]STM32 低功耗待机模式与RTC周期唤醒

STM32等类似Cortex-M3的MCU在系统或电源复位以后&#xff0c;MCU就会处于程序运行状态。当用户不需继续运行程序时&#xff0c;可以利用进入低功耗模式来节省电池电量&#xff0c;当需要重新运行时&#xff0c;可以通过特定条件进行唤醒程序继续或重新工作。特别是在电池供电的…

STM8L101+si4463低功耗和自动唤醒配置

刚开始接触RF通信&#xff0c;借助成都亿佰特的demo很快完成了数据互传&#xff0c;但是功耗一直降不下去&#xff0c;ST和SiliconLabs官方的datasheet里分别说STM8L101在halt模式功耗为1uA&#xff08;开AWU的情况下&#xff09;、SI4463在standby模式为50nA&#xff0c;但是即…

STM32CUBEMX 待机模式最简单的RTC定时唤醒(低功耗电池产品必备)

文章意义&#xff1a; 看到很多技术帖子讲述RTC定时唤醒功能的时候&#xff0c;老是需要去读取当前时间&#xff0c;再设定下一个闹钟唤醒时间&#xff0c;无形中多了很多变量和操作。所以我决定分享一种简单的RTC定时唤醒方法&#xff0c;适合于不需要实现具体时间获取的场合…