免费下载!
[!--downpath--]以下是一个基于三轴加速度传感的算法来判定状态的C代码:```c######0x18#0x20#0x23#0x28#0x2A#0x2C#1.0//加速度变化阀值#100//取样率(Hz)#10//窗口大小(个样本)enumState{IDLE,,};intmain(void){intfd=();if(fd==-1){("toI2C.n");exit(1);}//配置传感(fd,,0x77);//打开传感并设置取样率(fd,,0x08);//设置检测范围为+/-8g//初始化前个样本的加速度值float[];float[];float[];for(inti=0;i<;i++){intx=(fd,);inty=(fd,);intz=(fd,);//将读取到的原始数据转换为实际加速度值[i]=(float)x/1024.0;[i]=(float)y/1024.0;[i]=(float)z/1024.0;(/);//等待一段时间,以达到取样率}//初始化状态enumStatestate=IDLE;while(1){//读取最新的加速度值intx=(fd,);inty=(fd,);intz=(fd,);//将读取到的原始数据转换为实际加速度值float=(float)x/1024.0;float=(float)y/1024.0;float=(float)z/1024.0;//估算加速度变化值float=0;float=0;float=0;for(inti=0;i<;i++){+=abs(-[i]);+=abs(-[i]);+=abs(-[i]);}/=;/=;/=;//按照加速度变化值判别状态(state){caseIDLE:if(>||>||>){state=;("State:n");}break;case:if(>||>||>){state=;}else{state=;("State:n");}break;case:if(>){state=IDLE;("State:IDLEn");}break;}//更新前个样本的加速度值for(inti=-1;i>0;i--){[i]=[i-1];[i]=[i-1];[i]=[i-1];}[0]=;[0]=;[0]=;//等待一段时间,以达到取样率(/);}0;}```该代码使用了和上面类似的方法来读取三轴加速度传感的数据,并按照加速度变化的情况来判定状态。
具体地,依照阀值来判定加速度是否变化,依照窗口大小来估算加速度变化值,之后按照加速度变化值的大小来判定状态。假如加速度变化超过阀值且当前状态为IDLE,则步入状态;假如加速度变化超过阀值且当前状态为,则保持状态;假如加速度变化没有超过阀值且当前状态为,则步入状态;假如加速度变化超过阀值且当前状态为加速度三个基本公式图片,则保持状态;假如加速度在Z轴方向上超过阀值且当前状态为,则回到IDLE状态。注意,须要依照具体的传感机型和配置更改代码中的地址和寄存器值加速度三个基本公式图片,以及阀值、采样率和窗口大小的大小。