Arduino無代碼控制系統設計,使用Simulink完成(不定期更新)
前幾天做完畢業設計,因為是和MATLAB有關的,正好之前是一個玩Arduino控制系統設計的小玩家,是以準備把這個東西整理一下發一發,個人玩Arduino也有三年多的時間,因為是使用simulink去實作控制,之前有學習過鳥哥的ESP8266的文章,是付費的,但是值得一看的。但是因為MATLAB對于8266的支援不太好,就使用Arduino的uno來寫吧。現在在CSDN上也有很多關于Arduino和simulink的教程,但是大多是單篇的,隻教你怎麼連接配接到simulink上。我希望自己出一個完整點的教程,因為是第一次寫這種系列教程部落格,有不足之處請大家指出,我會盡快修改。
一.Arduino與Simulink
筆者是自動化專業出身,在正常的認知中,控制系統設計是使用的單片機,比如51單片機,stm32,或者是PLC,大型的控制系統使用DCS。那麼這裡面,到DCS控制系統中,其實已經很少用到代碼了,大部分的正常PID,串級回路,以及簡單的先進控制,比如模糊,史密斯預估這種控制方案,已經由DCS廠家為你做好了功能塊了,使用的工程師隻需要針對功能塊的引腳進行操作就可以實作對控制系統的設計了,比如這樣。
這樣的好處是加快控制系統的開發和投入生産。而在單片機領域,也有去代碼化的設計方案出現。比如常見的STM32的cubemx,當然,它僅僅隻限于單片機的引腳功能管理和時序設計。當然,matlab也是支援STM32的cubemx的,但是線上的調試功能做的還不如Arduino,是以我選擇使用Arduino,可能未來我也會出一些stm32相關的文章。接下來就進行Arduino與Simulink 的環境的搭建
二.環境搭建
安裝硬體支援包:我是新買的電腦,是以matlab的版本是2020a,各位選擇的話,一定要選擇14b之後的,如果配置吃得消,就選最新的把。
打開matlab>點選附加功能>擷取硬體支援包,選擇安裝硬體支援包:Simulink Support Package for Arduino Hardware 。如圖第三個安裝包。
因為美國網絡問題可能出現各種安裝錯誤的問題,這個不用我多說怎麼解決了吧。
安裝好後就可以開始使用了
三.Arduino與simulink的連接配接
在第一次使用Arduino與simulink的控制系統設計時,需要進行一些步驟的連接配接和參數的調整。首先打開matlab 2020a,因為我是新的本子,是以裝的最新的,但是用起來也不是很習慣。第一次需要将matlab的目前檔案夾換一下,我的預設是
C:\Program Files\Polyspace\R2020a\bin
但是在這個目錄下,你會發現,使用simulink進行編譯的時候會出現下面的錯誤
Your current working folder is:
C:\Program Files\Polyspace\R2020a\bin
Simulink does not permit you to modify the MATLAB installation area.
Please change to a working folder that is not in the MATLAB
installation area and re-try the previous command.如下圖
我是在桌面上建立一個檔案夾使用的。
好的,接下來就是打開Simulink library browser進行代碼塊的拖拽了,在simulink library中找到 Simulink support package for Arduino Hardware,點選進入,在Common中找到digital output 塊,如下圖。
使用過arduino 的小夥伴都知道,Arduino 在13号引腳上,是自帶一個LED燈的,所有的Arduino的課程的第一個都是blinker,就是閃爍的LED燈。選擇這個塊以後,将号碼改成13号,或者自己搭建一個LED燈的電路,記得串聯一個470Ω的電阻用來限流。
給這個塊一個脈沖信号,使用Pulse Genarator塊,在參數設定上,一共四個參數,從上到下,分别是1,3,50,0。一會解釋。如圖
圖檔中的左側脈沖的參數設定。
第一個參數是脈沖的峰值大小,使用1就可以的。第二個是一個pwm的周期的時間。選擇3s。第三個是脈寬的占空比,選擇50%,這樣的燈閃爍是亮滅時長對稱的。
第四個是相位延遲,當數值為0的時候,剛開始的初始值為1,也就是一開始就發脈沖。 當設定為數值t的時候,此初始脈沖會相應的延遲時間t,可以使用預設的0。
到這裡,所有的塊的設定就完成了。接下來要對硬體的相關參數進行設定了
右擊simulink空白處,點選configuration parameters進入下面的界面。
修改下面幾個參數。在單片機的控制中,一般希望他的運作時間是無窮的。是以stop時間選擇修改為inf。求解器solver要修改成discrete(no continuous states)。下一步修改Hardware Implementation 中的Hardware board選擇Arduino uno。下面的host-board connection可能需要改成手動的,我以前的桌上型電腦就是識别不出來,有使用山寨的ch340的uno闆子也可能識别不出來。這個推薦使用Atmega 64作為序列槽晶片的Arduino(國産的也就貴幾塊錢)。
在過去的版本中,可以使用normal,external的模式進行控制系統的運作。但是在2020版本的matllab已經找不到這幾個選擇了。隻有部署到硬體,和正常的run。所謂的部署到硬體是直接讓arduino自己運作,matlab直接将simulink生成的代碼直接燒錄到單片機中。另一種run,是simulink自動生成一段序列槽通訊的代碼,實作實時的互動,可以在運作的過程中不斷修改單片機的相關參數,比如led燈的脈寬改變亮度。但是同時,這樣的操作會受限于序列槽通訊的帶寬。根據《simulink與低成本硬體及機電一體化》這本書中說到的,在外部模式下運作,模型的最小運作步長是30ms,求解器的步長需要設定為50ms(matlab2013b)版本下。我在這裡不推薦大家使用這樣的方式,除非是做一些簡單的實驗課程。因為很多自動化的控制系統編碼器,後者步進電機的控制采樣時間可能需要至少2-5ms的時間。
四.運作結果
在2020版本中,如果使用外部模式,點選run,就可以運作。如圖,序列槽的rx tx的燈一直在亮,表明資料不斷通訊。
這張是部署到硬體,可以看到rx,tx的燈已經滅掉了。開始運作需要在菜單中選擇
build,deploy&start這個選項。
五.小結
我暫時還沒找到2020版本生成的c語言代碼在哪裡,這篇也寫不下了,下次我找到了,給大家分析一下simulink生成的c語言代碼的邏輯,也是有很大的不同的,雖然意義不太大。好了,到這裡了,大家可以去嘗試不用代碼點亮自己的led燈了,下期各位是想看舵機控制還是單回路的pid控制呢,或者寫一個簡單的序列槽通信都可以。