当前位置:   article > 正文

使用STM32与MAX30102实现的较为稳定的血氧算法_max30102心率血氧传感器稳定算法

max30102心率血氧传感器稳定算法

        现阶段网络上的算法读出的血氧值较为不稳定,且许多情况下无法得出有效值,本算法的原理见:MAX30102 血氧调试笔记_Yulong_u012183892-CSDN博客_max30102

        为了控制传感器采样的速率,算法在定时器中实现,可以灵活调整采样速率达到更好的效果。定时器中段的服务函数如下:

  1. //定时器3中断服务程序 读入数据处理
  2. void TIM3_IRQHandler(void) //TIM3中断
  3. {
  4. if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
  5. {
  6. TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
  7. max30102_read_fifo();//数据读入
  8. i++;//记录周期数
  9. int temp=fifo_ir;
  10. int temp2=fifo_red;
  11. while(temp+temp2<20000){//未检测出手指时代码会在此处跑死,原因为拟合函数只在检测到手指时有效
  12. printf("未检测出手指\r\n");
  13. max30102_read_fifo();
  14. temp=fifo_ir;
  15. temp2=fifo_red;
  16. }
  17. if(i==0){//周期数值初始
  18. max=temp;
  19. min=temp;
  20. max2=temp2;
  21. min2=temp2;
  22. }
  23. //取得周期内最大最小数据
  24. if(max<temp){
  25. max=temp;
  26. }
  27. if(min>temp){
  28. min=temp;
  29. }
  30. if(max2<temp2){
  31. max2=temp2;
  32. }
  33. if(min2>temp2){
  34. min2=temp2;
  35. }
  36. if(i>=39){//39数据为1周期
  37. i=0;
  38. ac=max-min;//单个周期内最大最小数据差为交流分量
  39. dc=min; //数据=直流分量+交流分量
  40. ac2=max2-min2;//同理
  41. dc2=min2;
  42. max=temp;
  43. min=temp;
  44. max2=temp2;
  45. min2=temp2;
  46. }
  47. }
  48. }

取得ac,dc,ac2,dc2后可以由主函数中的代码

  1. //结果生成,数据较为稳定,开头几个数据可以不要,比较不稳
  2. ac_ir=(float)ac;//注意转换,否则无法赋值
  3. dc_ir=(float)dc;
  4. ac_red=(float)ac2;
  5. dc_red=(float)dc2;
  6. R2=(ac_red* dc_ir)/(ac_ir*dc_red);
  7. SPO2 =-45.060*R2*R2+ 30.354 *R2 + 94.845;

 得出较为稳定的血氧结果,串口输出结果如下图所示:

第一列数字为检测出的血氧饱和度,第二列为计算出的R2值,在手指移开时的结果如下图所示:

 全部代码见:MAX30102与STM32的血氧检测算法-硬件开发文档类资源-CSDN下载

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/401526
推荐阅读
相关标签
  

闽ICP备14008679号