黃文力++元曉
摘要:設計了一種DSP電機控制系統(tǒng),開發(fā)了電機控制可視化界面。建立計算機(上位機)與DSP(下位機)之間的串口通信機制,既而完成對電機運行的復雜控制。著重分析DSP電機驅(qū)動程序的結構和相關代碼,理清程序設計的思路,供相關研究人員借鑒。
關鍵詞:DSP 直流電機 串口通信 程序設計
中圖分類號:TP29 文獻標識碼:A 文章編號:1007-9416(2014)12-0147-03
Abstract:A kind of DSP motor control system was designed and one motor control visual interface was developed in the paper. The serial communication mechanism between PC of host and DSP of client is established to finish complicated controls of DC motor. Focus on the analysis of structures and related codes of DSP motor drive program is expected to clear program design ideas for relevant science researches.
Key Words:DSP; DC motor; serial communication; program design
目前,利用DSP實現(xiàn)對電動機運行的控制已經(jīng)成為電機拖動領域流行且成熟的方案。通過DSP可以實施對多類型電機的多形式的運動控制,其中最突出的是對電機寬域且平滑的調(diào)速,依據(jù)電機與DSP類型的不同,具有諸多實用的方案[1,2]。關于直流電機的調(diào)速,理論上可以采取三種方式:改變電樞電壓,改變電樞回路電阻,調(diào)節(jié)勵磁磁通,但是由于其它兩種方法缺陷明顯,目前主要采用改變電樞電壓的方法:通過調(diào)節(jié)DSP輸出的PWM波形的占空比,調(diào)控輸入到電機電樞繞組的電壓有效值,既而實現(xiàn)電機速度在較寬的范圍內(nèi)平滑改變[3]。
本文介紹一種基于DSP TMS320F2812的電機控制系統(tǒng)。利用Visual Studio 2010(VS2010)開發(fā)電機控制界面,構建了計算機(上位機)與DSP(下位機)之間串口的通信機制,實現(xiàn)對電機運動的控制。著力討論以DSP為信息交換樞紐的電機驅(qū)動程序的設計。
1 控制系統(tǒng)開發(fā)
首先,利用集成了.net Framework 4.0的Visual Studio 2010 Windows應用程序開發(fā)平臺,采用C#語言開發(fā)出電機控制界面,用以實現(xiàn)如開停、增/減速、運行狀態(tài)查詢等可視化電機控制功能,如圖1所示;其次,構建上位機與下位機之間的串口通信機制,由上位機PC把相應的控制命令傳遞給下位機DSP,執(zhí)行電機控制的操作命令;最后,由DSP構成電機控制系統(tǒng)的信息交換樞紐,一方面?zhèn)鬟f上位機下達的控制命令給電動機,另一方面把電動機運行狀態(tài)的相關信息反饋給上位機,實現(xiàn)對電機運行狀態(tài)的實時監(jiān)控。
該控制系統(tǒng)整體為主從式計算機結構如圖2所示,其中PC為上位機,DSP為下位機,兩者之間通過串口RS232C協(xié)議交換數(shù)據(jù)。硬件電路連接如圖3所示,包括計算機、DSP開發(fā)板、仿真器、電機驅(qū)動電路板、直流電動機和一些電路連接線。
2 驅(qū)動程序設計
CCS3.3是一個集成版的DSP應用程序開發(fā)環(huán)境,基本涵蓋了TI公司所有型號的DSP,與其它版本相比體積稍大,但是代碼優(yōu)化效率較高,調(diào)試方便,是目前用的最多的DSP程序開發(fā)平臺。該電機控制系統(tǒng)利用C語言基于CCS3.3軟件平臺開發(fā)DSP的電機驅(qū)動程序,建立電機控制策略實施的紐帶。
DSP的驅(qū)動程序主要包括:各個外設的初始化函數(shù)、主函數(shù)與輸入中斷函數(shù)。其中初始化函數(shù)完成相應外設的初始化定義,如系統(tǒng)、輸入/輸出引腳、串行通信接口、事件管理器等;主函數(shù)完成相關變量、宏及功能函數(shù)的定義,最后形成一個死循環(huán),等待CPU對電機控制命令中斷請求的響應,完成對電機運動的調(diào)節(jié);中斷函數(shù)為電機各種控制命令在DSP電機驅(qū)動程序中的入口,利用事件響應機制去完成對電機行為的控制。程序整體采用模塊化結構,通過調(diào)用一個個功能子函數(shù)來實現(xiàn)對電機的不同控制,邏輯清晰,便于實現(xiàn)系統(tǒng)功能的擴展。
驅(qū)動程序的設計思路如圖4所示,首先需要完成DSP及相應功能外設的初始化,即準備好去執(zhí)行電機的控制命令,然后等待串口的電機控制命令的輸入,即形成一個死循環(huán)。當串口有電機操作指令輸入時,隨即發(fā)生中斷事件,調(diào)用中斷函數(shù),執(zhí)行相應的電機操作指令,包括電機的起/停、正/反轉、加/減速、狀態(tài)查詢等;在指令完成后,返回死循環(huán)進入待命狀態(tài),等待下一個電機操作指令,周而復始。
2.1 主函數(shù)
首先引用相關的頭文件,定義相應的宏、變量與功能函數(shù),然后在主函數(shù)中完成相關變量、函數(shù)及外設功能的初始化,最后形成一個死循環(huán),等待串口輸入對CPU的中斷請求,既而完成電機行為的相關控制指令。以下程序代碼的省略部分,均為DSP程序的一些固定的功能語句,如中斷的使能、外設功能的設定等,為了節(jié)省篇幅,不再一一列出,可以參閱文獻[4]。
//頭文件,宏、變量、功能函數(shù)定義等
……;
void main(void)
{
InitSysCtrl(); //初始化系統(tǒng)函數(shù)
//CPU中斷,PIE寄存器、外設初始化[4]
……;
InitGpio(); //初始化Gpio口
InitEv();endprint
for(i = 0; i < 4; i++) //初始化數(shù)組變量
{
Sci_VarRx[i] = 0;//存儲電機控制指令
}
i = 0;//初始化
M1_Flag=0; M2_Flag=0;//電機起始為停止狀態(tài)
//電機控制界面顯示波特率初值
sendMsg(SciaRegs.SCIHBAUD);
sendMsg(SciaRegs.SCILBAUD);
//定時器T3和T1計數(shù)使能
EvbRegs.T3CON.bit.TENABLE=1;
EvaRegs.T1CON.bit.TENABLE=1;
/*使能SCI中斷,開CPU中斷,使能全局與實時中斷[4]*/
……;
for(;;) { }
}
2.2 功能函數(shù)
該電機控制系統(tǒng)實現(xiàn)了控制2臺(易于擴展到多臺)直流電機的起/停、正/反轉、加/減速、狀態(tài)查詢等行為,由于程序采用模塊化結構,每一個控制功能都對應特定的功能函數(shù),且每一個功能函數(shù)的結構類似,皆為先判斷指令對象,然后再依據(jù)不同的指令代碼執(zhí)行對應的動作。因此在此僅列出加速功能函數(shù)的代碼,其中省略部分為對兩臺以上電機的相同操作,不再重復。其它功能函數(shù)以此類推。
void M_Inc(unsigned int num) //加速函數(shù)
{
if((num==1)&(M1_Flag!=0)) //電機M1
{
//占空比增加2%
EvaRegs.CMPR1=EvaRegs.CMPR1+375;
if(EvaRegs.CMPR1>=0x41EB)
{
//最大占空比值為90%
EvaRegs.CMPR1=0x41EB;
}
}
else if((num==2)&(M2_Flag!=0)) //其它電機
{
……;//相同控制代碼
}
}
2.3 系統(tǒng)初始化函數(shù)
在系統(tǒng)初始化函數(shù)中,主要完成關閉看門狗電路、初始化PLL鎖相環(huán)模塊、設定高/低速時鐘預定標器頻率等,也就是說確定系統(tǒng)輸出PWM波的頻率,相關內(nèi)容可以參閱文獻[4]。以下主要列出該工程中用到的外設的初始化設置代碼:
void InitSysCtrl(void)
{
//關門狗電路、PLL模塊、高低速時鐘初始化[4]
……;
// EVA、EVB、SCIA模塊時鐘使能
SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;
SysCtrlRegs.PCLKCR.bit.SCIENCLKA=1;
}
2.4 I/O口初始化函數(shù)
在輸入輸出引腳初始化函數(shù)中,主要完成工程用到引腳的功能與方向的設定,如引腳為功能引腳還是通用的輸入輸出引腳、是輸入還是輸出引腳等。其代碼如下:
void InitGpio(void)
{
EALLOW;//使能寄存器訪問
//設置串口的的發(fā)送和接收引腳為功能引腳 GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4=1;
GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5=1;
//設置GPIOA0、A1等引腳為功能引腳
GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0=1;
GpioMuxRegs.GPAMUX.bit.PWM2_GPIOA1=1;
GpioMuxRegs.GPBMUX.bit.PWM7_GPIOB0=1;
GpioMuxRegs.GPBMUX.bit.PWM8_GPIOB1=1;
EDIS;//關閉寄存器訪問
}
2.5 串口初始化函數(shù)
該工程利用串口的SCIA模塊,其初始化包括設置1位停止位、8位數(shù)據(jù)位,禁止奇偶校驗、禁止數(shù)據(jù)回送測試,使能串口的發(fā)送和接收數(shù)據(jù)功能,使能中斷方式發(fā)送和接收數(shù)據(jù),設置波特率等,最后重啟SCI保存設置,完成初始化。主要代碼如下所示:
void InitSci(void)
{
//停止位、數(shù)據(jù)位、極性校驗等設置[4]
……;
SciaRegs.SCIHBAUD=0x00;
SciaRegs.SCILBAUD=0xE7;//波特率為9600
//發(fā)送和接收數(shù)據(jù)使能,中斷使能。重啟SCI[4]
……;
}
2.6 事件管理器初始化函數(shù)
在事件管理器初始化函數(shù)中,分別設定事件管理器EVA的定時器T1與EVB的定時器T3工作于連續(xù)增/減計數(shù)模式,定時器的時鐘頻率為37.5MHz,暫時禁止T1計數(shù),使能T1內(nèi)部時鐘,設定T1的周期值為0x493E=18750(即相應的PWM波頻率為1kHz),設定T1計數(shù)器初始值為0;使能比較單元的比較操作,全比較器輸出,相應引腳PWM1~PWM6由比較邏輯驅(qū)動;立即重載寄存器保存設置;設定PWM1引腳為低電平有效,PWM2引腳為高電平有效,初始占空比值為0x1250(25%);設定死區(qū)定時器周期為10 s,定時器預定標因子為(37.5 MHz)/8≈4.69 MHz,相應的死區(qū)時間約為10/(4.69×106)≈2.13μs。對于EVB的操作完全類似,代碼如下所示:endprint
void InitEv(void)
{
/*EVA模塊。設定T1工作模式、時鐘頻率、周期值,T1計數(shù)器初值。比較單元1使能及相關引腳設定[4]。*/
……;
/*PWM1、PWM2引腳初始低電平,保證電機初始停止狀態(tài)。*/
EvaRegs.ACTR.bit.CMP1ACT=0;
EvaRegs.ACTR.bit.CMP2ACT=0;
EvaRegs.CMPR1=0x1250;//占空比初始值25%
EvaRegs.DBTCONA.bit.DBT=10;//死區(qū)定時器周期
//死區(qū)定時器1使能
EvaRegs.DBTCONA.bit.EDBT1=1;
//死區(qū)定時器預定標因子
EvaRegs.DBTCONA.bit.EDBT1=3;
/*EVB模塊。與EVA模塊完全類似,只需把定時器T1換為T3,引腳PWM1與PWM2改為PWM7與PWM8,死區(qū)定時器控制寄存器DBTCONA改為DBTCONB即可。*/
……;
}
2.7 中斷函數(shù)
DSP采用中斷方式響應串口數(shù)據(jù)的讀取,所有對電機的控制操作皆在中斷函數(shù)里完成,不同的控制命令調(diào)用不同的功能子函數(shù)。相應程序的代碼結構如下:
/*只要串口輸入緩沖區(qū)有數(shù)據(jù)需要接收,CPU就//會執(zhí)行此中斷函數(shù)。*/
interrupt void SCIRXINTA_ISR(void)
{
//利用數(shù)組保存控制命令數(shù)據(jù)
Sci_VarRx[i] = SciaRegs.SCIRXBUF.all;
i++;//主函數(shù)中已定義
//根據(jù)命令代碼格式,01為電機正反轉識別代碼
if(Sci_VarRx[0]==0x0001)
{
Rec_Manage(Sci_VarRx[0]);//電機正/反轉
}
//02為電機停止識別代碼
else if(Sci_VarRx[0]==0x0002)
{
……;//電機停止
}
/*03、04分別對應電機加/減速、占空比設定、運行狀態(tài)查詢等識別代碼。*/
……;
if(i==4){ i=0; }
//使得同組其他中斷能夠得到響應
PieCtrl.PIEACK.bit.ACK9=1;
EINT; //開全局中斷
}
3 結語
基于DSP所設計的電機運動控制器目前應用廣泛,方案眾多。本文介紹了一種可以實現(xiàn)對多臺直流電機實施調(diào)節(jié)的DSP電機控制系統(tǒng),利用VS2010開發(fā)了電機控制界面,并且建立了上、下位機之間的串口通信機制,成功實現(xiàn)了對多臺(兩臺)電機運行的調(diào)制和狀態(tài)的實時監(jiān)控。另外,深入分析了基于C語言的DSP電機驅(qū)動程序的結構和有關代碼,力爭建立DSP相關電機驅(qū)動程序的模塊化結構與模式化設計的思維。
參考文獻
[1]任忠,王自強.基于DSP控制的無刷直流電機調(diào)速系統(tǒng)的設計[J].電力電子,2008,30(3):30-32.
[2]李宏,徐德民,焦振宏.基于DSP的大功率永磁直流電機調(diào)速系統(tǒng)設計[J].電力電子技術,2006,40(5):29-31.
[3]李方圓,李曉.基于dsp直流電機調(diào)速系統(tǒng)的設計[J].數(shù)字技術與應用,2012,(12):128-130.
[4]顧衛(wèi)剛.手把手教你學DSP——基于TMS320X281x[M].北京:北京航空航天大學出版社,2011.endprint