欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    脉搏血氧饱和度.docx

    • 资源ID:5450388       资源大小:85.17KB        全文页数:21页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    脉搏血氧饱和度.docx

    1、脉搏血氧饱和度脉搏血氧饱和度的测量一、测量值:脉搏血氧饱和度、脉率二、测量原理:以两路光线(红光vs,红外光ir)高频交替照射被测部位,两路透射光经光电转换得到两路变化的光电流信号,两路光电流信号经过放大、去直流、去工频干扰得到两路信号的交流部分,交流部分的平均功率之比即为动脉血的含氧量,通过线性拟合得到脉搏血氧饱和度;其中任何一路信号交流部分即为脉搏波,测得其周期可计算出脉率。三、测量电路及其参数。电路包括三部分:探头驱动电路、光电流放大和去直流电路、计算电路。探头驱动电路实现两路光线由对称的两组三极管构成,与计算电路的两个IO端口和两个DA端口相连,分别控制两路光线的交替开关和幅值。光电流

    2、放大和去直流电路由两级运放构成,一级运放将光电流信号放大为电压信号,这个电压信号包含交流分量和较大的直流分量(分别对应着测量部位的动脉血和其他成分),因此需要二级运放去直流处理。计算电路接受两个运放的输出,作为反馈为探头驱动电路和去直流电路提供参考电压幅值。探头接口说明:1为地线,6、7分别为外屏蔽和内屏蔽线,2为红外光输入正极,红光输入负极,3为红光输入正极,红外光输入负极,9为光电管输出正极,5为光电管输出负极。四、测量流程 基本测量流程如下图。200Hz定时器中断,两路LED交替通断,即1秒内两路光各有100次采样。以红外光这一路为例:每次开启红外光LED,根据OA0输出改变LED的幅度

    3、ir_LED_level(Q3 的基极),根据OA1输出改变去直流电路的直流参考电压ir_dc_offset (OA1的正向输入端),得到的OA1的输出作为计算电路的输入,关灯,原始信号去工频处理后得到ir_heart_signal,数字去直流后得到ir_heart_signal_ac,该信号进入脉搏波周期判断的队列group_caculate64,同时计算ir_heart_signal_ac信号的平方和,并且采样计数,同时进行脉搏周期的判断。数字信号直流跟随可表达为:跟随系数(输入信号-直流分量)+直流分量=更新的直流分量。脉搏周期的判断过程:队列相当于在脉搏波信号上一个滑动的窗口,窗口应有

    4、一定宽度,大于噪声时间,但需小于脉搏周期。判断过程如下:当最小值位置处于窗口中部位置时则判定为一个波谷,检测到波谷以后窗口继续滑过10个采样点,但不再检查最小值,确保上一个波谷已经离开窗口中心,然后继续检查最小值位置确定下一个波谷。可以分为三种状态分别称之为确定波谷、离开波谷、寻找波谷。如下图。利用局部特征实时判断脉搏周期的三个阶段:1)确定波谷,确定周期,计算血氧饱和度和脉率,清空计数;2)离开波谷,开始计数,计算信号平方和;3)寻找波谷,保持计数,计算平方和,确定窗口中最小值位置五、测量程序实现(可参考pulsoximeter.c文件)1、变量设置1)全局参量 根据运放一的输出经AD转化后

    5、判断LED是否过亮过暗,2500到3000之间为合适亮度,否则进行调节,快速调节步长为2,细调步长为1,可根据实际电路修改。/反馈控制LED驱动幅度时的上下界和调节步长#define FIRST_STAGE_TARGET_HIGH 3000#define FIRST_STAGE_TARGET_LOW 2500#define FIRST_STAGE_TARGET_HIGH_FINE 3500#define FIRST_STAGE_TARGET_LOW_FINE 2000#define FIRST_STAGE_STEP 2#define FIRST_STAGE_FINE_STEP 12)全局变量/

    6、脉搏血氧信号,存储脉搏血氧几个处理方法后的值int32_t ir_heart_signal;/红外光,OA1输出经过平均滤波后,等待数字去直流int32_t vs_heart_signal;/ 红光,OA1输出经过平均滤波后,等待数字去直流int32_t ir_heart_signal_ac;/红外光,经过数字去直流,进入计算窗口,参加平方和的累加int32_t vs_heart_signal_ac;/ 红光,经过数字去直流,进入计算窗口,参加平方和的累加int32_t sum_ir_heart_signal_ac = 0;/红外光,信号平方和累加值,一个周期计算平均功率int32_t sum

    7、_vs_heart_signal_ac = 0; /红光,信号平方和累加值,一个周期计算平均功率/计算过程信号int group_wave512;/用于显示,循环队列,存储几个周期内的ir_heart_signal_ac信号int offset_wave = 0;/循环队列队列头int flag_initial = 1;/初始化标志位int sample_count = 0;/采样计数,每个周期清空,重新计数int num_beat = 0;/初始值为1,下一个脉搏后为2,计算平均功率和血氧饱和度,重新置1int flag_jump = 0;/脉搏波周期判断,是否处于离开波谷的状态int sa

    8、mple_jump = 0;/离开波谷时的采样计数,到20则已离开波谷,置0 ,flag_jump 置1/循环队列,以滑动窗口的形式判断当前是否为脉搏波波谷int group_caculate64;/用于脉搏周期判断的循环队列,存储64 个ir_heart_signal_ac信号int offset_caculate = 0;/队列头位置int min;/队列中最小值int location_min;/最小值位置int location_min_adjust;/最小值相对与队列头的位置,如果是32则确认一个波谷/最终结果/脉率unsigned int heart_rate = 6000;/脉率

    9、最终测量结果,初始值为60.00unsigned int group_heart_rate8;/最近8秒内的脉率,循环队列,初始化为6000int offset_heart_rate=0;/队列头unsigned int sample_heart_rate;/脉率当前原始结果,经过一定调整后进入group_heart_rate8int32_t sum_heart_rate;/最近8秒的脉率累加值,除以8得到新的heart_rate/脉搏血氧饱和度unsigned int SpO2 = 9500;/血氧饱和度最终测量结果,初始值为95.00unsigned int group_SpO28; /最

    10、近8秒内的血氧饱和度,循环队列,初始化为9500int offset_SpO2=0;/队列头int32_t sum_SpO2; /最近8秒的血氧饱和度累加值,除以8得到新的heart_rate/控制参数int fresh=0; /调试使用,无意义/反馈控幅和OA1参考电压的参数int led_tab=0; /控制开启红光还是红外光,每次中断切换状态int ir_LED_level;/ir驱动幅度,控制Q3基极,范围1到2500,数字越大,亮度越弱int vs_LED_level;/vs驱动幅度,控制Q4基极,范围1到4095,数字越大,亮度越弱int ir_dc_offset = 4095;/

    11、ir灯直流参考电压,开启红外LED时,控制OA1正向输入端int vs_dc_offset = 4095;/ /vs灯直流参考电压,开启红光LED时,控制OA1正向输入端int ir_dc_offset_second = 0;/数字去直流时的直流跟随量int vs_dc_offset_second = 0; /数字去直流时的直流跟随量/运放输出的输出int ir_sample;/ir灯,OA0的输出,根据该输出改变ir_LED_levelint vs_sample;/vs灯,OA0的输出,根据该输出改变vs_LED_level3)子函数unsigned long isqrt32(registe

    12、r unsigned long h);/开方运算int16_t ir_filter_test(int16_t sample);/平均滤波器_红外int16_t vs_filter_test(int16_t sample);/平均滤波器_红光2、程序主体(请参照pulsoximeter.c文件)1)晶振、电源设置2)初始化操作:group_heart_rate8初始化为6000,sum_heart_rate 初始化为48000,group_SpO28初始化为9500,sum_SpO2初始化为76000。3)DAC设置,ir_LED_level初始化为2500,vs_LED_level初始化为90

    13、0。ADC设置。定时器设置,200Hz采样中断,1600Hz用于PWM输出。4)设置完,进入低功耗模式5)中断处理程序,200Hz中断,中断进入后或者进入红光LED流程,或者进入红外LED流程,都要根据输入调整相应参数,进行平均滤波,去直流处理。两种流程其他计算上有所不同:在红光流程中主要进行两路信号平方和累加、采样计数、脉搏血氧饱和度和脉率的计算;红外流程里主要进行的是脉搏周期的判断。两个流程的具体操作如下。红光流程:关闭两路灯,设置参数,开启红光LED,读取输入,关闭红光LED,根据输入调整参数,平均滤波,去直流,循环队列更新,是否处于找到波谷的状态(num_beat由1变为2,找到,否则

    14、未找到),未找到则计算两路平方和,采样计数累加,找到则计算脉搏血氧饱和度和脉率,平方和、采样计数置0。红外流程:关闭两路灯,设置参数,开启红光LED,读取输入,关闭红光LED,根据输入调整参数,平均滤波,去直流,循环队列更新,是否处于离开波谷的状态(flag_jump=0时为寻找状态,flag_jump=0时为离开状态),寻找状态找到循环队列中最小值及位置,判断是否波谷,不是波谷继续寻找,是波谷则进入离开状态,离开状态仅计数,计数满20次进入寻找状态。中断程序代码如下所示:/红光流程if(led_tab=0)/ led_tab=0,打开红光LED led_tab=1;/切换led_tab,下一

    15、次进入红外流程 P2OUT |= BIT2;/关灯 P2OUT |= BIT3;/关灯 DAC12_0CTL &= DAC12ENC;/开启DAC,根据vs_LED_level给出幅度 DAC12_0CTL &= DAC12OPS; DAC12_0CTL |= DAC12ENC; DAC12_0DAT = vs_LED_level;/红光LED驱动幅度 DAC12_1DAT = vs_dc_offset;/红光去直流电路的参考电压,OA1正向输入 P2OUT &= BIT3;/开灯,红光LED ADC12CTL0 &= ENC;/开启DAC,读取OA0、OA1输出 ADC12CTL0 |= E

    16、NC; for(m=1;m=FIRST_STAGE_TARGET_HIGH|vs_sample= FIRST_STAGE_TARGET_HIGH) if (vs_sample = FIRST_STAGE_TARGET_HIGH_FINE) vs_LED_level += FIRST_STAGE_STEP; else vs_LED_level += FIRST_STAGE_FINE_STEP; if (vs_LED_level = 4095) vs_LED_level = 4095; else if (vs_sample = FIRST_STAGE_TARGET_LOW_FINE) vs_LED

    17、_level -= FIRST_STAGE_STEP; else vs_LED_level -= FIRST_STAGE_FINE_STEP; if (vs_LED_level = 4095) if (vs_dc_offset 0) vs_dc_offset-; else if (i 100) if (vs_dc_offset 7);/数字直流跟随 vs_heart_signal_ac = vs_heart_signal - vs_dc_offset_second;/去直流 group_waveoffset_wave = ir_heart_signal_ac+4000; /加4000保证脉搏波

    18、信号为正 offset_wave = (offset_wave + 1) & 0x1ff; /循环队列更新,用于显示 group_caculateoffset_caculate = ir_heart_signal_ac;/循环队列更新,用于脉搏判断 offset_caculate = (offset_caculate + 1) & 0x3f; if(num_beat=1)/ num_beat是否为1 sample_count+;/采样计数 /两路信号平方和累加 sum_vs_heart_signal_ac += (vs_heart_signal_ac * vs_heart_signal_ac)

    19、10); sum_ir_heart_signal_ac += (ir_heart_signal_ac * ir_heart_signal_ac)10); if(num_beat=2) / num_beat是否为2,为2表示找到一个新的波谷 int32_t x = isqrt32(sum_vs_heart_signal_ac);/平方和开方 int32_t y = isqrt32(sum_ir_heart_signal_ac);/平方和开方 int32_t w = 100 * x / y;/平均功率之比R100 sum_SpO2 -= group_SpO2offset_SpO2;/8秒内血氧饱和

    20、度之和减去8秒前的值 /计算当先新的脉搏血氧饱和度,拟合公式110-25R,R为平均功率之比 group_SpO2offset_SpO2 = 11000 - 25 * w; /调整新的脉搏血氧饱和度,变化不能超过3个百分点,范围在85到100之间 if(group_SpO2offset_SpO2(group_SpO2(offset_SpO2-1)&0x07+300) group_SpO2offset_SpO2 = group_SpO2(offset_SpO2-1)&0x07+300; else if(group_SpO2offset_SpO210000) group_SpO2offset_Sp

    21、O2 = 10000; else if(group_SpO2offset_SpO28500) group_SpO2offset_SpO2 = 8500; else sum_SpO2 += group_SpO2offset_SpO2; /8秒内血氧饱和度之和加上当前的值 offset_SpO2 = (offset_SpO2+1) & 0x07; SpO2=sum_SpO2/8;/计算平均值,得到最终结果 /清空计数和变量重置 sum_vs_heart_signal_ac = 0;/平方和累加值置零 sum_ir_heart_signal_ac = 0; /平方和累加值置零 /脉率的计算 samp

    22、le_heart_rate = 600000 / sample_count;/由脉搏周期换算成脉率 num_beat = 1;/脉搏计数重置成1 sample_count = 0;/采样计数置0 if(sample_heart_rate18000)/明显错误的结果 else /8秒内脉率之和减去8秒前的值 sum_heart_rate -= group_heart_rateoffset_heart_rate; /循环队列更新,得到当前脉率 group_heart_rateoffset_heart_rate = sample_heart_rate;/8秒内脉率之和加上当前值 sum_heart_

    23、rate += group_heart_rateoffset_heart_rate; offset_heart_rate = (offset_heart_rate+1) & 0x07; /求平均值,为脉率最终结果 heart_rate=sum_heart_rate/8; fresh=1; /红外流程else /前面部分与红光部分一致,关灯,设置参数,开灯,读取运放输出,关灯,平均滤波,去/直流,不再做注释,注释的主要是脉搏周期的判断部分 led_tab=0; P2OUT |= BIT2;/关灯 P2OUT |= BIT3;/关灯 DAC12_0CTL &= DAC12ENC; DAC12_0C

    24、TL |= DAC12OPS; DAC12_0CTL |= DAC12ENC; DAC12_0DAT = ir_LED_level;/红外LED驱动幅度 DAC12_1DAT = ir_dc_offset;/OA1输入参考电压 P2OUT &= BIT2;/开灯 ADC12CTL0 &= ENC; ADC12CTL0 |= ENC; for(m=1;m= FIRST_STAGE_TARGET_HIGH | ir_sample = FIRST_STAGE_TARGET_HIGH) if (ir_sample = FIRST_STAGE_TARGET_HIGH_FINE) ir_LED_level

    25、 += FIRST_STAGE_STEP; else ir_LED_level += FIRST_STAGE_FINE_STEP; if (ir_LED_level = 2500) ir_LED_level = 2500; else if (ir_sample = FIRST_STAGE_TARGET_LOW_FINE) ir_LED_level -= FIRST_STAGE_STEP; else ir_LED_level -= FIRST_STAGE_FINE_STEP; if (ir_LED_level = 4095) if (ir_dc_offset 0) ir_dc_offset-;

    26、else if (i 100) if (ir_dc_offset 7); ir_heart_signal_ac = ir_heart_signal - ir_dc_offset_second; /是否为程序启动状态,此时flag_initial = 1 if(flag_initial = 1) if(offset_wave=500) flag_initial=0; else/脉搏周期的判断 if(flag_jump=0)/ flag_jump=0,表示处在寻找波谷状态 sample_jump = 0;/ 离开波谷时的采样计数置0 /寻找group_caculate 64循环队列中的最小值及其位置min = group_caculate0; location_min = 0; for(int i=1;i64;i+) if(mingroup_caculatei) min = group_caculatei; location_min = i


    注意事项

    本文(脉搏血氧饱和度.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开