第三章 传感器与前端电路:光电二极管与LED驱动电路设计、跨阻放大器设计、环境光抑制技术
好,咱们进入血氧仪最核心的模拟前端部分。说实话,这部分要是没设计好,后面数字处理再牛也白搭。我见过不少团队,算法团队花了好几个月调参,结果发现是前端信噪比不够,白忙活一场。
3.1 光电二极管(PD)的选择与偏置
血氧仪里用的光电二极管,说白了就是个光转电流的器件。红光和红外光各配一个PD,或者用一颗双波长PD。
选型时我重点关注三个参数:
- 暗电流:越小越好。我习惯选暗电流在1nA以下的,不然温度一上来,基线漂移会让你怀疑人生。
- 响应度:单位是A/W。红光660nm附近,响应度一般在0.4~0.6 A/W;红外940nm附近,大概0.6~0.8 A/W。
- 结电容:这个直接影响带宽和噪声。结电容越小,跨阻放大器越稳定。
我的经验:PD的结电容和面积成正比。别为了多收光选太大面积的PD,否则带宽上不去,噪声还大。我一般选2mm²以下的PD,配合适当的聚光透镜,效果更好。
偏置方式怎么选?
PD有两种偏置模式:光伏模式和光导模式。
- 光伏模式:PD两端零偏置。优点是暗电流极小,噪声低。缺点是响应速度慢一点。血氧仪这种低频应用(通常几十Hz到几百Hz),光伏模式完全够用。
- 光导模式:PD加反向偏压(比如-5V)。优点是响应速度快,结电容变小。缺点是暗电流会增大,噪声也大。
我个人习惯用光伏模式。血氧仪对噪声极其敏感,暗电流每增加一点,信噪比就掉一截。你想想看,手指透过的光信号本来就弱,再被暗电流淹没了,那还测什么?
3.2 LED驱动电路设计
LED驱动看似简单,其实坑不少。血氧仪里LED是脉冲驱动的,不是一直亮着。为什么?
- 省电——电池供电的设备,能省一点是一点。
- 避免组织发热——长时间照射会改变局部血流,影响测量。
- 配合时序——红光和红外交替点亮,PD才能区分信号。
驱动电路的核心要求:
- 电流要稳。LED的亮度直接由电流决定,电流波动会引入噪声。
- 上升/下降沿要快。脉冲宽度通常只有几十微秒,边沿慢了,有效发光时间就不够。
- 电流大小可调。不同肤色、不同部位需要的驱动电流不一样。
我常用的方案是恒流源驱动,用一颗运放加MOS管构成。下面是个简化版电路:
// 伪代码描述驱动时序
void drive_leds() {
// 先关掉所有LED
LED_RED_CTRL = 0;
LED_IR_CTRL = 0;
delay_us(10); // 等待电流泄放
// 点亮红光,持续80us
LED_RED_CTRL = 1;
delay_us(80);
LED_RED_CTRL = 0;
delay_us(10); // 切换间隔
// 点亮红外,持续80us
LED_IR_CTRL = 1;
delay_us(80);
LED_IR_CTRL = 0;
// 然后进入采样阶段
}
注意:LED的峰值电流不能超过规格书限制。我曾经遇到过,为了追求信号强度,把电流调到100mA,结果LED光衰严重,用了两个月就不行了。血氧仪是医疗设备,可靠性是第一位的。
3.3 跨阻放大器(TIA)设计
PD输出的是电流信号,微安甚至纳安级别。我们需要把它转成电压信号,然后才能ADC采样。这个转换就靠跨阻放大器。
TIA的核心公式:
Vout = -Ipd × Rf
其中Rf是反馈电阻。比如PD输出1μA,Rf取1MΩ,输出电压就是-1V。
设计TIA时,我重点关注三个问题:
- 稳定性:PD的结电容和运放的输入电容会在反馈环路里引入极点,容易振荡。解决办法是在反馈电阻上并联一个小电容Cf。
- 噪声:Rf越大,热噪声越大。但Rf小了,信号又太小。这是个trade-off。
- 带宽:血氧仪信号频率很低,但为了脉冲驱动,带宽还是要够。我一般设计在10kHz左右。
反馈电容Cf怎么选?
有个经验公式:
Cf = sqrt( Cpd / (2 * π * Rf * GBP) )
其中Cpd是PD结电容,GBP是运放的增益带宽积。嗯,这个公式算出来只是个起点,实际要在板上调试,用方波测试看有没有过冲。
我的选型习惯:运放选低偏置电流、低噪声的CMOS运放,比如TI的OPA2376或ADI的AD8605。偏置电流要小于1pA,不然PD的微弱电流会被运放自己吃掉。
3.4 环境光抑制技术
环境光干扰是血氧仪最大的敌人之一。太阳光、日光灯、手机屏幕光,都会照到PD上,产生额外的光电流。
环境光干扰有多严重?
室内日光灯下,PD产生的光电流可能达到几微安。而手指透射过来的红光信号,可能只有几十纳安。差了100倍!如果不处理,信号完全被淹没了。
我常用的三种抑制方法:
- 光学滤波:在PD前面加滤光片,只让660nm和940nm附近的光通过。这是第一道防线。
- 时序差分采样:这是最核心的方法。LED亮的时候采一次,LED灭的时候再采一次,两次相减,环境光就被减掉了。
- 模拟低通滤波:环境光通常是直流或低频(100Hz/120Hz的工频闪烁),用高通或带通滤波器可以滤掉。
时序差分采样的具体做法:
// 采样时序伪代码
uint32_t sample_with_ambient_cancellation() {
uint32_t v_led_on; // LED亮时的采样值
uint32_t v_led_off; // LED灭时的采样值
// 点亮LED
LED_ON();
delay_us(50); // 等待稳定
v_led_on = ADC_read();
LED_OFF();
// 等待环境光稳定
delay_us(20);
v_led_off = ADC_read();
// 相减得到纯净信号
return v_led_on - v_led_off;
}
避坑指南:我曾经遇到过,环境光抑制做得很好,但运动伪差还是很大。后来发现是LED和PD之间的光路被手指移动改变了。嗯,这其实是另一个话题——运动伪差抑制,后面章节会详细讲。
硬件上还要注意:
- PD和LED之间要做光学隔离,防止LED的光直接串到PD里。
- PCB上,模拟地和数字地要分开,TIA周围不要走数字信号线。
- 外壳要遮光,尤其是侧面缝隙,环境光会从那里漏进去。
好了,传感器前端这部分就讲到这里。说白了,血氧仪的模拟前端就是三个字:弱信号检测。PD把光转成电流,TIA把电流转成电压,环境光抑制保证信号干净。每一步都有坑,但每一步也都有成熟的解决方案。下一章我们讲ADC采样和数字滤波,把模拟信号变成数字信号,然后才能交给算法处理。