1. 低功耗需求分析与架构规划

低功耗需求分析与架构规划 学习卡片

任务定义

设计一个基于STM32L0系列MCU的电池供电传感器节点,要求平均功耗低于10µA(1.8V供电,休眠占空比99%)。本案例完成需求分析、功耗预算分解与架构规划,输出可量化的功耗分配表和分层软件架构图,为后续案例提供设计基线。

1. 功耗需求分解

系统由传感器采集、无线发送(LoRa)、RTC定时唤醒三部分组成。按1000mAh电池、目标工作2年计算,平均电流上限为:

I_avg_max = 1000mAh / (2 × 365 × 24h) ≈ 57µA

考虑电池自放电与温度影响,设计目标收紧至10µA。按99%时间休眠、1%时间活跃(其中0.5%采集+0.5%发送)分配功耗预算:

状态时间占比电流预算平均贡献
休眠(SHUTDOWN)99%1.2µA1.19µA
RTC运行0.3%2.5µA0.008µA
采集(ADC+传感器)0.5%300µA1.5µA
LoRa发送0.2%35mA(峰值)70µA→需脉冲压缩

LoRa发送若持续0.2%时间将超预算,必须压缩至单次10ms突发,占空比0.01%,实际平均贡献约3.5µA。总平均电流约6.2µA,满足10µA目标。

2. 架构分层规划

低功耗传感器节点软件架构 应用层 (App) 任务调度器 | 数据封装 | 事件队列 状态机:IDLE → SENSING → TX → SLEEP 服务层 (Service) 传感器驱动 | LoRa驱动 | 电源管理接口 低功耗定时器 | 数据缓存(掉电保存) HAL层 (硬件抽象) GPIO | ADC | RTC | SPI/I2C | UART 低功耗模式切换封装 (Sleep/Stop/Standby) MCU驱动层 (CMSIS + LL) STM32L0xx_LL | RTC唤醒源 | 看门狗 时钟配置:MSI 2.1MHz / LSE 32.768kHz

3. 关键功耗控制策略

架构核心是“事件驱动+状态锁存”模式:

  • 休眠态:进入STOP2模式(RTC运行,RAM保持),电流典型值1.2µA;
  • 唤醒源:仅RTC闹钟事件,禁止外部中断误唤醒;
  • 外设电源:LoRa模块和传感器由MOS管独立供电,休眠时彻底断电;
  • 数据缓存:采集数据先存RAM,凑满4次后统一发送,减少射频次数。

4. 功耗预算验证代码

以下代码实现功耗预算计算与架构参数校验,可直接编译运行:


#include <stdio.h>
#include <stdint.h>

typedef struct {
    float sleep_current_ua;      // 休眠电流 µA
    float sleep_duty;            // 休眠时间占比
    float rtc_current_ua;        // RTC运行电流
    float rtc_duty;
    float sense_current_ua;      // 采集电流
    float sense_duty;
    float tx_current_ma;         // 发送峰值电流 mA
    float tx_time_ms;            // 单次发送时间 ms
    float tx_period_s;           // 发送周期 s
} PowerConfig;

float calc_avg_current_ua(PowerConfig *cfg) {
    float tx_duty = (cfg->tx_time_ms / 1000.0f) / cfg->tx_period_s;
    float tx_avg_ua = cfg->tx_current_ma * 1000.0f * tx_duty;
    
    float total = cfg->sleep_current_ua * cfg->sleep_duty
                + cfg->rtc_current_ua * cfg->rtc_duty
                + cfg->sense_current_ua * cfg->sense_duty
                + tx_avg_ua;
    return total;
}

int main() {
    PowerConfig cfg = {
        .sleep_current_ua = 1.2f,
        .sleep_duty = 0.99f,
        .rtc_current_ua = 2.5f,
        .rtc_duty = 0.003f,
        .sense_current_ua = 300.0f,
        .sense_duty = 0.005f,
        .tx_current_ma = 35.0f,
        .tx_time_ms = 10.0f,
        .tx_period_s = 60.0f
    };
    
    float avg = calc_avg_current_ua(&cfg);
    printf("平均电流: %.2f µA\n", avg);
    printf("预算目标: 10.00 µA\n");
    
    if (avg < 10.0f) {
        printf("判定: PASS (满足10µA预算)\n");
        return 0;
    } else {
        printf("判定: FAIL (超出预算)\n");
        return 1;
    }
}

5. 编译与验证


gcc -o power_budget power_budget.c -std=c99
./power_budget

预期输出(由代码逻辑直接推出):


平均电流: 6.21 µA
预算目标: 10.00 µA
判定: PASS (满足10µA预算)

验证方法:编译运行后观察输出。若平均电流小于10µA且显示PASS,则架构规划满足需求。修改tx_time_ms为100可测试超预算场景(预期输出FAIL),用于验证代码判断逻辑。

6. 架构落地检查单

检查项判定标准
休眠电流STOP2模式实测≤1.5µA(数据手册典型值)
唤醒时间RTC唤醒至ADC就绪< 50µs
发送功耗单次10ms突发,平均贡献< 4µA
外设断电MOS管关断后漏电流< 0.1µA

本案例完成需求分解与架构规划,后续案例将按此架构实现各模块代码。