这一章开始,我将详细的分享下对LSM6DSOX的FSM中编程模块的理解,如果不了解FSM状态机是啥的小伙伴,请先阅读LSM6DSOX的FSM有限状态机理解--状态机简介
本章我将从FSM的编程模块到Unico FSM编程界面,分别介绍各个模块、区域、变量的意义,为编写自己FSM状态机程序打个基础,下面我们开始吧。
上一帖中介绍了LSM6DSOX的FSM中一共有16个完全独立并资源相同的状态机程序块,那么每个程序块长什么样子呢?
一个状态机程序块中包含了输入选择器和状态机代码块两部分。
输入选择器能够将传感器信号或者内部计算的数据信号中选择输入信号源,所支持的信号如下:
其中,上述空间物理量和 矢量的模计算方法如公式:
怎么选择输入FSM信号源呢?这里就涉及到了一个命令“SINMUX”,用这个命令就可以配置不同的数据到FSM的数据源端了,具体用法我会在指令介绍中讲解~
状态机代码块就是我们实现自己状态机的功能模块了,如下图所示,状态机代码块由固定变量、可变变量、指令程序组成:
固定变量区位于程序块的最前端,长度固定6字节,一共6个变量,根据配置系统自动更新,无需自己更改。
可变变量区位于固定变量区之后,长度随使用而改变,最长36字节,一共24个变量,随用随设置。
指令程序区位于可变变量区之后,由条件和命令组成,控制输入选择器的命令“SINMUX”就在这个区域内设置。
状态机代码块中的上述三个区域总长度最多256字节。每次上电时,需要重新配置FSM代码块内容。
每个状态机代码块都可以根据输入的信号采样集数据,产生一个中断信号,并且修改相应的FSM_OUTS寄存器状态。
接下来结合UnicoGUI软件的FSM界面,介绍上述状态机程序块相关内容。
关于如何连接开发板和启动UnicoGUI软件,如果有问题可以参考 LSM6DSOX开箱与体验“Port not open & not supported ”问题解决。
这里默认大家都能正常打开UnicoGUI软件了哈。
在Unico的主界面左侧,点开FSM模块,可以看到界面中一共有三个标签栏,Configuration,Interrupt,Debug
默认的界面就是状态机设置、编程的界面,如下图所示。
在这个界面中我们可以看到有很多的按键和输入框,参考Unico上FSM使用.pdf文件中,我标注了8个红框区域,逐一来看:
1、StateMachine Selection,状态机选择,这个下拉菜单中一共有16个选项,对应的就是前面讲的16个独立的状态机程序块。
2、FSM_ODR,FSM频率(Output Data Rate),这个值在限制了加速度/角速度数据传输到代码块的最高频率,建议是将加速度/角速度的输出频率高于这个值,也就是在Unico主界面的Opitions中Accelerater output data rate和Gyrocope Output data rate值高于FSM ODR的值,避免欠采样问题发生。
3、Long_Counter,16位计数器,一个最大可以计数65535的全局计数器,也就是所有状态机程序块公用。Max Value是设置计数器的最大溢出值,16位数据形式标志(例如65525填写FFFF),底下两个勾选可以设置计数器溢出时是否产生INT1/INT2外部中断。计数器的值可以从程序中使用“INCR”来增加。
4、Converter,格式转换,由于FSM中用的都是半精度浮点数HFP,所以在这给我们提供了32位浮点数转16位浮点数、16位转32位的小工具。
5、SMx status,状态机x状态设置,这个区域有三个选项,Enabled用于启动状态机x,只有勾选Enabled该状态机程序块才会工作。INT1 INT2分别将状态机的中断路由到INT1、INT2外部中断上,16个状态机可以独立设置启动与否,绑定外部中断。
6、SMx Fixed Data Section,状态机x固定变量区,显示了6个变量和2个开关:
上面的固定变量,在用UnicoGUI的时候这六个变量都是跟随编程操作自动更改的,无需自行更改。
当我们想要直接使用LSM6DSOX在自己的项目中的时候,则需要考虑设置其中的值。
7、SMx Variable Data Section,状态机x可变变量区,其中显示了24个变量,共计36个字节,当我们用不到某些变量的时候,Unico就不会配置该变量到状态机程序块中,也就不占用内存。
其中黑色字体的就是可以设置的变量
灰色字体的是没法直接设置的变量
8、SMx Instructions Section,程序指令区,上图中这个区域只有四个按键,分别是
当点击Add State按键后,就可以增加一条状态指令,如下图所示
在FSM模块的Interrupt界面下,分成了两个区域,如图所示。
左侧为输入加速度、角速度、输出外部中断INT1/INT2的波形图。
右侧为16个状态机的输出寄存器OUT_Sx的数据,通过点击read,可以读取当前的值。
在FSM模块的Debug界面下,也是分成了两个区域,如下图所示。
左侧为我们写的状态机图,通过分析它可以很清楚的看到我们的状态机状态是如何改变的。
右侧为调试区域,通过导入采集的输入数据集,可以对左边的状态机进行仿真调试,这里就先不细说了。
以上就是对LSM6DSOX中FSM编程模块各个模块和参数的基础认识,对这些有了初步的认识和了解之后,我们就可以着手看看示例状态机程序,分析下其工作流程和编写流程了~
下一章 将从示例程序,对LSM6DSOX的FSM编程过程进行分析讲解。
本帖最后由 justd0 于 2020-4-22 09:52 编辑引用: littleshrimp 发表于 2020-4-22 08:00 很好的贴子,标题和内部型号是不是写错了?LSM6DSOX?
沟通后,帮他改了,哈哈
引用: littleshrimp 发表于 2020-4-22 09:45 "LSMC6DSOX" LSM6DSOX
感谢指正哈,已经修改过来啦
本贴不错,顶一下