先拿一张官方教程里的图说下4D检测,其实这里4D不是说4维…只是以X轴,Y轴构成的二维坐标系旋转后四个方向的识别。所以,基于下图来分析下识别过程,就是Y轴加速度反向接近重力加速度g,就是第一种姿态;反之,是第二种姿态;X轴加速度反向接近g,则是第三种,反之,第四种。整体识别思路还是很容易理解的吧。
接下来我们看下官方例程是怎样的,按照上一章的方式导入参数,就可以看到状态机代码了:
这个例程也是7条语句,但是有些新的指令出现了,接下来咱逐条分析下语句的作用。 S0:CMD MSKITEQ 第一条是个指令,根据指令集说明的解释,这条指令作用就是在OUTC寄存器被更新但是值没变的时候,屏蔽掉此时的中断。这条的作用接S6,待S6在讲解 S1:CMD SRP 这条再上一章有提到过,将重置点指针设置在下一条,也就是S2的位置,这样之后的判断条件重置后都会回到S2. S2:RNC NOP GNTH1 判断条件,GNTH1 上一章也讲过了,会将输入的数据根据阈值Thresh1进行比较,如果大于的话则继续执行S3,否则返回S2。 S3: RNC LNTH1 TH3 判断条件,上一条跳转到这里后,会进行LNTH1比较,也就是如果输入的数据小于阈值 Thresh1就返回S2,否则**了Timer3的时间周期后,跳转到S4。 S4 CMD OUTC 这是一条命令指令,OUTC命令作用是将临时掩码值更新到OUTS输出寄存器上,并且产生一个中断。 这里有个额外的知识点,可以看到MaskA的值为0xF0,从上一章我们可以得知,此时选择了X轴正向、X轴负向、Y轴正向、Y轴负向为输入值,那么前面的比较指令就会对四个方向与阈值相对比,只要比对通过了的值就会在临时掩码的相应为置一,运行到OUTC的时候,就会将该值赋值在OUTS寄存器了,表现出来的现象就是上面那张动作示意图显示的样子,不同姿态对应着0x01,0x02,0x04,0x08四个值。 执行完S4,继续执行S5. S5 RNC NOP LNTH2 此条指令的继续判断条件为LNTH2 ,也就是上一条辨别出来的轴数据要是小于阈值2就继续执行S6,否则则返回S2. S6 CMD CONTROL 这条命令 CONTROL:有几个作用,1、将临时值都回复到默认状态,比如SRP设置的重置点值、TH3比较的临时值,临时掩码值等都恢复到默认状态;2、结束掉循环,跳转回默认的重置点,此时会产生一次中断,但是连接到S0指令的作用,这里的中断就被屏蔽掉了。表现出来的就是程序恢复初始状态,中断和OUTS都没有变化。 整体的状态机流程图如下:
[size=0.83em]3.png (16.98 KB, 下载次数: 0) 下载附件 [url=]保存到相册[/url] [color=rgb(153, 153, 153) !important]2020-8-27 23:41 上传
结合上面的动作图、流程图和指令分解,我相信各位就会比较清晰的理解了这个例程的工作流程了。 根据上述的过程,我们不难分析出,只要将MaskA的值改为0xFC,就可以识别出6个方向了。
|