电池供电设备的续航不是靠某一个技巧凑出来的,而是一开始就按功耗预算倒推出来的。先把平均电流的目标定下来,再往回拆每个环节能花多少,这是唯一可控的路径。
功耗的四个来源
运行电流:MCU 跑代码、外设工作时的电流。主频和供电电压越高电流越大。同一任务用高主频跑完再休眠往往比低主频慢慢跑更省电——这就是后面说的占空比思维。
休眠电流:内核停止但部分电路仍工作时的电流。这是决定续航的关键量,因为设备 99% 的时间都在休眠。
外设静态电流:传感器、无线模块、LDO 在”不工作”时也在耗电。很多传感器有关断模式,功耗能降一两个数量级;没有的只能靠外部 MOSFET 切断供电。LDO 静态电流在不同型号间差异很大,是选型重点指标之一。
漏电:PCB 漏电、电容漏电流、引脚漏电流、电池自放电。休眠电流压到微安量级时这些本来可忽略的项变得显著,板子受潮或助焊剂残留都会让漏电上升。
各级休眠模式
不同芯片的命名和细节差异很大,下面按行为特征分类(具体以所用芯片手册为准):
浅睡眠(Sleep):CPU 停止,时钟继续跑,外设仍可工作,RAM 和寄存器全部保持。唤醒最快,无需重新初始化时钟。电流量级在毫安到几百微安,适合等待中断的短时空闲。
深睡眠(Stop / Deep Sleep):主时钟关闭,大部分外设停止,RAM 保持(保持多少因芯片而异,有的需要额外保持电源)。唤醒后要重新配置时钟和部分外设,但程序从休眠指令之后继续跑,状态连续。电流量级在几十微安到几微安。
待机 / 关机(Standby / Shutdown):内核电源关闭,RAM 丢失,只有 RTC 域或备份域的少量寄存器保持。唤醒等同复位,程序从头开始,需要用保持寄存器区分冷启动和唤醒启动。电流量级在几微安到亚微安。
选择的关键判断是:唤醒后需要多少状态。如果需要保留运行中的变量、连接状态、滤波器状态,就只能选保留 RAM 的模式;如果每次唤醒都是”采样一次、发一次、再睡”,那待机模式就够了,把跨唤醒的少量状态放进保持寄存器或 flash。
一个常见的设计是双模式:短间隔的周期性任务用浅睡,长时间无任务时进待机。
唤醒源
常见唤醒源及其代价:
- 外部引脚:按键、传感器中断输出。最省电,几乎不增加休眠电流。休眠期间需保持引脚配置并设好触发边沿
- RTC 闹钟:定时唤醒。RTC 在低功耗域独立运行,代价是 RTC 本身的电流,量级通常在微安以下
- 看门狗:部分芯片支持用低功耗看门狗唤醒,用于周期性自检
- 串口接收:需要保持接收电路工作,代价较高,且低波特率下时钟精度会影响接收
- 比较器 / ADC 阈值:模拟量超过阈值唤醒,省掉 CPU 轮询
唤醒时间也是成本。深睡唤醒要等时钟稳定和 PLL 锁定,这期间电流接近运行电流。唤醒过于频繁时,唤醒开销会超过休眠省下的电,因此存在一个最优唤醒周期。
时钟门控与引脚状态
时钟门控:不用的外设要关时钟。复位后默认开启的外设时钟往往不少,逐个关掉能省可观电流,GPIO 端口时钟同理。
引脚状态是最容易漏掉的一项:
悬空的输入引脚会漏电。CMOS 输入处于中间电平时,上下管可能同时部分导通,形成电源到地的直流通路,电流可达几十微安量级——足以毁掉整个低功耗设计。不用的引脚要么配成带上/下拉的输入,要么配成输出并固定电平,不要浮空。
输出引脚的负载。驱动 LED、上拉电阻的引脚在休眠时若保持高电平,电流会持续流走。休眠前设为高阻或输出低,取决于电路拓扑。
I2C 总线的上拉电阻。如果总线上挂了外部上拉,休眠时若某一侧引脚把线拉低,电流就一直流。进入休眠前确认总线处于空闲(两根线都为高)。
调试接口。SWD/JTAG 引脚在休眠时可能维持内部上拉,某些芯片需在软件里禁用调试接口才能进入最低功耗。禁用后要留一个恢复手段,否则芯片可能无法再烧录。
占空比思维
假设一个采集上报流程:
唤醒 + 初始化 5 ms @ 10 mA
传感器采样 20 ms @ 5 mA
无线发送 100 ms @ 80 mA
休眠 60 s @ 5 µA
平均电流可以按占空比算:
运行部分能耗 = 5×10 + 20×5 + 100×80 = 50 + 100 + 8000 = 8150 mA·ms
周期总时长 = 60000 + 125 = 60125 ms
平均电流 ≈ 8150/60125 + 0.005 ≈ 0.1355 + 0.005 ≈ 0.14 mA
可以看到无线发送那 100 ms 占了运行能耗的绝大部分。优化优先级是:先压无线发送的时间和电流,再压传感器,最后才是休眠电流。反过来做是常见的错误方向——把休眠电流从 5 µA 优化到 2 µA,只省了 0.003 mA,而把发送时间从 100 ms 压到 50 ms 能省 0.067 mA。
短时高速 vs 长时低速:同样计算量,用高主频快速跑完再休眠,通常比用低主频慢慢跑省电——静态电流在整个运行期间都在消耗,缩短运行时间直接减少静态能耗。前提是高主频不会显著抬高动态功耗、唤醒开销可摊薄。
发送前的准备要算进去。连接建立、握手、DNS 解析往往比真正的数据传输耗电得多。把多次采样攒成一批发送,摊薄单次连接开销,是省电最有效的手段之一。
电池寿命估算
基本公式:
寿命(小时) = 电池容量(mAh) / 平均电流(mA)
接上例,假设用一节标称容量在 1000 mAh 量级的电池,平均电流 0.14 mA,理论寿命约 7000 小时,不到一年。
但实际寿命要打折,几个必须考虑的因素:
- 自放电:一次电池年自放电率几个百分点,可充电电池更高
- 放电曲线:电压降到截止电压即停止,标称容量不是全部可用
- 温度:低温下可用容量显著下降,高温加速老化
- 脉冲能力:发送瞬间电流可能上百毫安,内阻压降会触发欠压复位。需要在电池侧放足够大的去耦电容,并确认电池的脉冲放电能力
- 设计余量:通常只按标称容量的七八成计算
工程上通常按平均电流算出理论值再乘 0.6~0.8 的系数,作为可承诺的寿命。
实测手段
万用表串接:最简单,但只能看到平均电流,动态范围不够——休眠时几微安、发送时上百毫安,普通表的电流档在两者间切换时会有压降(burden voltage),可能把设备压到欠压复位。
采样电阻 + 示波器:在电源回路里串一个小阻值精密电阻(比如 1 Ω 或 10 Ω),用示波器测压降换算电流。能看到完整的电流波形,是定位”哪一段耗电”的主要手段。缺点是示波器的动态范围有限,微安级信号噪声大。
专用功耗分析仪:覆盖纳安到安培的动态范围,自动换量程且 burden voltage 低,还能对电流积分算能耗。
测量时要注意几个陷阱:
- 不要让调试器供电。调试器会提供额外电流路径,测出的数值没有意义。断开调试器,用电池或外部电源供电测量
- 测量点要在电池侧,不要测稳压器之后,否则漏掉了 LDO 的静态电流和转换损耗
- 串口日志会改变功耗行为,特别是波特率低时发送耗时长。测量前关掉日志,或者把日志改到不影响测量的通道
实测流程建议:先测纯休眠电流确认达标,再逐个加入唤醒、采样、发送,看每步增量是否符合预算,这样能在问题出现的当下定位到具体环节。
评论(1)
这篇的含金量比我上个月买的课高。
请 登录 后参与评论。