3、环境光抑制技术:暗电流消除、环境光采样与相减、动态范围优化
各位好,咱们接着聊血样测量信号链。上一章讲了光电前端的基础架构,这一章要啃的,是环境光抑制。说白了,就是怎么让传感器在乱七八糟的光线里,只认我们想要的那个信号。
环境光这东西,我刚开始做血氧项目时真没太当回事。直到有一次,样机在实验室跑得好好的,拿到窗边一测,波形直接飘到天上去。嗯,从那以后,我再也不敢小看它了。
3.1 暗电流消除——先搞定传感器自己的“漏电”
先说说暗电流。光电二极管在没有光照时,也会产生微弱的电流。这电流来自热激发、晶格缺陷,说白了就是传感器自己的“漏电”。
暗电流有多大?我见过最差的,室温下能到几个nA。你想想看,血样反射回来的光电流可能也就几十pA到几百pA,暗电流直接就把信号淹没了。
消除暗电流,我常用的方法有两种:
- 硬件差分法:用两个一模一样的光电二极管,一个遮光,一个正常接收。两者的输出做差分。我在一个多波长血氧仪里用过这招,效果不错,但缺点是占面积、成本高。
- 时序采样法:更常用。在LED关闭的间隙,快速采样一次光电信号,这就是暗电流+环境光的总和。然后在LED开启时再采样一次,两者相减。我习惯在每次LED脉冲前加一个“暗采样窗口”,宽度约10μs。
关键参数:暗电流随温度变化很大,大约每升高10°C翻一倍。所以如果你做的是穿戴设备,体温变化会直接影响暗电流。我建议在固件里加一个温度补偿表,或者至少做一次上电自校准。
我的小技巧:在PCB布局时,把光电二极管和运放输入端用“保护环”(Guard Ring)围起来。这能有效减少PCB漏电流,让暗电流测量更干净。我曾经因为没加保护环,暗电流一直降不下去,折腾了两周才找到原因。
3.2 环境光采样与相减——把背景光“减”掉
暗电流搞定了,接下来是环境光。环境光比暗电流麻烦多了——它不光有直流成分(比如室内灯光),还有交流成分(比如50Hz/60Hz的荧光灯频闪)。
环境光采样策略,我一般分两步走:
- 同步采样:在LED关闭时,用ADC快速采样环境光。采样点要避开LED开启的瞬间,避免残余电荷影响。我习惯在LED关闭后等5μs再采样。
- 数字相减:把环境光采样值从LED开启时的总采样值中减去。注意,这里不是简单的减法——因为环境光可能随时间变化,我建议用滑动平均滤波处理环境光采样值,再做减法。
举个例子,我做过的一个心率血氧模块,采样时序是这样的:
// 伪代码示例
void sample_ppg(void) {
// 阶段1:关闭LED,采样环境光
LED_OFF();
delay_us(5); // 等待残余电荷泄放
ambient = ADC_read(); // 环境光+暗电流
// 阶段2:开启LED,采样总信号
LED_ON();
delay_us(10); // 等待LED稳定
total = ADC_read();
// 阶段3:关闭LED,计算净信号
LED_OFF();
ppg_signal = total - ambient;
// 可选:对ambient做低通滤波
ambient_filtered = 0.9 * ambient_filtered + 0.1 * ambient;
}
这里有个坑:如果环境光变化太快(比如有人在你面前晃手机),单次减法可能不够。我建议在硬件上先加一个高通滤波器,把直流环境光滤掉,只保留交流成分。这样ADC的动态范围就能全部分配给有用的PPG信号。
注意:环境光中的50Hz/60Hz频闪,如果采样率不是其整数倍,会产生混叠。我建议采样率设为100Hz以上,或者用硬件陷波器。我曾经因为采样率设成50Hz,结果测出来的心率全是50Hz的谐波,数据完全不能用。
3.3 动态范围优化——把信号“挤”进ADC的窗口
环境光抑制的终极目标,是让ADC的满量程范围尽可能多地分配给有用信号。你想想看,如果环境光占了ADC量程的90%,那PPG信号只能挤在剩下的10%里,分辨率自然就差了。
动态范围优化,我常用的三板斧:
- 自动增益控制(AGC):根据环境光强度动态调整TIA的增益。环境光强时降低增益,避免饱和;环境光弱时提高增益,捕捉微弱信号。我习惯用数字电位计或可编程增益放大器(PGA)来实现。
- 基线恢复:在TIA输出端加一个直流伺服环路,把环境光引起的直流偏置“吸走”。这样交流信号就能在ADC的中间电平附近摆动。我做过一个设计,用运放搭建的积分器做基线恢复,效果比纯数字处理好很多。
- ADC动态范围扩展:如果环境光变化范围很大(比如从暗室到阳光直射),可以考虑用16位以上的Σ-Δ ADC。但要注意,高分辨率ADC的转换速度通常较慢,不适合高速采样。我一般折中选12位或14位的SAR ADC。
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| AGC | 灵活,适应范围广 | 需要额外控制电路 | 环境光变化大的场景 |
| 基线恢复 | 硬件实现,实时性好 | 增加电路复杂度 | 交流信号为主的测量 |
| 高分辨率ADC | 简单,无需额外硬件 | 速度受限,成本高 | 低速高精度测量 |
我个人习惯把AGC和基线恢复结合起来用。AGC负责粗调,把信号拉到ADC量程的中间区域;基线恢复负责细调,把直流分量进一步抑制。这样ADC的有效位数几乎全给了PPG信号。
实战经验:有一次做动态血氧测量,受试者从室内走到室外,环境光强度变化了100倍。如果只用固定增益,ADC直接饱和。后来加了AGC,增益自动从100kΩ降到1kΩ,信号才恢复正常。嗯,从那以后,AGC就成了我设计的标配。
好了,环境光抑制这块就聊到这儿。说白了,就是跟“杂光”斗智斗勇。暗电流消除是基本功,环境光采样与相减是常规操作,动态范围优化才是真正拉开差距的地方。下一章咱们聊聊LED驱动和脉冲调制,那又是另一番天地了。