[经验分享] 【LSM6DSOX有限状态机例程学习 四】--4D检测(FourD position recognition)

justd0   2020-8-27 23:41 楼主

上一篇文章里已经详细的介绍了ST官方的LSM6DSOX例程库文件结构,和各个文件的介绍。在结尾设有一道简单的思考题:假如设备安装传感器的方向不是Z轴正向朝向面板方向,而是X轴正向的话,那么我们想要实现识别翻扣设备的动作该怎么修改配置呢?

      由于我们在设计设备的时候,PCB及传感器的姿态会跟设备使用姿态会有所差异,那么就会导致程序里设计的明明是传感器Z轴正向扣在桌子上触发,但是设备扣在桌子上时,是传感器X轴正向扣在桌子上。那么该如何处理呢?其实很简单,上一篇文章中已经讲过了Mask寄存器是选择输入信号的,因此只需要将+X轴选做输入即可,也就是将MaskA 的值改为0x80.

 

 

本篇将对4D检测(FourD position recognition)例程进行分析讲解。

 

先拿一张官方教程里的图说下4D检测,其实这里4D不是说4只是以X轴,Y轴构成的二维坐标系旋转后四个方向的识别。所以,基于下图来分析下识别过程,就是Y轴加速度反向接近重力加速度g,就是第一种姿态;反之,是第二种姿态;X轴加速度反向接近g,则是第三种,反之,第四种。整体识别思路还是很容易理解的吧。

 

1.png

接下来我们看下官方例程是怎样的,按照上一章的方式导入参数,就可以看到状态机代码了:

2.png

这个例程也是7条语句,但是有些新的指令出现了,接下来咱逐条分析下语句的作用。

S0CMD MSKITEQ

第一条是个指令,根据指令集说明的解释,这条指令作用就是在OUTC寄存器被更新但是值没变的时候,屏蔽掉此时的中断。这条的作用接S6,待S6在讲解

S1CMD SRP

这条再上一章有提到过,将重置点指针设置在下一条,也就是S2的位置,这样之后的判断条件重置后都会回到S2.

S2RNC 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都没有变化。

 

整体的状态机流程图如下:

3.png

 

结合上面的动作图、流程图和指令分解,我相信各位就会比较清晰的理解了这个例程的工作流程了。

 

根据上述的过程,我们不难分析出,只要将MaskA的值改为0xFC,就可以识别出6个方向了。

回复评论 (1)

可以,很详细,赞

点赞  2020-8-28 19:36
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复