电池设备的环境光传感器:IRQ、单次采样与低功耗取舍
在电池供电设备里,环境光传感器通常只需要偶尔提供一个 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 前应先回答:
- IRQ 是转换完成中断,还是阈值中断?
- IRQ 开启后,传感器能否自动回到 Standby?
- 传感器等待 IRQ 时的典型和最大电流是多少?
- 业务能接受多大的光照变化检测延迟?
如果数据手册只描述“Active 模式下设置上下阈值并等待中断”,它通常不是低功耗 single-shot 完成中断。
常见的四类设计
Single-shot 或 Forced Mode
主机发起一次转换,传感器完成后自动回到低功耗模式。MCU 可以通过定时器或 Data Ready IRQ 回收结果:
1 | MCU 启动转换 |
这是周期采集最理想的模式,因为不需要 MCU 额外发命令关闭传感器,也不容易因错误路径遗漏休眠动作。
超低功耗自主阈值监测
部分器件有独立的低功耗比较器或专用监测引擎。它可以用较低电流持续判断阈值,只在环境发生明显变化时拉起 IRQ。
这种方案适合“平时不关心具体 lux,只在由亮变暗时唤醒”的产品,但必须确认数据手册给出的电流属于低功耗监测引擎,而不是普通连续测量模式。
MCU 定时按需采样
如果器件只有 Standby 和连续 Active,没有 single-shot 自动回休眠能力,常见做法是由 MCU 把一次连续模式裁剪成一次采样:
1 | 传感器保持 Standby |
这种设计需要状态机保证任何成功、超时或 I2C 错误路径最终都能让传感器回到 Standby,但其平均电流通常远低于长期连续 Active。
连续测量加阈值 IRQ
如果产品必须在较短时间内发现明暗变化,连续模式可能无法避免。此时可以:
- 使用业务可接受的最长 Measurement Rate;
- 设置高低阈值迟滞,避免在临界点反复触发;
- 使用 persistence,要求连续多次越界后才中断;
- MCU 被唤醒后批量处理必要工作,再尽快睡眠。
这是用功耗换取响应速度,不应包装成单纯的“IRQ 低功耗优化”。
用占空比估算方向
假设某颗环境光传感器的参数为:
- Active 电流:266 µA;
- Standby 电流:5 µA;
- 每 5 秒采集一次;
- 每次从唤醒到读取完成需要 25 ms。
只考虑传感器自身,平均电流约为:
1 | (266 µA × 25 ms + 5 µA × 4975 ms) / 5000 ms |
如果异常情况下等待和重试使 Active 时间增加到 55 ms:
1 | (266 µA × 55 ms + 5 µA × 4945 ms) / 5000 ms |
而长期连续 Active 可能仍是数百微安量级。这个简单估算足以判断架构方向,但不能代替测量:
- 手册电流可能只对应某组 Integration Time 和 Measurement Rate;
- Active 内部可能包含测量和 idle,平均电流未必能线性外推;
- MCU、I2C 上拉、稳压器和无线唤醒也会影响整机结果;
- Standby 电流应同时关注典型值、最大值和温度范围。
优先优化采样策略,而不是一两毫秒
低功耗优化最容易陷入“把等待时间减少 2 ms”的局部问题。对于几秒甚至几十秒才采一次的数据,减少采样次数通常更有效。
合并周期请求和事件请求
设备可能同时有固定周期采样和外部事件触发采样。如果事件刚好发生在周期采样之后,重复启动一次转换没有必要。
可以维护:
- 最近一次有效样本的时间;
- 当前是否正在采样;
- 哪些业务正在等待本次结果;
- 是否还存在必须重新采样的 pending 请求。
如果样本足够新就直接复用;如果采样正在进行,就让新的使用者等待当前结果,而不是再次启动传感器。
使用自适应采样周期
固定 5 秒并不总是合理。更常见的策略是:
1 | 环境稳定、无事件 |
如果业务只需要“事件发生时的光照”,甚至可以采用事件触发采样加慢速健康检查,而不是永久维持高频周期采样。
对齐已有唤醒窗口
传感器采样可以尽量对齐:
- 外部 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 一定更省电”答案。合理的选择顺序是:
- 先确认传感器是否支持 single-shot 或低功耗阈值引擎;
- 再明确业务需要周期 lux,还是实时明暗事件;
- 不支持 single-shot 时,用状态机实现按需 Active 和可靠回 Standby;
- 优先合并请求、降低采样频率并对齐已有唤醒;
- 最后通过整机电流波形验证,而不是只依赖手册典型值。
对于只需偶尔获取照度的电池设备,MCU 定时按需采样通常比连续 Active 加阈值 IRQ 更合适;而真正需要快速明暗检测时,连续 IRQ 的功耗代价应作为产品需求的一部分明确接受。