摘 要: 基于Matlab GUI(圖形用戶界面)設(shè)計了一種以單片機為控制核心的直流電機PID調(diào)速系統(tǒng)。利用GUI作為上位機對單片機采集的信息進行處理,實現(xiàn)電機轉(zhuǎn)速的波形顯示、存儲、PID控制等功能。由于該系統(tǒng)的PWM信號由專門PWM芯片產(chǎn)生,因此降低了單片機程序的復(fù)雜程度,提高了系統(tǒng)的可靠性和控制精度。實驗結(jié)果表明,該系統(tǒng)運行穩(wěn)定,界面的人機交互性好,操作簡單方便。在對PID參數(shù)的選定中可提高對PID算法和電機性能的直觀認(rèn)識,對自動控制、電機拖動等研究領(lǐng)域具有一定的現(xiàn)實意義。
關(guān)鍵詞: Matlab圖形用戶界面;直流電機;比例積分微分;閉環(huán)控制
相對于其他類型的電機,直流電機具有很多優(yōu)點,包括速度的可控性,啟動、 制動的穩(wěn)定性,以及調(diào)速的平滑性和經(jīng)濟性等[1]。運用其中的一些優(yōu)點可以實現(xiàn)頻繁的無極快速起動、制動和反轉(zhuǎn),能滿足生產(chǎn)過程中自動化系統(tǒng)各種不同的特殊要求[2]。其有很多不同的控制算法和手段,模擬PID控制是最早發(fā)展起來的控制策略之一,長期以來形成了典型的控制結(jié)構(gòu)。模擬PID參數(shù)整定方便,能夠滿足一般控制的要求,但是在實際中,現(xiàn)場的參數(shù)是易發(fā)生變化的(如溫度、濕度等),而模擬PID控制系統(tǒng)一旦給定參數(shù),則其在整個控制過程中是不能改變的,故其難以使系統(tǒng)達(dá)到滿意的控制效果[3-4]。隨著計算機技術(shù)與現(xiàn)代控制理論的發(fā)展,數(shù)字PID技術(shù)逐漸發(fā)展起來,它不僅能夠?qū)崿F(xiàn)模擬PID所完成的控制任務(wù),而且具備控制算法靈活、可靠性高等優(yōu)點,應(yīng)用面也越來越廣。Matlab具有強大的數(shù)值計算、可視化功能和系統(tǒng)建模仿真能力,在高校和科研機構(gòu)使用極為廣泛[5]。圖形用戶界面是目前計算機應(yīng)用程序界面的主要形式。Matlab為用戶提供了功能強大的集成圖形用戶界面開發(fā)環(huán)境(GUI),通過GUI,用戶可方便、快捷地設(shè)計圖形用戶界面,開發(fā)自己的應(yīng)用程序。并且GUI平臺界面友好、使用簡單,運用十分廣泛,能夠方便地進行某種技術(shù)或方法的演示,將GUI運用到控制系統(tǒng)中也為產(chǎn)品的演示與教學(xué)提供了新的途徑[6]。
1 系統(tǒng)總體設(shè)計
本設(shè)計中,單片機系統(tǒng)作為下位機進行數(shù)據(jù)采集和控制執(zhí)行,而Matlab GUI作為上位機主要完成PID調(diào)控、命令的發(fā)送、數(shù)據(jù)的存儲、轉(zhuǎn)速波形顯示等工作。采用51單片機作為主控制器,通過控制D/A模塊產(chǎn)生模擬電壓來驅(qū)動PWM模塊產(chǎn)生相應(yīng)占空比PWM信號,從而實現(xiàn)對直流電機轉(zhuǎn)速的控制。單片機的外圍器件還包括電機驅(qū)動模塊、電平轉(zhuǎn)換模塊、LCD、鍵盤等。系統(tǒng)總體框圖如圖1所示。
該系統(tǒng)采用 STC89C52 單片機為控制核心,控制DA芯片TLC7528能夠產(chǎn)生0~5 V的模擬電壓。該模擬電壓驅(qū)動PWM芯片STC12C5608產(chǎn)生高精度占空比可調(diào)的PWM信號。PWM信號經(jīng)過驅(qū)動芯片BTS7960的功率放大形成了對直流電機的驅(qū)動電壓。依靠光電編碼器完成對電機轉(zhuǎn)速的獲取,上位機接收單片機發(fā)送的轉(zhuǎn)速信息,一方面根據(jù)PID參數(shù),對電機的轉(zhuǎn)速進行進一步的調(diào)整更正;另一方面,在GUI界面繪制出電機的轉(zhuǎn)速波形。通過GUI界面,可以方便地改變PID參數(shù),調(diào)整系統(tǒng)的動態(tài)特性,也可以將轉(zhuǎn)速信息保存下來以備后續(xù)分析。該系統(tǒng)采用12 V的電壓為驅(qū)動單獨供電,保證了系統(tǒng)的驅(qū)動能力供給充足,提高了系統(tǒng)的穩(wěn)定性和可靠性。鍵盤主要用來復(fù)位單片機系統(tǒng)和選擇串口通信的波特率,LCD則為波特率的選擇和當(dāng)前轉(zhuǎn)速的顯示提供良好的交互界面。
2 系統(tǒng)硬件模塊介紹
2.1 DA轉(zhuǎn)換模塊設(shè)計
DA芯片采用雙路、8位數(shù)字/模擬轉(zhuǎn)換器TLC7528,8位的分辨率可以為系統(tǒng)提供較高的轉(zhuǎn)換精度。數(shù)模轉(zhuǎn)換電路如圖2所示。
圖中,由單片機輸出的8位數(shù)字量經(jīng)由DA_0到DA_7輸入芯片。DA_CS為控制引腳,控制TLC7528進行轉(zhuǎn)換或者保持模擬量輸出。模擬電壓經(jīng)由DA_OUT輸出,用于控制PWM模塊產(chǎn)生PWM信號。
2.2 PWM模塊設(shè)計
為了提高PWM信號分辨力,保證系統(tǒng)控制精度,該系統(tǒng)采用單獨的PWM模塊輸出PWM信號。STC12C5608是增強型的8051CPU,指令代碼完全兼容傳統(tǒng)8051,但速度比傳統(tǒng)8051快8~12倍。針對電機控制、強干擾場合,其內(nèi)部集成了4路PWM,8路高速10位A/D轉(zhuǎn)換,編程功能使其成為專用的PWM芯片,其高精度A/D轉(zhuǎn)換功能用來處理TLC7528產(chǎn)生的模擬信號,從而實現(xiàn)用模擬電壓來控制PWM信號占空比的功能。其構(gòu)成電路如圖3所示。
圖3中,STC12C5608芯片從AD0引腳接收TLC7528產(chǎn)生的模擬電壓,芯片根據(jù)其內(nèi)部對應(yīng)的程序在PWM0引腳輸出相應(yīng)占空比的PWM信號。
2.3 驅(qū)動模塊設(shè)計
直流電機的驅(qū)動芯片采用BTS7960,它是應(yīng)用于電機驅(qū)動的大電流半橋高集成芯片,通態(tài)電阻典型值為16 MΩ,驅(qū)動電流可達(dá)43 A,能夠為系統(tǒng)提供充足的驅(qū)動能力。由于BTS7960的芯片內(nèi)部只有一個半橋,故該模塊采用2片對電機進行驅(qū)動。電路如圖4所示。
圖4中,IN1與IN2是PWM信號輸入端,ERO1和ERO2是電流檢測輸出引腳。PWM信號經(jīng)過功率放大后在J2兩端輸出,為直流電機提供驅(qū)動電壓。
3 GUI程序設(shè)計
圖形用戶界面是指包括文本框、標(biāo)簽、按鈕、單選按鈕、復(fù)選框、圖片、菜單、對話框等組件的人機交互界面。在該界面中,通過單擊、雙擊、拖動鼠標(biāo)和簡單的文字輸入就可以輕松地操作計算機,完成所有任務(wù)。它既能嵌入已有的仿真程序,又能把仿真后的圖形化結(jié)果以人機交互的動態(tài)方式直觀呈現(xiàn),使用者不需要知道代碼的具體內(nèi)容,只要了解操作步驟即可很方便地操作界面。對于熟悉Matlab而不想編寫大量VC代碼的科研人員來講,Matlab GUI無疑是一個最佳選擇[7]。
圖5所示為該系統(tǒng)的GUI界面,大概包含以下幾個區(qū)域:端口設(shè)置區(qū)、DA轉(zhuǎn)換區(qū)、目的轉(zhuǎn)速設(shè)置區(qū)、開閉環(huán)控制區(qū)、轉(zhuǎn)速波形區(qū)以及理論驅(qū)動電壓波形區(qū)。端口設(shè)置區(qū)主要完成對端口的設(shè)置,如端口號的選擇、波特率的選擇以及Matlab串口中斷類型選擇等(本實驗中,端口號是COM3,波特率是19 200,中斷類型默認(rèn)設(shè)置為接收到特定字符‘Z’后觸發(fā))。DA轉(zhuǎn)換區(qū)可直接控制D/A模塊輸出模擬電壓,從而改變PWM占空比控制轉(zhuǎn)速,以供調(diào)試和測試之用。目的轉(zhuǎn)速設(shè)置區(qū)對期望轉(zhuǎn)速進行設(shè)置,開閉環(huán)控制區(qū)則可以根據(jù)當(dāng)前的控制策略選擇開環(huán)控制或者閉環(huán)控制,在閉環(huán)控制時,可以設(shè)置不同的PID參數(shù)改變系統(tǒng)的響應(yīng)特性。轉(zhuǎn)速波形區(qū)主要完成對實測轉(zhuǎn)速波形的顯示,能夠直觀地觀察到電機轉(zhuǎn)速的響應(yīng)波形。理論驅(qū)動電壓波形區(qū)用來顯示理論驅(qū)動電壓的波形,通過該波形可以基本了解驅(qū)動電壓的變化趨勢,以便與轉(zhuǎn)速波形形成對比。
3.1 Matlab 串口設(shè)置流程
(1)用serial函數(shù)創(chuàng)建一個串口對象
obj = serial('port')
obj=serial('port','PropertyName',PropertyValue,...)
(2)用fopen函數(shù)打開串口對象
fileID = fopen(filename)
fopen()函數(shù)括號中為串口對象,如果無法打開,返回-1。
(3)用fread函數(shù)讀取串口數(shù)據(jù)
A=fread(fileID)
fread函數(shù)括號中為串口對象,返回讀取到的數(shù)據(jù)。
(4)用fclose函數(shù)、free函數(shù)、delete函數(shù)和clear函數(shù)清除串口對象并釋放內(nèi)存空間。如:
fclose(s);%關(guān)閉串口對象s
free(s);%釋放s占用的內(nèi)存空間
delete(s);%刪除串口對象s
clear(s);%刪除工作空間變量,釋放內(nèi)存
3.2 串口中斷設(shè)置
3.2.1 選擇中斷模式
(1)串口緩存區(qū)達(dá)到指定字節(jié)數(shù)時觸發(fā)中斷,如:
s.BytesAvailableFcnMode='byte';%中斷類型
s.BytesAvailableFcnCount=31;%指定中斷字節(jié)數(shù)
s.BytesAvailableFcn={@serial_interrupt,handles};
%指定中斷函數(shù)為serial_interrupt
(2)接收到特定字符時觸發(fā)中斷,如:
s.BytesAvailableFcnMode='terminator';%中斷類型
s.Terminator=′Z′;%當(dāng)接收到字符′Z′時觸發(fā)中斷
s.BytesAvailableFcn={@serial_interrupt,handles};
%指定中斷函數(shù)為serial_interrupt
3.2.2 在.m文件中添加中斷函數(shù)
function serial_interrupt(hObject,event,handles)
%定義中斷函數(shù)
3.3 波形繪制與串口數(shù)據(jù)存儲
3.3.1 波形繪制(電機轉(zhuǎn)速波形)
轉(zhuǎn)速的波形繪制主要在串口中斷函數(shù)中完成,部分代碼如下:
s_data=fread(s);%串口數(shù)據(jù)讀取
display_length=600;%定義要繪制的點數(shù)
time=linspace(0,60,display_length);%定義時間坐標(biāo)
count=count+1;%計數(shù)變量加1用以繪制下一個點
speed=(s_data(27)-48)*1000+(s_data(28)-48)*100+
(s_data(29)-48)*10+(s_data(30)-48);
%提取串口中的電機轉(zhuǎn)速數(shù)據(jù)并轉(zhuǎn)換成整型
rotspeed=[rotspeed,speed];%保存數(shù)據(jù)用于繪圖
plot(handles.axes_speed,time(1:count),rotspeed(1:count));
%繪圖
set(handles.axes_speed,'XLim',[time(1),time(end)]);
if count==600 %畫滿600點后重新開始畫圖
count=0;
rotspeed=speed;
end
3.3.2 串口數(shù)據(jù)存儲
本程序默認(rèn)把數(shù)據(jù)存儲到s_text.txt中。部分代碼如下:
fid=fopen(get(handles.edit_save,'String'),'at');
%以添加文本方式打開文件
s_text=fread(s);%讀串口數(shù)據(jù)
fprintf(fid,'%s\n',s_text);%向文件寫入數(shù)據(jù)并換行
3.4 閉環(huán)控制算法
PID控制是在經(jīng)典控制理論中技術(shù)最成熟、研究最廣泛和應(yīng)用最多的一種控制方式。圖6所示為整理后的閉環(huán)相應(yīng)曲線,其中P參數(shù)為0.5,I參數(shù)為0.05,D參數(shù)為0,目的轉(zhuǎn)速為3 000 r/min。
部分程序如下:
current_speed=data.param;%得到當(dāng)前的轉(zhuǎn)速
spect_speed=data.target;%得到目標(biāo)轉(zhuǎn)速
error=spect_speed-current_speed; %求得誤差信號
sum=sum+error;%誤差信號累加
P=str2double(get(handles.edit_p,'String'));
%從GUI界面得到P參數(shù)
I=str2double(get(handles.edit_i,'String'));
%從GUI界面得到I參數(shù)
D=str2double(get(handles.edit_d,'String'));
%從GUI界面得到D參數(shù)
result=P*error+I*sum+D*(error-error_1);%驅(qū)動信號
基于Matlab GUI開發(fā)了一種具有友好用戶界面的PID直流電機調(diào)速系統(tǒng)。通過該界面,用戶能夠直觀地觀察到電機轉(zhuǎn)速變化的波形,并且可以對PID參數(shù)進行實時調(diào)整以觀察電機的動態(tài)響應(yīng)特性。同時GUI的數(shù)據(jù)保存功能能夠保存串口發(fā)送過來的所有數(shù)據(jù)以備后續(xù)的分析和研究。由于該系統(tǒng)的PWM信號由專門PWM芯片產(chǎn)生,降低了單片機程序的復(fù)雜度,提高了系統(tǒng)的可靠性和控制精度。該系統(tǒng)運行穩(wěn)定,操作簡單方便,在自動控制、電機拖動等眾多領(lǐng)域具有一定的應(yīng)用價值。
參考文獻
[1] 庹朝永.基于單片機的直流電機PWM調(diào)速系統(tǒng)設(shè)計與開發(fā)[J].煤炭技術(shù),2011,30(6):62-63.
[2] 王曉峰,郝瀟.基于單片機實現(xiàn)視域下直流電機PWM控制策略的探討[J].煤炭技術(shù),2012,31(7):232-233.
[3] 王葳,張永科,劉鵬鵬,等.無刷直流電機模糊PID控制系統(tǒng)研究與仿真[J].計算機仿真,2012,29(4):196-199,254.
[4] 王毅,王平,蘇偉達(dá),等.基于數(shù)字PID控制的直流電機控制系統(tǒng)的設(shè)計[J].福建師范大學(xué)學(xué)報,2010,26(4):59-62.
[5] 杜世民,楊潤萍.基于MATLAB GUI的“信號與系統(tǒng)”教學(xué)仿真平臺開發(fā)[J].實驗技術(shù)與管理,2012,29(3):87-90.
[6] 金波.基于Matlab的“信號與系統(tǒng)”實驗演示系統(tǒng)[J].實驗技術(shù)與管理,2010,27(12):104-107.
[7] 鐘可君,張海林.基于Matlab GUI設(shè)計的光學(xué)實驗仿真[J].實驗室研究與探索,2010,29(10):52-52,80.