董靖川, 王太勇, 陸鋼慶, 李曉奇, 閆傳濱
(天津大學 機械工程學院,天津 300354)
傳統嵌入式數字控制系統軟件開發需要手工編寫大量代碼,并且需要等到樣機完成后才能進行測試,整個過程不但很容易出錯,而且發現錯誤后需要重復代碼編寫、算法調試等工作,造成開發效率低下,可靠性差。為了解決傳統設計方法的弊端,從20世紀90年代以后,人們嘗試通過基于模型的設計方法(MBD)開發嵌入式控制系統。該方法以控制系統的數學模型為核心,借助計算機建模、仿真和自動代碼生成技術實現開發流程,使工程師能夠在各個階段都能夠依據系統控制模型進行設計開發,在建模、仿真過程中能夠盡早發現并解決問題,避免了手工編寫代碼造成的效率低下和可靠性問題,使復雜控制系統快速、可靠設計成為可能。目前,基于模型的設計方法已成功應用于大型項目的開發上,如空客380客機、GM混合動力汽車、諾-馬公司的聯合攻擊機等項目[1]。
Matlab/Simulink軟件支持基于模型的設計流程,提供圖形化的建模、仿真環境[2-3],以及嵌入式代碼自動生成等功能,可以滿足運動控制系統的開發需要。在此基礎上,采用以單片機(MCU)為核心的嵌入式運動控制板作為控制器硬件平臺[4],并連接直角坐標運動機構組成運動控制實驗裝置,可以實現運動控制算法的驗證與測試。為了在該裝置上實現基于模型的設計,開發了運動控制板的Simulink自動代碼生成模塊庫[5],含有AD、DA、編碼器、通用輸入、通用輸出等接口的驅動程序。另外還開發了運動控制板的數據采集與傳輸庫函數,可以在實驗過程中實時記錄數據,并上傳到計算機上進行數據分析處理。
運動控制實驗裝置由PC機、基于MCU的運動控制器和直角坐標運動機構組成,如圖1所示。PC機上運行Matlab/Simulink軟件,實現控制器建模、仿真、代碼生成及數據處理等功能。自主設計的基于MCU的運動控制器運行由PC機設計的實時控制算法,且含有控制、編程及通信接口。直角坐標運動控制機構由相互垂直的直線運動軸組成,每個軸通過永磁同步交流伺服電機[6]拖動,經聯軸器帶動滾珠絲杠[7],將旋轉運動轉換為直線運動,最后帶動工作臺移動。每個軸的電機配有旋轉編碼及電機驅動器,由驅動器接收運動控制器發出的指令,并將編碼器的脈沖反饋到運動控制器,實現閉環控制。

(a) 組成原理

(b) 實驗裝置照片
在自主開發的運動控制卡中,控制MCU是基于ARM Cortex-M4核心的STM32F429單片機,具有硬件浮點處理單元,支持DSP指令,最高主頻可達180 MHz[8],可以滿足復雜控制算法的實時計算需求。MCU內部含有2MB Flash存儲器和256KB的SRAM,可存儲控制程序及數據。程序下載及調試接口基于SWD協議,通過ST-Link連接PC機,下載設計的伺服控制程序,并實現在線程序調試。板上帶有RS-232通信接口[9],能夠連接PC機串口進行實驗數據的傳輸。電源接口輸入5 V和24 V直流電源,為控制部分電路及連接驅動器的信號回路供電。模擬量輸出接口,可輸出-10~10 V范圍的電壓信號,作為伺服驅動器的速度或轉矩指令。模擬量輸入接口用于連接各種模擬量信號傳感器。編碼器接口可連接驅動器的編碼器信號輸出,可對正交編碼信號[10]進行雙向計數,實現電機位置和速度的測量。開關量輸入及輸出接口可連接繼電器、指示燈、行程開關等裝置,也作為與驅動器通信的伺服使能輸出、報警輸入等信號的接口。此外,板上還設置了4個按鍵,用于對實驗過程的控制。
控制代碼的自動化生成是實現基于模型的設計方法的關鍵技術。在Matlab/Simulink環境下,由控制系統模型生成控制器代碼的流程如圖2所示[11]。用戶在Simulink下建立的控制模型,經過rtw編譯生成模型的rtw文件。rtw是一種結構化的文本文件,是代碼生成過程中的中間產物,是后續利用目標語言編譯器(Target Language Complier, TLC)進行自動代碼生成的輸入文件。該文件中記錄了模型的模塊、輸入、輸出、參數、狀態、存儲及其他重要的模型信息。然后,通過調用目標語言編譯器將rtw文件編譯為一系列源文件(如C語言的.C、.h文件等)。在編譯過程中,目標語言編譯器需要調用一些TLC文件。TLC文件使用一種腳本語言,規定了生成代碼的結構及代碼生成的動作等。在代碼生成過程中,需要調用3類TLC文件,即系統TLC文件、模塊TLC文件和其他支持代碼生成的TLC函數庫。在編譯過程中,系統TLC文件首先被調用,該文件規定了生成代碼的全局結構。然后由系統TLC 文件調用模塊的TLC文件和TLC函數庫,進行代碼生成。在此過程中,會對模型的rtw文件中記錄的信息進行讀寫。TLC編譯過程結束后生成的源文件代碼經過編譯、鏈接后可以生成能夠在目標平臺硬件上運行的可執行文件。

