導航:首頁 > 源碼編譯 > 演算法集成平台設計

演算法集成平台設計

發布時間:2023-08-06 20:45:28

⑴ 代碼嵌入模型是什麼

集成式MBD開發方式
把FOC演算法模型嵌入代碼
寫在最後

姍姍來遲的第五期(天太冷了,搭模型、寫文章也需要毅力)。
本期將是2021年的收官,也將是MBD實戰之電機控制系列的最後一期。這一期將介紹如何將模型生成的代碼集成到已有的代碼中去——把演算法模型嵌入你的代碼之中去。
1 集成式的MBD開發方式

這個話題這前面的文章中提過了很多次,之所以頻繁的提及這種集成的方法,是因為這是目前MBD(Model-Based Design,基於模型的設計)的主流開發方式。
具體而言,集成式MBD的開發方法是:軟體代碼手寫一部分,模型生成一部分,然後再將兩部分集成在一起,從而實現完整的軟體開發。
手寫代碼和模型生成有著不同的分工:
手寫代碼:適用於底層驅動、外設初始化、內存管理、中斷管理、OS、Bootloader、協議棧等,還包括片外擴展IC的初始化,以及其他數學特徵不明顯的功能;
模型生成:適用於數學演算法、狀態機、數據處理等。
Tips:為了便於區分,本文將手寫的代碼稱為底層代碼,而模型生成的代碼稱為模型代碼。底層代碼負責的模塊並不一定全部都是必須的,例如OS(嵌入式中一般使用實時操作系統,比如FreeRTOS),很多控制可能不需要OS,只需要中斷管理即可。
可以看出,底層代碼負責的功能,並不適合使用模型來實現。上一期給出的完全由模型實現的電機控制框架,雖然實現了電機控制,但實際上忽略了很多實際項目中必須的模塊,例如OS、Bootloader等,還有很多安全機制也沒有考慮。
底層代碼功能理論上也能通過模型來實現,但沒必要、也不需要用模型的方式來實現。MathWorks官方也一直推薦僅使用Simulink/MATLAB搭建演算法模型,像底層驅動、內存管理、OS、Bootloader、協議棧等等,還是通過手寫代碼的方式更為高效。
這一點我有直接咨詢過MathWorks的工程師,他告訴我底層代碼要通過模型來實現,其難點在於TLC語言的復雜性和硬體晶元的多樣性(市面上的晶元太多,每一個都需要適配),這兩點沒有專業的團隊,很難實現模型的高效性。
Tips:我有了解到,有的公司利用StateFlow實現了類似於OS的Task Manager,用於管理模型中的不同任務。其構成也是相當復雜,沒有專門的團隊是沒辦法開發和維護的。但也僅限於任務調度——我感覺像復雜的狀態機,OS的很多功能是沒辦法用StateFlow實現的。
對於有復雜演算法的軟體,MBD代碼生成就可以大顯身手了,演算法越復雜,優勢就越顯著。舉一些例子,如:電機控制、電池管理系統(BMS)、路徑規劃、緊急制動(AEB)、自動泊車(APS)等演算法,其演算法實現都可以通過MBD的方式來開發。
用MBD來開發演算法,簡單總結有如下優勢:
便於演算法實現和調整:這里指的並不是找Bug,演算法的數學表達可能是固定的,但在特定的應用場景下,演算法的局部需要特定調整,例如添加狀態機實現不同狀態的切換。藉助模型的圖形化,以及MATLAB/Simulink上的各種工具箱,這種調整是很直觀,並且很容易實現。
專注演算法且演算法獨立:使用模型搭建演算法,我們只需要專注演算法實現的本身,不需要考慮底層驅動等因素;由於不考慮底層驅動,演算法模型可以方便地實現移植。有人說演算法的核心是數學,寫代碼往往並不太容易兼顧數學,但搭建模型可以。
便利的模擬測試:演算法的測試對於優化演算法是非常強有力的途徑,通過MBD,可以方便的實現MIL、SIL、PIL和HIL,根據測試結果,反饋到模型中,再對模型進行調整,這其中的效率是手寫代碼無法比擬的。
我自己是有完全手寫代碼實現電機控制軟體所有環節的經驗的,對比搭建MBD電機控制框架的開發過程,上述優點是非常明顯的,我深有體會。這些優點對新手入門也是非常友好,特別是對非電子、計算機專業的人來說。
在使用集成式MBD開發項目時,軟體實現一般需要兩個角色:
底層工程師:底層工程師需要對MCU和硬體電路設計很熟悉,他負責實現底層驅動、MCU初始化、OS、Bootloader、協議棧等。他使用手寫代碼的方式進行開發,在底層代碼中給演算法預留好介面,以供演算法集成。
演算法模型工程師:演算法模型工程師則負責搭建模型、測試演算法,測試通過後就可以生成代碼,然後集成到底層代碼中去。
Tips:軟體實現還可以有一個統籌底層代碼和模型代碼的架構工程師,給底層和模型設計需求;非軟體的部分,一般有一位硬體工程師。
集成好了之後可能還需要進行測試,因為模擬畢竟和實際情況有差異。這時候再調整模型,或者調整底層代碼,就可以做到彼此獨立、互不幹擾了。這一點在傳統的開發中往往是一大痛點,而MBD可以很好的解決這個問題。
2 把FOC演算法模型嵌入代碼

