每日报道:基于STM32物联网开发板(7)--心率血氧采集MAX30102
1.概述
MAX30102是一种集成的脉搏血氧计心率监测模块。它包括内部LED,光电探测器、光学元件和低噪声电子器件具有环境光抑制。MAX30102提供简化设计过程的完整系统解决方案用于移动和可穿戴设备。
MAX30102在单个1.8V电源上运行以及用于内部LED的单独3.3V电源。通信通过标准I2C兼容。
MAX30102的SpO2(经皮动脉血氧饱和度)子系统包含环境光消除(ALC),连续时间∑-ΔADC和专有的离散时间滤波器。ALC有内部跟踪/保持电路,用于消除环境光,以及增加有效动态范围。SpO2 ADC具有可编程满量程范围从2µA到16µA。这个ALC可抵消高达200µA的环境电流。内部ADC是连续时间过采样∑-Δ转换器,分辨率为18位。ADC采样率为10.24MHz。ADC输出数据速率可以从50sps(每秒采样)编程到3200sps。
(资料图片)
MAX30102具有片上温度传感器,用于校准SpO2子系统的温度依赖性。温度传感器的固有分辨率为0.0625°C。设备输出数据对IR LED的波长相对不敏感,其中红色LED的波长对于正确解释数据至关重要。与MAX30102输出信号一起使用的SpO2算法可以补偿与环境温度变化相关的SpO2误差。
MAX30102模块集成了红色和红外LED驱动器,以调制用于SpO2和HR测量的LED脉冲。使用适当的电源电压,LED电流可以从0编程到50mA。LED脉冲宽度可从69µs编程到411µs,以允许算法根据使用情况优化SpO2和HR精度和功耗。
应用
可穿戴设备健身辅助设备智能手机硬件接口:
引脚 | 说明 |
MAX30102_INT | PC9信号检测脚 |
MAX30102_SDA | PC7 I2C数据线 |
MAX30102_SCL | PC8 I2C时钟线 |
2.通讯协议
本模块采用I2C通讯方式,具有I2C/SMBus兼容的2线制由串行数据线(SDA)和串行时钟线(SCL),时钟速率高达400kHz。
设备地址:I2C接口时序:2.1 起始信号和停止信号
起始信号:时钟为高电平时,数据由高电平变为低电平。//产生IIC起始信号void IIC_Start(void){SDA_OUT(); //sda线输出IIC_SDA(1); IIC_SCL(1);Delay_Us(4); IIC_SDA(0);//START:when CLK is high,DATA change form high to low Delay_Us(4);IIC_SCL(0);//钳住I2C总线,准备发送或接收数据 }
停止信号:时钟线为高电平时,数据线由低变高。//产生IIC停止信号void IIC_Stop(void){SDA_OUT();//sda线输出IIC_SCL(0);IIC_SDA(0);//STOP:when CLK is high DATA change form low to high Delay_Us(4);IIC_SCL(1); IIC_SDA(1);//发送I2C总线结束信号Delay_Us(4); }
2.2 发送数据和发送应答
时钟线为低电平时发送数据。应答信号本身就是一位数据。
//产生ACK应答void IIC_Ack(void){IIC_SCL(0);SDA_OUT();IIC_SDA(0);Delay_Us(2);IIC_SCL(1);Delay_Us(2);IIC_SCL(0);}//不产生ACK应答 void IIC_NAck(void){IIC_SCL(0);SDA_OUT();IIC_SDA(1);Delay_Us(2);IIC_SCL(1);Delay_Us(2);IIC_SCL(0);}//IIC发送一个字节 void IIC_Send_Byte(u8 txd){ u8 t; SDA_OUT(); IIC_SCL(0);//拉低时钟开始数据传输 for(t=0;t<8;t++) { if(txd&0x80)IIC_SDA(1); else IIC_SDA(0); txd<<=1; Delay_Us(2); IIC_SCL(1); Delay_Us(2); IIC_SCL(0); Delay_Us(2); } }
2.3 读取数据和读取应答
时钟线为高时读取数据。应答信号本身就是一位数据。
//等待应答信号到来//返回值:1,接收应答失败// 0,接收应答成功u8 IIC_Wait_Ack(void){u8 ucErrTime=0;SDA_IN(); //SDA设置为输入 IIC_SDA(1);Delay_Us(1); IIC_SCL(1);Delay_Us(1); while(READ_SDA){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL(0);//时钟输出0 return 0; } //读1个字节,ack=1时,发送ACK,ack=0,发送nACK u8 IIC_Read_Byte(unsigned char ack){ unsigned char i,receive=0; SDA_IN();//SDA设置为输入 for(i=0;i<8;i++ ) { IIC_SCL(0); Delay_Us(2); IIC_SCL(1); receive<<=1; if(READ_SDA)receive++; Delay_Us(1); } if (!ack) IIC_NAck();//发送nACK else IIC_Ack(); //发送ACK return receive;}
2.4 数据读写
void IIC_Read_One_Byte(u8 daddr,u8 addr,u8* data){ IIC_Start(); IIC_Send_Byte(daddr); //发送写命令IIC_Wait_Ack();IIC_Send_Byte(addr);//发送地址IIC_Wait_Ack(); IIC_Start(); IIC_Send_Byte(daddr|0X01);//进入接收模式 IIC_Wait_Ack(); *data = IIC_Read_Byte(0); IIC_Stop();//产生一个停止条件 }void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data){ IIC_Start(); IIC_Send_Byte(daddr); //发送写命令IIC_Wait_Ack();IIC_Send_Byte(addr);//发送地址IIC_Wait_Ack(); IIC_Send_Byte(data); //发送字节 IIC_Wait_Ack(); IIC_Stop();//产生一个停止条件 HAL_Delay(10); }
标签: