其中,[x]代表不超過x的最大整數(shù)。
(3)V0是一個速度常數(shù),即當(dāng)歸一化速度值num=120的時候?qū)?yīng)的電機(jī)實(shí)際速度。
(4)num和速度V近似線性關(guān)系,V∝num。正是因?yàn)橛辛诉@種函數(shù)關(guān)系,我們在舞蹈動作控制中,可以輕松實(shí)現(xiàn)速度在
大范圍內(nèi)變化。
3.2 速度正負(fù)實(shí)現(xiàn)方式
(1)在程序中,數(shù)組steps[8]用于存放步進(jìn)電機(jī)的脈沖序列。

(2)設(shè)置指針cur_step[8]指向8個電機(jī)當(dāng)前處在脈沖序列step[8]中的位置。
易知:0<=step[i]<=7,其中,i分別代表8個電機(jī)。
(3)設(shè)置指針移動變量delta=0。delta=1,指針向后移動一步,電機(jī)正轉(zhuǎn);delta=-1,指針向前移動一步,電機(jī)反轉(zhuǎn);delta=0,指針不移動,電機(jī)不發(fā)生轉(zhuǎn)動。
3.3 程序具體步驟
3.3.1初始化計(jì)時器InitTimer,然后空循環(huán),進(jìn)入等中斷階段。
3.3.2 中斷觸發(fā)后,程序進(jìn)入服務(wù)程序。
(1)執(zhí)行函數(shù)SetAllSpeeds,函數(shù)根據(jù)提供的速度值speed[i]依次判斷是否給各個電機(jī)發(fā)送脈沖,實(shí)現(xiàn)電機(jī)以特定的速度和方向旋轉(zhuǎn)。SetAllSpeeds具體算法流程見圖3。
(2)從定義的數(shù)組dancedata中讀取新的速度信息,每200ms一次。
(3)將系統(tǒng)在調(diào)用中斷處理函數(shù)時關(guān)閉的計(jì)時器重新打開InitTimer。
(4)中斷處理函數(shù)結(jié)束返回。
注意:第一,(1)和(2)不可交換,這是為了保證步進(jìn)電機(jī)每步延時的均勻性;第二,內(nèi)部中斷間隔時間1ms內(nèi),8051是否能夠?qū)⒅袛喾⻊?wù)程序中所有的代碼執(zhí)行完全?答案是肯定的。參考圖4,我們對整個中斷服務(wù)程序進(jìn)行了統(tǒng)計(jì),它所要執(zhí)行的指令數(shù)在200~300之間變化,時鐘間隔設(shè)置為1ms,選用12MHz晶振,執(zhí)行這些指令需要耗時約500~600μs<1ms,因此,中斷處理完全可以在一個計(jì)時器周期內(nèi)執(zhí)行完畢。