依然以PMSM無感電機控制軟體開發為例來介紹如何實現模型代碼的集成,硬體平台是NXP的電機開發套件MCSPTE1AK144。
電機開發套件MCSPTE1AK144 - From NXP
後文中提到的最新的模型和代碼已經更新到了我的GitHub倉庫中,下載模型可以訪問下面這個鏈接:
GitHub倉庫:autoMBD電機控制項目
https://github.com/TkungAI/autoMBD_Motor_Control
也可以在私信作者發送關鍵詞「MBD電機控制」,作者還有其他資源,發送關鍵詞「資源」可以收到下載鏈接。
回到正題,如何開展集成式MBD開發,有以下三個工作環節:
1. 實現演算法模型

首先要明確演算法模型的需求,可以簡單地概括為:
演算法的輸入和輸出是什麼?
演算法的內部變數有哪些?
演算法要處理什麼任務(狀態機)?
這三個問題的解答也需要和底層工程師和硬體工程師一起協商、相互約束、相互補充,共同明確需求。下圖是本次實現的電機控制演算法模型(文件名FOC_Ctrl_CodeModel.slx):
PMSM無感電機控制演算法模型 - From autoMBD
PMSM無感電機控制演算法模型
-
From autoMBD
這里給出我在本次的PMSM無感電機控制軟體開發中,對上述三個問題的回答:
輸入和輸出
輸入為5個ADC采樣信號和2個電機控制信號,ADC採用數據用於FOC演算法、目標轉速的輸入,電機控制信號用於控制電機的啟停;輸出為三相占空比Duty Cycle和LED信號,分別用來執行控制和顯示控制狀態(參見上圖)。
中間變數
中間量不會輸出,是在演算法處理數據過程中產生的,可以體系演算法的特徵,比如處理後的電壓信號、電流信號、無感演算法估計的速度和位置、控制信號等。這部分通過Bus數據對象實現對數據結構體的定義。下圖中的varFOC即包含了所有的中間量。
中間變數和StateFlow Chart - From autoMBD
狀態機設計
這部分也就是明確電機控制軟體具有的功能、任務。在不同的階段,演算法執行的內容是不一樣的,例如關閉電機的狀態下,不需要跑FOC演算法。本次項目中,只實現了簡單啟動、關閉和故障清楚的功能,狀態相對簡單,如下圖所示:
演算法模型狀態機 - From autoMBD
Tips:如果有看之前提出的電機控制框架模型,應該就能發現這里的狀態機與之非常相似。實際上這里的狀態機是對原版的更新和優化,把函數調用方式從Function Call換成了Simulink Function,在Chart內部即可調用函數,不需要把調用的函數模型建立在Chart外面了。具體狀態機的講解可以參考電機實戰的03期和04期的內容。
要注意的是,在Run狀態下,調用的FOC核心演算法模型,其包含了獨屬於FOC演算法的子狀態機和中間變數FocInternalPara。這里將FOC演算法部分和與非FOC演算法部分進行了分別設計,增加演算法的靈活性和移植性。
FOC核心數學演算法 - From autoMBD
FOC核心演算法模型子狀態機 - From autoMBD
Tips:該狀態機只負責FOC演算法的狀態控制,包括對齊、開環、追蹤和無感閉環四個狀態,具體內容可以參考電機實戰的04期的內容。
演算法模型的內容就介紹到這里,其他的細節還請下載模型後打開查看。模型創建好了就可以生成代碼了:
演算法模型生成代碼 - From autoMBD
這里生成的代碼即集成時需要用到的代碼。生成代碼文件很多,其實是可以優化減少的,後續再開新的文章來講解如何優化生成的代碼。
2. 實現底層代碼

