脉搏血氧饱和度Word文档格式.docx

上传人:b****4 文档编号:7413914 上传时间:2023-05-08 格式:DOCX 页数:21 大小:85.17KB
下载 相关 举报
脉搏血氧饱和度Word文档格式.docx_第1页
第1页 / 共21页
脉搏血氧饱和度Word文档格式.docx_第2页
第2页 / 共21页
脉搏血氧饱和度Word文档格式.docx_第3页
第3页 / 共21页
脉搏血氧饱和度Word文档格式.docx_第4页
第4页 / 共21页
脉搏血氧饱和度Word文档格式.docx_第5页
第5页 / 共21页
脉搏血氧饱和度Word文档格式.docx_第6页
第6页 / 共21页
脉搏血氧饱和度Word文档格式.docx_第7页
第7页 / 共21页
脉搏血氧饱和度Word文档格式.docx_第8页
第8页 / 共21页
脉搏血氧饱和度Word文档格式.docx_第9页
第9页 / 共21页
脉搏血氧饱和度Word文档格式.docx_第10页
第10页 / 共21页
脉搏血氧饱和度Word文档格式.docx_第11页
第11页 / 共21页
脉搏血氧饱和度Word文档格式.docx_第12页
第12页 / 共21页
脉搏血氧饱和度Word文档格式.docx_第13页
第13页 / 共21页
脉搏血氧饱和度Word文档格式.docx_第14页
第14页 / 共21页
脉搏血氧饱和度Word文档格式.docx_第15页
第15页 / 共21页
脉搏血氧饱和度Word文档格式.docx_第16页
第16页 / 共21页
脉搏血氧饱和度Word文档格式.docx_第17页
第17页 / 共21页
脉搏血氧饱和度Word文档格式.docx_第18页
第18页 / 共21页
脉搏血氧饱和度Word文档格式.docx_第19页
第19页 / 共21页
脉搏血氧饱和度Word文档格式.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

脉搏血氧饱和度Word文档格式.docx

《脉搏血氧饱和度Word文档格式.docx》由会员分享,可在线阅读,更多相关《脉搏血氧饱和度Word文档格式.docx(21页珍藏版)》请在冰点文库上搜索。

脉搏血氧饱和度Word文档格式.docx

//反馈控制LED驱动幅度时的上下界和调节步长

#defineFIRST_STAGE_TARGET_HIGH3000

#defineFIRST_STAGE_TARGET_LOW2500

#defineFIRST_STAGE_TARGET_HIGH_FINE3500

#defineFIRST_STAGE_TARGET_LOW_FINE2000

#defineFIRST_STAGE_STEP2

#defineFIRST_STAGE_FINE_STEP1

2)全局变量

//脉搏血氧信号,存储脉搏血氧几个处理方法后的值

int32_tir_heart_signal;

//红外光,OA1输出经过平均滤波后,等待数字去直流

int32_tvs_heart_signal;

//红光,OA1输出经过平均滤波后,等待数字去直流

int32_tir_heart_signal_ac;

//红外光,经过数字去直流,进入计算窗口,参加平方和的累加

int32_tvs_heart_signal_ac;

//红光,经过数字去直流,进入计算窗口,参加平方和的累加

int32_tsum_ir_heart_signal_ac=0;

//红外光,信号平方和累加值,一个周期计算平均功率

int32_tsum_vs_heart_signal_ac=0;

//红光,信号平方和累加值,一个周期计算平均功率

//计算过程信号

intgroup_wave[512];

//用于显示,循环队列,存储几个周期内的ir_heart_signal_ac信号

intoffset_wave=0;

//循环队列队列头

intflag_initial=1;

//初始化标志位

intsample_count=0;

//采样计数,每个周期清空,重新计数

intnum_beat=0;

//初始值为1,下一个脉搏后为2,计算平均功率和血氧饱和度,重新置1

intflag_jump=0;

//脉搏波周期判断,是否处于离开波谷的状态

intsample_jump=0;

//离开波谷时的采样计数,到20则已离开波谷,置0,flag_jump置1

//循环队列,以滑动窗口的形式判断当前是否为脉搏波波谷

intgroup_caculate[64];

//用于脉搏周期判断的循环队列,存储64个ir_heart_signal_ac信号

intoffset_caculate=0;

//队列头位置

intmin;

//队列中最小值

intlocation_min;

//最小值位置

intlocation_min_adjust;

//最小值相对与队列头的位置,如果是32则确认一个波谷

//最终结果

//脉率

unsignedintheart_rate=6000;

//脉率最终测量结果,初始值为60.00

unsignedintgroup_heart_rate[8];

//最近8秒内的脉率,循环队列,初始化为6000

intoffset_heart_rate=0;

//队列头

unsignedintsample_heart_rate;

//脉率当前原始结果,经过一定调整后进入group_heart_rate[8]

int32_tsum_heart_rate;

//最近8秒的脉率累加值,除以8得到新的heart_rate

