2. 低功耗基础

TinyML 推理任务部署在电池供电设备上时,功耗设计不再是“能跑就行”的附属问题,而是决定产品能否落地、续航是否达标的核心约束。本章从电池供电场景出发,建立完整的功耗分析框架:先厘清功耗模型与能量预算的关系,再区分峰值功耗与平均功耗对硬件选型和软件调度的不同影响,最后深入待机与活跃模式的切换策略。理解这些基础概念,是后续章节中优化推理算子、调整时钟频率、设计唤醒机制的前提。

电池供电设备功耗模型总览 电池能量源 容量(mAh) × 电压(V) 能量预算 总能量 / 目标续航 功耗模型 P_total = P_active + P_idle + P_sleep + P_transition 峰值功耗 影响电源/电池选型 平均功耗 决定续航时间 待机模式 μA级 活跃模式 mA级 模式切换开销 唤醒延迟 / 瞬态电流

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%,导致续航估算偏差。

正确的设计流程应当是:先建立功耗时间线,识别能量热点;再根据能量预算分配各模块限额;然后针对峰值功耗做硬件验证;最后通过状态机优化待机与活跃的切换策略。每一步都需要用实测数据验证,而不是仅凭数据手册估算。

经验总结:低功耗设计不是“做完再优化”,而是从需求定义阶段就建立功耗模型。建议在项目启动时制作一张功耗预算表,列出所有功能模块的电流、时间、频率,并每周更新实测数据。当续航目标无法达成时,这张表能帮助你快速定位瓶颈——是传感器采样率太高,还是推理算法过于复杂,或是通信次数过于频繁。