《国产嵌入式技术及应用实践》课件 项目五可穿戴应用终端设计与实现任务1 心率血氧采集功能设计与开发_第1页
《国产嵌入式技术及应用实践》课件 项目五可穿戴应用终端设计与实现任务1 心率血氧采集功能设计与开发_第2页
《国产嵌入式技术及应用实践》课件 项目五可穿戴应用终端设计与实现任务1 心率血氧采集功能设计与开发_第3页
《国产嵌入式技术及应用实践》课件 项目五可穿戴应用终端设计与实现任务1 心率血氧采集功能设计与开发_第4页
《国产嵌入式技术及应用实践》课件 项目五可穿戴应用终端设计与实现任务1 心率血氧采集功能设计与开发_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

任务1心率血氧采集功能设计与开发成都职业技术学院成都卓物科技有限公司任务情报本次任务使用MAX30102是一个典型的心率血氧传感器芯片,由美信(Maxim)公司生产。该传感器搭载在可穿戴系统应用板卡ZW-M607中。如图所示,MAX30102一共有8个引脚,利用I2C总线进行通信,SDA为PC07,SCL为PC08,该模块使用简单的两线I2C接口与微控制器进行通信。它有一个固定的I2C地址:0xAE(用于写操作)和0xAF(用于读操作)。MAX30102嵌入了一个用于存储数据样本的FIFO缓冲器。FIFO具有32个样本存储库,这意味着它可以容纳多达32个SpO2和心率样本。FIFO缓冲区可以减轻微控制器从传感器读取每个新数据样本的负担,从而节省系统功耗。MAX30102FIFO的深度为32,每个buf是6个字节(两通道数据,每通道3字节)。我么可以开启PPG_RDY_EN,这样就能每来一个新的数据,就会中断一次通知我们去取数据。读FIFO_DATA就会自动清掉中断标志位。FIFO相关的寄存器有4个。如图所示,虽然是显示均可读写(R/W),但是实际上只有FIFOReadPointer可以写(应用在读数据出错,往回重读一次的情况)。其他FIFO寄存器均为只读。FIFOWritePointer:好理解,就是写指针寄存器。保存下一个新数据在FIFO中的写地址。每次来一个数据,这个写指针会自动移动一位。OverFlowCounter:如果32个FIFO深度满了,就会在这里增加1,表示溢出。FIFOReadPointer:FIFO读指针,始终指向下一个待读取的FIFO地址。如果数据读取后,读地址也会自动增加。FIFODataRegister:可以简单的理解为*FIFO_RD_PTR,始终指向下一个数据。心率血氧库函数说明打开MAX30102.h文件,定义了心率血氧传感器使用的I2C单元、时钟和超时时间。/*I2Cunitdefine*/#defineMAX30102_I2C_UNIT(CM_I2C3)#defineMAX30102_I2C_FCG(FCG1_PERIPH_I2C3)#defineMAX30102_I2C_TIMEOUT(0xFFFFU)定义了心率血氧传感器I2C地址和长度。//MAX30102IIC器件地址#define MAX30102_IIC_ADDR (0x57)//地址长度#defineMAX30102_ADDR_LEN(1)定义了心率血氧传感器中断引脚PC06。//MAX30102中断引脚#defineMAX30102_INT_PORT(GPIO_PORT_C)#defineMAX30102_INT_PIN(GPIO_PIN_06)相应的I2C引脚定义在BSP_I2C.h文件中,对应修改I2C3的引脚SCL为PC08,SDA为PC07。/*DefineI2C3portandpinforSDAandSCL*/#defineI2C3_SCL_PORT(GPIO_PORT_C)#defineI2C3_SCL_PIN(GPIO_PIN_08)#defineI2C3_SDA_PORT(GPIO_PORT_C)#defineI2C3_SDA_PIN(GPIO_PIN_07)#defineBSP_I2C3_BAUDRATE(100000)心率血氧传感器初始化打开MAX30102.c文件,找到maxim_max30102_init()函数为心率血氧传感器初始化函数,在该函数初始化之前,需要初始化I2C3,否则此函数初始化不成功,在maxim_max30102_init()函数里首先初始化INT引脚,设置为输入模式,开启引脚上拉电阻。stc_gpio_init_tstcGpioInit;(void)GPIO_StructInit(&stcGpioInit);stcGpioInit.u16PinDir=PIN_DIR_IN;//设置输入模式stcGpioInit.u16PullUp=PIN_PU_ON;//开启上拉电阻(void)GPIO_Init(MAX30102_INT_PORT,MAX30102_INT_PIN,&stcGpioInit);复位心率血氧传感器。maxim_max30102_reset();//resetstheMAX30102配置心率血氧传感器相应参数,这些参数是根据官方代码移植过来的,配置的代码过长此处省略。

