3、LoRaWAN设备状态机:深度睡眠模式、待机模式、发送模式、接收模式(RX1/RX2)、各状态电流实测数据
做LoRaWAN设备功耗估算,说白了就是跟设备的状态机打交道。
你想想看,一个节点不可能一直干活。它大部分时间在睡觉,偶尔醒来发个数据,再竖着耳朵听一下有没有回复。就这么几个状态,但每个状态的电流差异巨大——从微安级到几十毫安,跨度能差四个数量级。
我刚开始做低功耗项目时,就犯过一个低级错误:只盯着发送电流看,忽略了待机电流的累积效应。结果呢?电池寿命估算直接翻车。嗯,今天咱们就把这几个状态掰开揉碎了讲清楚。
3.1 深度睡眠模式
这是节点最常待的状态,也是省电的关键。
深度睡眠模式下,MCU内核停止运行,大部分外设时钟被关闭,只有RTC(实时时钟)和少量唤醒逻辑还在工作。LoRa射频芯片同样进入Sleep模式,寄存器内容保持,但收发电路全部断电。
典型电流范围: 1.2 µA ~ 3.5 µA(视具体芯片和配置而定)
我实测过的数据: 使用STM32L0系列 + SX1276,深度睡眠实测 1.8 µA。如果开启RTC闹钟唤醒,会额外增加约 0.5 µA。
个人经验: 很多开发者忽略了一个细节——GPIO的上下拉配置。如果某个引脚在睡眠时处于浮空状态,漏电流可能轻松吃掉几个微安。我习惯在进入深度睡眠前,把所有未使用的GPIO都配置成模拟输入模式,或者输出低电平。这个小动作,能帮你省下 1~2 µA。
3.2 待机模式
待机模式,也有人叫它空闲模式或IDLE模式。
这个状态下,MCU内核时钟还在跑,但CPU暂停执行指令。外设如SPI、I2C、定时器等可以继续工作。LoRa芯片通常处于Standby或FSK模式,等待进一步指令。
为什么要用待机模式?因为从深度睡眠唤醒需要时间,大概 1~3 ms。如果你需要频繁响应事件,每次都从深度睡眠爬起来,延迟受不了。待机模式唤醒只需几微秒,适合做快速轮询。
| 参数 | 典型值 | 备注 |
|---|---|---|
| MCU待机电流 | 50 µA ~ 200 µA | 取决于外设时钟开启数量 |
| LoRa芯片待机电流 | 1.6 mA ~ 2.0 mA | SX1276在Standby模式 |
| 整体待机电流 | 1.7 mA ~ 2.2 mA | MCU + LoRa + 传感器 |
注意: 待机模式虽然响应快,但电流比深度睡眠高了三个数量级。我见过有人把节点设计成一直待在待机模式,结果电池一个月就耗光了。记住:待机模式只适合短时间停留,比如发送前预热、接收窗口前的短暂等待。
3.3 发送模式
发送模式是功耗的「峰值时刻」。
LoRaWAN节点发送数据时,射频功放全功率工作。电流大小取决于发射功率和射频芯片型号。以SX1276为例,+20 dBm(100 mW)发射时,电流峰值可达 120 mA ~ 130 mA。
但要注意,这个电流不是持续的。一次典型的LoRaWAN发送,空中时间(Time on Air)通常在 50 ms ~ 500 ms 之间,取决于扩频因子和带宽配置。
实测数据(SX1276 + STM32L0):
- +20 dBm 发射:125 mA(峰值)
- +17 dBm 发射:90 mA(峰值)
- +14 dBm 发射:50 mA(峰值)
- +10 dBm 发射:30 mA(峰值)
为什么会差这么多?因为功放的效率不是线性的。低功率档位时,功放偏置电流占比更大,效率反而下降。我个人习惯:如果覆盖允许,尽量用 +14 dBm 或 +17 dBm,比 +20 dBm 省电不少,而且对射频法规更友好。
3.4 接收模式(RX1 / RX2)
发送完数据后,节点会打开接收窗口,等待服务器回复。
LoRaWAN标准定义了RX1和RX2两个接收窗口。RX1在发送结束后 1 秒打开,频率和扩频因子与上行相同。RX2在RX1结束后 1 秒打开,使用默认的 869.525 MHz(欧洲)或 923.3 MHz(北美),SF12。
接收模式下,LoRa芯片处于连续接收状态,电流相对稳定。
| 接收窗口 | 典型电流 | 持续时间 |
|---|---|---|
| RX1 | 11 mA ~ 13 mA | 通常 50 ms ~ 200 ms |
| RX2 | 11 mA ~ 13 mA | 通常 50 ms ~ 200 ms |
避坑指南: 我曾经遇到过一个奇怪的问题——节点发送后功耗居高不下。查了半天,发现是接收窗口超时后,LoRa芯片没有正确回到睡眠模式。后来在代码里加了超时强制复位射频芯片的逻辑,问题才解决。嗯,接收窗口的退出机制,一定要做容错处理。
3.5 各状态电流实测数据汇总
下面这张表,是我在多个项目中实测汇总的数据。芯片组合是 STM32L072 + SX1276,供电电压 3.3V,室温 25°C。
| 工作模式 | 电流(典型值) | 持续时间 | 备注 |
|---|---|---|---|
| 深度睡眠 | 1.8 µA | 占空比 > 99% | RTC唤醒,GPIO正确配置 |
| 待机模式 | 1.9 mA | 几毫秒 ~ 几十毫秒 | MCU运行,LoRa Standby |
| 发送模式(+20 dBm) | 125 mA | 100 ms ~ 500 ms | 取决于SF和BW |
| 发送模式(+14 dBm) | 50 mA | 100 ms ~ 500 ms | 推荐日常使用 |
| 接收模式(RX1/RX2) | 12 mA | 每个窗口 50 ms ~ 200 ms | 两个窗口共约 200 ms |
关键结论:
- 深度睡眠是续航的基石——它占了节点 99% 以上的时间
- 发送电流虽然高,但时间短,对总功耗贡献有限
- 待机模式是「隐形杀手」——如果代码写得不好,让节点长时间停在待机状态,功耗会直线上升
- 接收窗口的功耗不可忽视,尤其是RX2使用SF12时,接收时间可能长达 1 秒以上
好了,状态机这部分就讲到这里。下一节咱们会把这些电流数据代入实际场景,算一算一颗 CR2032 纽扣电池到底能撑多久。你想想看,如果深度睡眠做到 2 µA 以下,每天发 10 次数据,一年下来总耗电量是多少?嗯,到时候咱们用数据说话。