Tips:底層代碼的實現本質上就是手寫代碼的開發方式,只不過不做演算法部分而已,所以需要有一定的編程基礎。網路上有很多嵌入式開發的文章和案例,autoMBD的目標也不是介紹手寫代碼的開發,所以這里不會很細致的講如何實現底層代碼,僅從方法論的角度簡單介紹一下。
可以發現,上述的演算法模型中已經沒有任何的硬體支持包的模塊了,即已經不包含任何的底層驅動、外設初始化等等的功能,這部分由底層代碼來實現。
要開發底層代碼,需要用到集成開發環境IDE。對於S32K1系列晶元,NXP公司提供了一套免費的、專用於NXP汽車晶元的IDE工具——面向Arm®的S32 Design Studio(簡稱S32DS)。
面向Arm®的S32 Design Studio - From NXP
打開S32DS後,窗口如下圖所示:
S32DS窗口 - From NXP
要配置底層驅動,需要用到S32K1專用圖形配置工具——Processor Expert(上圖中紅色方框中的部分)。該工具能夠實現對S32K1系列晶元的靈活配置。而底層驅動則需要使用S32K1 SDK,該SDK具有豐富的API供開發者使用,功能完善且強大。
關於Processor Expert和S32K1 SDK的使用,更多請參考NXP的技術文檔。
本次項目中我也實現了一個基本的PMSM無感電機控制的底層代碼,包括外設配置、MCU初始化和中斷管理的內容,該DS工程位於倉庫的這個位置:
S32DS_Prjct -> FOC_Ctrl_MBD_Integration。
該底層代碼實現的功能與上一期中的電機控制框架基本一致。
3. 模型代碼的集成

