董靖川, 王太勇, 陸鋼慶, 李曉奇, 閆傳濱
(天津大學(xué) 機(jī)械工程學(xué)院,天津 300354)
傳統(tǒng)嵌入式數(shù)字控制系統(tǒng)軟件開(kāi)發(fā)需要手工編寫大量代碼,并且需要等到樣機(jī)完成后才能進(jìn)行測(cè)試,整個(gè)過(guò)程不但很容易出錯(cuò),而且發(fā)現(xiàn)錯(cuò)誤后需要重復(fù)代碼編寫、算法調(diào)試等工作,造成開(kāi)發(fā)效率低下,可靠性差。為了解決傳統(tǒng)設(shè)計(jì)方法的弊端,從20世紀(jì)90年代以后,人們嘗試通過(guò)基于模型的設(shè)計(jì)方法(MBD)開(kāi)發(fā)嵌入式控制系統(tǒng)。該方法以控制系統(tǒng)的數(shù)學(xué)模型為核心,借助計(jì)算機(jī)建模、仿真和自動(dòng)代碼生成技術(shù)實(shí)現(xiàn)開(kāi)發(fā)流程,使工程師能夠在各個(gè)階段都能夠依據(jù)系統(tǒng)控制模型進(jìn)行設(shè)計(jì)開(kāi)發(fā),在建模、仿真過(guò)程中能夠盡早發(fā)現(xiàn)并解決問(wèn)題,避免了手工編寫代碼造成的效率低下和可靠性問(wèn)題,使復(fù)雜控制系統(tǒng)快速、可靠設(shè)計(jì)成為可能。目前,基于模型的設(shè)計(jì)方法已成功應(yīng)用于大型項(xiàng)目的開(kāi)發(fā)上,如空客380客機(jī)、GM混合動(dòng)力汽車、諾-馬公司的聯(lián)合攻擊機(jī)等項(xiàng)目[1]。
Matlab/Simulink軟件支持基于模型的設(shè)計(jì)流程,提供圖形化的建模、仿真環(huán)境[2-3],以及嵌入式代碼自動(dòng)生成等功能,可以滿足運(yùn)動(dòng)控制系統(tǒng)的開(kāi)發(fā)需要。在此基礎(chǔ)上,采用以單片機(jī)(MCU)為核心的嵌入式運(yùn)動(dòng)控制板作為控制器硬件平臺(tái)[4],并連接直角坐標(biāo)運(yùn)動(dòng)機(jī)構(gòu)組成運(yùn)動(dòng)控制實(shí)驗(yàn)裝置,可以實(shí)現(xiàn)運(yùn)動(dòng)控制算法的驗(yàn)證與測(cè)試。為了在該裝置上實(shí)現(xiàn)基于模型的設(shè)計(jì),開(kāi)發(fā)了運(yùn)動(dòng)控制板的Simulink自動(dòng)代碼生成模塊庫(kù)[5],含有AD、DA、編碼器、通用輸入、通用輸出等接口的驅(qū)動(dòng)程序。另外還開(kāi)發(fā)了運(yùn)動(dòng)控制板的數(shù)據(jù)采集與傳輸庫(kù)函數(shù),可以在實(shí)驗(yàn)過(guò)程中實(shí)時(shí)記錄數(shù)據(jù),并上傳到計(jì)算機(jī)上進(jìn)行數(shù)據(jù)分析處理。
運(yùn)動(dòng)控制實(shí)驗(yàn)裝置由PC機(jī)、基于MCU的運(yùn)動(dòng)控制器和直角坐標(biāo)運(yùn)動(dòng)機(jī)構(gòu)組成,如圖1所示。PC機(jī)上運(yùn)行Matlab/Simulink軟件,實(shí)現(xiàn)控制器建模、仿真、代碼生成及數(shù)據(jù)處理等功能。自主設(shè)計(jì)的基于MCU的運(yùn)動(dòng)控制器運(yùn)行由PC機(jī)設(shè)計(jì)的實(shí)時(shí)控制算法,且含有控制、編程及通信接口。直角坐標(biāo)運(yùn)動(dòng)控制機(jī)構(gòu)由相互垂直的直線運(yùn)動(dòng)軸組成,每個(gè)軸通過(guò)永磁同步交流伺服電機(jī)[6]拖動(dòng),經(jīng)聯(lián)軸器帶動(dòng)滾珠絲杠[7],將旋轉(zhuǎn)運(yùn)動(dòng)轉(zhuǎn)換為直線運(yùn)動(dòng),最后帶動(dòng)工作臺(tái)移動(dòng)。每個(gè)軸的電機(jī)配有旋轉(zhuǎn)編碼及電機(jī)驅(qū)動(dòng)器,由驅(qū)動(dòng)器接收運(yùn)動(dòng)控制器發(fā)出的指令,并將編碼器的脈沖反饋到運(yùn)動(dòng)控制器,實(shí)現(xiàn)閉環(huán)控制。
(a) 組成原理
(b) 實(shí)驗(yàn)裝置照片
在自主開(kāi)發(fā)的運(yùn)動(dòng)控制卡中,控制MCU是基于ARM Cortex-M4核心的STM32F429單片機(jī),具有硬件浮點(diǎn)處理單元,支持DSP指令,最高主頻可達(dá)180 MHz[8],可以滿足復(fù)雜控制算法的實(shí)時(shí)計(jì)算需求。MCU內(nèi)部含有2MB Flash存儲(chǔ)器和256KB的SRAM,可存儲(chǔ)控制程序及數(shù)據(jù)。程序下載及調(diào)試接口基于SWD協(xié)議,通過(guò)ST-Link連接PC機(jī),下載設(shè)計(jì)的伺服控制程序,并實(shí)現(xiàn)在線程序調(diào)試。板上帶有RS-232通信接口[9],能夠連接PC機(jī)串口進(jìn)行實(shí)驗(yàn)數(shù)據(jù)的傳輸。電源接口輸入5 V和24 V直流電源,為控制部分電路及連接驅(qū)動(dòng)器的信號(hào)回路供電。模擬量輸出接口,可輸出-10~10 V范圍的電壓信號(hào),作為伺服驅(qū)動(dòng)器的速度或轉(zhuǎn)矩指令。模擬量輸入接口用于連接各種模擬量信號(hào)傳感器。編碼器接口可連接驅(qū)動(dòng)器的編碼器信號(hào)輸出,可對(duì)正交編碼信號(hào)[10]進(jìn)行雙向計(jì)數(shù),實(shí)現(xiàn)電機(jī)位置和速度的測(cè)量。開(kāi)關(guān)量輸入及輸出接口可連接繼電器、指示燈、行程開(kāi)關(guān)等裝置,也作為與驅(qū)動(dòng)器通信的伺服使能輸出、報(bào)警輸入等信號(hào)的接口。此外,板上還設(shè)置了4個(gè)按鍵,用于對(duì)實(shí)驗(yàn)過(guò)程的控制。
控制代碼的自動(dòng)化生成是實(shí)現(xiàn)基于模型的設(shè)計(jì)方法的關(guān)鍵技術(shù)。在Matlab/Simulink環(huán)境下,由控制系統(tǒng)模型生成控制器代碼的流程如圖2所示[11]。用戶在Simulink下建立的控制模型,經(jīng)過(guò)rtw編譯生成模型的rtw文件。rtw是一種結(jié)構(gòu)化的文本文件,是代碼生成過(guò)程中的中間產(chǎn)物,是后續(xù)利用目標(biāo)語(yǔ)言編譯器(Target Language Complier, TLC)進(jìn)行自動(dòng)代碼生成的輸入文件。該文件中記錄了模型的模塊、輸入、輸出、參數(shù)、狀態(tài)、存儲(chǔ)及其他重要的模型信息。然后,通過(guò)調(diào)用目標(biāo)語(yǔ)言編譯器將rtw文件編譯為一系列源文件(如C語(yǔ)言的.C、.h文件等)。在編譯過(guò)程中,目標(biāo)語(yǔ)言編譯器需要調(diào)用一些TLC文件。TLC文件使用一種腳本語(yǔ)言,規(guī)定了生成代碼的結(jié)構(gòu)及代碼生成的動(dòng)作等。在代碼生成過(guò)程中,需要調(diào)用3類TLC文件,即系統(tǒng)TLC文件、模塊TLC文件和其他支持代碼生成的TLC函數(shù)庫(kù)。在編譯過(guò)程中,系統(tǒng)TLC文件首先被調(diào)用,該文件規(guī)定了生成代碼的全局結(jié)構(gòu)。然后由系統(tǒng)TLC 文件調(diào)用模塊的TLC文件和TLC函數(shù)庫(kù),進(jìn)行代碼生成。在此過(guò)程中,會(huì)對(duì)模型的rtw文件中記錄的信息進(jìn)行讀寫。TLC編譯過(guò)程結(jié)束后生成的源文件代碼經(jīng)過(guò)編譯、鏈接后可以生成能夠在目標(biāo)平臺(tái)硬件上運(yùn)行的可執(zhí)行文件。
圖2 Simulink代碼自動(dòng)生成流程
為了能夠使用戶的控制器模型運(yùn)行在基于MCU的運(yùn)動(dòng)控制板上,設(shè)計(jì)了與運(yùn)動(dòng)控制板配套的Simulink模塊庫(kù),如圖3所示。該模塊庫(kù)中的模塊對(duì)應(yīng)了運(yùn)動(dòng)控制板上的各種用于控制的輸入/輸出接口。其中輸出模塊包括模擬量輸出(DAC)、伺服使能輸出(SEN)、通用開(kāi)關(guān)量輸出(DO);輸入模塊包括編碼器輸入(ENC)、按鍵(KEY)、伺服報(bào)警輸入(SAL)、通用開(kāi)關(guān)量輸入(DI)和模擬量輸入(ADC)。用戶可以將上述模塊拖動(dòng)到Simulink的模型中,建立起控制算法輸入/輸出信號(hào)與控制接口之間的聯(lián)系。
圖3 運(yùn)動(dòng)控制板的Simulink模塊庫(kù)
運(yùn)動(dòng)控制板Simulink模塊庫(kù)中的模塊是基于S-function構(gòu)建的[12]。S-function是Simulink的模塊擴(kuò)展接口,可以通過(guò)S-function實(shí)現(xiàn)自定義的Simulink模塊。該模塊可以按照Simulink的框架運(yùn)行各種子方法的調(diào)用,和Simulink內(nèi)建模塊一起工作。 S-function分為L(zhǎng)evel 1和Level 2,可以用M代碼或C語(yǔ)言編寫。本文中,采用C語(yǔ)言編寫Level 2的支持代碼生成的S-function。以DAC模塊為例,在模塊庫(kù)中自定義一個(gè)S-function模塊,編寫對(duì)應(yīng)的S-function C語(yǔ)言文件。該文件基于Simulink自帶的S-fuction模板sfuntmpl_basic.c構(gòu)建。為了能夠支持代碼生成,除了實(shí)現(xiàn)常規(guī)的S-function方法外,還需要實(shí)現(xiàn)mdlRTW方法。mdlRTW方法的主要功能是,在代碼生成時(shí)將模塊的參數(shù)寫入到rtw文件。DAC模塊在圖形用戶界面(GUI)參數(shù)中定義了一個(gè)channel(“通道號(hào)”)參數(shù),mdlRTW方法獲取該參數(shù)并寫入到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的建模和仿真中直接使用該模塊。
運(yùn)動(dòng)控制板的Simulink模塊庫(kù)中,每個(gè)模塊都有對(duì)應(yīng)的TLC文件,用于生成該模塊的硬件驅(qū)動(dòng)程序C語(yǔ)言代碼。TLC語(yǔ)法是以單個(gè)“%”符號(hào)開(kāi)頭的關(guān)鍵字為命令,空格后跟參數(shù)的腳本語(yǔ)言,含有變量、記錄、分支、循環(huán)、函數(shù)、注釋等功能。模塊的TLC文件支持各種子函數(shù),用戶可以根據(jù)需要選擇其中部分函數(shù)并實(shí)現(xiàn),也可以在TLC文件中調(diào)用Simulink的內(nèi)建TLC函數(shù),方便代碼生成。以DAC模塊為例,該模塊TLC文件內(nèi)容為:
%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行設(shè)置CodeFormat變量為“Embedded-C”,指定嵌入式的C語(yǔ)言格式,這種格式內(nèi)存占用較少,簡(jiǎn)化了代碼的接口。%implements命令一行注明S-function模塊名以及生成代碼的目標(biāo)語(yǔ)言。在該文件中實(shí)現(xiàn)了Outputs子函數(shù),該函數(shù)用于編寫模塊計(jì)算輸出的代碼,將其生成到model_step()函數(shù)中。channel變量是從模型的rtw文件中記錄的模擬量輸出通道號(hào),OutVal變量由內(nèi)建函數(shù)LibBlockInputSignal獲取的模塊輸入端口數(shù)據(jù),在這里是模擬量輸出電壓數(shù)值。生成的代碼中通過(guò)調(diào)用定義的C語(yǔ)言函數(shù)F429DSM_SetDACOutputVoltage實(shí)現(xiàn)MCU片上數(shù)模轉(zhuǎn)換器(DAC)數(shù)值的更改,實(shí)現(xiàn)模擬量電壓的輸出功能。
為了使Simulink生成的代碼通過(guò)編譯、連接成可執(zhí)行文件并在運(yùn)動(dòng)控制板上運(yùn)行,需要將自動(dòng)生成的代碼整合到控制器軟件的開(kāi)發(fā)工程中。為此,設(shè)計(jì)了一個(gè)通用控制軟件工程模板,基于該模板可快速構(gòu)建完整的控制器軟件開(kāi)發(fā)工程。
控制器軟件工程模板需要完成硬件設(shè)備的初始化,還要提供底層硬件訪問(wèn)的接口驅(qū)動(dòng)。此外,為了實(shí)現(xiàn)離散控制,還需要構(gòu)建能夠執(zhí)行固定周期任務(wù)的軟件框架。在構(gòu)建控制軟件工程中,借助了運(yùn)動(dòng)控制板MCU廠家意法半導(dǎo)體公司提供的圖形化的MCU配置工具STM32CubeMx[13]。在STM32CubeMx軟件中,選擇運(yùn)動(dòng)控制板上的MCU型號(hào),然后根據(jù)控制板的硬件電路原理對(duì)MCU的管腳分配、片上外設(shè)功能、時(shí)鐘樹(shù)、中斷等進(jìn)行配置,并設(shè)置開(kāi)發(fā)工具及工程路徑、堆棧大小等參數(shù),可以自動(dòng)生成的含有硬件初始化代碼的完整軟件工程。在此代碼基礎(chǔ)上,模板中再封裝一層驅(qū)動(dòng)接口函數(shù),供Simulink 模塊驅(qū)動(dòng)程序調(diào)用。
為了方便實(shí)驗(yàn)數(shù)據(jù)的記錄、傳輸與處理,在此控制軟件工程模板中還添加了數(shù)據(jù)采集與傳輸功能函數(shù)庫(kù)。數(shù)據(jù)采集功能可以在每個(gè)控制周期內(nèi)將指定的信號(hào)數(shù)值記錄到預(yù)先分配的內(nèi)存中。數(shù)據(jù)傳輸功能支持標(biāo)準(zhǔn)的xmodem協(xié)議[14],可以將采集到的數(shù)據(jù)通過(guò)RS-232接口批量上傳到PC機(jī)。
利用此工程模板構(gòu)建控制軟件工程的步驟如下:①?gòu)?fù)制工程模板,并打開(kāi)作為新的工程。②將Simulink生成的代碼復(fù)制到工程中。③調(diào)用Simulink自動(dòng)生成的模型初始化函數(shù)model_initialize ()和模型周期任務(wù)函數(shù)model_step()。前者在main函數(shù)初始化階段調(diào)用;對(duì)于后者,在工程模板中已將MCU的定時(shí)器TIM2配置為1 ms定時(shí)周期,在其中斷處理函數(shù)中調(diào)用model_step()函數(shù),即可實(shí)現(xiàn)周期為1 ms離散控制。④在周期中斷處理函數(shù)中調(diào)用數(shù)據(jù)采集與傳輸函數(shù)庫(kù),記錄所需實(shí)驗(yàn)數(shù)據(jù)。
基于模型的設(shè)計(jì)方法使用戶能夠快捷、高效地進(jìn)行控制系統(tǒng)的開(kāi)發(fā),并且降低了手工編碼錯(cuò)誤帶來(lái)的風(fēng)險(xiǎn)。下面以機(jī)電傳動(dòng)控制課程實(shí)驗(yàn)教學(xué)中的雙軸聯(lián)動(dòng)運(yùn)動(dòng)控制實(shí)驗(yàn)為例,說(shuō)明基于模型的設(shè)計(jì)在實(shí)驗(yàn)中的應(yīng)用。
雙軸聯(lián)動(dòng)使用直角坐標(biāo)運(yùn)動(dòng)機(jī)構(gòu)的X和Y軸的同步移動(dòng)實(shí)現(xiàn)工作臺(tái)的圓形軌跡運(yùn)動(dòng),其Simulink控制模型如圖4所示。模型中含有2個(gè)伺服控制通道,分別控制X、Y軸,二者結(jié)構(gòu)是相同的。各軸的位置指令由正弦信號(hào)發(fā)生器模塊產(chǎn)生,幅值和頻率相同,通過(guò)設(shè)置偏移和相位關(guān)系使X和Y合成的指令軌跡為圓形。伺服控制使用電動(dòng)機(jī)驅(qū)動(dòng)器的轉(zhuǎn)矩控制模式,發(fā)送到驅(qū)動(dòng)器的模擬量電壓代表轉(zhuǎn)矩的大小和方向。每個(gè)伺服通道實(shí)現(xiàn)位置和速度的P-PI雙閉環(huán)控制。
圖4 輪廓控制實(shí)驗(yàn)的Simulink控制器模型
接口模塊來(lái)自運(yùn)動(dòng)控制板的Simulink模塊庫(kù)。使用按鍵KEY1發(fā)送實(shí)驗(yàn)開(kāi)始信號(hào),經(jīng)按鍵消抖濾波后產(chǎn)生驅(qū)動(dòng)器的伺服使能信號(hào),并實(shí)現(xiàn)編碼器計(jì)數(shù)清零和軌跡指令復(fù)位。各軸編碼器讀數(shù)經(jīng)差分、累加、比例轉(zhuǎn)換等處理得到以mm和mm/s為單位表示的位置和速度反饋信號(hào)。轉(zhuǎn)矩指令經(jīng)過(guò)鉗制處理后由模擬量輸出模塊發(fā)送到電動(dòng)機(jī)驅(qū)動(dòng)器。
模型建立后,點(diǎn)擊工具欄中的Model Configuration Parameters圖標(biāo),打開(kāi)模型參數(shù)配置面板,設(shè)置代碼生成相關(guān)的選項(xiàng):① 在Solver面板中,將 Solver options中type設(shè)置為Fixed-step,將Fixed-step size設(shè)置為1 ms,與運(yùn)動(dòng)控制板的固定控制周期一致;② 在Hardware Implementation面板中,將Device vendor設(shè)置為ARM Compatible,Device type設(shè)置為ARM Cortex,與運(yùn)動(dòng)控制板的MCU一致;③ Code Generation面板中,將System target file設(shè)置為ert.tlc,作為系統(tǒng)TLC文件,Language選擇C語(yǔ)言,選中Generate code only,點(diǎn)擊Generate code按鈕,即可啟動(dòng)自動(dòng)代碼生成流程。
復(fù)制控制軟件工程模板,在MCU開(kāi)發(fā)工具Keil uVision中打開(kāi)工程。將Simulink自動(dòng)生成的.C和.h文件加入到工程中。在main()函數(shù)入口調(diào)用模型初始化函數(shù)model_initialize ();在TIM2 的周期中斷函數(shù)中首先調(diào)用模型周期任務(wù)函數(shù)model_step(),再調(diào)用數(shù)據(jù)采集接口記錄X、Y軸的編碼器計(jì)數(shù),供后續(xù)數(shù)據(jù)分析使用。編譯、鏈接后,生成可執(zhí)行的控制程序。
將程序下載到運(yùn)動(dòng)控制板,按下按鍵1啟動(dòng)實(shí)驗(yàn),可看到X、Y軸電動(dòng)機(jī)同時(shí)運(yùn)行,帶動(dòng)工作臺(tái)實(shí)現(xiàn)圓形軌跡的運(yùn)動(dòng)。松開(kāi)按鍵1后,電動(dòng)機(jī)停止運(yùn)行。打開(kāi)PC機(jī)的超級(jí)終端程序,選擇與運(yùn)動(dòng)控制卡相連的COM串行通信口,設(shè)置通信格式為波特率115 200、無(wú)校驗(yàn)、1停止位,然后選擇Xmodem協(xié)議并按下控制板按鍵2上傳采集的實(shí)驗(yàn)數(shù)據(jù)。在Matlab中,讀取上傳的實(shí)驗(yàn)數(shù)據(jù)文件,根據(jù)X、Y軸編碼器讀數(shù)可計(jì)算得到各個(gè)時(shí)刻各軸的實(shí)際位置、跟蹤誤差以及圓周運(yùn)動(dòng)的輪廓誤差數(shù)據(jù)[15]。最終計(jì)算出的的雙軸聯(lián)動(dòng)控制實(shí)驗(yàn)的輪廓誤差曲線如圖5所示。
圖5 輪廓誤差曲線
采用Matlab/Simulink軟件及自主設(shè)計(jì)的運(yùn)動(dòng)控制板和直角坐標(biāo)運(yùn)動(dòng)機(jī)構(gòu),構(gòu)建了基于模型的設(shè)計(jì)的運(yùn)動(dòng)控制實(shí)驗(yàn)環(huán)境。開(kāi)發(fā)了支持自動(dòng)代碼生成的運(yùn)動(dòng)控制板Simulink模塊庫(kù),含有AD、DA、編碼器、通用輸入、通用輸出等模塊。實(shí)驗(yàn)應(yīng)用結(jié)果表明,基于模型的設(shè)計(jì)具有建模直觀、簡(jiǎn)便、靈活、可靠等優(yōu)點(diǎn),使運(yùn)動(dòng)控制理論與實(shí)驗(yàn)無(wú)縫連接,能夠快速構(gòu)建起實(shí)驗(yàn)控制系統(tǒng),有利于激發(fā)學(xué)生的學(xué)習(xí)興趣,培養(yǎng)工程實(shí)踐和創(chuàng)新能力。