//脉搏血氧饱和度

unsignedintSpO2=9500;

//血氧饱和度最终测量结果,初始值为95.00

unsignedintgroup_SpO2[8];

//最近8秒内的血氧饱和度,循环队列,初始化为9500

intoffset_SpO2=0;

int32_tsum_SpO2;

//最近8秒的血氧饱和度累加值,除以8得到新的heart_rate

//控制参数

intfresh=0;

//调试使用,无意义

//反馈控幅和OA1参考电压的参数

intled_tab=0;

//控制开启红光还是红外光,每次中断切换状态

intir_LED_level;

//ir驱动幅度,控制Q3基极,范围1到2500,数字越大,亮度越弱

intvs_LED_level;

//vs驱动幅度,控制Q4基极,范围1到4095,数字越大,亮度越弱

intir_dc_offset=4095;

//ir灯直流参考电压,开启红外LED时,控制OA1正向输入端

intvs_dc_offset=4095;

///vs灯直流参考电压,开启红光LED时,控制OA1正向输入端

intir_dc_offset_second=0;

//数字去直流时的直流跟随量

intvs_dc_offset_second=0;

//数字去直流时的直流跟随量

//运放输出的输出

intir_sample;

//ir灯,OA0的输出,根据该输出改变ir_LED_level

intvs_sample;

//vs灯,OA0的输出,根据该输出改变vs_LED_level

3)子函数

unsignedlongisqrt32(registerunsignedlongh);

//开方运算

int16_tir_filter_test(int16_tsample);

//平均滤波器_红外

int16_tvs_filter_test(int16_tsample);

//平均滤波器_红光

2、程序主体(请参照pulsoximeter.c文件)

1)晶振、电源设置

2)初始化操作:

group_heart_rate[8]初始化为6000,sum_heart_rate初始化为48000,group_SpO2[8]初始化为9500,sum_SpO2初始化为76000。

3)DAC设置,ir_LED_level初始化为2500,vs_LED_level初始化为900。

ADC设置。

定时器设置,200Hz采样中断,1600Hz用于PWM输出。

4)设置完,进入低功耗模式

5)中断处理程序,200Hz中断,中断进入后或者进入红光LED流程,或者进入红外LED流程,都要根据输入调整相应参数,进行平均滤波,去直流处理。

两种流程其他计算上有所不同:

在红光流程中主要进行两路信号平方和累加、采样计数、脉搏血氧饱和度和脉率的计算;

红外流程里主要进行的是脉搏周期的判断。

两个流程的具体操作如下。

红光流程:

关闭两路灯,设置参数,开启红光LED,读取输入,关闭红光LED,根据输入调整参数,平均滤波,去直流,循环队列更新,是否处于找到波谷的状态(num_beat由1变为2,找到,否则未找到),未找到则计算两路平方和,采样计数累加,找到则计算脉搏血氧饱和度和脉率,平方和、采样计数置0。

红外流程:

关闭两路灯,设置参数,开启红光LED,读取输入,关闭红光LED,根据输入调整参数,平均滤波,去直流,循环队列更新,是否处于离开波谷的状态(flag_jump==0时为寻找状态,flag_jump==0时为离开状态),寻找状态找到循环队列中最小值及位置,判断是否波谷,不是波谷继续寻找,是波谷则进入离开状态,离开状态仅计数,计数满20次进入寻找状态。

中断程序代码如下所示:

//红光流程

if(led_tab==0)//led_tab==0,打开红光LED

{

led_tab=1;

//切换led_tab,下一次进入红外流程

P2OUT|=BIT2;

//关灯

P2OUT|=BIT3;

DAC12_0CTL&

=~DAC12ENC;

//开启DAC,根据vs_LED_level给出幅度

=~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|=ENC;

for(m=1;

m<

=1500;

m++)//伪循环提供DAC转换时间,红光LED保持开

}

vs_sample=ADC12MEM0;

//OA0输出结果

i=ADC12MEM1;

//OA1输出结果

//OA0输出,根据全局参量控制LED的驱动幅度

if(vs_sample>

=FIRST_STAGE_TARGET_HIGH||vs_sample<

=FIRST_STAGE_TARGET_LOW)

if(vs_sample>

=FIRST_STAGE_TARGET_HIGH)

=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;

if(vs_sample<

=FIRST_STAGE_TARGET_LOW_FINE)

vs_LED_level-=FIRST_STAGE_STEP;

vs_LED_level-=FIRST_STAGE_FINE_STEP;

if(vs_LED_level<

=1)

vs_LED_level=1;

//OA1输出,控制OA1输入的参考电压