到這里,模型代碼和底層代碼都已經實現,如何集成呢?實際上生成的代碼中有一個ert_main.c的文件就給出了集成的實例,讀者可以參考該文件。
模型代碼集成的過程是比較簡單的,主要分為以下幾步:
模型初始化:FOC_Ctrl_CodeModel_initialize()
周期性運算Step函數:FOC_Ctrl_CodeModel_step()或rt_OneStep()
終止(如果需要):FOC_Ctrl_CodeModel_terminate()
Tips:調用並運行模型演算法的是Step函數,即計算模型的一個步長。兩個Step函數功能是一樣的,rt_OneStep()在」模型Step「的基礎上封裝了一層錯誤檢查,但該錯誤檢查基本上起不了什麼作用。
特別要注意的是周期性調用Step函數的周期,需要和演算法的運算周期保持一致,不然可能會出現錯誤結果。
本次項目中,模型初始化在MCU初始化完成後調用;Step函數的調用在Motor_ISR中;模型演算法不會終止,所以不需要Terminate函數。
初始化的具體代碼如下:
/* Low level driver initialization */ MCU_Init(); GD3000_Init(); FMSTR_Init(); /* Initialize model */ FOC_Ctrl_CodeModel_initialize(); MCU_Start(); /* Forever loop */ while(1) { FMSTR_Poll(); mainCnt++; }
Motor_ISR:
void Motor_ISR (void) { /* Read ADC*/ ADC_DRV_GetChanResult(INST_ADCONV1, 0, &adcResult[0][0]); /* V_REFSH */ ADC_DRV_GetChanResult(INST_ADCONV1, 1, &adcResult[0][1]); /* Pot */ ADC_DRV_GetChanResult(INST_ADCONV1, 2, &adcResult[0][2]); /* iA */ ADC_DRV_GetChanResult(INST_ADCONV1, 3, &adcResult[0][3]); /* Temp */ ADC_DRV_GetChanResult(INST_ADCONV2, 0, &adcResult[1][0]); /* V_REFSL */ ADC_DRV_GetChanResult(INST_ADCONV2, 1, &adcResult[1][1]); /* uDC */ ADC_DRV_GetChanResult(INST_ADCONV2, 2, &adcResult[1][2]); /* iB */ ADC_DRV_GetChanResult(INST_ADCONV2, 3, &adcResult[1][3]); /* iDC */ /* Set model inputs here */ FOC_Ctrl_CodeModel_U.ADCinput[0] = adcResult[0][2]; FOC_Ctrl_CodeModel_U.ADCinput[1] = adcResult[1][2]; FOC_Ctrl_CodeModel_U.ADCinput[2] = adcResult[1][3]; FOC_Ctrl_CodeModel_U.ADCinput[3] = adcResult[1][1]; FOC_Ctrl_CodeModel_U.ADCinput[4] = adcResult[0][1]; FOC_Ctrl_CodeModel_U.FaultSwitch = faultSwitch; FOC_Ctrl_CodeModel_U.MotorSwitch = motorSwitch; /* Calculate one-step for the modle */ rt_OneStep(); /* Get model output here */ pwmDuty[0] = (uint16_t)(FULL_DUTY * FOC_Ctrl_CodeModel_Y.DUTY[0]); pwmDuty[1] = (uint16_t)(FULL_DUTY * FOC_Ctrl_CodeModel_Y.DUTY[1]); pwmDuty[2] = (uint16_t)(FULL_DUTY * FOC_Ctrl_CodeModel_Y.DUTY[2]); /* Set PWM ty */ FTM_DRV_FastUpdatePwmChannels(INST_FLEXTIMER_PWM1, 3, pwmChannels, pwmDuty, true); /* Clear FTM flag */ FTM_DRV_ClearStatusFlags(3, FTM_TIME_OVER_FLOW_FLAG|FTM_RELOAD_FLAG); }
可以看到模型的傳參和返回結果是通過全局變數的方式實現的:
輸入全局變數:FOC_Ctrl_CodeModel_U
輸出全局變數:FOC_Ctrl_CodeModel_Y
這里是可以通過對演算法模型進行設置的,可以改成傳參的方式,本次項目使用的是默認方式。
前文中的演算法模型的中間變數也是一個全局變數:
模型中間變數:FOC_Ctrl_CodeModel_DW.varFOC
到這里模型代碼的集成就算完成了,可以像手寫代碼的方式調試和下載代碼了。
其實還有很多關於代碼集成的細節和技巧沒有提到,本次項目實現的模型代碼完全是在默認設置下生成的。
Simulink是可以對生成的代碼進行很細致的控制的,例如控制代碼生成的位置、函數傳參的方式、函數的復用等,還有代碼如何優化,如何創建數據字典來管理模型數據。關於這些技巧和實踐,我會在後續的文章中進行介紹,歡迎持續關注作者。
3 寫在最後

