0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于STM32物联网开发板(7)--心率血氧采集MAX30102

嵌入式技术 来源:嵌入式技术 作者:嵌入式技术 2023-05-24 11:10 次阅读

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精度和功耗。

应用

pYYBAGRjOomAB14PAABglh52fT8692.pngpoYBAGRjOp-ANiqAAAUcknd1-kQ527.png

硬件接口

引脚

说明

MAX30102_INT

PC9信号检测

MAX30102_SDA

PC7 I2C数据线

MAX30102_SCL

PC8 I2C时钟线

2.通讯协议

本模块采用I2C通讯方式,具有I2C/SMBus兼容的2线制由串行数据线(SDA)和串行时钟线(SCL),时钟速率高达400kHz。

  • 设备地址:
poYBAGRtfI2APRNAAABGGNsJ_xc497.png
  • I2C接口时序:
poYBAGRtfNuADb53AAApVDPk4g4781.png

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

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

    关注

    2526

    文章

    48093

    浏览量

    740062
  • 物联网
    +关注

    关注

    2869

    文章

    41622

    浏览量

    358374
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348743
  • 开发板
    +关注

    关注

    25

    文章

    4429

    浏览量

    93993
  • 血氧计
    +关注

    关注

    0

    文章

    4

    浏览量

    7642
收藏 人收藏

    评论

    相关推荐

    max30102心率模块

    传感器单片机MAX3传感器
    闲花野草逢春生
    发布于 :2022年04月08日 22:38:06

    有人用过MAX30102么,

    max30102的一个心率,检测模块,
    发表于 06-01 20:10

    max30102心率传感器

    请问有人用过max30102传感器么? 手册里面有个Proximity Function 功能。大概意思就是 设置完模式后,设备会
    发表于 07-24 15:42

    MAX30102 浓度+心率传感器

    淘宝上虽然都卖MAX30102传感器模块,但是带的资料里面都没有相关程序。下面是STM32F103的使用程序,大家参考下
    发表于 07-28 18:24

    基于MicroPython:TPYBoard心率监测器

    监测器的制作过程上面叨叨了这么多,接下来就进入正题。开始心率监测器的制作。首先先来介绍,里面最重要的器件-MAX30102心率模块。MAX30102
    发表于 06-19 13:45

    MAX30102脉搏模块AT指令串口输出

    `MAX30102脉搏模块AT指令串口输出芯片说明MAX30102是一个集成的脉搏仪和
    发表于 03-10 17:14

    MAX30102调试遇到问题

    MAX30102测试手指的心率的时候,数据比较稳定,我们想测量额头的
    发表于 03-24 23:15

    MAX30102模块的原理及编程 精选资料分享

    一.简介MAX30102是一个集成的脉搏仪和心率监测仪生物传感器的模块(芯片)。它集成了一个660nm红光LED、880nm红外光LED、光电检测器、光器件,以及带环境光抑制的低噪
    发表于 07-19 09:15

    MAX30100和MAX30102是什么

    MAX30100和MAX30102是常用的测量心率的模块,MAX30100是能够读取心率
    发表于 08-03 06:37

    STM32是如何去MAX30102心率传感器的

    STM32F103单片机通过IIC控制MAX30102心率传感器MAX30102的VCC引脚
    发表于 08-19 08:33

    max30102心率传感器

    这个传感器让我了解了很多,以前使用的单片机,基本没有遇见过堆栈溢出的问题,这个传感器让我遇到了,在此记录调试心得。首先把所有驱动文件都贴出来了心率算法代码algorithm.h/** \file
    发表于 08-20 07:52

    基于MAX30100/MAX30102传感器设计的心率检测相关资料分享

    基于美信MAX30100/MAX30102传感器设计的心率检测,以单片机STM32F103
    发表于 11-10 07:27

    心率MAX30102模块资料分享

    心率MAX30102模块资料话不多说,
    发表于 01-07 08:02

    基于MAX30102心率传感器设计

    最近的一个项目需要用到一款心率传感器,选型选择了MAX30102,可以在ArduinoIDE中搜到MAX3010X库,包含了简单读取、
    发表于 01-13 06:24

    如何使用MAX30102读取心率/的参数

    1. 买来MAX30102模块,某宝卖家只提供了两个小小的例程,一个是基于mBed的STM32F103C8T6的Keil例程,另外一个是arduion程序,其余啥都没有了,失望,网上好多人抱怨移植
    发表于 02-08 07:11