3、PPG信号采集硬件基础:LED驱动电路、光电二极管选型、跨阻放大器(TIA)设计要点

好,咱们进入硬件部分。说实话,很多做算法的朋友一看到电路就头疼,觉得那是硬件工程师的事。但我个人的经验是——不懂硬件细节,算法做得再好也是白搭。信号质量不行,你拿什么去算血氧?

这一章,我就把PPG信号采集最核心的三个硬件模块掰开揉碎了讲。分别是:LED驱动电路光电二极管选型跨阻放大器(TIA)设计。这三个东西,决定了你采集到的信号是“金标准”还是“垃圾数据”。

3.1 LED驱动电路:光从哪里来?

PPG信号采集,说白了就是往皮肤里打光,然后看反射回来多少。那这个“打光”的活儿,就交给LED了。但LED不是直接接个电源就能用的,它需要一个稳定、可控、低噪声的驱动电路。

3.1.1 驱动方式选择

常见的驱动方式有两种:恒流驱动恒压驱动。我强烈建议你选恒流驱动。为什么?

LED的亮度取决于流过它的电流,而不是电压。LED的伏安特性是非线性的,温度一变化,电压稍微波动一点,电流就可能翻倍。你想想看,血氧计算是基于红光和红外光两个通道的比值,如果LED亮度忽大忽小,那算出来的血氧值能准吗?

所以,恒流驱动是必须的。我见过一些低成本方案用电阻限流,结果温度一上来,信号漂得没法看。

3.1.2 典型电路结构

一个最简单的恒流驱动电路,可以用一个运放加一个MOS管来实现。但咱们做可穿戴设备,空间有限,我一般直接用集成LED驱动芯片,比如TI的TPS61160或者ADI的ADP8860。这些芯片内部集成了恒流源、PWM调光功能,外围只需要几个电容电阻。

这里给一个参考电路结构:

// 伪代码描述驱动时序
// 红光LED和红外光LED分时点亮
// 每个通道的驱动电流可独立配置

void LED_Drive_Init(void) {
    // 配置红光LED驱动电流为20mA
    LED_SetCurrent(LED_RED, 20);  
    // 配置红外光LED驱动电流为15mA
    LED_SetCurrent(LED_IR, 15);   
}

void LED_Sequence(void) {
    // 先点亮红光,持续100us
    LED_On(LED_RED);
    delay_us(100);
    LED_Off(LED_RED);
    
    // 等待50us,避免串扰
    delay_us(50);
    
    // 再点亮红外光,持续100us
    LED_On(LED_IR);
    delay_us(100);
    LED_Off(LED_IR);
    
    // 最后有一段全黑时间,用于采集环境光
    delay_us(100);
}

嗯,这里要注意:红光和红外光绝对不能同时亮。否则你采集到的信号是混合的,没法分离。分时点亮是基本操作。

个人经验: 我曾经在一个项目中,LED驱动电流设得太大,结果皮肤表面温度升高,导致局部血流变化,信号反而变差了。后来我把电流从30mA降到15mA,信号质量反而提升了。所以,不是电流越大越好,够用就行。

3.2 光电二极管选型:光怎么变成电?

LED把电变成光,光电二极管(PD)负责把光变回电。这个环节的选型,直接决定了你信号的信噪比

3.2.1 关键参数

选光电二极管,我主要看三个参数:

参数 说明 我的建议
响应波长 PD对哪个波长的光最敏感 红光(660nm)和红外光(940nm)都要有高响应度
暗电流 没有光照时PD产生的漏电流 越小越好,最好小于1nA
结电容 PD的寄生电容,影响响应速度 越小越好,最好小于10pF

说白了,你要找的是一颗在红光和红外波段都灵敏、暗电流极低、结电容小的PD。市面上常见的比如Vishay的VEMD5510,或者Hamamatsu的S1133系列,都是不错的选择。

避坑指南: 我曾经选过一颗暗电流标称1nA的PD,结果实际测试时发现温度一升高,暗电流飙到了10nA以上。这导致在弱光条件下,信号完全被暗电流噪声淹没了。所以,一定要看暗电流的温度特性,别只看25°C下的标称值。