圖2 Simulink代碼自動生成流程
為了能夠使用戶的控制器模型運行在基于MCU的運動控制板上,設計了與運動控制板配套的Simulink模塊庫,如圖3所示。該模塊庫中的模塊對應了運動控制板上的各種用于控制的輸入/輸出接口。其中輸出模塊包括模擬量輸出(DAC)、伺服使能輸出(SEN)、通用開關量輸出(DO);輸入模塊包括編碼器輸入(ENC)、按鍵(KEY)、伺服報警輸入(SAL)、通用開關量輸入(DI)和模擬量輸入(ADC)。用戶可以將上述模塊拖動到Simulink的模型中,建立起控制算法輸入/輸出信號與控制接口之間的聯系。

圖3 運動控制板的Simulink模塊庫
運動控制板Simulink模塊庫中的模塊是基于S-function構建的[12]。S-function是Simulink的模塊擴展接口,可以通過S-function實現自定義的Simulink模塊。該模塊可以按照Simulink的框架運行各種子方法的調用,和Simulink內建模塊一起工作。 S-function分為Level 1和Level 2,可以用M代碼或C語言編寫。本文中,采用C語言編寫Level 2的支持代碼生成的S-function。以DAC模塊為例,在模塊庫中自定義一個S-function模塊,編寫對應的S-function C語言文件。該文件基于Simulink自帶的S-fuction模板sfuntmpl_basic.c構建。為了能夠支持代碼生成,除了實現常規的S-function方法外,還需要實現mdlRTW方法。mdlRTW方法的主要功能是,在代碼生成時將模塊的參數寫入到rtw文件。DAC模塊在圖形用戶界面(GUI)參數中定義了一個channel(“通道號”)參數,mdlRTW方法獲取該參數并寫入到rtw文件中,供代碼生成使用:
static void mdlRTW(SimStruct *S) {
uint8_T channel = (uint8_T)(mxGetScalar(ssGetSFcnParam(S, 0)));
if (!ssWriteRTWParamSettings(S, 1, SSWRITE_VALUE_DTYPE_NUM, "channel",
&channel, DTINFO(SS_UINT8, COMPLEX_NO)))
return; }
在Matlab下使用用mex命令編譯該文件后,即可在Simulink的建模和仿真中直接使用該模塊。
運動控制板的Simulink模塊庫中,每個模塊都有對應的TLC文件,用于生成該模塊的硬件驅動程序C語言代碼。TLC語法是以單個“%”符號開頭的關鍵字為命令,空格后跟參數的腳本語言,含有變量、記錄、分支、循環、函數、注釋等功能。模塊的TLC文件支持各種子函數,用戶可以根據需要選擇其中部分函數并實現,也可以在TLC文件中調用Simulink的內建TLC函數,方便代碼生成。以DAC模塊為例,該模塊TLC文件內容為:
%assign CodeFormat = "Embedded-C"
%implements F429DSM_DAC "C"
%function Outputs(block, system) Output
/* %
%assign channel = CAST("Number", SFcnParamSettings.channel)
%assign OutVal = LibBlockInputSignal(0, "", "", 0)
F429DSM_SetDACOutputVoltage(%
%
%endfunction
第1行設置CodeFormat變量為“Embedded-C”,指定嵌入式的C語言格式,這種格式內存占用較少,簡化了代碼的接口。%implements命令一行注明S-function模塊名以及生成代碼的目標語言。在該文件中實現了Outputs子函數,該函數用于編寫模塊計算輸出的代碼,將其生成到model_step()函數中。channel變量是從模型的rtw文件中記錄的模擬量輸出通道號,OutVal變量由內建函數LibBlockInputSignal獲取的模塊輸入端口數據,在這里是模擬量輸出電壓數值。生成的代碼中通過調用定義的C語言函數F429DSM_SetDACOutputVoltage實現MCU片上數模轉換器(DAC)數值的更改,實現模擬量電壓的輸出功能。
為了使Simulink生成的代碼通過編譯、連接成可執行文件并在運動控制板上運行,需要將自動生成的代碼整合到控制器軟件的開發工程中。為此,設計了一個通用控制軟件工程模板,基于該模板可快速構建完整的控制器軟件開發工程。
控制器軟件工程模板需要完成硬件設備的初始化,還要提供底層硬件訪問的接口驅動。此外,為了實現離散控制,還需要構建能夠執行固定周期任務的軟件框架。在構建控制軟件工程中,借助了運動控制板MCU廠家意法半導體公司提供的圖形化的MCU配置工具STM32CubeMx[13]。在STM32CubeMx軟件中,選擇運動控制板上的MCU型號,然后根據控制板的硬件電路原理對MCU的管腳分配、片上外設功能、時鐘樹、中斷等進行配置,并設置開發工具及工程路徑、堆棧大小等參數,可以自動生成的含有硬件初始化代碼的完整軟件工程。在此代碼基礎上,模板中再封裝一層驅動接口函數,供Simulink 模塊驅動程序調用。
為了方便實驗數據的記錄、傳輸與處理,在此控制軟件工程模板中還添加了數據采集與傳輸功能函數庫。數據采集功能可以在每個控制周期內將指定的信號數值記錄到預先分配的內存中。數據傳輸功能支持標準的xmodem協議[14],可以將采集到的數據通過RS-232接口批量上傳到PC機。
利用此工程模板構建控制軟件工程的步驟如下:①復制工程模板,并打開作為新的工程。②將Simulink生成的代碼復制到工程中。③調用Simulink自動生成的模型初始化函數model_initialize ()和模型周期任務函數model_step()。前者在main函數初始化階段調用;對于后者,在工程模板中已將MCU的定時器TIM2配置為1 ms定時周期,在其中斷處理函數中調用model_step()函數,即可實現周期為1 ms離散控制。④在周期中斷處理函數中調用數據采集與傳輸函數庫,記錄所需實驗數據。
基于模型的設計方法使用戶能夠快捷、高效地進行控制系統的開發,并且降低了手工編碼錯誤帶來的風險。下面以機電傳動控制課程實驗教學中的雙軸聯動運動控制實驗為例,說明基于模型的設計在實驗中的應用。
雙軸聯動使用直角坐標運動機構的X和Y軸的同步移動實現工作臺的圓形軌跡運動,其Simulink控制模型如圖4所示。模型中含有2個伺服控制通道,分別控制X、Y軸,二者結構是相同的。各軸的位置指令由正弦信號發生器模塊產生,幅值和頻率相同,通過設置偏移和相位關系使X和Y合成的指令軌跡為圓形。伺服控制使用電動機驅動器的轉矩控制模式,發送到驅動器的模擬量電壓代表轉矩的大小和方向。每個伺服通道實現位置和速度的P-PI雙閉環控制。

圖4 輪廓控制實驗的Simulink控制器模型
接口模塊來自運動控制板的Simulink模塊庫。使用按鍵KEY1發送實驗開始信號,經按鍵消抖濾波后產生驅動器的伺服使能信號,并實現編碼器計數清零和軌跡指令復位。各軸編碼器讀數經差分、累加、比例轉換等處理得到以mm和mm/s為單位表示的位置和速度反饋信號。轉矩指令經過鉗制處理后由模擬量輸出模塊發送到電動機驅動器。
模型建立后,點擊工具欄中的Model Configuration Parameters圖標,打開模型參數配置面板,設置代碼生成相關的選項:① 在Solver面板中,將 Solver options中type設置為Fixed-step,將Fixed-step size設置為1 ms,與運動控制板的固定控制周期一致;② 在Hardware Implementation面板中,將Device vendor設置為ARM Compatible,Device type設置為ARM Cortex,與運動控制板的MCU一致;③ Code Generation面板中,將System target file設置為ert.tlc,作為系統TLC文件,Language選擇C語言,選中Generate code only,點擊Generate code按鈕,即可啟動自動代碼生成流程。
復制控制軟件工程模板,在MCU開發工具Keil uVision中打開工程。將Simulink自動生成的.C和.h文件加入到工程中。在main()函數入口調用模型初始化函數model_initialize ();在TIM2 的周期中斷函數中首先調用模型周期任務函數model_step(),再調用數據采集接口記錄X、Y軸的編碼器計數,供后續數據分析使用。編譯、鏈接后,生成可執行的控制程序。
將程序下載到運動控制板,按下按鍵1啟動實驗,可看到X、Y軸電動機同時運行,帶動工作臺實現圓形軌跡的運動。松開按鍵1后,電動機停止運行。打開PC機的超級終端程序,選擇與運動控制卡相連的COM串行通信口,設置通信格式為波特率115 200、無校驗、1停止位,然后選擇Xmodem協議并按下控制板按鍵2上傳采集的實驗數據。在Matlab中,讀取上傳的實驗數據文件,根據X、Y軸編碼器讀數可計算得到各個時刻各軸的實際位置、跟蹤誤差以及圓周運動的輪廓誤差數據[15]。最終計算出的的雙軸聯動控制實驗的輪廓誤差曲線如圖5所示。

圖5 輪廓誤差曲線
采用Matlab/Simulink軟件及自主設計的運動控制板和直角坐標運動機構,構建了基于模型的設計的運動控制實驗環境。開發了支持自動代碼生成的運動控制板Simulink模塊庫,含有AD、DA、編碼器、通用輸入、通用輸出等模塊。實驗應用結果表明,基于模型的設計具有建模直觀、簡便、靈活、可靠等優點,使運動控制理論與實驗無縫連接,能夠快速構建起實驗控制系統,有利于激發學生的學習興趣,培養工程實踐和創新能力。