if(!maxim_max30102_write_reg(REG_INTR_ENABLE_1,0xc0))//INTRsettingreturnFALSE;if(!maxim_max30102_write_reg(REG_INTR_ENABLE_2,0x00))returnFALSE;………………if(!maxim_max30102_write_reg(REG_PILOT_PA,0x7f))//Choosevaluefor~25mAforPilotLEDreturnFALSE;returnTRUE;主要配置了这些参数:中断使能FIFO指针SpO2配置LED电源设置采样率在main函数里先初始化I2C总线,然后初始化maxim_max30102_init()函数,串口初始化是为了后面打印心率和血氧数据。

/*MCUPeripheralregisterswriteunprotected*/LL_PERIPH_WE(LL_PERIPH_ALL);//解除MCU寄存器写保护

BSP_CLK_Init();//时钟初始化

TMR0_USART_Config();//串口接收超时定时器初始化

USART1_Init(57600);//串口1初始化

BSP_I2C3_Init();maxim_max30102_init();//心率血氧初始化

/*MCUPeripheralregisterswriteprotected*/LL_PERIPH_WP(LL_PERIPH_ALL);//MCU寄存器写保护然后在主循环里延时50毫秒一直读取心率血氧数据。

DDL_DelayMS(50);max30102Test();//心率血氧读取温湿度数据测试打开MAX30102.c文件,定义了关于采集心率和血氧的一些参数,该参数有很多,可针对代码慢慢理解。#defineCALCULATE_TIMES4//有效值运算次数#definePPG_DATA_THRESHOLD100000//检测阈值#definen_ir_buffer_length500//定义血氧和心率数据长度/*IRLEDsensordata红外数据,用于计算血氧*/uint32_taun_ir_buffer[n_ir_buffer_length];/*RedLEDsensordata红光数据,用于计算心率曲线以及计算心率*/uint32_taun_red_buffer[n_ir_buffer_length];int32_tn_sp02;//血氧数据int8_tch_spo2_valid;//血氧原始数据int32_tn_heart_rate;//心率数据int8_tch_hr_valid;//心率原始数据uint8_tfinger_touch_flag=0; //采集标志位staticuint8_tcalculate_times=0;int32_tn_heart_rate_array[CALCULATE_TIMES]={0};//心率原始数据数组int32_tn_sp02_array[CALCULATE_TIMES]={0};//血氧原始数据数组看到max30102Test()函数,首先需要在心率血氧传感器INT引脚低电平时读取数据。if(GPIO_ReadInputPins(MAX30102_INT_PORT,MAX30102_INT_PIN)==0)将500个样例心率和血氧数据,移除100个样例,留下400个样例。

for(uint16_ti=100;i<n_ir_buffer_length;i++){aun_red_buffer[i-100]=aun_red_buffer[i];aun_ir_buffer[i-100]=aun_ir_buffer[i];}然后开始采集100个样例心率和血氧数据,在INT引脚低电平时采集数据,一般情况下将手放在心率血氧传感器上,才会把finger_touch_flag标志位置1,采集到的数据此时有效。

//take100setsofsamplesbeforecalculatingtheheartrate.for(uint16_ti=(n_ir_buffer_length-100);i<n_ir_buffer_length;i++){while(GPIO_ReadInputPins(MAX30102_INT_PORT,MAX30102_INT_PIN)==1);//waituntiltheinterruptpinassertsmaxim_max30102_read_fifo((aun_red_buffer+i),(aun_ir_buffer+i));if((aun_red_buffer[i]>PPG_DATA_THRESHOLD)&&(aun_ir_buffer[i]>PPG_DATA_THRESHOLD))finger_touch_flag=1;//置标志位}当采集到的数据有效时,记录有效值次数,并把采集的有效数据存入心率血氧数组中,同时将有效数据打印出来。

if(finger_touch_flag){finger_touch_flag=0;//记录有效值次数

calculate_times++;n_heart_rate_array[calculate_times-1]=n_heart_rate;n_sp02_array[calculate_times-1]=n_sp02;printf("HR=%i,",n_heart_rate);printf("SpO2=%i,\r\n",n_sp02);当记录的有效值大于设定的值后,计算心率和血氧的平均值,此处代码过长省略,请在源文件中查看相应代码。if(calculate_times>CALCULATE_TIMES){………………/*去头尾计算均值*/

heart_rate_average=(n_heart_rate_sum-n_heart_rate_max– n_heart_rate_min)/(CALCULATE_TIMES-2);sp02_average=(n_sp02_sum-n_sp02_max-n_sp02_min)/ (CALCULATE_TIMES-2);printf("HR_average=%d,",heart_rate_average);printf("SpO2_average=%d,\r\n",sp02_average);calculate_times=0;}计算出的平均数据,通过串口打印出来。任务实现第一步: 可穿戴系统应用板卡(ZW-M607)使用12VDC电源供电,插入后按下电源开关。第二步: 使用USB

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论