1 從零新建一個MBDT工程
- 按鍵中斷 :檢測S32K144 EVB上的按鍵SW2,每按下一次,紅色LED燈切換一次亮滅狀態;
- 周期中斷 :每0.5秒(2 Hz)進入一次周期中斷服務函數,切換綠色LED燈亮滅狀態,綠色LED燈會亮滅交替閃爍。
從零開始創建MBDT工程可以分為七個步驟:
**1. **將S32K144 EVB連接到電腦上,注意檢查OpenSDA端口號和磁盤中S32K144 EVB盤號;
**2. **選擇合適的位置作為MATLAB的工作空間,新建Simulink模型,并命名保存;
**3. **在模型中添加必要模塊,包括MBD_S32K1xx_Config_Information、Digital_Input_ISR、Periodic_Interrupt_Timer和兩個Function-Call Subsystem,如下圖:
添加模塊到新建工程中 - From autoMBD
**4. **配置模塊的參數,各個模塊的配置可以參照以下截圖(未給出截圖的地方保持默認即可):
MBD_S32K1xx_Config_Information配置1 - From autoMBD
MBD_S32K1xx_Config_Information配置2 - From autoMBD
Periodic_Interrupt_Timer配置 - From autoMBD
Digital_Input_ISR配置 - From autoMBD
**5. **構建中斷中執行的功能,本示例執行的功能較為簡單,僅控制燈的亮滅。具體的模型如下(兩個模型實際上是一樣的,只不過輸出的引腳不一樣):
周期中斷的中斷函數模型 - From autoMBD
按鍵中斷的中斷函數模型 - From autoMBD
**6. **選擇固定步長,配置工程的步長為0.001 s,設置求解器為離散求解器。工程的步長根據實際需要進行配置,但也要考慮模型的運算量。如果運算量大,在設置的步長內不能完成計算,會導致錯誤結果。
工程求解器配置 - From autoMBD
**7. **至此MBDT的工程已經完成,可以生成代碼了。在“C CODE”標簽中點擊“Build”(快捷鍵ctr + B),Simulink編譯后會將代碼自動下載到S32K144 EVB中,并運行起來。一切正常的話,下載后可以看到綠色LED燈在不斷閃爍,按壓SW2按鍵,可以控制紅色LED燈的亮滅。
從零開始新建一個MBDT工程的基本步驟就是這樣的了。
使用模型來構建自己的函數,最常用到的是Simulink中的 Stateflow ,它可以高效的產生和控制各種信號(Signal)、事件(Event)和狀態(State)。后期會專門針對Stateflow開一期,歡迎關注。
2 使用S32DS下載生成的代碼
可能有讀者會疑惑,為什么需要使用S32DS下載生成的代碼,Simulink不是已經下載好了嗎?原因我總結有以下三點:
- 最重要的一點是 ,底層驅動并不適合通過模型的方式來實現,最高效的還是使用S32DS來配置底層。一般建議將算法部分和底層驅動分開,這樣的話需要有一個集成的過程,這就避免不了使用S32DS;
- 使用S32DS進行debug更加高效和便捷,功能也更加強大;
- 通過S32DS還可以對生成的代碼進行擴展,擴展一些其它庫或者技術棧。
從我目前了解到的,一個完整的基于MBD的開發,還很難擺脫對IDE的依賴,所以這里給出使用S32DS下載生成的代碼的示例。同樣給出一個視頻教程時長約4 min 44 s。
使用S32DS下載生成的代碼,一共有6個步驟:
**1. **打開S32DS,新建一個空白工程,并刪去main.c文件。注意新建工程時不要選擇SDK,因為生成的代碼中已經包含了SDK,其他保持默認即可。
*新建S32DS工程(不選擇SDK) * - From autoMBD
但如果你在 模型中使用了AMMCLIB的相關模塊 ,可以在新建的時候添加相應的AMMCLIB庫:
*添加AMMCLIB工具 * - From autoMBD
當然也可以通過添加庫的方式添加AMMCLIB,添加庫的方法是:選中工程,右鍵選擇“Properties”,找到Paths and Symbols中的Library Paths和Libraries,添加S32K14x_AMMCLIB.a文件和路徑即可(其他擴展庫也是這樣的方法添加):
*添加AMMCLIB工具 * - From autoMBD
需要注意的是路徑和庫文件的格式,以我自己安裝的AMMCLIB1.1.24為例,格式如下:
- 庫文件為 英文的冒號+文件名 ,不包含路徑
*添加庫文件 * - From autoMBD
- 庫路徑為 路徑所在目錄 ,不包含庫文件
*添加庫路徑 * - From autoMBD
視頻展示的例程沒有使用到AMMCLIB庫,所以沒有上述過程。
**2. **將Simulink生成的代碼復制到S32DS工程中去,生成的代碼在Simulink工作空間一個標題為 “工程名”+“_mbd_rtw” 的文件夾中。生成的代碼源文件有:
- common文件夾內所有文件
- inc文件夾內所有文件
- S32K144文件夾內所有文件
- src文件夾內所有文件
- 目錄內所有***.c和.h文件***
將上述所有源文件復制到新建的工程中去:
*復制生成的代碼到S32DS工程中 * - From autoMBD
**3. **下一步,添加編譯路徑。需要添加的具體路徑如下:
- ${ProjDirPath}/src
- ${ProjDirPath}/src/common
- ${ProjDirPath}/src/inc
- ${ProjDirPath}/src/S32K144/include
- ${ProjDirPath}/src/src/clock/S32K1xx
- ${ProjDirPath}/src/src/power/S32K1xx
值得注意的是, 如添加了庫,那么庫的include文件也需要包含到路徑中 。還是以AMMCLIB1.1.24為例,庫的包含路徑為:
- C:NXPAMMCLIBS32K14x_AMMCLIB_v1.1.24include
同樣視頻中也沒有這個步驟。添加庫的方法是:選中工程,右鍵選擇“Properties”,找到Paths and Symbols中的“Includes”,依次添加上述路徑即可。如下圖所示:
*添加必要的編譯路徑 * - From autoMBD
**4. **將startup.c、system_S32K144.c從編譯路徑中移除,因為這些文件和新建的S32DS工程有重復,編譯會報錯。從編譯路徑移除的方法是:選中要移除編譯路徑的文件,右鍵選中Buidl path -> Remove from -> Debug_FLASH。
移除編譯路徑的文件并沒有被刪除,但不會被編譯,同時文件會變成灰色。如下圖所示:
*移除編譯路徑的文件 * - From autoMBD
5. 至此生成的代碼已經成功導入到S32DS中了,可以點擊編譯查看是否有錯誤。
*編譯S32DS工程 * - From autoMBD
**6. **點擊Debug蟲,開始下載代碼
下載S32DS工程* * - From autoMBD
下載成功后,即可開始Debug,下圖方框中的按鈕分別是:運行、暫停、終止、斷開連接、步入、步進、步出。
*S32DS Debug調試 * - From autoMBD
通過S32DS下載的代碼,功能和Simulink下載的是完全一樣的。
3 基于MBDT實現PIL測試
通過MBDT,實現PIL(Processor In the Loop)是比較簡單的。
PIL的基本原理是,Simulink在下載代碼的同時,會在代碼中包含一段通信協議。該通信協議可以接受Simulink發送的指令,并傳輸代碼運算的結果到Simulink。
在Simulink的每一個步長中,Simulink會將輸入信號發送到MCU,MCU計算好后,再將結果傳回Simulink,周而復始實現PIL測試。一般采用的是串口通信方式,本示例中使用的是UART通訊。
**Tips:**該通信協議被稱為rtiostream,是Simulink開發的,有興趣的可以去了解一下。
這里要提一下,在MCU的應用中,是沒必要做SIL(Software In the Loop)的,因為SIL是在電腦上跑(跑的是exe文件),而實際代碼是在MCU中跑。這樣的SIL測試結果沒什么意義。MCU的應用中,一般只需要執行PIL和HIL。
開展PIL測試需要創建兩個工程:Model工程是被測工程,會生成代碼,并下載到MCU中運行;Top工程是上位機工程,用于產生Model工程的輸入信號,并與MCU進行數據交互。
本示例中對 AMMCLIB中的Sin函數進行PIL測試 ,測試其在MCU中的運行效果。開展PIL測試一共分為了四個步驟:
**1. **首先將S32K144 EVB連接到電腦上,并為MATLAB選擇合適的工作空間。前文已經提到過,這里不再贅述。
**2. **創建Model工程。Model工程比較簡單,可按以下步驟進行創建:
- 添加MBD_S32K1xx_Config_Information模塊,并配置參數;
- 添加GFLIB_Sin_FLT、輸入和輸出模塊;
- 配置工程步長為0.001 s。
創建的Model工程如下圖所示:
*PIL測試的Model工程 * - From autoMBD
**3. **創建Top工程。可按以下步驟創建:
- 添加Model模塊,并關聯到需要測試的model工程;
- 添加對照模塊,斜坡輸入(斜率π,初始值-2π)作為輸入信號;
- 配置工程步長為0.001 s。
值得注意的是,PIL的輸入信號要轉換為單精度數,因為MCU處理的是單精度數據。創建的Top工程如下:
*PIL測試的Top工程 * - From autoMBD
**4. **至此PIL測試的模型搭建已經完成了。將仿真總時長設為6 s,點擊Run即可開始PIL測試。測試過程中的現象可查看上面的視頻,這里給出一個測試結果的圖:
*PIL測試的結果 * - From autoMBD
由于斜坡輸入的斜率為π,初始值-2π,總仿真時長為6π,那么測試的輸入信號范圍是-2π到4π。從上圖可以看到,-2π到2π之間的曲線是吻合得較好的,當輸入信號大于2π時,MCU的Sin函數計算結果開始出現失真。
查看AMMCLIB的手冊說明,找到GFLIB_Sin_FLT的說明
*GFLIB_Sin_FLT的說明 * - From AMMCLIB手冊
可以看到這里要求的輸入范圍是-π到π。一般對于MCU來說,算力非常緊張,所以這種非線性的數學函數會有特殊的要求,如果不滿足就會出現失真,結果不正確。所以我們在使用這類函數的時候一定要注意使用要求,從而保證最佳的性能。
-
led燈
+關注
關注
22文章
1592瀏覽量
107851 -
simulink仿真
+關注
關注
0文章
75瀏覽量
8565 -
按鍵中斷
+關注
關注
0文章
15瀏覽量
6438 -
MCU芯片
+關注
關注
3文章
248瀏覽量
11394 -
S32DS
+關注
關注
0文章
8瀏覽量
805
發布評論請先 登錄
相關推薦
評論