先說一點題外話,我最近才了解到NXP新發布的S32K3系列晶元,其最新的硬體支持包MBDT有了一個較大的升級,它的底層模塊已經實現了完全等同於S32K3專用底層配置工具的功能。這一升級使得底層驅動這一功能也可以在Simulink模型中實現。
現在的S32K1的MBDT底層模塊由於功能很有限,很多情況下底層驅動的配置必須使用專用配置工具Processor Expert來配置才能滿足需求。而S32K3的更新有望改變這一現狀,有興趣的可以了解一下S32K3晶元和它最新的硬體支持包MBDT。
S32K3X4EVB-Q172 - From NXP
到本篇文章為止,我認為關於MBD的基礎部分,應該已經寫得差不多了,如果看完我的全部文章,應該能有所收獲。
下一期我將對所有發布的文章,和GitHub倉庫進行一次清理和總結。
明年autoMBD將會進入到下一個階段,會嘗試更有挑戰的內容,例如TLC語言、MBD實現通信、MBD與OS的結合等。所以請持續關注autoMBD,更多技術分享不容錯過。
2021年還剩下最後一周,在這里提前祝大家2022年新年快樂,希望各位讀者能在2022年收獲更多!

⑵ 演算法設計策略有哪些

演算法設計策略如下:

1、分治html

分治法的設計思想是,將一個難以直接解決的大問題,分割成k個規模較小的子問題,這些子問題相互獨立,且與原問題相同,而後各個擊破,分而治之。演算法。

5、分支限界

回溯法是對解空間進行深度優先搜索,事實上任何搜索遍整個解空間的演算法都可解決問題。因此採用通用圖搜索的任何實現做為搜索策略都可解決問題,只要作到窮舉便可。除了深度優先搜索以外,咱們還可採用廣度優先搜索,而分支限界法則是對解空間進行優先順序優先搜索。

⑶ 設計一個好的演算法通常要考慮哪些要求

數據結構中評價一個好的演算法,應該從四個方面來考慮,分別是:

一、演算法的正確性。

二、演算法的易讀性。

三、是演算法的健壯性。

四、是演算法的時空效率(運行)。

演算法的設計取決於數據(邏輯)結構,演算法的實現取決於所採用的存儲結構。數據的存儲結構本質上是其邏輯結構在計算機存儲器中的實現。為了全面反映一個數據的邏輯結構,它在內存中的影像包括兩個方面,即數據元素之間的信息和數據元素之間的關系。

不同的數據結構有相應的操作。數據的操作是在數據的邏輯結構上定義的操作演算法,如檢索、插入、刪除、更新和排序。

(3)演算法集成平台設計擴展閱讀

該演算法的一般性質包括:

1.通用性對於任何符合輸入類型的輸入數據,都可以根據演算法解決問題,並且包保證了計算結構的正確性。

2.演算法的每一條指令都必須能夠被人或機器執行。

3.確定性演算法應該在每一步之後都有明確的下一步指示。也就是說,確保每個步驟都有下一步行動的指示,不缺少或只包含含糊的下一步行動指示。

4.有限演算法的執行必須在有限步結束。

閱讀全文

與演算法集成平台設計相關的資料

熱點內容
心理大全pdf 瀏覽:1000
區域鏈加密幣怎麼樣 瀏覽:339
查找命令符 瀏覽:95
壓縮工具zar 瀏覽:735
白盤怎麼解壓 瀏覽:474
辰語程序員學習筆記 瀏覽:47
程序員被公司勸退 瀏覽:523
java三子棋 瀏覽:692
加密空間怎麼強制進入 瀏覽:345
ug分割曲線命令 瀏覽:209
學碼思程序員 瀏覽:609
自考雲學習app為什麼登不上 瀏覽:410
domcer伺服器晝夜更替怎麼搞 瀏覽:436
plc和單片機哪個好 瀏覽:535
帝國神話組建雲伺服器 瀏覽:827
鄧散木pdf 瀏覽:199
方舟怎麼直連伺服器圖片教程 瀏覽:563
假相pdf 瀏覽:336
找對象找程序員怎麼找 瀏覽:976
怎麼投訴蘋果商店app 瀏覽:470