基于USB通信的多直流電動機控制系統(tǒng)
姜偉凱,李雛
(上海大學,上海200072:)
摘要:將USB數(shù)據(jù)通信用于直流電動機控制系統(tǒng),采用PICl8F4550單片機和LM629組建了閉環(huán)的高精度數(shù)字式直流電動機驅(qū)動模塊。通過一個實例,介紹運動參數(shù)傳遞的全過程。
關鍵詞:USB通信;直流電機;運動控制
中圈分類號:TM33 文獻標識碼:A 文章編號:1004—7018(2008)06—0040—02  本文利用USB的可拓展性開發(fā)可以按照需要擴增和縮減的直流電動機計算機分級控制系統(tǒng)。系統(tǒng)中將一臺個人計算機作為USB系統(tǒng)中的主機。通過USB數(shù)據(jù)傳遞控制一塊或多塊驅(qū)動一執(zhí)行模塊,如圖1所示。每個模塊含有一片PICl8F4550單片機、兩片LM629直流電動機專用控制芯片、一片L298驅(qū)動芯片、兩臺帶有同軸光電碼盤的直流電動機。其中PICl8F4550單片機是USB系統(tǒng)中的關鍵節(jié)點。圖1中的USB Hub部件為USB集線器(擴展USB的聯(lián)接端口)。
1個人計算機與PICl8F4550單片機之間的USB通信
PICl8F4550是微芯(Mierochip)公司推出的具有全速USB 2.0連接功能的單片機,內(nèi)置SIE(SerialInterface Engine)引擎,SIE能完成單片機RAM存儲區(qū)與USB主機內(nèi)存之間的數(shù)據(jù)傳輸。該單片機中有1 kB的RAM可用于USB緩沖器(USB RAM),最多可以配置16個USB通信端點(Endpoint)。當USB主機向PICl8F4550發(fā)送數(shù)據(jù)時,SIE把接收到的數(shù)據(jù)解碼后移送到相應的通信端點,當單片機發(fā)送數(shù)據(jù)時,SIE把端點數(shù)據(jù)編碼后發(fā)送給USB主機。
USB節(jié)點設備種類繁多。為了使主機能夠正確識別特定的節(jié)點設備,從而加載合適的USB驅(qū)動,規(guī)定每一種節(jié)點設備都有設備廠商號(Vendor ID)和產(chǎn)品號(Product ID)。在枚舉(enumeration)過程中,計算機通過發(fā)送查詢命令來獲得設備的這兩種節(jié)點特征以及其它信息。USB主機通過枚舉識別USB設備并給新連接的設備分配相應地址。枚舉完成后,可以在客戶程序中用Mierochip提供的動態(tài)鏈接庫(MPUSB.d11)中的函數(shù)(MPUSBOpen),打開
連接主機內(nèi)存和USB RAM中的相應通信端點的虛擬通道(pipeline),并返回一個指向該通道的旬柄(han dle),在以后的編程中,就用該句柄變量代表該通道。
下面列出一個從個人計算機到PICl8F4550單片機的參數(shù)傳遞實例:
(1)在客戶程序中,將被發(fā)送的參數(shù)賦值給一個數(shù)組(send—bur)中的各個元素
(2)用MPuSBOpen函數(shù)建立一個發(fā)送數(shù)據(jù)的通道OutPipe=USBOpen(0,vid—pid,0ut—pipel,MP—WRITE,0);
其中第一個參數(shù)O表示uSB設備序號。參數(shù)vjd_pid表示芯片廠商號和產(chǎn)品號。參數(shù)out_pipel表示發(fā)送管道1。參數(shù)MP WRITE表示該管道用于發(fā)送數(shù)據(jù)。函數(shù)返回的句柄值OutPipej將用作于MPuSBWrite函數(shù)中的參數(shù)。
(3)用MPuSBWrite函數(shù)把含有控制參數(shù)的數(shù)組send_buf從uSB主機發(fā)送給第一個uSB設備(設備序號O):
uSBWrite (OutPipe, send_buf, 8,&SenADataLength,1000);
(4)在MPLAB—IDtE集成開發(fā)環(huán)境中編寫用于PIcl8F4550單片機的固件程序。
用數(shù)據(jù)傳送函數(shù)將接收到的參數(shù)從uSB RAM(要事先分配地址和容量)復制到一個數(shù)組(data.
(5)將數(shù)組中元素值賦給指定變量。例如,將加速度、速度參數(shù)賦給指定變量
mA=dataPacket[2];
//把發(fā)送過來的加速度值保存在變量mA
mV=dataPacket[3];
//把發(fā)送過來的****速度值保存在變量mv
(6)用數(shù)據(jù)傳輸指令將變量的值通過單片機的端口D,發(fā)送給芯片LM629。下面是一個發(fā)送加速度數(shù)據(jù)的例子。
LM629_sTATUS_CHK();
//對LM629進行忙(busy)檢測,如LM629不處于忙狀態(tài),則進行發(fā)送加速度數(shù)據(jù)的操作。
|