在中國(guó)科大首屆機(jī)器人舞蹈比賽中(中央10臺(tái)節(jié)目轉(zhuǎn)播),我們用一個(gè)單片機(jī)控制多個(gè)步進(jìn)電機(jī)指揮跳舞機(jī)器人的雙肩、雙肘和雙腳伴著音樂(lè)做出各種協(xié)調(diào)舒緩充滿感情的動(dòng)作,榮獲一等獎(jiǎng)。電路采用74373鎖存,74LS244和ULN2003作電壓和電流驅(qū)動(dòng),單片機(jī)(Atc52)作脈沖序列信號(hào)發(fā)生器。程序設(shè)計(jì)基于中斷服務(wù)和總線分時(shí)利用方式,實(shí)時(shí)更新各個(gè)電機(jī)的速度、方向。整個(gè)舞蹈由運(yùn)動(dòng)數(shù)據(jù)所決定的一截截動(dòng)作無(wú)縫連接而成。
['-ln)96. =#%e'\)a 1 步進(jìn)電機(jī)簡(jiǎn)介 _Zf1=&U#/ 步進(jìn)電機(jī)根據(jù)內(nèi)部線圈個(gè)數(shù)不同分為二相制、三相制、四相制等。本文以四相制為例介紹其內(nèi)部結(jié)構(gòu)。圖1為四相五線制步進(jìn)電機(jī)內(nèi)部結(jié)構(gòu)示意圖。
%I Y-0\ o}WbW }& 2 四相五線制步進(jìn)電機(jī)的驅(qū)動(dòng)電路 "c\T 電路主要由單片機(jī)工作外圍電路、信號(hào)鎖存和放大電路組成。我們利用了單片機(jī)的I/O端口,通過(guò)74373鎖存,由74LS244驅(qū)動(dòng),ULN2003對(duì)信號(hào)進(jìn)行放大。8個(gè)電機(jī)共用4bit I/O端口作為數(shù)據(jù)總線,向電機(jī)傳送步進(jìn)脈沖。每個(gè)電機(jī)分配1bit的I/O端口用作74373鎖存信號(hào),鎖存步進(jìn)電機(jī)四相脈沖,經(jīng)ULN2003放大到12V驅(qū)動(dòng)電機(jī)運(yùn)轉(zhuǎn)。
FIU(2 by6E
"7% 電路原理圖(部分)如圖2所示。
*+p'CfsSka (1)Intel 8051系列單片機(jī)是一種8位的嵌入式控制器,可尋址64K字節(jié),共有32個(gè)可編程雙向I/O口,分別稱為P0~P3。該系列單片機(jī)上集成8K的ROM,128字節(jié)RAM可供使用。
b@,=;Y)O (2)74LS244為三態(tài)控制芯片,目的是使單片機(jī)足以驅(qū)動(dòng)ULN2003。ULN2003是常用的達(dá)林頓管陣列,工作電壓是12V,可以提供足夠的電流以驅(qū)動(dòng)步進(jìn)電機(jī)。關(guān)于這些芯片的詳細(xì)介紹可參見(jiàn)它們各自的數(shù)據(jù)手冊(cè)。
_,Fwt (3)74373是電平控制鎖存器,它可使多個(gè)步進(jìn)電機(jī)共用一組數(shù)據(jù)總線。我們用P1.0~P1.7作為8個(gè)電機(jī)的鎖存信號(hào)輸出端,見(jiàn)表1。
8n~@Rj5 zi*D8!_C z
eIBB 這是一種基于總線分時(shí)復(fù)用的方式,以動(dòng)態(tài)掃描的方式來(lái)發(fā)送控制信號(hào),這和高級(jí)操作系統(tǒng)里的多任務(wù)進(jìn)程調(diào)度的思想一致。這種方法明顯的好處是節(jié)省I/O口,使系統(tǒng)可以控制更多的步進(jìn)電機(jī)。本電路設(shè)計(jì)為控制8個(gè)。
5Y9 j/wA 5+3Z?|b 3 程序設(shè)計(jì) `m'2RNSc+# 傳統(tǒng)的步進(jìn)電機(jī)驅(qū)動(dòng)程序利用簡(jiǎn)單的條件循環(huán)來(lái)發(fā)送脈沖序列,但當(dāng)電機(jī)數(shù)目發(fā)生變化時(shí),編程繁雜,冗余代碼較多,難以做到信號(hào)占空比一致,進(jìn)而產(chǎn)生“抖動(dòng)”現(xiàn)象。下面提出一種基于中斷服務(wù)方式,面向舞蹈動(dòng)作,可實(shí)時(shí)改變各個(gè)電機(jī)速度和方向(每200ms可改變一次)的程序設(shè)計(jì)方法。
JI\u -+BE 3.1 速度歸一化和線性關(guān)系
zO)9(%LS 我們將速度量化成一個(gè)-128~127內(nèi)可變的數(shù),正號(hào)代表正轉(zhuǎn),負(fù)號(hào)代表返轉(zhuǎn),稱之歸一化速度(-128~127為一個(gè)字節(jié))。給每個(gè)電機(jī)分配一個(gè)速度累加計(jì)數(shù)器speed_tickers(I=0,1,2…,7分別代表8個(gè)電機(jī)),初始值為0,每個(gè)中斷觸發(fā)周期內(nèi)給該累加計(jì)數(shù)器加上從舞步信息數(shù)組dancedata中讀取的速度值speeds,當(dāng)計(jì)數(shù)器值大于或等于預(yù)設(shè)的閾值MAX_SPEED_TICKER=600時(shí),則發(fā)送脈沖序列中的下一個(gè)(正轉(zhuǎn))或上一個(gè)(反轉(zhuǎn))給步進(jìn)電機(jī),這取決于速度的符號(hào)(參考3.2節(jié))。同時(shí),將該電機(jī)的累加計(jì)數(shù)器speed_tickers恢復(fù)為0。給出的速度值speed越大,則累加達(dá)到或超過(guò)閾值MAX_SPEED_TICKER的時(shí)間就越短,那么向步進(jìn)電機(jī)發(fā)送脈沖的頻率就越高,速度也就越快。
d G:=tf&1R 歸一化速度值設(shè)為num(-128~127),電機(jī)實(shí)際旋轉(zhuǎn)速度設(shè)為V,那么V和num之間滿足關(guān)系式:
9MM4