在电池供电设备里,环境光传感器通常只需要偶尔提供一个 lux 值。此时“传感器带 IRQ”并不代表 IRQ 一定比定时读取省电。真正决定功耗的是:等待 IRQ 时传感器处于什么模式、转换期间 MCU 能否休眠,以及业务究竟需要周期数据还是实时阈值事件。

先确认 IRQ 的真实语义

环境光传感器常见的 IRQ 至少有两种:

  • Data Ready IRQ:一次转换完成后通知 MCU 读取结果;
  • Threshold IRQ:光照超过高阈值或低于低阈值时通知 MCU。

两者看起来都是一根中断线,功耗含义却完全不同。

Data Ready IRQ 如果能配合 single-shot 使用,传感器完成一次转换后可能自动回到 Standby,适合低功耗周期采集。Threshold IRQ 往往要求传感器保持连续测量;MCU 虽然可以睡眠,传感器本身却持续消耗 Active 电流。

因此,决定是否使用 IRQ 前应先回答:

  1. IRQ 是转换完成中断,还是阈值中断?
  2. IRQ 开启后,传感器能否自动回到 Standby?
  3. 传感器等待 IRQ 时的典型和最大电流是多少?
  4. 业务能接受多大的光照变化检测延迟?

如果数据手册只描述“Active 模式下设置上下阈值并等待中断”,它通常不是低功耗 single-shot 完成中断。

常见的四类设计

Single-shot 或 Forced Mode

主机发起一次转换,传感器完成后自动回到低功耗模式。MCU 可以通过定时器或 Data Ready IRQ 回收结果:

1
2
3
4
5
6
MCU 启动转换
-> MCU 休眠
-> 转换完成
-> 定时器或 Data Ready 唤醒
-> 读取结果
-> 传感器已回到 Standby

这是周期采集最理想的模式,因为不需要 MCU 额外发命令关闭传感器,也不容易因错误路径遗漏休眠动作。

超低功耗自主阈值监测

部分器件有独立的低功耗比较器或专用监测引擎。它可以用较低电流持续判断阈值,只在环境发生明显变化时拉起 IRQ。

这种方案适合“平时不关心具体 lux,只在由亮变暗时唤醒”的产品,但必须确认数据手册给出的电流属于低功耗监测引擎,而不是普通连续测量模式。

MCU 定时按需采样

如果器件只有 Standby 和连续 Active,没有 single-shot 自动回休眠能力,常见做法是由 MCU 把一次连续模式裁剪成一次采样:

1
2
3
4
5
6
7
传感器保持 Standby
-> 软件定时器到期
-> MCU 设置 Active
-> MCU 等待转换,条件允许时再次休眠
-> 检查 Data Valid / New Data
-> 读取结果
-> 设置 Standby

这种设计需要状态机保证任何成功、超时或 I2C 错误路径最终都能让传感器回到 Standby,但其平均电流通常远低于长期连续 Active。

连续测量加阈值 IRQ

如果产品必须在较短时间内发现明暗变化,连续模式可能无法避免。此时可以:

  • 使用业务可接受的最长 Measurement Rate;
  • 设置高低阈值迟滞,避免在临界点反复触发;
  • 使用 persistence,要求连续多次越界后才中断;
  • MCU 被唤醒后批量处理必要工作,再尽快睡眠。

这是用功耗换取响应速度,不应包装成单纯的“IRQ 低功耗优化”。

用占空比估算方向

假设某颗环境光传感器的参数为:

  • Active 电流:266 µA;
  • Standby 电流:5 µA;
  • 每 5 秒采集一次;
  • 每次从唤醒到读取完成需要 25 ms。

只考虑传感器自身,平均电流约为:

1
2
(266 µA × 25 ms + 5 µA × 4975 ms) / 5000 ms
≈ 6.3 µA

如果异常情况下等待和重试使 Active 时间增加到 55 ms:

1
2
(266 µA × 55 ms + 5 µA × 4945 ms) / 5000 ms
≈ 7.9 µA

而长期连续 Active 可能仍是数百微安量级。这个简单估算足以判断架构方向,但不能代替测量:

  • 手册电流可能只对应某组 Integration Time 和 Measurement Rate;
  • Active 内部可能包含测量和 idle,平均电流未必能线性外推;
  • MCU、I2C 上拉、稳压器和无线唤醒也会影响整机结果;
  • Standby 电流应同时关注典型值、最大值和温度范围。

优先优化采样策略,而不是一两毫秒

