一、为什么会做?
最近看到价格飞涨的血氧仪,又在采购中发现有血氧传感器(MAX30102)并且价格不贵,于是买下了一个打算自己做一个血氧仪。
二、失败在哪?
在下载例程代码,在正点原子STM32F103ZET6上跑起来后,发现获得的数据并不理想,甚至数据就像随机生成的。重读数据手册后也没找到问题所在,我猜测是REG_LED1_PA、REG_LED2_PA、REG_PILOT_PA这三个寄存器赋值大小的问题。
三、代码移植
把IIc相关代码改换成自己的IIc就行了。
algorithm.c里面包含了数据计算函数。myiic.c包含了模拟iic的函数对照着这个更改就行。MAX30102.c包含的是对传感器读写,初始化的函数不需要更改。
四、寄存器设置及初始化
max30102_GPIO_Init();//初始化INT引脚
if(maxim_max30102_write_reg(REG_INTR_ENABLE_1,0xc0)) // 终端设置
return -1;
if(maxim_max30102_write_reg(REG_INTR_ENABLE_2,0x00))//温度相关
return -1;
if(maxim_max30102_write_reg(REG_FIFO_WR_PTR,0x00)) //FIFO_WR_PTR[4:0] //建议在试用前清零
return -1;
if(maxim_max30102_write_reg(REG_OVF_COUNTER,0x00)) //OVF_COUNTER[4:0]//建议在试用前清零
return -1;
if(maxim_max30102_write_reg(REG_FIFO_RD_PTR,0x00)) //FIFO_RD_PTR[4:0]//建议在试用前清零
return -1;
if(maxim_max30102_write_reg(REG_FIFO_CONFIG,0x0f)) //sample avg = 1, fifo rollover=-1, fifo almost full = 17
return -1;
if(maxim_max30102_write_reg(REG_MODE_CONFIG,0x03)) 选择不同的检测内容//0x02 for Red only, 0x03 for SpO2 mode 0x07 multimode LED
return -1;
if(maxim_max30102_write_reg(REG_SPO2_CONFIG,0x20)) // 设置adc精度检测速度在数据手册也有如何选择
return -1;
if(maxim_max30102_write_reg(REG_LED1_PA,0x27)) //LED1RED的电流值越大电流越大数据手册有值对应的电流大小
return -1;
if(maxim_max30102_write_reg(REG_LED2_PA,0x27)) // LED2IR的电流值越大电流越大数据手册有值对应的电流大小
return -1;
if(maxim_max30102_write_reg(REG_PILOT_PA,0x7f)) // 也是设置电流但是我没搞懂这个的具体涵义以下是机翻:PILOT _ PA [7:0]的目的是在接近模式和多 LED 模式下设置 LED 电源。
return -1;
return 0; //返回成功
如果有大佬做出来是好的希望能指点一下我。