版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、-慧创科技(北京)有限公司 项目名称:手环系统嵌入式软件实现方案说明书慧创科技(北京)有限公司有关该文档:此文档的内容包括手环系统嵌入式软件实现方案说明书。文档所有者:慧创科技(北京)有限公司文档版本记录:版本号负责人完成时间备注1.0石聪2014-12-81.1石聪2014-12-16目录TOC o 1-5 h z HYPERLINK l bookmark2 系统功能框架4 HYPERLINK l bookmark4 系统分模块功能实现方案4 HYPERLINK l bookmark6 计步功能实现方案4 HYPERLINK l bookmark8 跌倒功能实现方案8 HYPERLINK l
2、 bookmark10 心率功能实现方案131.系统功能框架2.系统分模块功能实现方案21计步功能实现方案功能:1.能对用户运动时所走的路程进行计步。算法:慧创科技(北京)有限公司慧创科技(北京)有限公司 (1)算法流程图开始(2)算法的具体实现方案代码中需要用到的变量定义与初始化:定义一个数组accVals6用来存储从传感器上得到的原始16位加速度值,具体定义如下:externunsignedcharaccVals6;定义一个结构体StepCtrl用来存储代码中需要用到的变量,具体定义如下:typedefstructunsignedintaccAll_pf;/XYZ方向加速度的平方和unsi
3、gnedcharstateO;unsignedintstate;state0、state用于计步数的显示unsignedintmin;/波形分析中的极小值unsignedintmax;/波形分析中的极大值unsignedintaccValShort3;/用来存放滤波后的相邻三个数据unsignedintaccAll_pf_pj;相邻三个accAll_p啲平均值unsignedintaccAll_pf_ys;/用来存放未滤波前相邻三个加速度平方的值unsignedintaccAll_pf_lb11;/用来存放滤波后的值unsignedcharuTemp1“/uTempuTemp1用于16位数据转
4、换为无符号的8位数据unsignedcharbCurFall;unsignedshortnCurMovingPer;当前的运动百分比StepCtrl;定义一个结构体变量g_StepCtrl用于管理算法中用到的变量externStepCtrlg_StepCtrl;变量初始化函数:Wg_StepCtrl.min初始为20000,其余变量初始为0。具体初始化代码如下:voidg_Ctrl_Init()bg_memset(unsignedchar*)(&g_StepCtrl),0,sizeof(g_StepCtrl);g_StepCtrl.min=20000;加速度数据处理函数具体初始化代码如下:增加
5、一帧加速度数据函数voidUpdate_StepFallByAcc(),具体代码如下voidUpdate_StepFallByAcc()先通过I2c从mma加速度芯片中获取当前的16位加速度数据代码如下:I2c_readBytes(MMA_I2C_ADDR,1,6,accVals);由于加速度传感器传来的16位数据精度太高,我们在实际应用时没必要那么高的精度,并且16位的数据将带来很大的计算量,因此我们将釆集来的16位原始数据简化为无符号的8位数据。采集来的16位原始数据简化为无符号的8位数据的代码如下:for(uTemp=0;uTemp=0X80)&(accValsg_StepCtrl.uT
6、emp1!=0X7F)accValsg_StepCtrl.uTemp1+;g_StepCtrl.accValShortuTemp=accValsg_StepCtrl.uTemp1;if(g_StepCtrl.accValShortuTemp=0X80)g_StepCtrl.accValShortuTemp-=256;慧创科技(北京)有限公司慧创科技(北京)有限公司 为了减小计算量,又能准确可靠的计步和判断用户是否跌倒,程序中采用了XYZ三个方向加速度平方和这个特征值,计算X、Y、Z方向加速度的平方和的代码如下:g_StepCtrlaccAll_pf=g_StepCtrl.accValShort
7、0*g_StepCtrlaccValShort0+g_StepCtrlaccValShort1*g_StepCtrlaccValShort1+g_StepCtrl.accValShort2*g_StepCtrlaccValShort2;滤波算法采用的是平均值滤波算法,平均值滤波算法如下:g_StepCtrlaccAll_pf_pj=0;for(uTemp=0;uTemp=g_StepCtrlaccAll_pf_lb4)&(g_StepCtrlaccAll_pf_lb5=g_StepCtrlaccAll_pf_lb)&(g_StepCtrlaccAll_pf_lb5=g_StepCtrlaccA
8、ll_pf_lb2)&(g_StepCtrlaccAll_pf_lb5=g_StepCtrlaccAll_pf_lb1)&(g_StepCtrlaccAll_pf_lb5=g_StepCtrlaccAll_pf_lb0)&(g_StepCtrlaccAll_pf_lb5=g_StepCtrlaccAll_pf_lb6)&(g_StepCtrlaccAll_pf_lb5=g_StepCtrlaccAll_pf_lb7)&(g_StepCtrlaccAll_pf_lb5=g_StepCtrlaccAll_pf_lb8)&(g_StepCtrlaccAll_pf_lb5=g_StepCtrlaccA
9、ll_pf_lb9)&(g_StepCtrlaccAll_pf_lb5=g_StepCtrlaccAll_pf_lb10)g_StepCtrlmax=g_StepCtrlaccAll_pf_lb5波峰与其前面最近的一个波谷数据的差值大于500的情况的检测代码如下:if(g_StepCtrlmax-g_StepCtrlmin)=500)g_StepCtrl.state0+;g_StepCtrl.state+;g_StepCtrlmin=g_StepCtrlaccAll_pf_lb5;发送计步数增加信息代码如下:#ifdefUART_OUT_DEBUG_DATAUart_SendByte(0XBB
10、);Uart_SendBytes(unsignedchar*)&g_StepCtrl.state,2);#endif22跌倒功能实现方案功能:1.能对用户运动时所发生的跌倒事件进行实时监测。算法:(1)算法流程图慧创科技(北京)有限公司慧创科技(北京)有限公司慧创科技(北京)有限公司 (2)算法的具体实现方案代码中需要用到的变量定义与初始化:定义一个数组accVals6用来存储从传感器上得到的原始16位加速度值,具体定义如下:externunsignedcharaccVals6;定义三个无符号的字符型静态变量,用于存储相应的状态信息具体定义如下staticunsignedcharnCurInF
11、allingTimes=0;/失重状态的持续时间值存放该改变量中staticunsignedcharnCurNormalTimes=0;未发生跌倒的正常状态的持续时间值存放在该变量staticunsignedcharnCurHittingTimes=0;/撞击状态的持续时间值存放在该变量中定义一个结构体StepCtrl用来存储代码中需要用到的变量,具体定义如下:typedefstructunsignedintaccAll_pf;/XYZ方向加速度的平方和unsignedcharstate。;unsignedintstate;/stateO、state用于计步数的显示unsignedintmin
12、;/波形分析中的极小值unsignedintmax;/波形分析中的极大值unsignedintaccValShort3;/用来存放滤波后的相邻三个数据unsignedintaccAll_pf_pj;/相邻三个accAll_p啲平均值unsignedintaccAll_pf_ys|;3;/用来存放未滤波前相邻三个加速度平方的值unsignedintaccAll_pf_lb11“/用来存放滤波后的值unsignedcharuTempl;/uTempuTempl用于16位数据转换为无符号的8位数据unsignedcharbCurFall;/该变量用于存放跌倒的次数unsignedshortnCurM
13、ovingPer;当前的运动百分比StepCtrl;定义一个结构体变Mg_StepCtrl用于管理算法中用到的变量externStepCtrlg_StepCtrl;变量初始化函数:将g_StepCtrlmin初始为20000,其余变量初始为0具体初始化代码如下:voidg_Ctrl_Init()bg_memset(unsignedchar*)(&g_StepCtrl),0,sizeof(g_StepCtrl);g_StepCtrl.min=20000;加速度数据处理函数具体初始化代码如下:增加一帧加速度数据函数voidUpdate_StepFallByAcc(),具体代码如下voidUpdat
14、e_StepFallByAcc()先通过I2c从mma加速度芯片中获取当前的16位加速度数据代码如下:I2c_readBytes(MMA_I2C_ADDR,1,6,accVals);由于加速度传感器传来的16位数据精度太高,我们在实际应用时没必要那么高的精度,并且16位的数据将带来很大的计算量,因此我们将采集来的16位原始数据简化为无符号的8位数据。釆集来的16位原始数据简化为无符号的8位数据的代码如下:for(uTemp=0;uTemp=0X80)&(accValsg_StepCtrl.uTemp1!=0X7F)accValsg_StepCtrluTemp1+;g_StepCtrl.accV
15、alShortuTemp=accValsg_StepCtrl.uTemp1;if(g_StepCtrlaccValShortuTemp=0X80)g_StepCtrl.accValShortuTemp-=256;为了减小计算量,又能准确可靠的计步和判断用户是否跌倒,程序中采用了XYZ三个方向加速度平方和这个特征值,计算X、Y、Z方向加速度的平方和的代码如下:g_StepCtrlaccAll_pf=g_StepCtrl.accValShort0*g_StepCtrlaccValShort0+g_StepCtrlaccValShort1*g_StepCtrl.accValShort1+g_Step
16、CtrlaccValShort*g_StepCtrlaccValShort2;滤波算法采用的是平均值滤波算法,平均值滤波算法如下:g_StepCtrl.accAll_pf_pj=0;for(uTemp=0;uTemp2;uTemp+)g_StepCtrlaccAll_pf_ysuTemp=g_StepCtrlaccAll_pf_ysuTemp+1;g_StepCtrlaccAll_pf_pj+=g_StepCtrlaccAll_pf_ysuTemp;g_StepCtrlaccAll_pf_ys=g_StepCtrlaccAll_pf;g_StepCtrlaccAll_pf_pj+=g_Step
17、CtrlaccAll_pf;for(uTemp=0;uTempvIO;uTemp+)g_StepCtrlaccAll_pf_lbuTemp=g_StepCtrlaccAll_pf_lbuTemp+1;g_StepCtrlaccAll_pf_lb1O=g_StepCtrlaccAll_pf_pj/3;跌倒检测函数IsCurFallByAccs()(首先出现失重状态,然后在短时间内又出现撞击状态,此时判断用户发生了跌倒事件。)具体代码如下:voidIsCurFallByAccs()当加速度平方和值小于200时认为用户处于失重状态,当判断出用户处于失重状态时,将nCurInFallingTimes(
18、用户处于跌倒状态的时间)加1,将nCurNormalTimes(用户处于未跌倒状态的时间)清0相应的代码如下:if(g_StepCtrlaccAll_pfv200)nCurInFallingTimes+;nCurNormalTimes=0;当加速度平方和值大于200且小于2000时认为用户处于未跌倒的正常状态,当判用户处于未跌倒的正常状态时,接着判断用户处于未跌倒状态的时间,如果nCurNormalTimes(用户处于未跌倒的正常状态的时间)小于10,将nCurNormalTimes(用户处于未跌倒的正常状态的时间)加1,然后再判断nCurNormalTimes(用户处于未跌倒的正常状态的时间
19、)是不是10,如果是10则将nCurInFallingTimes=0(用户处于失重状态的时间)清0,nCurHittingTimes=0(用户处于撞击状态的时间)清0.相应的代码如下:elseif(g_StepCtrlaccAll_pfv2000)if(nCurNormalTimes=2)&(nCurInFallingTimes=2)&(nCurNormalTimesv=3)nCurInFallingTimes=0;nCurHittingTimes=0;g_StepCtrl.bCurFall+;sys_AddFunOper(Deal_FallCatch);当判断出用户发生跌倒事件后,告诉主机已
20、经跌倒了相应的代码如下:voidDeal_FallCatch()Uart_SendByte(0XCC);Uart_SendByte(g_StepCtrl.bCurFall);23心率功能实现方案功能:1.能对用户的心率值进行监测。算法:算法流程图慧创科技(北京)有限公司慧创科技(北京)有限公司 开启一次心率测量ADC采集是否已是否超时.N超时,结束测试过程I/O口配置、ADC配置及其他相关配置打开滤波开关J1,关闭绿灯N14打开滤波开关J1,打开绿灯是否超时1N打开滤波开关J1,打开绿灯N1ADC采集是否已$超时,结束测试过程ADC采集是否已稳定超时,结束测试过Y程-是否超时/N打开滤波开关J
21、1,打开绿灯将采集到的数据存放到缓冲区的最大位置滤波获取极小值获取极大值区间获取有效心跳时间,并进行排序插入是否满足心率计算所需要的有效心跳时间数据yr进行心率计算,并发送心率数据(2)算法的具体实现方案初始化IO口配置初始化(绿灯、J1控制管脚分配和ADC数据釆集管脚)相应的代码如下:voidInit_HeartMeas_IOs(void)/PB0绿灯控制PB2-J1控制GPIO_Init(GPIOB,GPIO_Pin_0IGPIO_Pin_2,GPIO_Mode_Out_PP_Low_Fast);ADC相关初始化代码如下:voidHeart_ADC_Config(void)CLK_Peri
22、pheralClockConfig(CLK_Peripheral_ADC1,ENABLE);/开启时钟ADC_Init(ADC1,ADC_ConversionMode_Single,ADC_Resolution_12Bit,ADC_Prescaler_2);ADC_SamplingTimeConfig(ADC1ADC_Group_SlowChannels,ADC_SamplingTime_384Cydes);ADC_Cmd(ADC1,ENABLE);ADC_ChannelCmd(ADC1,ADC_Channel_2,ENABLE);定义算法中用到的一些变量并初始化,相应的代码如下:typede
23、fstructunsignedchargl_state;测量灯当前的状态unsignedcharn_StableTime;/判断稳定需要判断持续一段时间,因此不能直接进行unsignedshortnGL_HoldTime;/测试灯亮的时间数量unsignedcharbufRateAnalyHEART_BUF_ANALY_LEN;/心率分析的数据缓冲区unsignedcharanaly_min_pos;/分析过程中一个波形的最小值,需要最小值与最大值进行对比unsignedcharn_RateAnalyData;/分析的数据个数unsignedchars_RateAnaly;/数据分析的状态。u
24、nsignedcharbufHeartPeroHEART_BUF_PERO_MAX_LEN;/需要检测多个峰值unsignedcharnHeartPeroCnt;unsignedcharnMaxPosTimes;/极大值点到当前位置的时间长度unsignedcharv_heartrate;/测试出来的心率值未测试值0X00无心率0XFF其他为正常心率数据HeartMeasCtrl;externHeartMeasCtrlgHeartCtrl;滤波开关J1打开,测试绿灯关闭,然后等待输出稳定,稳定后打开测试灯开关或者超时结束测试过程,并直接关闭并认为测试值为0XFF相应的代码如下:voidhear
25、t_update_wait_nog_stable()HeartMeas_J1_PASS();/确保j1打开,判断是否稳定。gHeartCtrl.nGL_HoldTime+;Heart_ADC_Start();如果稳定了保持J1开,并打开绿灯if(Heart_ADC_IsStable()gHeartCtrl.gl_state=HeartMeasState_J1_GL_ON;pCurHeartRateTest=heart_update_wait_eng_stable;HeartMeas_OUT_H();/打开灯gHeartCtrl.nGL_HoldTime=0;如果超时则结束测试过程,并直接关闭并
26、认为测试值为0XFFelseif(gHeartCtrl.nGL_HoldTimeHEART_WAIT_STABLE_TIMEOUT)DoWhenHeartTestEnd();gHeartCtrl.v_heartrate=OXFF;/测试过程异常绿灯打开后,等待ADC输出稳定,相应的代码如下:voidheart_update_wait_eng_stable()gHeartCtrlnGL_HoldTime+;/测试灯亮的时间数量Heart_ADC_Start();/开始进行ADC数据采集如果稳定后,关闭J1开关,并将相应的变量初始化为相应的值,相应的代码如下:if(Heart_ADC_IsStab
27、le()gHeartCtrl.gl_state=HeartMeasState_GL_OON;/绿灯打开,但是关闭J1pCurHeartRateTest=heart_update_do_real_test;HeartMeas_J1_BREAK();/关闭J1开关gHeartCtrl.nGL_HoldTime=0;gHeartCtrl.n_RateAnalyData=0;已经滤波的数据个数为0gHeartCtrl.analy_min_pos=0XFF;/先设定最小值为一个极大值如果超时则结束测试过程,并直接关闭并认为测试值为0XFFelseif(gHeartCtrl.nGL_HoldTimeHEA
28、RT_WAIT_STABLE_TIMEOUT)gHeartCtrl.v_heartrate=0XFF;/测试过程异常DoWhenHeartTestEnd();关闭J1,并进行数据分析voidheart_update_do_real_test()gHeartCtrlnGL_HoldTime+;/测试灯亮的时间数量Heart_ADC_Start();/开始进行ADC数据釆集如果超时则结束测试过程,并直接关闭并认为测试值为0XFFif(gHeartCtrlnGL_HoldTime500)/大于一定时间进入下一个状态gHeartCtrl.v_heartrate=0XFF;/测试过程异常DoWhenHe
29、artTestEnd();完成一次釆集,增加一个数据elseHeart_ADC_FFT_Rate(g_nNewAdcVal4);将新数据存放到数据缓冲区,并进行相应的数据处理voidHeart_ADC_FFT_Rate(unsignedcharnAdcV)chari;gHeartCtrl.nMaxPosTimes+=2;将新数据保存到缓冲区的最大位置for(i=1;ivHEART_BUF_ANALY_LEN;i+)gHeartCtrl.bufRateAnalyi-1=gHeartCtrl.bufRateAnalyi;gHeartCtrl.bufRateAnalyHEART_BUF_ANALY_
30、LEN-1=nAdcV;滤波处理Heard_adc_lv_deal(&(gHeartCtrlbufRateAnalyHEART_BUF_ANALY_LEN-10);相应的滤波算法如下,滤波是为了消除一些影响心率计算的小波峰,滤波后这些小波峰变为小平台,滤波算法在这里实现。voidHeard_adc_lv_deal(unsignedchar*pForLv)if(pForLv5!=pForLv6)if(pForLv6pForLv5)&(pForLv6pForLv7)if(pForLv5pForLv7)pForLv6=pForLv5;elsepForLv6=pForLv7;return;elsere
31、turn;if(pForLv4!=pForLv6)if(pForLv6pForLv4)&(pForLv6pForLv7)if(pForLv4pForLv7)pForLv6=pForLv;pForLv5=pForLv4;elsepForLv6=pForLv7;pForLv5=pForLv7;return;elsereturn;if(pForLv!=pForLv6)if(pForLv6pForLv)&(pForLv6pForLv7)if(pForLvpForLv7)pForLv6=pForLv;pForLv5=pForLv;pForLv=pForLv;elsepForLv6=pForLv7;pFo
32、rLv5=pForLv7;pForLv4=pForLv7;return;elsereturn;if(pForLv2!=pForLv6)if(pForLv6pForLv)&(pForLv6pForLv7)if(pForLvpForLv7)pForLv6=pForLv;pForLv5=pForLv;pForLv=pForLv;pForLv=pForLv;elsepForLv6=pForLv7;pForLv5=pForLv7;pForLv4=pForLv7;pForLv=pForLv7;return;elsereturn;if(pForLv1!=pForLv6)if(pForLv6pForLv1)&
33、(pForLv6pForLv7)if(pForLv1pForLv7)pForLv6=pForLv1;pForLv5=pForLv1;pForLv=pForLv1;pForLv=pForLv1;pForLv=pForLv1;elsepForLv6=pForLv7;pForLv5=pForLv7;pForLv4=pForLv7;pForLv=pForLv7;pForLv=pForLv7;return;elsereturn;更新数据分析中波形的极小值nAdcV=gHeartCtrl.bufRateAnaly5;if(nAdcVgHeartCtrl.analy_min_pos)gHeartCtrl.analy_min_pos=nAdcV;判断极大值区间代码如下:if(gHeartCtrl.bufRateAnaly0gHeartCtrl.bufRateAnaly1)for(i=2;i10)return;if(gHeartCtrl.bufRateAnalyigHeartCtrl.bufRateAnaly1)return;ff_ff=gHeartCtrl.nMaxPosTimes+i;gHeartCtrl.nMaxPosTimes=-i;如果数据与最小值比较小于某个数,贝y表示不是心率测试的结果,这样可以排除部分小
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教育领域守信经营承诺函(6篇)
- 行业的销售线索转化率分析工具
- 2026年深圳龙文重点名校高中语文试题竞赛模拟(二)试题含解析
- 拉萨市2026年初三二模英语试题试卷(B版)含解析
- 2026年河北省涉县鹿头中学初三年级第一次质量检测试题(期末)英语试题试卷含附加题含解析
- 2026年山东省龙口市重点中学第二学期开学考试初三英语试题测试2.13试题含解析
- 2026届重庆綦江县联考初三毕业班联考(一)英语试题试卷含解析
- 广州市白云区重点名校2025-2026学年初三月考试卷(三)语文试题含解析
- 2025七年级地理上册主题二模拟地球运动1用地球仪探究地球自转第2课时利用经纬网定位习题课件晋教版
- 客户信赖承诺保证函(9篇)
- 商丘市安全文明施工方案
- 2025年广东中考数学试题【附答案】
- 服装产业园项目规划设计方案
- 湖北省武汉市2025年中考物理真题(含答案)
- 医院环境清洁消毒与监测
- DB44∕T 2331-2021 公路混凝土桥梁火灾后安全性能评定技术规程
- 河南洛阳产融集团有限公司招聘笔试题库2025
- 香水标签管理办法
- 村干部考事业编制试题及答案
- 中医学介绍讲课件
- 副食品配送卫生管理制度
评论
0/150
提交评论