低功耗设计原理:为什么续航看的是"平均电流"
你做了个电池供电的小设备,测工作时才耗 80mA,一节 2000mAh 电池算下来该撑 25 小时。结果装上去两三天就没电——反过来别人的传感器节点,一节纽扣电池能跑一年。差在哪?不在那 80mA,而在你没让它睡觉。低功耗设计的全部功夫,都绕着一个数打转:平均电流。
续航看的是平均电流,不是峰值
先把最要命的一句撂这儿:电池能撑多久,等于容量除以平均电流,跟你工作时那个峰值电流几乎没关系。
续航时间 ≈ 电池容量(mAh) / 平均电流(mA)
关键就在"平均"两个字。你测的 80mA 是设备满负荷干活那一瞬间的电流——但电池设备绝大多数时间根本不该干活。它更像守夜人:偶尔醒来看一眼、干点活、倒头继续睡。真正决定续航的,是把醒着的大电流和睡着的小电流按时间摊平后的平均值。
举个实数。设备每分钟醒 1 秒采集上报(80mA),其余 59 秒深睡只耗 10μA(0.01mA),平均电流是:
(80mA × 1s + 0.01mA × 59s) / 60s ≈ 1.34mA
同样电池,续航从"一直 80mA"的 25 小时,变成 2000 / 1.34 ≈ 1493 小时,约 62 天。占空比再压狠点——每 5 分钟醒 1 秒——平均电流压到 0.28mA,续航直奔一年。看清楚了吗?峰值一点没变,改变续航的是"醒着的时间占多大比例"。所以低功耗的第一性原理就是:想尽办法让平均电流小,核心手段就是睡觉。 想深挖续航怎么算、放电曲线和电池衰减,看 电池续航估算。
睡眠与唤醒:干活时干活,剩下全睡死
于是低功耗设备的节奏就成了固定套路:大部分时间深睡到微安级,需要时才醒来爆发式干活,干完立刻睡回去。 醒着那点时间就是占空比里的"占空",你要做的是把它压到极小。要分清两种睡眠深度,差别巨大:
- 浅睡(light sleep):CPU 停了、时钟大部分关了,但内存(RAM)和外设状态都保住,中断、定时器、串口来数据都能立刻唤醒,醒来后程序从睡的那一行接着往下跑,上下文全在。代价是省得不够狠,还得供着 RAM。适合"睡一小会儿、随时快速响应"。
- 深睡(deep sleep):几乎全芯片断电,只留一小块超低功耗的 RTC 域(实时时钟域)盯着唤醒源。省到微安级,但代价是——RAM 里的东西基本全丢,醒来等于重新开机,从
app_main重头跑。只有 RTC 域里那块特殊内存(RTC memory)能跨深睡保住少量数据。
那断电后谁来叫醒它?靠 RTC 域里还醒着的唤醒源:定时器(睡够多少秒自己醒)、引脚电平(某个脚被拉高/拉低就醒)。ESP32-S3 的引脚唤醒用 ext1(指定一组 RTC 引脚、按"任一为高"或"全部为低"触发)——这也是 S3 和老 ESP32 的区别:S3 只有 ext1,没有老款只能配单脚的 ext0,多脚唤醒直接用 ext1。完整实战代码、RTC memory 用法、唤醒源配置都在 L3 深度睡眠实战 里跑过。
ESP32-S3 的三档功耗:心里得有本账
要设计低功耗,得先知道芯片各档大概耗多少才能算平均电流。ESP32-S3 大致分三档(具体值随主频、外设开关、供电电压浮动,以模组 datasheet 为准):
| 状态 | 量级 | 谁还醒着 | 唤醒方式 |
|---|---|---|---|
| Active(工作) | 几十~上百 mA | 全芯片,WiFi 发射时更是瞬间冲高到一两百 mA | —— |
| Light sleep(浅睡) | 数百 μA ~ 一两 mA | RAM 保持、外设状态保住 | 中断/定时器/串口,秒醒且续跑 |
| Deep sleep(深睡) | 约 10 μA 上下 | 只剩 RTC 域 | RTC 定时器 / ext1 引脚,醒来重启 |
看这张表就明白:Active 和 Deep sleep 差了四个数量级(mA 对 μA,差一万倍)。这就是占空比为何是命门——多醒一秒,都是拿一万倍的电流去烧电池。设计时先按这三档估出平均电流,能不能满足续航一算就知道。把它和整机功耗连起来算,看 功耗预算。
压平均电流的几招
思路只有一条:要么让睡的时间占比更高,要么让醒着时更省。 几招:
- 提高睡眠占空比:收益最大。能 5 分钟上报一次就别 1 分钟,间隔每翻一倍平均电流几乎减半。先问清业务多久要一次数据,别高频轮询。
- 该断电的外设全断:传感器、屏幕、LED、外部 flash,深睡前主动关掉或用一个 MOS 管切断供电。很多外设待机也要几 mA,比主控深睡还费电——它们醒着,你这 10μA 深睡就白做了。
- 降频:干活但不赶时间时,把 CPU 主频从 240MHz 降到 80MHz,动态功耗跟着降。
- 按需联网:WiFi 是全场最大的电老虎——连接、扫描、发射瞬间冲到一两百 mA。别让它常连挂机,而要攒够数据一次性连上、发完立刻断开进深睡。传小数据能用更省的 低功耗广域网络 就别硬上 WiFi。
几个偷电的坑
平均电流压不下去,八成是下面几处在漏电:
| 坑 | 现象 | 怎么避 |
|---|---|---|
| 外设一直供着电 | 主控深睡才 10μA,整机实测却几 mA | 深睡前切断传感器/屏幕供电;查每个外设的待机电流 |
| 上拉/下拉电阻常年耗电 | 每个上拉电阻默默地漏几十 μA,几个加起来盖过深睡电流 | 深睡时该悬空的引脚别留强上拉;必要的上拉挑大阻值(几十 kΩ 起) |
| WiFi 常连挂机 | 明明只偶尔传数据,续航却按小时算 | 改成按需连接、发完就断睡;别用需要保持长连接的心跳协议 |
| 只测了工作电流 | datasheet 算的续航和实测差十倍 | 一定要实测整机深睡电流(串个 μA 级电流表或用功耗分析仪),别只信芯片单项参数 |
低功耗第一坑是只盯主控功耗,忘了外设和上拉在偷电——主控深睡到 10μA,可传感器待机 2mA、几个上拉再漏几十 μA,整机平均电流就废了。设计完一定实测整机深睡态真实电流,datasheet 单项参数拼出来的续航和实际能差一个数量级。WiFi 更要按需用、发完就断。
一句话口诀
续航看平均电流不看峰值:容量除以平均电流就是能撑多久。压它靠一件事——多睡、睡死:大部分时间深睡到微安级(ESP32-S3 约 10μA,靠 RTC 定时器或 ext1 引脚唤醒),需要时才醒来爆发干活。四招:提高睡眠占空比、断闲置外设、降频、WiFi 按需连。收尾一定实测整机深睡电流,防外设和上拉偷电。
下一步
把平均电流换算成能撑多少天、放电曲线怎么看,去 电池续航估算。睡眠唤醒的完整实战代码和 ext1 配置,看 L3 深度睡眠实战。整机各模块功耗账怎么列,看 功耗预算。电源纹波和去耦怎么做干净,看 纹波与去耦。回 元器件原理总览 补齐其余电源基础。