ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

物联网低功耗设计:别让休眠电流骗了你,从原理图到实测全解析

物联网低功耗设计:别让休眠电流骗了你,从原理图到实测全解析 刚拿到一块模组开发板的时候我估计大多数人和我一样第一件事就是翻规格书找休眠电流。看到几个微安的指标心里还挺美这板子装电池能用大半年。等到真正做完整机带着蜂窝模组、传感器、指示灯一起跑起来实测电流直接给我看愣了——待机状态愣是下不来最后找了一圈问题居然出在一颗上拉电阻上。功耗这事儿从来不是模组一颗芯片的事而是整块板子、整条供电链路、甚至整个网络环境的事。先说清楚我下面聊的是硬件模组也就是通信模组、MCU模组这一挂不是游戏Mod那种模组完全是两类东西。这篇东西就是写给刚入门做物联网设备、电池供电设备的工程师和动手党看的我会尽量把规格书参数、原理图设计、实测方法和软件配置串起来讲让你少走我当初走的弯路。如果你手里正好是移远RG255C-CN这类蜂窝模组或者ESP32-C3这种低功耗MCU模组那这篇尤其对胃口。1. 先搞懂规格书里的功耗参数别被休眠电流骗了1.1 规格书里那几行字每个参数背后站着不同场景第一次看模组规格书的人基本都会盯着一句Sleep Current: xxx μA心花怒放。但等你看完整个功耗表就会发现条目其实不止一个。常见的有这么几类参数含义典型数量级蜂窝模组发射电流射频发射瞬间的电流随发射功率变化几百mA到1A以上接收/连接态电流保持网络连接时的电流几十mA到一百多mA待机电流空闲待机等待网络寻呼几mA到十几mAPSM/休眠电流模组深度休眠射频基本关闭几十μA甚至更低这个表格看着简单但新手常犯的错是拿发射电流和休眠电流直接比较然后得出这个模组很省电的结论。实际上一个水表一天只通信三次每次1秒钟真正决定电池续航的是休眠电流和唤醒周期而一个共享单车锁可能要频繁监听服务器指令待机电流才是大头。规格书的每个参数都对应着完全不同的业务场景先搞清楚自己产品属于哪种模式再去看对应参数别一上来就把最小电流当成全场景答案。1.2 静态参数和实测差十倍不是模组虚标是你忽略了系统很多朋友第一次用电源串联万用表测整板电流会发现比规格书标称值高出一个数量级第一反应是模组坑我。实际上规格书测的是模组单独工作、理想供电、天线匹配良好、GPIO全部悬空或按推荐配置时的数据。而你的板子上有传感器、有LDO、有上拉电阻这些都会在休眠时继续耗电。更隐蔽的是规格书不会告诉你当网络信号差的时候发射电流会自动抬高重传机制会让射频模块频繁进入高功耗状态。你在室内办公桌上测试的功耗和用户在偏远地区弱信号环境下测试的功耗可能差好几倍。所以规格书参数只能作为理论下限真正的系统功耗必须靠实测得出这也是为什么我后面专门用一个章节来讲测试环境搭建。2. 原理图上那些看不见的耗电口外设、电压与网络的隐形开销2.1 外设供电与GPIO上拉休眠时还在偷偷耗电的元凶这是我最想提醒新手的一点。很多开发板的参考原理图会把传感器、Flash、LED统统接到模组的同一个3.3V电源轨上GPIO再用上拉电阻接到VDD。系统休眠时你以为耗电的只有模组实际上一颗LED的限流电阻、一颗传感器的静态电流、几十个GPIO上拉电阻全都在从电池里抽血。说个具体计算。一颗10kΩ上拉电阻接到3.3V如果引脚在休眠时处于低电平那么流过这颗电阻的电流就是3.3V/10k≈330μA。单看一颗好像没啥。但电池容量如果是200mAh的纽扣电池这颗电阻就把待机时间干掉了约6%左右。如果板子上有8颗这样的上拉那就是接近一半的待机功耗没了。所以画原理图时凡是上拉到电源轨的电阻都得逐个问一句这个引脚休眠时是什么电平能不能改成软件内部上拉能不能直接下拉2.2 电压转换选型LDO和DC-DC的静态电流经常比模组休眠电流还高另一个新手完全不会注意的坑是电源芯片自己的静态电流。很多老款LDO静态电流动不动就是几百μA甚至几mA。你以为模组进了PSM只有50μA结果整个板子还是2mA利润全被LDO吃了。选型建议很简单如果系统经常处于休眠状态优先选静态电流在微安级别甚至几百纳安的低功耗LDO比如专门标了IQ的型号或者选支持PFM模式、轻载自动降频的DC-DC。DC-DC的好处是转换效率高尤其在电池电压和模组工作电压差得比较多的时候。但要注意DC-DC的纹波不能太大射频发射瞬间电流高达数百mA供电轨如果被拉出过大的纹波模组很可能会随机重启、掉线那可比耗电麻烦多了。实践上在模组电源入口放一组100μF钽电容加0.1μF陶瓷电容做储能能有效缓解射频发射瞬间的电压跌落。2.3 天线匹配和网络搜网射频行为才是功耗天花板退一步说就算你把整板外围设备都关干净了模组自身的射频功耗还是会受环境影响。天线匹配不好反射功率会被射频前端当成热量损耗掉模组为了维持同等通信质量必然要抬升发射功率信号差时蜂窝模组会自动加大发射功率到最高级别耗电立刻上去了。这也是很多人测到同样一个模组功耗忽高忽低的原因——它不是坏了是它正在适应你所在位置的无线环境。另外模组上电后的搜网、注册、附着过程会产生一串很密集的高电流脉冲。如果产品放在地库、电梯这类信号差的地方搜网失败后反复重试峰值电流会反复出现对电池消耗极大。硬件上尽量把天线设计好软件上则要尽量避免频繁开关机——每次开机重新附着网络可能比持续待机5分钟还费电。3. 功耗实测环境搭建从串联电阻到冬季雪夜/夏季雨夜工况3.1 工具选择万用表、示波器、功耗分析仪各有各的死角先回答一个最常见的问题测功耗到底用什么工具我自己的工具架上三样东西各有用途。数字万用表电流档是最容易上手的但也是最能骗人的。它内置的采样率很低对上百毫秒的脉冲电流响应很迟钝测出来的只是一个被平均过的假值。比如一个每125ms出现一次、持续10ms、50mA的脉冲万用表测出来可能只有5μA看着特别美好实际上平均功耗远不止这个数。示波器加电流探头才是看瞬态功耗的正确姿势。电流探头能捕捉到微秒级的脉冲你能看到模组搜网、发射、休眠的完整电流波形。缺点是一支像样的电流探头不便宜而且直流精度普遍不如专门的功耗分析仪。功耗分析仪是最省事的直接连到电源与被测板之间软件里就能看实时电流曲线、算平均功耗、统计峰值和累计电量。缺点是贵。如果你的预算有限入门方案可以用串联采样电阻示波器来代替在供电回路里串一个低阻值电阻用示波器测电阻两端电压再换算成电流。3.2 采样电阻阻值怎么定压降、带宽与温漂的三角权衡串联采样电阻这个方法听着简单但阻值选不好测试结果说服力不足甚至会把板子搞复位。阻值太大的后果是射频发射瞬间电流能达到几百毫安甚至一安培流过电阻时会产生不小的压降。比如模组峰值电流1A串联100mΩ电阻压降就是100mV。如果电池电压只有3.6V模组工作电压被拉到3.5V以下可能直接触发欠压保护或重启。阻值太小的后果是信号太弱示波器看起来噪点很大无法准确读数。我的习惯是先查模组规格书里的峰值电流用峰值电流乘以阻值小于50mV这个粗略标准来选。低功耗测试一般用10mΩ到100mΩ射频测试最好用10mΩ甚至更小。另外要注意选低温漂的合金电阻普通贴片电阻温度一上去阻值漂移测出来的电流也就不准了。3.3 工况模拟冬季雪夜与夏季雨夜到底在模拟什么热搜词里有一句功耗测试冬季雪夜夏季雨夜工况这听起来像气象预报其实说的是产品认证和研发阶段必须做的环境功耗测试。原理很简单电池是化学器件温度对它影响非常大。冬季雪夜意味着低温可能是零下二十度甚至更低锂电池内阻会明显变大放电能力变差同一套系统在常温下能跑一个月低温下可能一周就趴窝。夏季雨夜则是高温高湿电池自放电加快模组的射频效率也会变差。做这类测试你需要一台可编程温度箱把被测设备放在里面再从箱外引电源线和数据线。测试手法通常是在-40℃、-20℃、0℃、25℃、55℃几个温度点分别浸泡一段时间让设备温度与环境平衡再跑一轮完整的业务周期记录电流曲线和整机电压跌落情况。我之前碰到过一个问题设备在室温下待机电流只有20μA放到-20℃后电池内阻变大导致模组发射瞬间电压被拉到欠压阈值以下设备反复重启待机功耗反而变成了正常时的几十倍。这种问题不看冬季雪夜工况根本发现不了。3.4 数据记录与平均功耗计算用积分算别用眼睛算拿到电流波形以后很多新手会盯着峰值看半天然后问我这个峰值有500mA是不是太夸张了。峰值功耗当然要关注因为它决定了电池和电源的瞬间输出能力但决定电池续航的是平均功耗是把一段时间内的电流对时间做积分再除以时间。这里有一个坑数字万用表的平均值功能和积分平均完全是两码事。万用表只对它的采样点求算术平均采样点之间如果刚好漏掉了脉冲结果就偏得离谱。靠谱做法是用示波器长时间采集一段稳定业务周期的电流波形或者让功耗分析仪记录电量值再把电量除以时间得到平均电流。如果你手头只有示波器可以把波形分段分别算出每个阶段的电流和时间再按时间加权平均精度够用。4. 软件侧的省电三板斧睡眠模式、省电特性与任务编排4.1 睡眠模式怎么选Modem Sleep、Light Sleep、Deep Sleep分别是给谁用的硬件外设清干净之后剩下就看软件怎么调度模组状态了。不同模组的睡眠分级不太一样但思路相通。对ESP32-C3这类MCU模组来说常见的是Modem Sleep、Light Sleep和Deep Sleep三档。Modem Sleep只是关闭WiFi/蓝牙的射频部分CPU还在跑适合需要快速响应、又要省一点电的场景Light Sleep把CPU也停了靠定时器或GPIO唤醒电流能降到几百微安级别适合周期性采样的传感器节点Deep Sleep则是把大部分RAM电源都关了只留极少数唤醒源电流能到个位数微安代价是唤醒后从头初始化速度慢。选哪档本质上是唤醒延迟和功耗预算之间的交换。对于移远RG255C-CN这类蜂窝模组事情更复杂一点因为它还要跟基站维持一个看不见的协议关系。模组从连接态进入空闲态再进入PSM每一步都需要网络侧配合。很多新手在MCU上习惯了随便睡睡醒醒到了蜂窝模组上还是频繁开关机这就是功耗爆炸的根源。4.2 蜂窝模组的两大神器PSM与eDRX配置了不代表生效蜂窝模组省电核心就是两个特性PSM省电模式和eDRX扩展非连续接收。PSM的逻辑可以这样理解模组跟基站协商好我接下来要睡很久你不用频繁找我等我主动醒来再联系你。进入PSM后模组大部分射频功能关闭电流可以降到几十微安甚至更低。代价是服务器想主动下发数据模组是收不到的只能等它自己醒来后去服务器拉取。所以PSM适合数据上报为主、下行指令可以从容等待的场景比如电表、水表、环境传感器。eDRX则是折中方案模组在空闲态时不监听每个寻呼周期而是只听约好了的那几个特定时间点的寻呼。这样待机电流比普通空闲态低一到两个数量级同时服务器还能在可接受的延迟内唤醒它。适合共享单车、定位器这类需要随时可能被找但延迟几十秒也能忍的设备。这里必须强调一个坑PSM和eDRX不是模组端配置完就万事大吉的。它们需要核心网侧开启相应功能运营商套餐和APN参数也得支持。你拿模组在实验室私网或普通测试卡上测可能根本看不到预期的低电流。正确做法是先用AT指令查模组协商结果确认模组确实进入了PSM/eDRX状态再测功耗否则你优化半天都是白用功。4.3 任务编排把业务集中起来别让设备频繁翻身这是所有低功耗设计里成本最低、收益最明显的一条却最容易被忽略。很多设备的业务是这样的每小时上报一次数据每次上报前要等传感器预热要开GPS定位要连服务器要同步时钟可能还要检查有没有固件升级。如果这些动作在每小时里分散进行等于设备每隔几分钟就被唤醒一次每次唤醒都要付出大电流脉冲的代价。正确做法是把所有任务排到一个时间窗口里传感器预热-数据采集-模组开机-建链上报-接收下行指令-同步时钟-立即休眠。整个窗口可能只有几秒钟其余时间都待在深睡里。拿ESP32-C3做一个极简示例下面是典型的低功耗主循环骨架// 伪代码: 传感器节点低功耗主循环 void setup() { init_sensor_power(false); // 先关传感器电源 init_wakeup_timer(60s); // 定时60秒唤醒 } void loop() { sensor_power_on(); // 1. 给传感器供电 delay(100); // 预热 read_sensor_data(); // 2. 采集 sensor_power_off(); // 立刻断电 radio_start(); // 3. 打开模组射频 connect_and_upload(); // 4. 上报 收下行 radio_sleep(); // 5. 关射频进Light/Deep Sleep esp_deep_sleep_start(); // 进入休眠 }这个流程看着简单但很多人会贪图方便在采集完数据后不关闭传感器电源或者把模组的射频一直开着等下一个上报周期结果就是待机电流比理论值高出几个数量级。代码里的每一次关都要在原理图上有对应的电源控制开关和GPIO配置软件和硬件必须对得上账。5. 排查实例明明休眠了电流还是下不来5.1 案例一GPIO上拉电阻引发的幽灵电流这是我自己的真实经历。一块采用蜂窝模组的板子整板待机电流8mA模组单独测只有30μA。我把板子翻了个底朝天最后只好一路一路去断开外设的电源测试发现UART_RX引脚被硬件上拉到VDD。模组休眠时这个引脚恰好被内部下拉到低电平10kΩ上拉电阻就变成了一个从VDD到地的通路持续耗电约0.33mA。为什么总电流看起来有8mA而不是0.33mA因为板子上还有LDO静态电流、另一颗传感器、以及一颗误没关闭的LED。修复方法很简单把该引脚改成软件内部上拉或者修改休眠前的GPIO状态把引脚置为高电平上拉电阻两端就没压差了。但复盘时我发现这类问题最大的难点不是修复而是定位。它藏在原理图里不会报错你翻规格书永远查不到。排查这类问题我的经验是给板子的每个电源域加测试点用万用表或示波器逐一断开测试先找到总电流的量级再逐步缩小包围圈。5.2 案例二万用表测功耗峰值被平均掉另一个高频翻车现场是这样的软件同学自信地说休眠电流已经做到4μA了我用示波器一挂发现每一段时间就冒出一个50mA、持续约10ms的尖峰。万用表把这个尖峰摊平了显示的4μA实际上是假平均真实平均功耗算下来比4μA高了一个数量级。那段时间尖峰哪来的是一颗传感器在定时做内部测量它的待机电流规格书上写得非常小但每125ms会醒来一次做自检这个自检脉冲没被万用表采样到。处理办法有两个要么在传感器休眠期间用MOS管切断它的电源要么把它的自检周期拉长或者直接禁掉。这里最值得记住的教训是低功耗排查波形优先级永远高于数字。看到电流已经很低了这种结论先问一句这个数是用什么工具测的。5.3 案例三DC-DC空载静态电流比模组休眠电流还高还有一种情况外设和GPIO都没问题模组也确实进入了休眠但整板电流就是下不来。我遇到过一次整板待机2mA怎么优化都没用最后翻DC-DC的数据手册才发现那颗老片子空载静态电流有1.8mA。模组再怎么睡1.8mA已经躺在那儿了。解决方式要么换成静态电流低至几微安的低功耗LDO要么换支持PFM模式、轻载自动切到低频工作的DC-DC。这里顺带提醒一句低功耗产品选电源芯片不能只看最大输出电流一定要看轻载效率曲线和静态电流参数。很多大电流电源芯片在山寨开发板上用得风生水起放进电池设备里就是待机功耗的灾难。排了三类问题方法论是通的分电源域、逐级断电、看波形、别看数字。等你能做到模组说睡了整板电流就真的跟着掉下来基本就算摸到低功耗设计的门槛了。有条件的话我建议你把每次修改的电流曲线截图存档软件改一版就测一版这习惯能帮你省下大量回头排查的时间。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进