基于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);	 
}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分