低功耗优化最容易陷入“把等待时间减少 2 ms”的局部问题。对于几秒甚至几十秒才采一次的数据,减少采样次数通常更有效。

合并周期请求和事件请求

设备可能同时有固定周期采样和外部事件触发采样。如果事件刚好发生在周期采样之后,重复启动一次转换没有必要。

可以维护:

  • 最近一次有效样本的时间;
  • 当前是否正在采样;
  • 哪些业务正在等待本次结果;
  • 是否还存在必须重新采样的 pending 请求。

如果样本足够新就直接复用;如果采样正在进行,就让新的使用者等待当前结果,而不是再次启动传感器。

使用自适应采样周期

固定 5 秒并不总是合理。更常见的策略是:

1
2
3
4
5
6
7
8
9
10
11
环境稳定、无事件
-> 30 至 60 秒慢速采样

检测到人体或其他业务事件
-> 立即采样一次

光照接近业务判断阈值
-> 短时间提高采样频率

环境重新稳定
-> 退回慢速周期

如果业务只需要“事件发生时的光照”,甚至可以采用事件触发采样加慢速健康检查,而不是永久维持高频周期采样。

对齐已有唤醒窗口

传感器采样可以尽量对齐:

  • 外部 GPIO 或 PIR 唤醒;
  • 无线设备的 poll;
  • 电池测量;
  • 其他周期维护任务。

这样不仅降低传感器占空比,还能减少 MCU 从 retention 或 deep sleep 独立唤醒的次数。

采样频率和上报频率要解耦

采到新数据不代表必须立即发无线消息。常见策略是:

  • 本地按业务需要采样;
  • 只有变化超过阈值时更新并上报;
  • 设置最大报告间隔,保证长期稳定时仍有周期状态;
  • 事件发生时可以复用最近的新鲜样本。

无线发送的能量往往高于一次短 I2C 事务。只优化传感器模式,却让每次采样都触发无线报告,整体收益可能很有限。

MCU 在转换期间是否真的睡着

使用异步定时器只能说明系统具备休眠机会,并不保证每次等待都会进入低功耗状态。还要检查:

  • 协议栈是否繁忙;
  • 是否有尚未完成的任务或日志输出;
  • 最近的软件定时器是否允许进入目标睡眠模式;
  • I2C、GPIO 和传感器状态是否满足休眠门控;
  • 唤醒后是否继续原状态机,而不是重复初始化采样。

因此验证时不仅要看传感器寄存器,还要同时观察 MCU 的睡眠进入率和整机电流波形。

是否值得电源门控

如果传感器 Standby 仍占据不可接受的电流,可以考虑用 load switch 或受控电源完全断电。但这通常不是第一优先级,因为它会引入:

  • 每次采样重新上电和初始化;
  • I2C SDA/SCL 通过上拉反向供电的风险;
  • GPIO 上电时序和高阻态要求;
  • 额外器件、板级面积和故障路径;
  • 校准或寄存器配置丢失。

只有当整机预算确实需要节省最后几微安,并完成板级验证后,电源门控才可能值得。

建议的验证矩阵

至少比较三种 profile:

Profile 配置 重点观察
固定周期 每 5 秒按需 Active 一次 基准平均电流、数据新鲜度
事件优先 事件触发,加 30–60 秒 fallback 日常平均电流、事件响应
连续 IRQ 最长可接受 Measurement Rate,加阈值迟滞 阈值延迟、连续工作电流

同时测量传感器电源轨和整机输入电流,覆盖:

  • 环境长期稳定;
  • 事件频繁发生;
  • 光照在阈值附近波动;
  • 明暗快速切换;
  • I2C 失败和数据未就绪重试。

静止十分钟的平均值只能代表一种场景。低功耗设计最终要在功耗、数据新鲜度、事件延迟和可靠恢复之间取得平衡。

结论

环境光采集没有统一的“IRQ 一定更省电”答案。合理的选择顺序是:

  1. 先确认传感器是否支持 single-shot 或低功耗阈值引擎;
  2. 再明确业务需要周期 lux,还是实时明暗事件;
  3. 不支持 single-shot 时,用状态机实现按需 Active 和可靠回 Standby;
  4. 优先合并请求、降低采样频率并对齐已有唤醒;
  5. 最后通过整机电流波形验证,而不是只依赖手册典型值。

对于只需偶尔获取照度的电池设备,MCU 定时按需采样通常比连续 Active 加阈值 IRQ 更合适;而真正需要快速明暗检测时,连续 IRQ 的功耗代价应作为产品需求的一部分明确接受。