基于MAX30100和stm32的血氧检测系统

编程入门 行业动态 更新时间:2024-10-14 02:19:38

基于MAX30100和stm32的血氧<a href=https://www.elefans.com/category/jswz/34/1756862.html style=检测系统"/>

基于MAX30100和stm32的血氧检测系统

参考资料

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6ruMH93P-1578563433204)(http://139.199.225.16/blog_pic/2017_03_10/system_block.jpg)]

  • 这里有一篇TI的测血氧文档.pdf,其中的给的测血氧的公式没怎么看懂,关键怎么通过这公式得到血氧的含量的
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8cX5Iary-1578563433206)(http://139.199.225.16/blog_pic/2017_03_10/R_SaO2.jpg)]

MX30100的使用

  1. 通讯是标准的I2C通讯,在通讯过程中要注意一点,就是在进行读操作时,读出一个寄存器值后给予ACK,读寄存器的指针会自动加一,但有一个寄存器例外就是FIFO寄存器(0x05)。
    Datasheet上有一段*“Reading the FIFO_DATA register does not automatically increment the register address; burst reading this register readsthe same address over and over. Each sample is 4 bytes of data, so this register has to be read 4 times to get one sample.
    The other exception is 0xFF, reading more bytes after the 0xFF register does not advance the address pointer back to0x00, and the data read is not meaningful”*
  2. 两个LED的电流不要设成最大的值,否则读出来的值都是0xffff。

数据的处理

心率

  1. 在实际操作中发现,使用IR(红外)读出的心跳值(AC Component)会比较偏大,所以使用IR读出的数据作为测心率的标准。

  2. 初始数据读出如下图,注意纵坐标,交流部分只占直流的很少一部分

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XM0hMMxx-1578563433208)(http://139.199.225.16/blog_pic/2017_03_10/DataBeforeProcess.jpg)]

  1. 滤波一开始采用带通滤波器的方法,目的是滤掉直流部分和交流部分中心率波上面的毛刺可是发现不理想(带通滤波器参数 fs = 100Hz, fls = 0.8Hz, fhs = 2.5Hz, 四阶IIR),选这个参数是因为心跳频率一般在1Hz-2Hz之间。估计是采样频率太低了,但是stm32f103的性能满足不了更高采样率的滤波器, 以后用更高性能的芯片试试。

  2. 后来直接区512点的滑动平均求的直流分量,原始数据减去直流分量就得出交流分量,如下图
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LgWMZ6gL-1578563433211)(http://139.199.225.16/blog_pic/2017_03_10/DataAfterAve.jpg)]
    做个峰值检测就得到心率

血氧

  1. 应该需要进行定标的工作,只根据公式简单写出算法。

stm32滤波器的使用(官方DSP库的使用)

  1. arm_biquad_cascade_df1_q31(…)这次使用直接I型的IIR滤波器函数,用Matlab的Fdatool求出sos(安富莱教程), 然后将参数写入滤波器初始化函数中就行。注意因为使用的Q31格式,参数也必须是Q31格式,必须将参数缩小到Q31格式能表示的范围内。还要注意的就是输入序列,其值的范围必须在【-0.25 +0.25)中,因为官方库有这样一段话(In order to avoid overflows completely the input signal must be scaled down by 2 bits and lie in the range [-0.25 +0.25).)。

  2. 附上一个Matlab 滤波器 与 MCU 滤波器的比较Matlab程序。

    function [X1, X2, X3] = MCU_Filter_Test(sos, xin, ymcu, Len)
    %MCU Filter Test
    [b, a] = sos2tf(sos);
    y = filter(b, a, xin);
    X1 = fft(xin); X2 = fft(y); X3 = fft(ymcu);
    n = [0 : Len - 1];subplot(3,2,1);
    plot(n, xin);title('xin');
    subplot(3,2,2);
    plot(n, abs(X1));title('xin-fft');
    subplot(3,2,3);
    plot(n, y);title('y');
    subplot(3,2,4);
    plot(n, abs(X2));title('y-fft');
    subplot(3,2,5);
    plot(n, ymcu);title('ymcu');
    subplot(3,2,6);
    plot(n, abs(X3));title('ymcu-fft');
    

系统程序

因为已经转行做软件了,所以将所有的代码公开。当初这个系统是在大学的时候做的,是帮的做毕业设计。

CSDN 下载 基于MAX30100和stm32的血氧检测系统。

更多推荐

基于MAX30100和stm32的血氧检测系统

本文发布于:2024-02-11 19:39:50,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1682985.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:检测系统

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!