【LSM6DSOX有限狀態(tài)機(jī)例程學(xué)習(xí) 一】--有限狀態(tài)機(jī)及例程簡介
本帖最后由 justd0 于 2020-8-15 20:10 編輯
大家好,我是Justd0,很榮幸受到@nmg管理員大大的邀請,和大家分享ST最新的LSM6DSOX六軸傳感器。這款傳感器不僅具有16g的三軸加速度計(jì)和2000dps的三軸角速度計(jì),還內(nèi)置了有限狀態(tài)機(jī)(FSM)和機(jī)器學(xué)習(xí)處理模塊(MLC),只需要進(jìn)行相應(yīng)的配置,就可以直接輸出特定動(dòng)作的識別結(jié)果,想必這個(gè)傳感器會給大家?guī)聿灰粯拥捏w驗(yàn)。
從本帖開始,我將會用9個(gè)帖子來分享下,我在比賽過程中對LSM6DSOX的有限狀態(tài)機(jī)的理解和官方相關(guān)例程的學(xué)習(xí)使用,希望可以幫助還不是很了解這些的童鞋很能夠更好的使用ST這款六軸傳感器~ST官網(wǎng)上其實(shí)已經(jīng)提供了很詳細(xì)LSM6DSOX的說明文檔,大家可以閱讀參考,官方的文檔是最為權(quán)威的哦。所以,我分享的內(nèi)容上如有紕漏,也希望各位指正哈。
好了,進(jìn)入正題~~~
啥是有限狀態(tài)機(jī)(FSM)?
維基百科給出的解釋:有限個(gè)狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動(dòng)作等行為的數(shù)學(xué)模型。
用LSM6DSOX的示例狀態(tài)機(jī)圖解釋,如下圖,每一個(gè)藍(lán)色方塊為一個(gè)狀態(tài),程序會逐行運(yùn)行,當(dāng)滿足某些條件的時(shí)候,就會觸發(fā)相應(yīng)的狀態(tài)轉(zhuǎn)移。
按照上面的規(guī)則推到一下可知,F(xiàn)SM會先判斷狀態(tài)1中的“返回1”的條件是否滿足,如果滿足,就會回到默認(rèn)復(fù)位點(diǎn), 如果不滿足,則繼續(xù)判斷“前進(jìn)1”的條件是否滿足,如果仍不滿足,則返回復(fù)位點(diǎn), 如果滿足了,那么將會進(jìn)入狀態(tài)2執(zhí)行“命令處理”,當(dāng)處理完成后,則進(jìn)入狀態(tài)3,判斷方法跟狀態(tài)1一樣。(細(xì)心的伙伴可以看到這里的復(fù)位點(diǎn)不再是默認(rèn)的了,是的,因?yàn)橛袀(gè)命令可以更改重復(fù)位的位置,這個(gè)之后講命令的時(shí)候會提到)
FSM的有哪些特點(diǎn)?
LSM6DSOX的官方文檔上列寫了如下特點(diǎn):
輸入量可以是加速度、角速度、磁力計(jì)(需要擴(kuò)展),MLC機(jī)器學(xué)習(xí)模塊的輸出量
最多有16個(gè)狀態(tài)機(jī)程序同時(shí)運(yùn)行
每個(gè)狀態(tài)機(jī)程序都可以輸出多個(gè)狀態(tài)
有一套完整的命令和條件指令集
我們逐條來看 單位辦理工程資質(zhì)需要多本通信相關(guān)工程師職稱證書掛資質(zhì),歡迎有閑置證書的朋友聯(lián)系 陳工 150-0759-9549-微同
第一點(diǎn),輸入量可以是加速度、角速度、磁力計(jì)(需要擴(kuò)展),MLC機(jī)器學(xué)習(xí)模塊的輸出量,那么如下圖所示。加速度、角速度、磁力計(jì)的原始數(shù)據(jù)通過信號調(diào)節(jié)模塊處理成適當(dāng)靈敏度(對應(yīng)量程)的半精度浮點(diǎn)值HFP(float為32位,HFP為16位),然后直接輸入到FSM中或者經(jīng)過機(jī)器學(xué)習(xí)MLC模塊處理后將其輸出傳入FSM模塊,F(xiàn)SM處理后輸出結(jié)果。
可以看到FSM的輸入源是很豐富的,具體選擇哪個(gè)參數(shù)作為輸入源是可以通過CMD指令更改的,具體的后面再說。
第二點(diǎn),最多有16個(gè)狀態(tài)機(jī)程序同時(shí)運(yùn)行,我們把FSM展開來看,如下圖所示。在LSM6DSOX的FSM中共有16個(gè)狀態(tài)機(jī)模塊,所有狀態(tài)機(jī)間是相互獨(dú)立的。每個(gè)狀態(tài)機(jī)擁有自己的專用內(nèi)存區(qū),每個(gè)程序最大的空間為256字節(jié),而且每個(gè)狀態(tài)機(jī)獨(dú)立運(yùn)行,所以每個(gè)程序都可以獨(dú)立輸出結(jié)果。
LSM6DSOX的狀態(tài)機(jī)程序不具備掉電保存特性,每次重新上電的時(shí)候都需要重新配置。
第三點(diǎn),每個(gè)狀態(tài)機(jī)程序都可以輸出多個(gè)狀態(tài)。狀態(tài)機(jī)程序的輸出可以通過特定命令觸發(fā)內(nèi)部中斷,從而將輸出值傳送到對應(yīng)的FSM_OUTS寄存器中。當(dāng)外部INT1/INT2中斷被使能后,內(nèi)部中斷也可以路由到外部中斷,以此來提示外部處理器讀取FSM_OUTS寄存器狀態(tài)變化。輸出掩碼Mask的配置參數(shù)格式如下圖所示,通過掩碼可以設(shè)置不同組合的輸出狀態(tài),詳細(xì)的在后面講。
第四點(diǎn),有一套完整的命令和條件指令集。這個(gè)命令指令集在ST可編程傳感器.pdf中的13-14頁中有提到,我在官方的AN5273文檔中找到了更為詳細(xì)的介紹,FSM一共有16個(gè)條件指令和35個(gè)命令指令,但是由于篇幅有限,我將會在一個(gè)帖子里專門分享我對每個(gè)命令和條件指令功能的理解和使用示例。
了解了FSM是啥,都有什么特點(diǎn),小伙伴應(yīng)該就對它有了宏觀全面的認(rèn)識了。但同時(shí)也會有“這些輸入怎么選擇?輸出Mask怎么設(shè)置?中斷怎么配置?指令都有啥?等等”很多新的疑問吧,我該怎么寫有限狀態(tài)機(jī)程序呢?
這里其實(shí)ST官方已經(jīng)給我們提供了很多的應(yīng)用例程,官方例程庫可以點(diǎn)擊GitHub找到,其中針對LSM6DSOX的示例有如下7個(gè):
這些例程都使用FSM實(shí)現(xiàn)了運(yùn)動(dòng)/動(dòng)作識別的功能,相信小伙伴通過對這些例程的學(xué)習(xí)和復(fù)現(xiàn)便可以對LSM6DSOX的FSM有著更深的理解,對于以后的應(yīng)用也能輕車熟路~
我將在下一篇中 詳細(xì)的講解下FSM編程模塊的使用方法和編程指令的詳細(xì)含義,為例程學(xué)習(xí)打個(gè)小基礎(chǔ)。