第四章:传感器管理——选型、驱动与策略

传感器管理这块,我做了这么多年贴片项目,说实话,踩过的坑比走过的路还多。传感器选不好,后面所有优化都是白搭。今天咱们就聊聊,怎么把传感器这块的功耗压到最低。

4.1 传感器选型:功耗、精度与响应时间的三角博弈

选传感器,说白了就是做取舍。功耗低、精度高、响应快——这三样你不可能全都要。我个人的习惯是,先定功耗预算,再看精度,最后才考虑响应时间。

参数 低功耗优先 高精度优先 快速响应优先
典型功耗 < 1 μA 10-100 μA 100 μA - 1 mA
采样率 1-10 Hz 10-100 Hz > 1 kHz
启动时间 可接受 10-100 ms 1-10 ms < 1 ms
适用场景 连续监测、长期贴片 诊断级测量 事件检测、报警

我在项目中遇到过一件事:选了一款号称 0.5 μA 的加速度计,结果发现它的启动时间要 50 ms。每次唤醒读数据,光等它稳定就耗掉了大半电量。你想想看,这还不如选个 2 μA 但启动只要 1 ms 的传感器呢。

避坑指南: 我曾经被 datasheet 上的「待机电流」骗过。很多传感器待机电流确实低,但唤醒后要重新配置寄存器,这部分的功耗和耗时往往被忽略。一定要看「有效工作电流 × 工作时间」的积分值。

4.2 传感器驱动优化:轮询、中断还是 FIFO?

驱动方式选对了,功耗能降一个数量级。我一般这么选:

  • 轮询:适合采样率极低(< 1 Hz)的场景。但说实话,现在很少用了。CPU 空转太浪费。
  • 中断:最常用的方式。传感器自己判断条件,触发中断唤醒 MCU。我建议用边沿触发,别用电平触发,否则容易反复唤醒。
  • FIFO:这是我最喜欢的方式。传感器内部缓存数据,攒到一定数量再一次性通知 MCU。MCU 可以睡大觉,醒来一次处理一批数据。
// 伪代码:FIFO 模式配置示例
sensor_config.fifo_mode = FIFO_MODE_FULL;  // 满中断
sensor_config.fifo_threshold = 16;          // 攒够16个样本再唤醒
sensor_config.watermark_interrupt = ENABLE;

// MCU 这边
while(1) {
    __WFI();  // 睡大觉
    if(sensor_fifo_ready()) {
        read_fifo_burst(buffer, 16);  // 一次性读16个
        process_data(buffer);
    }
}
我的经验: FIFO 深度不是越大越好。深度太大,数据延迟高,不适合需要实时响应的场景。我一般设 8-32 个样本之间,具体看你的应用需求。

4.3 数据采集策略:阈值触发与变化检测

连续采样是最笨的办法。聪明的做法是让传感器自己判断「什么时候该干活」。

阈值触发:设定一个上下限,超过就报警。比如体温贴片,设 37.5°C 为阈值,超过才唤醒 MCU 记录。我做过一个项目,用这种方式把平均功耗从 50 μA 降到了 3 μA。

变化检测:更智能一点。不是看绝对值,而是看变化率。比如心率监测,心跳突然变快才触发记录。这需要传感器支持「运动检测」或「变化检测」功能。

我个人习惯的做法是:

  1. 先用阈值触发做第一级筛选
  2. 再用变化检测做第二级确认
  3. 最后才唤醒 MCU 做完整数据采集

这样三级过滤,MCU 90% 的时间都在睡觉。

4.4 传感器电源域控制

这个点很多人会忽略。传感器不仅要关,还要关得彻底。

我建议把传感器分成独立的电源域,用 MOSFET 或负载开关控制。不用的传感器直接断电,而不是让它进入「待机模式」。为什么?因为待机模式还是有漏电流,有些传感器待机电流标称 0.1 μA,实际测出来 0.5 μA,积少成多。

// 电源域控制示例
void sensor_power_control(uint8_t sensor_id, bool on) {
    if(on) {
        GPIO_SetBits(POWER_EN_PORT, 1 << sensor_id);
        delay_ms(5);  // 等待电源稳定
        sensor_init(sensor_id);
    } else {
        sensor_deinit(sensor_id);
        GPIO_ResetBits(POWER_EN_PORT, 1 << sensor_id);
        // 确保放电完成
        delay_ms(1);
    }
}
注意: 我曾经犯过一个错——断电后没有等电容放完电就重新上电,结果传感器启动异常。后来我加了一个放电电阻,断电后等 1 ms 再操作,问题就解决了。

嗯,传感器管理这块,说白了就是「能睡就睡,能关就关,能不干就不干」。选对传感器、用对驱动方式、定好采集策略、管好电源域,这四个环节做好了,功耗自然就下来了。

下一章咱们聊聊无线通信的功耗优化,那又是另一个大坑了。