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