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时钟线 |
本模块采用I2C通讯方式,具有I2C/SMBus兼容的2线制由串行数据线(SDA)和串行时钟线(SCL),时钟速率高达400kHz。
//产生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);
}
时钟线为低电平时发送数据。应答信号本身就是一位数据。
//产生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);
}
}
时钟线为高时读取数据。应答信号本身就是一位数据。
//等待应答信号到来
//返回值: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;
}
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);
}
全部0条评论
快来发表一下你的评论吧 !