2. 低功耗基础
TinyML 推理任务部署在电池供电设备上时,功耗设计不再是“能跑就行”的附属问题,而是决定产品能否落地、续航是否达标的核心约束。本章从电池供电场景出发,建立完整的功耗分析框架:先厘清功耗模型与能量预算的关系,再区分峰值功耗与平均功耗对硬件选型和软件调度的不同影响,最后深入待机与活跃模式的切换策略。理解这些基础概念,是后续章节中优化推理算子、调整时钟频率、设计唤醒机制的前提。
2.1 功耗模型:从器件到系统的分层拆解
电池供电设备的功耗模型不是单一数值,而是由多个物理来源叠加而成的系统级行为。在 TinyML 场景中,我们通常将总功耗拆解为四部分:计算功耗(MCU/CPU 执行推理指令)、存储功耗(Flash 读取模型权重、SRAM 保存中间特征图)、传感功耗(麦克风、加速度计、摄像头等数据采集)、通信功耗(BLE/Wi-Fi 传输推理结果)。这四部分并非简单相加,而是存在时间上的重叠与竞争。
以典型的关键词唤醒系统为例:设备持续监听麦克风,音频前端(模拟放大 + ADC)以 16kHz 采样率工作,功耗约 1.2mA;MCU 以 48MHz 运行神经网络推理,每次推理耗时 80ms,平均电流 6.8mA;推理完成后通过 BLE 发送 4 字节结果,发射电流 8.5mA,持续 2ms。若系统每 500ms 进行一次推理,则各部分功耗占比为:传感 42%、计算 38%、通信 15%、待机漏电 5%。这个比例说明,优化功耗不能只盯着 MCU 的算力效率,还要关注传感器常开带来的基础开销。
建立功耗模型的核心步骤是绘制功耗时间线(Power Timeline)。将设备的一个完整工作周期(如“采集→推理→传输→休眠”)按时间轴展开,标注每个阶段的电流值和持续时间。这张时间线图是后续所有优化决策的基础:它告诉你哪一段占据的能量最多、哪一段的峰值电流最高、哪一段存在优化空间。
| 功耗来源 | 典型电流范围 | 时间占比 | 优化手段 |
|---|---|---|---|
| 传感器采集 | 0.5 - 3 mA | 常开或周期开启 | 降低采样率、增加休眠、使用低功耗模式 |
| MCU 推理计算 | 2 - 15 mA | 短时突发(ms级) | 量化、剪枝、降低时钟频率 |
| 无线通信 | 5 - 20 mA | 极短(μs-ms级) | 减少发包次数、合并数据、使用低功耗协议 |
| 待机漏电 | 1 - 50 μA | 长期(秒-小时级) | 深度睡眠、关闭外设电源、使用 PMIC 控制 |
2.2 能量预算:从电池容量到续航目标的逆向推导
能量预算是功耗设计的“天花板”。它回答一个核心问题:在给定电池容量和续航目标下,平均功耗必须控制在什么范围内?计算方式并不复杂:电池总能量(mWh)除以目标续航时间(小时),得到平均功耗上限(mW)。例如,一颗 3.7V、2000mAh 的锂电池,总能量为 7400mWh。若产品目标续航为 30 天(720 小时),则平均功耗上限为 10.3mW,折合平均电流约 2.8mA。
这个数字立刻揭示了设计约束:如果传感器常开就需要 1.2mA,MCU 平均推理电流 0.8mA,通信平均 0.3mA,待机漏电 0.05mA,合计 2.35mA,勉强在预算内。但若增加一个 GPS 模块(平均 25mA),则续航将骤降至不足 5 天。因此,能量预算必须在项目启动时明确,并作为硬件选型和软件架构的硬约束。
实际操作中,建议采用“三级预算法”:第一级,根据电池容量和续航目标计算总平均电流上限;第二级,将总预算按功能模块分配(传感、计算、通信、待机各占多少);第三级,为每个模块设定峰值电流和持续时间上限。这样,当某个模块超出预算时,可以快速定位并调整。
实战案例:智能门磁传感器
某智能家居门磁设备使用 CR2032 纽扣电池(3V,220mAh,总能量 660mWh),目标续航 2 年(17520 小时)。计算得平均功耗上限为 0.038mW,即平均电流 12.6μA。设计时,将预算分配为:待机漏电 5μA(占 40%)、霍尔传感器周期检测 2μA(占 16%)、MCU 唤醒处理 3μA(占 24%)、BLE 通信 2.6μA(占 20%)。实际实现中,MCU 采用 RTC 定时唤醒,每 10 秒检测一次门磁状态,仅在状态变化时通过 BLE 发送通知。最终实测平均电流 11.2μA,满足 2 年续航目标。
2.3 峰值功耗与平均功耗:两种不同的设计约束
平均功耗决定续航,峰值功耗决定硬件能否安全工作。两者经常被混淆,但设计逻辑完全不同。平均功耗是能量消耗的积分结果,影响电池容量和散热设计;峰值功耗是瞬时最大电流,影响电池内阻压降、电源稳压器选型、PCB 走线宽度和去耦电容配置。
以 TinyML 推理为例:MCU 在启动神经网络加速器时,电流可能从待机的 5μA 瞬间跃升至 25mA,上升时间仅 10μs。如果电池内阻为 1Ω,则瞬间压降达 25mV,可能导致 MCU 复位或 ADC 参考电压漂移。更严重的是,若系统同时开启传感器和无线发射,峰值电流可能叠加至 40mA,超出电池的脉冲放电能力。
处理峰值功耗的常用策略包括:软启动(分步开启外设电源)、大容量去耦电容(在 PCB 上靠近 MCU 放置 10-100μF 电容)、峰值削峰(将推理计算与无线发射错开时间)。在软件层面,可以通过调整任务调度,避免多个高功耗外设同时工作。
风险提示:许多开发者只关注平均功耗而忽略峰值,导致设备在推理瞬间出现电压跌落、系统重启或数据损坏。务必在原型阶段使用示波器测量电源轨的瞬态响应,确认峰值电流和压降在安全范围内。
2.4 待机与活跃模式:功耗状态机的设计与切换
电池供电设备的功耗管理本质是一个状态机:在待机(Sleep)、活跃(Active)、以及中间的过渡态之间切换。待机模式的目标是将功耗降至最低,通常通过关闭外设时钟、进入 MCU 深度睡眠、断开传感器电源实现。活跃模式则根据任务需求,可能细分为“感知活跃”(仅传感器工作)、“计算活跃”(MCU 全速运行)、“通信活跃”(无线发射)等子状态。
关键设计原则是:尽可能缩短活跃时间,尽可能延长待机时间。但模式切换本身有代价——唤醒延迟和瞬态电流。例如,MCU 从深度睡眠唤醒需要 200μs,期间消耗 2mA 电流;若设备每 100ms 唤醒一次,则唤醒开销占总能量的 0.4%,可以接受。但若每 10ms 唤醒一次,唤醒开销占比升至 4%,就需要考虑是否值得。
在 TinyML 场景中,一个常见的优化是两级唤醒架构:第一级,超低功耗的传感器(如加速度计)持续监测物理量变化,功耗仅 2μA;第二级,当传感器检测到有效事件(如振动超过阈值),才唤醒 MCU 执行完整的神经网络推理。这种架构将平均功耗从“持续推理”的 2mA 降至“事件驱动”的 20μA,续航提升 100 倍。
// 待机-活跃模式切换伪代码示例
void system_loop() {
// 进入待机模式
enter_sleep_mode(SLEEP_2S);
// 由RTC或传感器中断唤醒
wakeup_reason = get_wakeup_source();
if (wakeup_reason == SENSOR_EVENT) {
// 活跃模式:执行推理
set_cpu_freq(48MHz);
enable_peripheral(PERIPH_ADC);
uint8_t* audio = capture_audio(16000, 32);
int result = run_tflite_inference(audio);
send_ble_packet(result);
}
// 清理并回到待机
disable_peripheral(PERIPH_ADC);
set_cpu_freq(32kHz);
enter_sleep_mode(SLEEP_2S);
}
2.5 常见误区与设计复盘
在低功耗设计实践中,以下误区最为常见:
- 误区一:只优化 MCU 计算功耗,忽略传感器和通信。实际上,在事件驱动的 TinyML 系统中,传感器常开功耗往往占总能耗的 40% 以上。
- 误区二:认为待机电流“足够小”就不需要优化。一个 10μA 的待机漏电看似微不足道,但在 2 年续航目标下,它消耗了 175mAh,占 CR2032 电池容量的 80%。
- 误区三:频繁切换模式反而增加能耗。每次唤醒都有瞬态电流和启动延迟,如果活跃时间太短,模式切换开销可能超过节省的能量。
- 误区四:忽略电池电压下降对功耗的影响。锂电池从 4.2V 降至 3.0V 时,相同负载下的电流会上升约 15%,导致续航估算偏差。
正确的设计流程应当是:先建立功耗时间线,识别能量热点;再根据能量预算分配各模块限额;然后针对峰值功耗做硬件验证;最后通过状态机优化待机与活跃的切换策略。每一步都需要用实测数据验证,而不是仅凭数据手册估算。
经验总结:低功耗设计不是“做完再优化”,而是从需求定义阶段就建立功耗模型。建议在项目启动时制作一张功耗预算表,列出所有功能模块的电流、时间、频率,并每周更新实测数据。当续航目标无法达成时,这张表能帮助你快速定位瓶颈——是传感器采样率太高,还是推理算法过于复杂,或是通信次数过于频繁。