上一章講了啥是有限狀態(tài)機(jī)模型和LSM6DSOX的FSM的特點(diǎn)。
本章我將從FSM的編程模塊到Unico FSM編程界面,分別介紹各個(gè)模塊、
區(qū)域、變量的意義,為編寫自己FSM狀態(tài)機(jī)程序打個(gè)基礎(chǔ),下面我們開始吧。
上一帖中介紹了LSM6DSOX的FSM中一共有16個(gè)完全獨(dú)立并資源相同的狀態(tài)機(jī)程序塊,
那么每個(gè)程序塊長(zhǎng)什么樣子呢?
![](http://bbs.eeworld.com.cn/data/attachment/forum/202008/16/193850s020epcusoccccbf.png.thumb.jpg)
一個(gè)狀態(tài)機(jī)程序塊中包含了輸入選擇器和狀態(tài)機(jī)代碼塊兩部分。
輸入選擇器能夠?qū)鞲衅餍盘?hào)或者內(nèi)部計(jì)算的數(shù)據(jù)信號(hào)中選擇輸入信號(hào)源,
所支持的信號(hào)如下:
LSM6DSOX加速度計(jì)數(shù)據(jù)、加速度和 矢量的模。
LSM6DSOX陀螺儀角速度數(shù)據(jù)、角速度和 矢量的模。
外部傳感器(比如磁力計(jì))數(shù)據(jù),磁力和 矢量的模。
內(nèi)部計(jì)算的角度、角度和 角度矢量和
正確配置的機(jī)器學(xué)習(xí)模塊的輸出。
其中,上述空間物理量和 矢量的模計(jì)算方法如公式:
![](http://bbs.eeworld.com.cn/data/attachment/forum/202008/16/194119f01ata2728r0u8gt.png.thumb.jpg)
怎么選擇輸入FSM信號(hào)源呢?這里就涉及到了一個(gè)命令“SINMUX”,用這個(gè)命令
就可以配置不同的數(shù)據(jù)到FSM的數(shù)據(jù)源端了,具體用法參考末尾的指令說(shuō)明。
單位需要多本通信工程師職稱證書掛資質(zhì),歡迎有閑置證書的朋友聯(lián)系 150-0759-9549-微同
狀態(tài)機(jī)代碼塊就是我們實(shí)現(xiàn)自己狀態(tài)機(jī)的功能模塊了,如下圖所示,狀態(tài)機(jī)代碼塊
由固定變量、可變變量、指令程序組成:
![](http://bbs.eeworld.com.cn/data/attachment/forum/202008/16/193850lnz7cb7l4t73tcxb.png.thumb.jpg)
固定變量區(qū)位于程序塊的最前端,長(zhǎng)度固定6字節(jié),一共6個(gè)變量,根據(jù)配置系統(tǒng)
自動(dòng)更新,無(wú)需自己更改。
可變變量區(qū)位于固定變量區(qū)之后,長(zhǎng)度隨使用而改變,最長(zhǎng)36字節(jié),一共24個(gè)變量,
隨用隨設(shè)置。
指令程序區(qū)位于可變變量區(qū)之后,由條件和命令組成,控制輸入選擇器的命令
“SINMUX”就在這個(gè)區(qū)域內(nèi)設(shè)置。
狀態(tài)機(jī)代碼塊中的上述三個(gè)區(qū)域總長(zhǎng)度最多256字節(jié)。每次上電時(shí),
需要重新配置FSM代碼塊內(nèi)容。
每個(gè)狀態(tài)機(jī)代碼塊都可以根據(jù)輸入的信號(hào)采樣集數(shù)據(jù),產(chǎn)生一個(gè)中斷信號(hào),
并且修改相應(yīng)的FSM_OUTS寄存器狀態(tài)。
指令代碼保存在LSM6DSOX狀態(tài)機(jī)程序塊的可變變量區(qū)之后,由一系列實(shí)現(xiàn)
算法邏輯的狀態(tài)組成。
每個(gè)指令都有一個(gè)8位的操作碼,每個(gè)操作碼可以實(shí)現(xiàn)一個(gè)命令指令(CMD)
或者條件指令(RESET/NEXT,RNC),它們被稱為程序狀態(tài),多個(gè)指令在
一起組成FSM整體邏輯,其中:
會(huì)需要參數(shù),參數(shù)會(huì)作為一個(gè)單獨(dú)的指令來(lái)執(zhí)行,后面詳細(xì)講。
條件和4位的NEXT條件),用來(lái)復(fù)位或者繼續(xù)執(zhí)行程序流。
指令代碼對(duì)LSM6DSOX寄存器和狀態(tài)機(jī)內(nèi)部參數(shù)偶直接影響,有些指令
還可以產(chǎn)生額外的功能,比如更新狀態(tài)信息等,下面分別介紹下命令指令和
條件指令的特點(diǎn)和使用方法。
命令指令(CMD)
命令指令是修改狀態(tài)機(jī)行為中的流控制、輸出、和同步的行為。
當(dāng)一個(gè)命令被執(zhí)行時(shí),會(huì)立即執(zhí)行(不需要更新輸入采樣集),程序指針(PP)
被設(shè)置為下一行,將執(zhí)行如下動(dòng)作:
有些命令指令可能會(huì)需要參數(shù),需要的參數(shù)必須在命令指令下一行定義。
這里用"STHR1"命令來(lái)舉例,該指令用來(lái)動(dòng)態(tài)改變閾值1(THRESH1)的值,
在Unico中的配置方法如下:
![](http://bbs.eeworld.com.cn/data/attachment/forum/202008/16/193936es1rvqqqyfrvwy0p.png.thumb.jpg)
當(dāng)程序指針(PP)指向狀態(tài)S0的0x0A地址時(shí),設(shè)備識(shí)別出"0xAA"指令碼為"STHR1"命令。
該指令需要兩個(gè)參數(shù),那么設(shè)備就不等待新的輸入采樣集,直接運(yùn)行S0-S2三個(gè)狀態(tài),
執(zhí)行后閾值1的值將被設(shè)置為“0x5640”即小數(shù)“100.0”
條件指令(RESET/NEXT,RNC)
條件指令用于重置或者繼續(xù)程序流,條件指令在一個(gè)新的輸入采樣集準(zhǔn)備好后,
在一個(gè)單一狀態(tài)下執(zhí)行。
條件指令中用于重置判斷的RESET條件定義在操作碼的高4位,而用于判斷繼續(xù)的
NEXT指令定義在操作碼的低4位,條件指令的執(zhí)行邏輯如下圖所示:
![](http://bbs.eeworld.com.cn/data/attachment/forum/202008/16/193936gcrozamineoca8ae.png.thumb.jpg)
當(dāng)進(jìn)入條件指令后,首先判斷重置條件(RESET),只有在RESET條件不滿足時(shí),
才判斷繼續(xù)條件(NEXT)。
當(dāng)兩個(gè)條件均不滿足時(shí),狀態(tài)機(jī)會(huì)等待一個(gè)新的采樣集到來(lái),然后重新開始判斷。
當(dāng)滿足RESET條件時(shí),就會(huì)發(fā)生向復(fù)位點(diǎn)切換的狀態(tài)過(guò)渡,即PP=PR。
當(dāng)RESET條件不滿足,且NEXT條件滿足時(shí),就會(huì)向下一個(gè)狀態(tài)過(guò)渡,即PP = PP+1;
默認(rèn)情況下,復(fù)位點(diǎn)(RP)被設(shè)置為第一個(gè)狀態(tài),但可以通過(guò)"SRP/CRP"指令動(dòng)態(tài)改變
復(fù)位點(diǎn)的位置。
值得注意的是,RESET和NEXT條件為同一個(gè)條件的情況是沒(méi)有意義的。
條件指令能夠判斷的條件一共有三種:
超時(shí):當(dāng)設(shè)置了定時(shí)器,定時(shí)計(jì)數(shù)器TC的值達(dá)到零的時(shí)候,條件滿足,成立。
閾值比較:當(dāng)啟動(dòng)的輸入值高于(或低于)設(shè)定的閾值時(shí),條件滿足,成立。
過(guò)零檢測(cè):當(dāng)啟動(dòng)的輸入越過(guò)零位時(shí),條件滿足,成立。
以上就是命令指令和條件指令的所有特點(diǎn)了。
FSM指令集中一共提供了16個(gè)條件指令和35個(gè)命令指令。
我已經(jīng)將所有指令集使用說(shuō)明翻譯成了中文,并排版做成了一個(gè)速查PDF,共享給大家使用。
UnicoGUI
上面講了FSM程序塊的結(jié)構(gòu)和變量區(qū),那怎么去編程呢?ST很貼心的出了一款
上位機(jī)-UnicoGUI,可以配置LSM6DSOX里的所有寄存器,FSM甚至可以直接
顯示狀態(tài)機(jī)圖,下面我將詳細(xì)介紹下UnicoGUI的FSM編程部分。
關(guān)于如何連接開發(fā)板和啟動(dòng)UnicoGUI軟件,如果有問(wèn)題可以參考 LSM6DSOX開
箱與體驗(yàn)“Port not open & not supported ”問(wèn)題解決。這里默認(rèn)大家都能
正常打開UnicoGUI軟件了哈。
在Unico的主界面左側(cè),點(diǎn)開FSM模塊,可以看到界面中一共有三個(gè)標(biāo)簽欄,
Configuration,Interrupt,Debug
默認(rèn)的界面就是狀態(tài)機(jī)設(shè)置、編程的界面,如下圖所示。
![](http://bbs.eeworld.com.cn/data/attachment/forum/202008/16/193850ulg3aq25yor2wbqw.png.thumb.jpg)
在這個(gè)界面中我們可以看到有很多的按鍵和輸入框,參考Unico上FSM使用.pdf文件中,
我標(biāo)注了8個(gè)紅框區(qū)域,逐一來(lái)看:
1、StateMachine Selection,狀態(tài)機(jī)選擇,這個(gè)下拉菜單中一共有16個(gè)選項(xiàng),對(duì)應(yīng)
的就是前面講的16個(gè)獨(dú)立的狀態(tài)機(jī)程序塊。
2、FSM_ODR,FSM頻率(Output Data Rate),這個(gè)值在限制了加速度/角速度數(shù)據(jù)
傳輸?shù)?/span>代碼塊的最高頻率,建議是將加速度/角速度的輸出頻率高于這個(gè)值,也就
是在Unico主界面的Opitions中Accelerater output data rate和
Gyrocope Output data rate值高于FSM ODR的值,避免欠采樣問(wèn)題發(fā)生。
3、Long_Counter,16位計(jì)數(shù)器,一個(gè)最大可以計(jì)數(shù)65535的全局計(jì)數(shù)器,也就是
所有狀態(tài)機(jī)程序塊公用。
Max Value是設(shè)置計(jì)數(shù)器的最大溢出值,16位數(shù)據(jù)形式標(biāo)志(例如65525填寫FFFF),
底下兩個(gè)勾選可以設(shè)置計(jì)數(shù)器溢出時(shí)是否產(chǎn)生INT1/INT2外部中斷。
計(jì)數(shù)器的值可以從程序中使用“INCR”來(lái)增加。
4、Converter,格式轉(zhuǎn)換,由于FSM中用的都是半精度浮點(diǎn)數(shù)HFP,
所以在這給我們提供了32位浮點(diǎn)數(shù)轉(zhuǎn)16位浮點(diǎn)數(shù)、16位轉(zhuǎn)32位的小工具。
5、SMx status,狀態(tài)機(jī)x狀態(tài)設(shè)置,這個(gè)區(qū)域有三個(gè)選項(xiàng),Enabled用于啟動(dòng)狀態(tài)機(jī)x,
只有勾選Enabled該狀態(tài)機(jī)程序塊才會(huì)工作。INT1 INT2分別將狀態(tài)機(jī)的中斷路由
到INT1、INT2外部中斷上,16個(gè)狀態(tài)機(jī)可以獨(dú)立設(shè)置啟動(dòng)與否,綁定外部中斷。
6、SMx Fixed Data Section,狀態(tài)機(jī)x固定變量區(qū),顯示了6個(gè)變量和2個(gè)開關(guān):
所以顯示的6字節(jié)為固定變量區(qū)大小。
信號(hào)等等。
為真所跳轉(zhuǎn)的地址。
正在執(zhí)行的指令的地址。
回滯變量可以設(shè)置。
可以設(shè)置。
上面的固定變量,在用UnicoGUI的時(shí)候這六個(gè)變量都是跟隨編程操作自動(dòng)更改的,
無(wú)需自行更改。
當(dāng)我們想要直接使用LSMC6DSOX在自己的項(xiàng)目中的時(shí)候,則需要考慮設(shè)置其中的值。
7、SMx Variable Data Section,狀態(tài)機(jī)x可變變量區(qū),其中顯示了24個(gè)變量,
共計(jì)36個(gè)字節(jié),當(dāng)我們用不到某些變量的時(shí)候,Unico就不會(huì)配置該變量到
狀態(tài)機(jī)程序塊中,也就不占用內(nèi)存。其中黑色字體的就是可以設(shè)置的變量,
否到達(dá)閾值。
會(huì)將比較值增加回滯參數(shù)變成一個(gè)比較區(qū)間,如下圖所示。
![](http://bbs.eeworld.com.cn/data/attachment/forum/202008/16/193851ba9k99580zwlkakl.png.thumb.jpg)
過(guò)零條件判斷。
將該狀態(tài)機(jī)處理數(shù)據(jù)的頻率降為FSM ODR/Dest。
機(jī)器學(xué)習(xí)核心內(nèi)部的決策樹結(jié)果,當(dāng)FSM和機(jī)器學(xué)習(xí)結(jié)合的時(shí)候
就需要用到這個(gè)參數(shù)。
灰色字體的是沒(méi)法直接設(shè)置的變量,
Temporary MaskA-C,臨時(shí)掩碼,用來(lái)保存MasksA-C的復(fù)制值。
DX,DY,DZ,DV,三軸角度、角度和矢量的模,顯示的是當(dāng)前傳感器
角速度積分得到的角度值。
DeltaT,角速度積分參數(shù),角速度會(huì)乘上該值后積分乘角度值。
PAS,Previous axis sign,上一個(gè)軸號(hào),儲(chǔ)存前一個(gè)采樣的軸號(hào),在
零點(diǎn)交叉條件下使用。
過(guò)期。
8、SMx Instructions Section,程序指令區(qū),上圖中這個(gè)區(qū)域只有四個(gè)按鍵,
分別是Add State 增加狀態(tài)指令,Import State Machine導(dǎo)入狀態(tài)機(jī)指令,
Export State Machine導(dǎo)出狀態(tài)機(jī)指令和Reset State Machine重置狀態(tài)機(jī)指令。
當(dāng)點(diǎn)擊Add State按鍵后,就可以增加一條狀態(tài)指令,如下圖所示
![](http://bbs.eeworld.com.cn/data/attachment/forum/202008/16/193851o0mlammy2fr22yyl.png.thumb.jpg)
圖中紅框內(nèi)容從左至右分別是:
復(fù)位點(diǎn)和Program Pointer(PP)當(dāng)前運(yùn)行程序點(diǎn)中的數(shù)據(jù)就是指這個(gè)
地址,首狀態(tài)地址隨前面固定變量和可變變量總長(zhǎng)度而定,圖中由于
只有6個(gè)固定長(zhǎng)度,因此狀態(tài)S0地址為0x06。
RNC,Reset/Next conditions,選擇該條狀態(tài)為條件指令
CMD,Commands,選擇該條狀態(tài)為命令指令
指令選擇框,選擇需要的指令
16進(jìn)制指令碼,所選指令的16進(jìn)制形式
Add,增加狀態(tài)按鈕,在此狀態(tài)前增加狀態(tài)
Remove,刪除狀態(tài)按鈕,刪除此條狀態(tài)。
在FSM模塊的Interrupt界面下,分成了兩個(gè)區(qū)域,如圖所示。
左側(cè)為輸入加速度、角速度、輸出外部中斷INT1/INT2的波形圖。
右側(cè)為16個(gè)狀態(tài)機(jī)的輸出寄存器OUT_Sx的數(shù)據(jù),通過(guò)點(diǎn)擊read,可以讀取當(dāng)前的值。
![](http://bbs.eeworld.com.cn/data/attachment/forum/202008/16/193851grqg05g17q36fqqr.png.thumb.jpg)
在FSM模塊的Debug界面下,也是分成了兩個(gè)區(qū)域,如下圖所示。
左側(cè)為我們寫的狀態(tài)機(jī)圖,通過(guò)分析它可以很清楚的看到我們的狀態(tài)機(jī)狀態(tài)是如何
改變的。
右側(cè)為調(diào)試區(qū)域,通過(guò)導(dǎo)入采集的輸入數(shù)據(jù)集,可以對(duì)左邊的狀態(tài)機(jī)進(jìn)行仿真調(diào)試,
這里就先不細(xì)說(shuō)了。
![](http://bbs.eeworld.com.cn/data/attachment/forum/202008/16/193851vwg4hi3kkbguqzjh.png.thumb.jpg)
以上就是對(duì)LSM6DSOX中FSM編程模塊各個(gè)模塊和參數(shù)的基礎(chǔ)認(rèn)識(shí),對(duì)這些有了初步的
認(rèn)識(shí)和了解之后,我們就可以著手看看示例狀態(tài)機(jī)程序,分析下其工作流程和編寫流程了~
以下是35個(gè)命令指令和16個(gè)條件指令的簡(jiǎn)介截圖,翻譯文檔我放在文章末尾了~:
命令指令
![](http://bbs.eeworld.com.cn/data/attachment/forum/202008/16/193937fdm7pro666o9lezi.png.thumb.jpg)
條件指令
![](http://bbs.eeworld.com.cn/data/attachment/forum/202008/16/193937cqoqlsqlcqmq0vvv.png.thumb.jpg)