3.2.2 封装与布局

PD的封装也很重要。我建议选表面贴装(SMD)的,方便自动化生产。另外,PD和LED之间的光学隔离一定要做好。如果LED的光直接漏到PD上,那你就不是在测反射信号,而是在测直射信号了。

我的做法是:在PD和LED之间加一个不透光的隔板,或者用黑色硅胶填充缝隙。这个细节很多人忽略,但影响非常大。

3.3 跨阻放大器(TIA)设计要点:微弱的电流怎么放大?

光电二极管输出的电流非常微弱,通常是微安级甚至纳安级。这么小的信号,直接送ADC是读不到的。所以需要一个跨阻放大器(TIA),把电流信号转换成电压信号,同时进行放大。

3.3.1 基本拓扑

TIA的核心就是一个运放加一个反馈电阻Rf。电流I_in流过Rf,产生电压V_out = -I_in * Rf。就这么简单。

但实际设计时,有几个坑要特别注意:

  • 反馈电容Cf:必须并联在Rf两端,用于相位补偿,防止振荡。没有Cf的TIA,大概率会自激。
  • 运放选型:要选低偏置电流、低噪声、高带宽的运放。比如TI的OPA2376、ADI的AD8605,都是经典选择。
  • 输入保护:PD可能产生较大的瞬态电流,需要在运放输入端加限流电阻或钳位二极管。

这里给一个参考电路参数:

// TIA设计参数示例
// 目标:将10uA的PD电流转换为1V的电压

Rf = 100kΩ;   // 增益 = 100kΩ,Vout = 10uA * 100kΩ = 1V
Cf = 10pF;    // 与Rf形成低通滤波器,截止频率约160kHz

// 运放选型:OPA2376
// 偏置电流:0.2pA(远小于信号电流,可忽略)
// 噪声:7.5nV/√Hz(低噪声,适合微弱信号)

3.3.2 噪声分析

TIA的噪声主要来自三个地方:运放本身的电压噪声运放的电流噪声反馈电阻的热噪声。其中,反馈电阻的热噪声是主要贡献者。

举个例子:Rf = 100kΩ时,热噪声密度约为 √(4kTR) ≈ 40nV/√Hz。如果信号带宽是100kHz,那总噪声就是 40nV * √(100kHz) ≈ 12.6μV。而你的信号是1V,信噪比约为98dB,还不错。

但如果你把Rf换成1MΩ,热噪声密度变成 √(4kT * 1MΩ) ≈ 126nV/√Hz,总噪声变成 126nV * √(100kHz) ≈ 40μV。信噪比降到88dB。所以,增益不是越高越好,要在增益和噪声之间做权衡。

核心要点: TIA设计的关键是在保证稳定性的前提下,最大化信噪比。反馈电阻Rf决定增益,反馈电容Cf决定带宽,运放选型决定噪声底限。这三者要一起考虑,不能孤立设计。

3.3.3 布局布线注意事项

最后说几句布局的事。TIA是高阻抗、高灵敏度的电路,对PCB布局非常敏感。我的经验是:

  • 反馈电阻Rf和电容Cf要紧贴运放引脚,走线越短越好。
  • PD到运放输入端的走线要尽可能短,并且周围用地线包围,防止噪声耦合。
  • 电源去耦电容要靠近运放电源引脚,一般用0.1μF和10μF并联。
  • 避免在TIA周围走数字信号线,尤其是时钟线。

嗯,这些细节看似琐碎,但往往就是这些地方决定了你的产品是“能用”还是“好用”。我见过太多方案,原理图看着没问题,一打板回来信号就是不行,最后查出来都是布局布线的问题。

好了,这一章的内容就到这里。LED驱动、PD选型、TIA设计,这三个硬件基础打牢了,后面采集到的PPG信号才有分析的价值。下一章,咱们聊聊信号调理和滤波,把模拟信号处理干净了再送ADC。