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);
}
嗯,这里要注意:红光和红外光绝对不能同时亮。否则你采集到的信号是混合的,没法分离。分时点亮是基本操作。
3.2 光电二极管选型:光怎么变成电?
LED把电变成光,光电二极管(PD)负责把光变回电。这个环节的选型,直接决定了你信号的信噪比。
3.2.1 关键参数
选光电二极管,我主要看三个参数:
| 参数 | 说明 | 我的建议 |
|---|---|---|
| 响应波长 | PD对哪个波长的光最敏感 | 红光(660nm)和红外光(940nm)都要有高响应度 |
| 暗电流 | 没有光照时PD产生的漏电流 | 越小越好,最好小于1nA |
| 结电容 | PD的寄生电容,影响响应速度 | 越小越好,最好小于10pF |
说白了,你要找的是一颗在红光和红外波段都灵敏、暗电流极低、结电容小的PD。市面上常见的比如Vishay的VEMD5510,或者Hamamatsu的S1133系列,都是不错的选择。
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。所以,增益不是越高越好,要在增益和噪声之间做权衡。
3.3.3 布局布线注意事项
最后说几句布局的事。TIA是高阻抗、高灵敏度的电路,对PCB布局非常敏感。我的经验是:
- 反馈电阻Rf和电容Cf要紧贴运放引脚,走线越短越好。
- PD到运放输入端的走线要尽可能短,并且周围用地线包围,防止噪声耦合。
- 电源去耦电容要靠近运放电源引脚,一般用0.1μF和10μF并联。
- 避免在TIA周围走数字信号线,尤其是时钟线。
嗯,这些细节看似琐碎,但往往就是这些地方决定了你的产品是“能用”还是“好用”。我见过太多方案,原理图看着没问题,一打板回来信号就是不行,最后查出来都是布局布线的问题。
好了,这一章的内容就到这里。LED驱动、PD选型、TIA设计,这三个硬件基础打牢了,后面采集到的PPG信号才有分析的价值。下一章,咱们聊聊信号调理和滤波,把模拟信号处理干净了再送ADC。