if(i>

if(vs_dc_offset>

0)

vs_dc_offset--;

elseif(i<

100)

if(vs_dc_offset<

4095)

vs_dc_offset++;

//关闭DAC

_NOP();

//实时处理

vs_heart_signal=vs_filter_test(i);

//OA1输出,平均滤波处理

vs_dc_offset_second+=((vs_heart_signal-vs_dc_offset_second)>

>

7);

//数字直流跟随

vs_heart_signal_ac=vs_heart_signal-vs_dc_offset_second;

//去直流

group_wave[offset_wave]=ir_heart_signal_ac+4000;

//加4000保证脉搏波信号为正

offset_wave=(offset_wave+1)&

0x1ff;

//循环队列更新,用于显示

group_caculate[offset_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)>

10);

sum_ir_heart_signal_ac+=((ir_heart_signal_ac*ir_heart_signal_ac)>

=2)//num_beat是否为2,为2表示找到一个新的波谷

int32_tx=isqrt32(sum_vs_heart_signal_ac);

//平方和开方

int32_ty=isqrt32(sum_ir_heart_signal_ac);

int32_tw=100*x/y;

//平均功率之比R×

100

sum_SpO2-=group_SpO2[offset_SpO2];

//8秒内血氧饱和度之和减去8秒前的值

//计算当先新的脉搏血氧饱和度,拟合公式110-25×

R,R为平均功率之比

group_SpO2[offset_SpO2]=11000-25*w;

//调整新的脉搏血氧饱和度,变化不能超过3个百分点,范围在85到100之间

if(group_SpO2[offset_SpO2]>

(group_SpO2[(offset_SpO2-1)&

0x07]+300))

group_SpO2[offset_SpO2]=group_SpO2[(offset_SpO2-1)&

0x07]+300;

elseif(group_SpO2[offset_SpO2]<

0x07]-300))

0x07]-300;

10000)

group_SpO2[offset_SpO2]=10000;

8500)

group_SpO2[offset_SpO2]=8500;

sum_SpO2+=group_SpO2[offset_SpO2];

//8秒内血氧饱和度之和加上当前的值

offset_SpO2=(offset_SpO2+1)&

0x07;

SpO2=sum_SpO2/8;

//计算平均值,得到最终结果

//清空计数和变量重置

sum_vs_heart_signal_ac=0;

//平方和累加值置零

sum_ir_heart_signal_ac=0;

//平方和累加值置零

//脉率的计算

sample_heart_rate=600000/sample_count;

//由脉搏周期换算成脉率

num_beat=1;

//脉搏计数重置成1

sample_count=0;

//采样计数置0

if(sample_heart_rate<

1000||sample_heart_rate>

18000)//明显错误的结果

//8秒内脉率之和减去8秒前的值

sum_heart_rate-=group_heart_rate[offset_heart_rate];

//循环队列更新,得到当前脉率

group_heart_rate[offset_heart_rate]=sample_heart_rate;

//8秒内脉率之和加上当前值

sum_heart_rate+=group_heart_rate[offset_heart_rate];

offset_heart_rate=(offset_heart_rate+1)&

//求平均值,为脉率最终结果

heart_rate=sum_heart_rate/8;

fresh=1;

//红外流程

else

//前面部分与红光部分一致,关灯,设置参数,开灯,读取运放输出,关灯,平均滤波,去//直流,不再做注释,注释的主要是脉搏周期的判断部分

led_tab=0;

DAC12_0CTL|=DAC12OPS;

DAC12_0DAT=ir_LED_level;

//红外LED驱动幅度

DAC12_1DAT=ir_dc_offset;

//OA1输入参考电压

=~BIT2;

//开灯

m++)

ir_sample=ADC12MEM0;

//OA0输出,用以控制LED驱动幅度

//OA1输出,初始未处理的信号

j=ADC12MEM2;

k=ADC12MEM3;

//OA0输出,控制LED驱动幅度

if(ir_sample>

=FIRST_STAGE_TARGET_HIGH||ir_sample<

ir_LED_level+=FIRST_STAGE_STEP;

ir_LED_level+=FIRST_STAGE_FINE_STEP;

if(ir_LED_level>

=2500)

ir_LED_level=2500;

if(ir_sample<

ir_LED_level-=FIRST_STAGE_STEP;

ir_LED_level-=FIRST_STAGE_FINE_STEP;

if(ir_LED_level<

ir_LED_level=1;

if(ir_dc_offset>

ir_dc_offset--;

100)

if(ir_dc_offset<

ir_dc_offset++;

T_body_signal=j;

T_enviroment_signal=k;

ir_heart_signal=ir_filter_test(i);

//初始信号滤波处理

ir_dc_offset_second+=((ir_heart_signal-ir_dc_offset_second)>

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;

{

//脉搏周期的判断

if(flag_jump==0)//flag_jump==0,表示处在寻找波谷状态

sample_jump=0;

//离开波谷时的采样计数置0

//寻找group_caculate[64]循环队列中的最小值及其位置

min=group_caculate[0];

location_min=0;

for(inti=1;

i<

64;

i++)

if(min<

group_caculate[i])

min=group_caculate[i];

location_min=i

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 外语学习 > 日语学习

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

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