第四章 模拟前端AFE芯片详解:AFE4404/MAX30102等芯片介绍、寄存器配置、I2C通信时序
各位同学,欢迎来到第四章。这一章我们聊聊血氧仪最核心的器件——模拟前端AFE芯片。
说实话,AFE芯片是整个血氧仪设计的灵魂。你想想看,传感器采集到的光信号极其微弱,噪声又大,如果没有一个好的AFE芯片做信号调理,后面的算法再牛也白搭。我在项目中就吃过这个亏,第一次做血氧仪时选了个通用运放搭的电路,结果信噪比惨不忍睹,折腾了两个月才换专用AFE芯片。
4.1 主流AFE芯片选型对比
目前市面上主流的血氧仪AFE芯片,主要有TI的AFE4404、AFE4490,以及Maxim的MAX30102、MAX30100。我个人的习惯是,根据产品定位来选:
- AFE4404:TI出品,四通道,支持SPO2和心率检测,动态范围大,适合医疗级产品
- MAX30102:Maxim出品,集成LED驱动和光电检测,封装极小,适合消费级可穿戴设备
- AFE4490:AFE4404的升级版,多了更多诊断功能,适合高端监护仪
- MAX30100:MAX30102的前代产品,功耗略高,但价格便宜
选型建议:如果是做医疗认证的产品,我建议用AFE4404或AFE4490,它们的性能指标更可靠。如果是做手环、智能手表这类消费产品,MAX30102是更好的选择,体积小、功耗低。
下面这张表是我整理的对比数据,大家可以参考:
| 参数 | AFE4404 | MAX30102 | AFE4490 |
|---|---|---|---|
| 通道数 | 4通道 | 2通道 | 4通道 |
| LED驱动电流 | 最大100mA | 最大50mA | 最大100mA |
| ADC分辨率 | 22位 | 18位 | 22位 |
| 采样率 | 最高1kHz | 最高400Hz | 最高1kHz |
| 封装 | QFN-40 | OLGA-14 | QFN-40 |
| 典型应用 | 医疗监护仪 | 智能手环 | 高端监护仪 |
4.2 AFE4404内部架构详解
我们重点讲AFE4404,因为它的架构比较典型,理解了它,其他AFE芯片也就触类旁通了。
AFE4404内部主要包含以下几个模块:
- LED驱动电路:可编程电流源,驱动红光和红外光LED
- 光电二极管接口:接收反射回来的光信号,转换成电流
- 跨阻放大器(TIA):将电流信号转换成电压信号,这是最关键的一级
- 环境光消除电路:滤除环境光的干扰
- 可编程增益放大器(PGA):进一步放大信号
- 22位Δ-Σ ADC:将模拟信号数字化
- 数字滤波器和FIFO:对数据进行预处理和缓存
嗯,这里要注意,AFE4404的TIA增益和PGA增益都是可编程的。我在项目中遇到过一个问题:增益设置太高,信号饱和;增益设置太低,信号太弱。后来我总结了一个经验——先设一个中等增益,然后根据实际信号幅度微调。
经验之谈:AFE4404的TIA增益建议设为50kΩ或100kΩ,PGA增益设为1倍或2倍。如果信号太弱,优先增加LED电流,而不是盲目提高增益。提高增益会同时放大噪声,得不偿失。
4.3 MAX30102的特点与差异
MAX30102和AFE4404的设计思路不太一样。MAX30102把LED驱动、光电检测、ADC、环境光消除都集成在一个小封装里,只有14个引脚。说白了,它就是为了可穿戴设备量身定做的。
MAX30102的几个关键特点:
- 集成LED:内部集成了红光和红外光LED,省去了外部LED选型的麻烦
- 低功耗:待机电流只有0.7μA,非常适合电池供电设备
- FIFO深度32级:可以缓存数据,减少MCU的读取频率
- 温度补偿:内置温度传感器,可以补偿温度对LED的影响
不过MAX30102也有缺点。它的ADC只有18位,动态范围不如AFE4404。而且它的采样率最高只有400Hz,对于某些需要高采样率的应用可能不够。我记得有一次做运动场景的血氧测试,MAX30102的采样率就不够用了,最后换成了AFE4404。
4.4 寄存器配置详解
AFE芯片的配置,说白了就是写寄存器。我们以AFE4404为例,讲几个关键寄存器。
4.4.1 控制寄存器(CONTROL_REG)
这个寄存器控制芯片的工作模式:
- Bit[1:0]:工作模式选择,00=待机,01=正常模式,10=诊断模式
- Bit[2]:LED使能,1=开启LED驱动
- Bit[3]:ADC使能,1=开启ADC转换
4.4.2 LED电流寄存器(LED_CURRENT)
设置红光和红外光LED的驱动电流:
- 红光LED电流:寄存器值×0.5mA,范围0~100mA
- 红外光LED电流:寄存器值×0.5mA,范围0~100mA
4.4.3 增益控制寄存器(GAIN_CTRL)
设置TIA和PGA的增益:
- TIA增益:可选50kΩ、100kΩ、200kΩ、500kΩ
- PGA增益:可选1倍、2倍、4倍、8倍
注意:增益设置不能超过芯片的最大输入范围。如果信号饱和,ADC会输出满量程值,这时候数据是无效的。我曾经在调试时发现数据全是0x7FFFFF,检查了半天才发现是增益设太高了。
下面是一个典型的AFE4404初始化代码示例:
// AFE4404初始化配置
void AFE4404_Init(void) {
// 1. 复位芯片
I2C_WriteRegister(AFE4404_ADDR, 0x00, 0x01);
delay_ms(10);
// 2. 设置工作模式:正常模式,开启LED和ADC
I2C_WriteRegister(AFE4404_ADDR, 0x01, 0x0F);
// 3. 设置LED电流:红光20mA,红外光15mA
I2C_WriteRegister(AFE4404_ADDR, 0x02, 0x28); // 红光:40*0.5mA=20mA
I2C_WriteRegister(AFE4404_ADDR, 0x03, 0x1E); // 红外光:30*0.5mA=15mA
// 4. 设置增益:TIA=100kΩ,PGA=2倍
I2C_WriteRegister(AFE4404_ADDR, 0x04, 0x12); // TIA=01(100k), PGA=01(2x)
// 5. 设置采样率:100Hz
I2C_WriteRegister(AFE4404_ADDR, 0x05, 0x64); // 100Hz
// 6. 使能FIFO
I2C_WriteRegister(AFE4404_ADDR, 0x06, 0x01);
}
4.5 I2C通信时序详解
AFE4404和MAX30102都使用I2C接口通信。I2C的时序看起来简单,但实际调试时坑不少。
标准的I2C写时序是这样的:
- 主机发送起始信号(SDA拉低,SCL保持高)
- 主机发送7位设备地址+写位(0)
- 从机应答(ACK)
- 主机发送寄存器地址
- 从机应答
- 主机发送数据字节
- 从机应答
- 重复步骤6-7直到数据发送完毕
- 主机发送停止信号
读时序稍微复杂一点:
- 先写寄存器地址(伪写操作)
- 然后重新发送起始信号
- 发送设备地址+读位(1)
- 从机发送数据
- 主机应答(最后一个字节不应答)
- 主机发送停止信号
关键点:AFE4404的I2C地址是0x58(7位地址),MAX30102的I2C地址是0x57。注意,有些MCU的I2C库要求传入8位地址,需要左移一位。我刚开始用STM32时就在这里栽过跟头。
下面是一个完整的I2C读时序代码示例:
// AFE4404 I2C读寄存器
uint32_t AFE4404_ReadRegister(uint8_t regAddr) {
uint8_t data[3] = {0};
// 1. 发送寄存器地址(伪写)
I2C_Start();
I2C_SendByte(AFE4404_ADDR << 1 | 0); // 写操作
I2C_WaitAck();
I2C_SendByte(regAddr);
I2C_WaitAck();
// 2. 重新开始,读取数据
I2C_Start();
I2C_SendByte(AFE4404_ADDR << 1 | 1); // 读操作
I2C_WaitAck();
// 3. 读取3个字节(AFE4404的寄存器是24位)
data[0] = I2C_ReadByte();
I2C_SendAck(0); // 应答
data[1] = I2C_ReadByte();
I2C_SendAck(0); // 应答
data[2] = I2C_ReadByte();
I2C_SendAck(1); // 最后一个字节不应答
// 4. 停止
I2C_Stop();
// 5. 组合成24位数据
return ((uint32_t)data[0] << 16) | ((uint32_t)data[1] << 8) | data[2];
}
4.6 实际调试中的注意事项
最后,分享几个我在实际项目中踩过的坑:
- 上电时序:AFE4404需要先上电,再配置寄存器。如果配置时芯片还没准备好,写寄存器会失败。我习惯在上电后加一个50ms的延时。
- I2C速率:AFE4404的I2C最高支持400kHz,但建议先用100kHz调试,稳定后再提高速率。速率太高时信号质量会变差。
- FIFO溢出:如果MCU读取速度跟不上ADC采样速度,FIFO会溢出。这时候需要提高读取频率,或者降低采样率。
- 环境光干扰:MAX30102对环境光比较敏感,建议在传感器上加遮光罩。我在做手环项目时,发现阳光下数据异常,加了遮光罩就好了。
调试技巧:用逻辑分析仪抓I2C波形,可以快速定位通信问题。我每次调试新板子,第一件事就是抓I2C波形,确认通信正常后再去调其他参数。
好了,这一章的内容就到这里。AFE芯片是血氧仪的核心,寄存器配置和I2C通信是基本功。下一章我们讲如何设计AFE芯片的外围电路,包括LED驱动电路、光电检测电路和电源滤波电路。到时候我会分享一些具体的电路设计经验和仿真结果。