手环项目嵌入式软件需求说明书

上传人:jin****ng 文档编号:75326002 上传时间:2022-04-15 格式:DOC 页数:16 大小:184.50KB
返回 下载 相关 举报
手环项目嵌入式软件需求说明书_第1页
第1页 / 共16页
手环项目嵌入式软件需求说明书_第2页
第2页 / 共16页
手环项目嵌入式软件需求说明书_第3页
第3页 / 共16页
亲,该文档总共16页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
项目名称:手环系统嵌入式软件实现方案说明书慧创科技(北京)有限公司有关该文档:此文档的内容包括手环系统嵌入式软件实现方案说明书。文档所有者:慧创科技(北京)有限公司文档版本记录:版本号负责人:完成时间备注1.0石聪2014-12-8目录1. 系统功能框架42. 系统分模块功能实现方案 42.1计步和跌倒功能实现方案 422心率功能实现方案 91. 系统功能框架手环fW计步跌倒心率2. 系统分模块功能实现方案2.1计步和跌倒功能实现方案功能:1. 能对用户运动时所走的路程进行计步。2. 能准确的判断用户是否发生跌倒。算法(1)算法流程图(2)算法的具体实现方案加速度数据处理代码void Update_StepFallByAcc()先通过I2c从mma加速度芯片中获取当前的加速度。l2c_readBytes(MMA_l2C_ADDR,1,6,accVals);由于加速度芯片传来的16位数据精度太高,我们在实际应用时没必要那么高的精度,并且16位的数据将带来很大的计算量,因此我们将采集来的16位原始数据简化为无符号的8位数据。采集来的16位原始数据简化为无符号的8位数据的代码如下:for( uTemp = 0 ; uTemp=0X80)&(accValsg_StepCtrl.uTemp1!=0X7F) accValsg_StepCtrl.uTemp1+;g_StepCtrl.accValShortuTemp = accValsg_StepCtrl.uTemp1;if( g_StepCtrl.accValShortuTemp=0X80 )g_StepCtrl.accValShortuTemp -= 256;为了减小计算量,又能准确可靠的计步和判断用户是否跌倒,程序中采用了平方和这个特征值,计算 X、Y、Z方向加速度的平方和的代码如下:g_StepCtrl.accAII_pf = g_StepCtrl.accValShort0*g_StepCtrl.accValShort0 + g_StepCtrl.accValShort1*g_StepCtrl.accValShort1 + g_StepCtrl.accValShort2*g_StepCtrl.accValShort2;/滤波算法采用的是平均值滤波算法平均值滤波算法如下:g_StepCtrl.accAII_pf_pj = 0;for(uTemp = 0 ; uTemp2 ; uTemp+)g_StepCtrl.accAII_pf_ysuTemp = g_StepCtrl.accAII_pf_ysuTemp+1; g_StepCtrl.accAII_pf_pj += g_StepCtrl.accAII_pf_ysuTemp;g_StepCtrl.accAII_pf_ys2 = g_StepCtrl.accAII_pf;g_StepCtrl.accAII_pf_pj += g_StepCtrl.accAII_pf;for(uTemp = 0 ; uTemp10 ; uTemp+)g_StepCtrl.accAII_pf_lbuTemp = g_StepCtrl.accAII_pf_lbuTemp+1;g_StepCtrl.accAII_pf_lb10 = g_StepCtrl.accAII_pf_pj/3;500的时候,即经分析,当特征值出现一个波峰且这个波峰与其前面最近的一个波谷数据的差值大于 可以认为用户走了一步,计步判断代码:g_StepCtrl.stateO=O;if(g_StepCtrl.accAII_pf_lb5=g_StepCtrl.accAII_pf_lb4) &(g_StepCtrl.accAII_pf_lb5 =g_StepCtrl.accAII_pf_lb3) &(g_StepCtrl.accAII_pf_lb5 =g_StepCtrl.accAII_pf_lb2) &(g_StepCtrl.accAII_pf_lb5 =g_StepCtrl.accAII_pf_lb1) &(g_StepCtrl.accAII_pf_lb5 =g_StepCtrl.accAII_pf_lbO) &(g_StepCtrl.accAII_pf_lb5 =g_StepCtrI.accAII_pf_Ib 6)&(g_StepCtrl.accAII_pf_lb5 =g_StepCtrl.accAII_pf_lb7) &(g_StepCtrl.accAII_pf_lb5 =g_StepCtrl.accAII_pf_lb8) &(g_StepCtrl.accAII_pf_lb5 =g_StepCtrl.accAII_pf_lb9) &(g_StepCtrl.accAII_pf_lb5 =g_StepCtrI.accAII_pf_Ib10) g_StepCtrl.max=g_StepCtrl.accAII_pf_lb5;/波峰与其前面最近的一个波谷数据的差值大于500的情况的检测代码如下:if(g_StepCtrl.max-g_StepCtrl.mi n)=500)g_StepCtrl.stateO+;g_StepCtrl.state+;g_StepCtrI.mi n=g_StepCtrl.accAII_pf_lb5;/发送计步数增加信息代码如下:#ifdef UART_OUT_DEBUG_DATAUart_Se ndByte(OXBB);Uart_SendBytes(unsigned char*)&g_StepCtrl.state,2);#en dif/跌倒检测代码如下:lsCurFallByAccs(); / 跌倒检测首先判断手环是否处于佩戴状态当运动量上升10倍时,表示被佩戴判断手环是否已佩戴代码如下:if ( (g_StepCtrl.accAII_pf1050) | (g_StepCtrI.accAII_pf910) ) if ( g_StepCtrI. nCurMovi ngPer(1OO*MAX_MOVING_PER_BEISHU)g_StepCtrI. nCurMovi ngPer+=1O; elseif ( g_StepCtrI. nCurMovi ngPer )g_StepCtrI. nCurMovi ngPer -;首先出现失重状态,然后在短时间内又出现撞击状态,此时判断用户发生了跌倒事件。 判断是否发生了跌倒事件代码如下:void lsCurFallByAccs()static un sig ned char n CurI nF all in gTimes = 0; /static un sig ned char n CurNormalTimes = 0; /static un sig ned char n CurHitt in gTimes = 0; /当加速度平方和值小于200认为处于失重跌倒状态普通状态情况值 撞击状态情况值当加速度平方和值小于200认为处于失重跌倒状态,判断是否处于失重状态代码如下:if ( g_StepCtrl.accAII_pf200 )n CurI nF alli ngTimes+;n CurNormalTimes=0;else if( g_StepCtrl.accAII_pf2000 ) / 处于普通状态if( n CurNormalTimes=2) & (n CurI nFalli ngTimes=2) & (n CurNormalTimesJ1控制GPIO_I nit(GPIOB, GPIO_Pin_O | GPIO_Pin_2 , GPIO_Mode_Out_PP_Low_Fast);2心率测量的ADC采集相关初始化代码如下:void Heart_ADC_Co nfig(void)CLK_PeripheralClockCo nfig(CLK_Peripheral_ADC1, ENABLE); /开启时钟ADC_I ni t(ADC1,ADC_Co nversio nM ode_Si ngle, ADC_Resolution_12Bit, ADC_Prescaler_2);ADC_Sampli ngTimeCo nfig(ADC1,ADC_Group_SlowCha nn els,ADC_Sampli ngTime_384Cycles);ADC_Cmd(ADC1, ENABLE);ADC_Cha nn elCmd(ADC1, ADC_Cha nn el_2 , ENABLE);3没有绿灯打开时,等待稳定代码如下:void heart_update_wait_ no g_stable()HeartMeas_J1_PASS(); / 确保 j1 打开判断 是否稳定。稳定后 打开测试灯开关 或者超时 结束测试过程 并直接关闭 并认为测试值为0XFFgHeartCtrl. nGL_HoldTime+;Heart_ADC_Start();如果稳定了保持J1开,并打开绿灯if ( Heart_ADC_IsStable()gHeartCtrl.gl_state = HeartMeasState_J1_GL_ON;pCurHeartRateTest = heart_update_wait_e ng_stable;HeartMeas_OUT_H(); / 打开灯4绿灯打开时,等待稳定代码如下void heart_update_wait_e ng_stable()gHeartCtrl. nGL_HoldTime+;测试灯亮的时间数量Heart_ADC_Start(); / 开始进行 ADC数据采集5判断 是否稳定。稳定后 关闭J1开关if ( ( Heart_ADC_IsStable()gHeartCtrl.gl_state = HeartMeasState_GL_OON; /绿灯打开,但是关闭J1pCurHeartRateTest = heart_update_do_real_test;HeartMeas_J1_BREAK(); / 关闭 J1 开关gHeartCtrl. nGL_HoldTime = 0;gHeartCtrl.n_RateA nalyData = 0; /已经滤波的数据个数为0gHeartCtrl.a naly_min_pos = 0XFF; /先设定最小值为一个极大值else if ( gHeartCtrl. nGL_HoldTime HEART_W AIT_STABLE_TIMEOUT ) gHeartCtrl.v_heartrate = 0XFF; / 测试过程异常DoWhe nH eartTestE nd();6关闭防饱和运放输出。并进行数据分析void heart_update_do_real_test()gHeartCtrl. nGL_HoldTime+;测试灯亮的时间数量Heart_ADC_Start(); / 开始进行ADC数据采集/完成一次采集,增加一个数据,这个数据时心率的周期数据if ( gHeartCtrl. nGL_HoldTime 500 ) / 大于一定时间 进入下一个状态gHeartCtrl.v_heartrate = 0XFF; /测试过程异常DoWhe nH eartTestE nd();elseHeart_ADC_FFT_Rate(g_ nN ewAdcVal4);7滤波是为了消除一些影响心率计算的小波峰,滤波后这些小波峰变为小平台,滤波算法在这里实现:将HEART_BUF_ANALY_LEN-5处两边数据进行判断,采用4阶的滤波方式,即最大值必须至少有 5 个数,从 HEART_BUF_ANALY_LEN-8 处位置 1 2【3 4 5 6 7 8 9】10void Heard_adc_lv_deal(u nsig ned char* pForLv)if ( ( pForLv5 != pForLv6)if ( (pForLv6pForLv5) & (pForLv6pForLv7) if ( pForLv 5 pForLv7)pForLv6 = pForLv 5;elsepForLv6 = pForLv7; return;elsereturn;/下面能够 确定5 = 6if ( (pForLv4 != pForLv)if ( (pForLv6pForLv4) & (pForLv6pForLv7) if ( pForLv4 pForLv7)pForLv6 = pForLv4;pForLv5 = pForLv4;elsepForLv6 = pForLv7;pForLv5 = pForLv7; return;elsereturn;/下面代码过程,已经能够确定4 = 5 = 6if ( pForLv3 != pForLv6)if ( (pForLv6pForLv3) & (pForLv6pForLv7) if ( pForLv3 pForLv7)pForLv6 = pForLv3;pForLv5 = pForLv3;pForLv4 = pForLv3;elsepForLv6 = pForLv7;pForLv5 = pForLv7;pForLv4 = pForLv7;return;elsereturn;/下面代码过程,已经能够确定3 = 4 = 5 = 6if ( pForLv2 != pForLv6)if ( (pForLv6pForLv2) & (pForLv6pForLv7)if ( pForLv2 pForLv7)pForLv6 = pForLv2;pForLv5 = pForLv2;pForLv4 = pForLv2;pForLv3 = pForLv2;elsepForLv6 = pForLv7;pForLv5 = pForLv7;pForLv4 = pForLv7;pForLv3 = pForLv7;return;elsereturn;/下面代码过程,已经能够确定2 = 3 = 4 = 5 = 6if ( pForLv1 != pForLv6)if ( (pForLvpForLv1) & (pForLv6pForLv7)if ( pForLv1 pForLv7)pForLv6 = pForLv1;pForLv5 = pForLv1;pForLv4 = pForLv1;pForLv3 = pForLv1; pForLv2 = pForLv1;elsepForLv6 = pForLv7;pForLv5 = pForLv7;pForLv4 = pForLv7; pForLv3 = pForLv7;pForLv2 = pForLv7;return;elsereturn;8将新的时间值 加入到时间分析列表中并分析是否完成心率数据采集,需要将新的值 插入到 已经有存在的数据列表中,并且需要按照从大到小的顺序进行排列。先寻找合适的值,然后进行判断,先寻找需要进行插入的位置需要从大到小进行排列void Heart_ADC_FFT_Rate(u nsig ned char nAdcV)char i;/gHeartCtrl.bufRateA nalygHeartCtrl.n_RateA nalyData = nAdcV;gHeartCtrl.n_RateA nalyData+;gHeartCtrl. nM axPosTimes +=2 ;往保存的数据中添加新的数据到最大位置for ( i=1 ; iHEART_BUF_ANALY_LEN ; i+ )gHeartCtrl.bufRateA nalyi-1 = gHeartCtrl.bufRateA nalyi;gHeartCtrl.bufRateA nalyHEART_BUF_ANALY_LEN-1 = nAdcV;Heard_adc_lv_deal( &( gHeartCtrl.bufRateA nalyHEART_BUF_ANALY_LEN-10);/更新最小值n AdcV = gHeartCtrl.bufRateA naly5;if ( n AdcV gHeartCtrl.a naly_ min _pos )gHeartCtrl.a naly_min_pos = n AdcV;/判断极大值区间if ( gHeartCtrl.bufRateA nalyOgHeartCtrl.bufRateA naly1)for ( i=2 ; i10 ; i+ )if ( gHeartCtrl.bufRateA nalyi != gHeartCtrl.bufRateA naly1)break;if ( (i10)return;/正在上升的过程if ( gHeartCtrl.bufRateAnalyi gHeartCtrl.bufRateAnaly1)return;/这里可以判断出有一个峰值区间存在i = i-7; /7无修正 8修正1 9修正2ff_ff = gHeartCtrl. nM axPosTimes + i;gHeartCtrl. nM axPosTimes = -i;/如果数据与最小值比较小于某个数,则表示不是心率测试的结果if ( (gHeartCtrl.bufRateA naly1-10) 80 )return;for( i=0 ; ivgHeartCtrl. nH eartPeroC nt ; i+ )if( (ff_ff gHeartCtrl.bufHeartPeroi)break;if ( i = gHeartCtrl. nH eartPeroC nt)gHeartCtrl.bufHeartPerogHeartCtrl. nH eartPeroC nt = ff_ff ;elsefor ( n AdcV = gHeartCtrl. nH eartPeroC nt ; nAdcVi ; n AdcV-)gHeartCtrl.bufHeartPero nAdcV = gHeartCtrl.bufHeartPero nAdcV-1; gHeartCtrl.bufHeartPeroi = ff_ff ;9判断是否有能够进行计算的稳定心率时间数据需要有连续5个数据的最大查找不大于5for ( i=3 ; ivgHeartCtrl. nH eartPeroC nt ; i+ )if ( gHeartCtrl.bufHeartPeroi-3 - gHeartCtrl.bufHeartPeroi = 5 )/这里表示已经有正确的数据了gh_idBegi nSamll = i-3;gh_idE ndSamll = i;CalTheHeartRateVals(); /根据保存的数据计算心率DoWhe nH eartTestE nd();return;10根据保存的数据计算心率void CalTheHeartRateVals()un sig ned char valall = 0;char i;for ( i=gh_idBeg in Samll ; i=gh_idE ndSamll ; i+ )valall += gHeartCtrl.bufHeartPeroi;i = gh_idE ndSamll - gh_idBegi nSamll + 1;/心率=60S/周期=60/ ( n/i/20)= 60*i*20 / ngHeartCtrl.v_heartrate = 2400*i/valall;
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 活动策划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!