樂(lè)萬(wàn)德,任靜,張琛玥,易朝韓,王旭升,閆潤(rùn)龍,黨帥
(西安航空學(xué)院 計(jì)算機(jī)學(xué)院,陜西西安,710077)
Arduino是高校在創(chuàng)新創(chuàng)業(yè)過(guò)程中廣泛使用的開發(fā)平臺(tái),在實(shí)際使用中能激發(fā)學(xué)生濃厚的探索興趣,深受大學(xué)生的歡迎。直流電機(jī)作為廣泛使用的智能產(chǎn)品核心部件,其PID(Proportional Integral Derivative)控制算法對(duì)學(xué)生有強(qiáng)烈的吸引力。PID廣泛應(yīng)用于控制領(lǐng)域。調(diào)速系統(tǒng)要求以動(dòng)態(tài)穩(wěn)定和穩(wěn)態(tài)精度為主,而微分D部分容易對(duì)系統(tǒng)造成擾動(dòng),所以傳統(tǒng)速度控制常用PI調(diào)節(jié)器。PID算法本身并不復(fù)雜,但對(duì)于PID參數(shù)整定,盡管有不少參數(shù)整定的方法和口訣,但在實(shí)際應(yīng)用中不盡人意。在參數(shù)整定過(guò)程中往往顯得盲目,甚至因?yàn)檎{(diào)參過(guò)程中參數(shù)選擇不合適,導(dǎo)致電機(jī)強(qiáng)烈振動(dòng)等,具有一定的安全隱患。
Arduino仿真實(shí)驗(yàn)[1]及仿真平臺(tái)[2]是解決上述問(wèn)題的有效方案。本文基于Proteus構(gòu)建Arduino控制電機(jī)的參數(shù)整定仿真平臺(tái),通過(guò)串口仿真將PID控制數(shù)據(jù)傳到Arduino串口監(jiān)視器進(jìn)行可視化顯示[3],幫助初學(xué)者及大學(xué)生創(chuàng)客實(shí)現(xiàn)PI調(diào)節(jié)器的可視化調(diào)參,形象直觀,并且排除了不合適參數(shù)可能引起的安全隱患。
Proteus是世界上著名的EDA仿真軟件,融合了電路仿真、PCB設(shè)計(jì)和虛擬模型仿真等功能,使用異常方便。Proteus支持大多數(shù)單片機(jī)仿真,也支持Arduino[4]。
實(shí)驗(yàn)硬件參考設(shè)計(jì)如圖1所示,包括:主控板Arduino Mega2560、電機(jī)驅(qū)動(dòng)板L298、編碼電機(jī)moterencoder、串口物理端口模型COMPIM。示波器可選。
圖1 仿真硬件平臺(tái)
Arduino硬件開發(fā)板是一個(gè)單片機(jī)集成電路,它的核心是一個(gè)單片機(jī),開發(fā)板上的其他電路用來(lái)供電和轉(zhuǎn)換信號(hào)。官方Arduino使用的是megaAVR系列的芯片,主要是ATmega8、ATmega168、ATmega328、ATmega1280以及ATmega2560,可根據(jù)項(xiàng)目需求進(jìn)行選用。
Arduino Mega2560在Arduino系列開發(fā)板中具有較強(qiáng)的性能及豐富的接口,具有廣泛的適應(yīng)性,因而作為本實(shí)驗(yàn)平臺(tái)選定的開發(fā)板。Arduino Mega2560處理器核心是ATmega2560, 同時(shí)具有54路數(shù)字輸入/輸出口,其中15路可作為PWM輸出,15路模擬輸入,4路UART接口,一個(gè)16MHz晶體振蕩器,一個(gè)USB口,一個(gè)電源 插座,一個(gè)ICSP header和一個(gè)復(fù)位按鈕。Arduino Mega2560也能兼容為Arduino UNO設(shè)計(jì)的擴(kuò)展板。
電機(jī)驅(qū)動(dòng)板L298是一款常用的雙路全橋式電機(jī)驅(qū)動(dòng)芯片,工作電壓可達(dá)46V,輸出電流可達(dá)4A。L298通過(guò)控制主控芯片上的I/O輸入端,調(diào)節(jié)輸出電壓,實(shí)現(xiàn)電機(jī)的正轉(zhuǎn)、反轉(zhuǎn)、停止。通常情況下L298可直接驅(qū)動(dòng)繼電器、直流電機(jī)以及步進(jìn)電機(jī)。
L298的四個(gè)輸出引腳OUT1、OUT2和OUT3、OUT4分別接兩個(gè)直流電機(jī)Motor1、Motor2。四個(gè)輸入引腳IN1、IN2、IN3、IN4從單片機(jī)接入控制電平,控制電機(jī)的正反轉(zhuǎn)。另外兩個(gè)引腳ENA、ENB控制電機(jī)調(diào)速。
PI控制器根據(jù)電機(jī)反饋的速度進(jìn)行控制,因而需要測(cè)得電機(jī)的實(shí)時(shí)轉(zhuǎn)速,轉(zhuǎn)速單位是rpm(轉(zhuǎn)每分)。本實(shí)驗(yàn)平臺(tái)選用編碼電機(jī)MOTOR-ENCODER。該電機(jī)有五根線,左右兩側(cè)兩根線接電源。上面有三根線,左右兩側(cè)兩根線輸出相位差90度的脈沖,據(jù)此可以測(cè)得電機(jī)旋轉(zhuǎn)方向;每旋轉(zhuǎn)一圈輸出多少個(gè)脈沖可以在設(shè)置對(duì)話框中設(shè)置,中間那根線,每圈輸出一個(gè)脈沖;利用其中任何一個(gè)可以測(cè)出轉(zhuǎn)速[5]。示波器可以顯示對(duì)應(yīng)波形及相位關(guān)系。
為了可視化觀察PI控制過(guò)程中的現(xiàn)象和參數(shù),實(shí)驗(yàn)平臺(tái)通過(guò)串口物理端口模型COMPIM(COM Port Physical Interface model)將需要顯示的數(shù)據(jù)傳遞到串口監(jiān)視器。Proteus中的COMPIM是標(biāo)準(zhǔn)的RS232端口,可設(shè)置占用計(jì)算機(jī)上哪一個(gè)串口,可以是“實(shí)際串口”,也可以是“虛擬串口”,可以實(shí)現(xiàn)虛擬仿真電路與外部實(shí)際電路的雙向串行通信。
本實(shí)驗(yàn)中電腦通過(guò)虛擬串口接收COMPIM的數(shù)據(jù),并通過(guò)Arduino IDE中串口監(jiān)視器將數(shù)據(jù)以文本或圖像方式顯示出來(lái),據(jù)此調(diào)整PI參數(shù)。
系統(tǒng)軟件設(shè)計(jì)如圖2所示。在Arduino框架函數(shù)setup()中設(shè)置初始目標(biāo)轉(zhuǎn)速Target,綁定編碼器脈沖中斷,并設(shè)置定時(shí)中斷。脈沖中斷觸發(fā)時(shí)調(diào)用中斷函數(shù)Code(),該函數(shù)在編碼電機(jī)旋轉(zhuǎn)過(guò)程中對(duì)脈沖計(jì)數(shù),為計(jì)算轉(zhuǎn)速做準(zhǔn)備。定時(shí)中斷觸發(fā)時(shí)調(diào)用中斷處理函數(shù)revolution_measure(),該函數(shù)根據(jù)脈沖數(shù)計(jì)算轉(zhuǎn)速,并將脈沖數(shù)清零,為下次計(jì)算轉(zhuǎn)速做準(zhǔn)備。
圖2 系統(tǒng)軟件設(shè)計(jì)
在loop()函數(shù)里,每隔時(shí)間tSample,根據(jù)當(dāng)前速度與目標(biāo)速度采用PI速度控制器,計(jì)算PI調(diào)節(jié)器的輸出Output并作為電動(dòng)機(jī)驅(qū)動(dòng)PWM值并更新。
在新的PWM驅(qū)動(dòng)下,電機(jī)轉(zhuǎn)速發(fā)生變化,此時(shí)將需要觀察的數(shù)據(jù)通過(guò)串口進(jìn)行輸出,特別是實(shí)際轉(zhuǎn)速與目標(biāo)轉(zhuǎn)速的對(duì)比情況。結(jié)合實(shí)際轉(zhuǎn)速達(dá)到目標(biāo)轉(zhuǎn)速的快慢、是否有超調(diào)等情況,進(jìn)一步調(diào)整PI參數(shù)。
編碼器測(cè)速是分析超調(diào)的基礎(chǔ)。旋轉(zhuǎn)設(shè)備測(cè)量轉(zhuǎn)速,一般采用和速度成正比的脈沖信號(hào)進(jìn)行測(cè)量。通過(guò)測(cè)量脈沖信號(hào)的頻率,進(jìn)而計(jì)算實(shí)際轉(zhuǎn)速。本文研究的PI調(diào)速主要以較高轉(zhuǎn)速為研究對(duì)象,采用M法測(cè)速,即通過(guò)單位時(shí)間內(nèi)脈沖的個(gè)數(shù)推算轉(zhuǎn)速。這種測(cè)量方法轉(zhuǎn)速越高精度越高。兩次采樣計(jì)時(shí)中斷間采樣的脈沖數(shù)計(jì)算公式為:
式中cs為采樣數(shù),revolution為轉(zhuǎn)速,單位為rpm。pulse為編碼器脈沖數(shù)。tSample為采樣時(shí)間,單位為ms。采樣時(shí)長(zhǎng)及編碼器頻數(shù)都對(duì)測(cè)速精度有影響:較長(zhǎng)的采樣時(shí)長(zhǎng)和較高的編碼器頻數(shù)有利于提高轉(zhuǎn)速的測(cè)量精度。電機(jī)調(diào)速PWM的調(diào)節(jié)與采樣同頻,因此采樣時(shí)長(zhǎng)過(guò)長(zhǎng),對(duì)PWM的平滑性有影響。本文中取采樣時(shí)間tSample為150ms,編碼器脈沖數(shù)為360。以每分鐘100轉(zhuǎn)的轉(zhuǎn)速為例,根據(jù)公式1,150ms采樣數(shù)為90。按每次采樣最大有兩個(gè)脈沖測(cè)量誤差計(jì),測(cè)速誤差為2%左右,滿足實(shí)驗(yàn)要求。
PWM(Pulse Width Modulation)簡(jiǎn)稱脈寬調(diào)制,是利用微處理器的數(shù)字輸出來(lái)對(duì)模擬電路進(jìn)行控制的一種非常有效的技術(shù)。PWM調(diào)速就是在一定的頻率下,通過(guò)控制一周期內(nèi)的開通與關(guān)斷時(shí)間,即調(diào)節(jié)占空比來(lái)調(diào)整直流電機(jī)兩端的電壓大小,從而調(diào)節(jié)電機(jī)轉(zhuǎn)速。因其相比于直接調(diào)整電壓,顯得方便快捷,廣泛應(yīng)用于通信、工控等方面。
PWM本質(zhì)上是一種方波,并不是連續(xù)的模擬信號(hào)。開關(guān)的通斷頻率不僅直接決定了等效電壓的高低和電機(jī)的轉(zhuǎn)速,還影響到電機(jī)的轉(zhuǎn)矩特性、機(jī)械特性及效率特性等。一般來(lái)說(shuō),PWM的頻率越高,直流電機(jī)轉(zhuǎn)動(dòng)越流暢;PWM的頻率越低,直流電機(jī)轉(zhuǎn)動(dòng)越卡頓。但是頻率越高則需要的啟動(dòng)占空比越高,使調(diào)節(jié)范圍變窄。因此,使用PWM控制電機(jī)時(shí),應(yīng)綜合硬件設(shè)計(jì)選取合適的頻率。一般PWM頻率需大于1kHz,才能穩(wěn)定地控制電機(jī)。但Arduino控制板很多引腳輸出的默認(rèn)PWM頻率是480Hz。這就意味著需要根據(jù)電機(jī)的實(shí)際要求對(duì)PWM頻率進(jìn)行調(diào)節(jié)。
有多種方式可以讓Arduino引腳輸出不同頻率,本文使用Arduino PWM頻率庫(kù)。這種方法避免了直接對(duì)芯片寄存器逐位操作的繁瑣和易錯(cuò)。
Arduino PWM頻率庫(kù)有五個(gè)全局函數(shù),分別是InitTimers() ,InitTimersSafe(),pwmWrite(),SetPinFrequency() ,SetPinFrequencySafe()。此外還有針對(duì)各個(gè)timer的函數(shù)。
值得注意的是Arduino的開發(fā)系統(tǒng)中,millis()和delay()等計(jì)時(shí)相關(guān)函數(shù)基于Timer 0時(shí)鐘。所以如果修改了Timer 0的時(shí)鐘周期,這兩個(gè)計(jì)時(shí)函數(shù)也會(huì)受到影響。因此本文系統(tǒng)中用Arduino Mega 2560 引腳12進(jìn)行PWM輸出。12號(hào)引腳受Timer 1控制,改變12號(hào)引腳的頻率不會(huì)影響millis()和delay()等函數(shù)。另外,本文編碼器函數(shù)使用Timer 2時(shí)鐘。因此,本系統(tǒng)中各個(gè)時(shí)鐘互不影響。
PWM頻率調(diào)節(jié)見圖3。首先導(dǎo)入PWM庫(kù),然后用InitTimersSafe()函數(shù)對(duì)系統(tǒng)時(shí)鐘進(jìn)行初始化。為了不影響delay()和millis()函數(shù),這個(gè)函數(shù)不初始化timer0。調(diào)用SetPinFrequency()函數(shù)對(duì)受Timer1控制的12號(hào)引腳進(jìn)行頻率設(shè)置。如果成功,返回值success為真,則通過(guò)12號(hào)引腳輸出頻率調(diào)整后的PWM信號(hào)對(duì)電機(jī)進(jìn)行調(diào)速;如果不成功,則提示用戶頻率調(diào)節(jié)不成功,是否用原頻率調(diào)速。
圖3 PWM頻率調(diào)節(jié)
PI調(diào)節(jié)器基于PID。PID廣泛應(yīng)用于控制領(lǐng)域,對(duì)一個(gè)控制系統(tǒng)的性能一般用穩(wěn)、準(zhǔn)、快來(lái)衡量,即穩(wěn)定性、快速性、準(zhǔn)確性。具體的評(píng)估指標(biāo)有最大超調(diào)量、上升時(shí)間、靜差等。在實(shí)踐生產(chǎn)工程中,不同的控制系統(tǒng)對(duì)控制器效果的要求不一樣。P值影響系統(tǒng)的快速性,I值影響系統(tǒng)的靜差及準(zhǔn)確性,D值雖然影響穩(wěn)定性,但也會(huì)放大噪聲誤差。調(diào)速系統(tǒng)要求以動(dòng)態(tài)穩(wěn)定和穩(wěn)態(tài)精度為主,傳統(tǒng)速度控制常用PI調(diào)節(jié)器。
PI調(diào)節(jié)器如圖4所示, PI調(diào)節(jié)器的基本原理是在對(duì)比目標(biāo)轉(zhuǎn)速與實(shí)際轉(zhuǎn)速的差值的基礎(chǔ)上,通過(guò)算法動(dòng)態(tài)產(chǎn)生調(diào)節(jié)量PWM驅(qū)動(dòng)直流電機(jī)。直流電機(jī)的目標(biāo)轉(zhuǎn)速在設(shè)置界面設(shè)定,實(shí)際轉(zhuǎn)速通過(guò)前述編碼測(cè)速獲得。
圖4 PI調(diào)速器
設(shè)t時(shí)刻目標(biāo)轉(zhuǎn)速為target(t),實(shí)際轉(zhuǎn)速為real(t),轉(zhuǎn)速誤差為e(t)=target(t)-real(t),則連續(xù)PI調(diào)節(jié)器公式可表示為:
其中Kp為比例常數(shù),Ti為積分常數(shù)。
為方便程序?qū)崿F(xiàn),PI調(diào)節(jié)器寫成離散形式:
其中kp為比例常數(shù),ki為積分常數(shù)。
公式(2),(3)被稱為位置式PI調(diào)節(jié)器,在程序?qū)崿F(xiàn)中也常常采用成增量形式:
位置式PI調(diào)節(jié)器與增量式PI調(diào)節(jié)器的本質(zhì)是一樣的,位置式PI調(diào)節(jié)器需要對(duì)誤差進(jìn)行累加,增量式PI調(diào)節(jié)器需要對(duì)調(diào)節(jié)量進(jìn)行累加,為了減小計(jì)算量,可將這兩個(gè)累加量在程序中設(shè)置為靜態(tài)變量。
電機(jī)PI參數(shù)整定過(guò)程中可遵循一些經(jīng)驗(yàn)總結(jié),一般先調(diào)節(jié)比例系數(shù)kp,再調(diào)節(jié)積分系數(shù)ki,各個(gè)參數(shù)采用由小到大進(jìn)行嘗試。對(duì)于虛擬實(shí)驗(yàn)平臺(tái),初學(xué)者調(diào)參過(guò)程中可以做更加大膽地試調(diào),以便加深各個(gè)系數(shù)對(duì)系統(tǒng)貢獻(xiàn)的理解。
系統(tǒng)基本參數(shù)采樣時(shí)間間隔與PWM重新計(jì)算間隔均為tSample=150 ms,目標(biāo)調(diào)節(jié)速度為Target=200 rpm。
圖5各子圖中水平線為目標(biāo)轉(zhuǎn)速200 rpm,曲線為PI控制的實(shí)際轉(zhuǎn)速。圖5(a)中,kp等于2時(shí),響應(yīng)速度較慢,且無(wú)法達(dá)到目標(biāo)轉(zhuǎn)速,需增大比例系數(shù)kp。圖5(b)中,kp等于12,響應(yīng)速度很快,但最終轉(zhuǎn)速與目標(biāo)轉(zhuǎn)速間仍有靜差,需引入積分環(huán)節(jié)。圖5(c)中,kp等于12,ki等于0.1,響應(yīng)速度較快,且最終速度沒有靜差,但過(guò)程中有超調(diào),需降低積分參數(shù)。圖5(d)中,kp=12,ki=0.075,響應(yīng)速度快,最終速度沒有靜差,也沒有超調(diào),調(diào)參結(jié)果比較滿意。
圖5 PI控制器參數(shù)整定
直流電機(jī)PI參數(shù)調(diào)節(jié)是PI調(diào)節(jié)器落地應(yīng)用的一個(gè)重點(diǎn),對(duì)初學(xué)者又是一個(gè)難點(diǎn)。文中仿真實(shí)驗(yàn)平臺(tái)有效地解決了這一難點(diǎn),讓學(xué)生及初學(xué)者可視化地體會(huì)到運(yùn)用Arduino控制板調(diào)節(jié)電機(jī)轉(zhuǎn)速時(shí)PI參數(shù)調(diào)節(jié)的效果,并減少實(shí)際調(diào)節(jié)中因參數(shù)不合適可能導(dǎo)致的安全隱患。