張 濱,杜啟亮,田聯(lián)房
(華南理工大學(xué),廣東廣州510641)
步進(jìn)電動(dòng)機(jī)由于具有運(yùn)動(dòng)精確、易于控制、起??臁⑦B續(xù)運(yùn)行無(wú)累積誤差和能夠接收數(shù)字信號(hào)等特點(diǎn),被廣泛應(yīng)用于數(shù)控機(jī)床、自動(dòng)化儀表、機(jī)器人等控制系統(tǒng)中。其中,步進(jìn)電動(dòng)機(jī)常用于快速精確定位系統(tǒng)中,但在啟動(dòng)和停止的過(guò)程中,若步進(jìn)脈沖變化太快,轉(zhuǎn)子會(huì)由于慣性過(guò)大產(chǎn)生起停失步和起停沖擊大等問(wèn)題,因此對(duì)步進(jìn)電動(dòng)機(jī)起停階段的加速度進(jìn)行規(guī)劃,產(chǎn)生合理的步進(jìn)電動(dòng)機(jī)驅(qū)動(dòng)頻率以減少?zèng)_擊具有很強(qiáng)的實(shí)際意義。
目前國(guó)內(nèi)外關(guān)于步進(jìn)電動(dòng)機(jī)加減速控制的算法主要有三種[1]:(1)梯形曲線算法。(2)指數(shù)曲線算法。(3)拋物線算法。三種算法各有各自的特點(diǎn),適合不同的應(yīng)用場(chǎng)合。利用FPGA設(shè)計(jì)控制器不僅可以簡(jiǎn)化設(shè)計(jì)過(guò)程,而且可以降低整個(gè)系統(tǒng)的成本和體積,提高系統(tǒng)的可靠性。本文針對(duì)二相雙四拍步進(jìn)電動(dòng)機(jī),按照模塊化的設(shè)計(jì)思想,設(shè)計(jì)了系統(tǒng)各模塊,為了便于拋物線算法的硬件實(shí)現(xiàn),本文將此算法做了適當(dāng)?shù)男薷模⒃趩纹珹ltera颶風(fēng)一代FPGA中完成了各模塊的設(shè)計(jì)與布局布線,完成了控制系統(tǒng)的整體調(diào)試,實(shí)現(xiàn)了步進(jìn)電動(dòng)機(jī)的加減速控制系統(tǒng)的設(shè)計(jì)。
應(yīng)用于步進(jìn)電動(dòng)機(jī)的加速度控制算法是以速度曲線的形狀命名的,主要的控制算法包括梯形算法、指數(shù)算法和拋物線算法。梯形算法包括加速度正恒定階段、加速度零階段和加速度負(fù)恒定階段。此方法計(jì)算簡(jiǎn)單,節(jié)省資源,但是三個(gè)階段不能光滑過(guò)渡,這會(huì)對(duì)電機(jī)的運(yùn)行質(zhì)量和機(jī)械結(jié)構(gòu)造成不利的影響。如圖1所示。指數(shù)算法的加速度表現(xiàn)為指數(shù)特征。此算法適合系統(tǒng)的固有規(guī)律,適合對(duì)加減速要求較高的場(chǎng)合。如圖2所示。


拋物線算法包括加加速運(yùn)動(dòng)階段、加速運(yùn)動(dòng)階段、減加速運(yùn)動(dòng)階段、勻速運(yùn)動(dòng)階段、加減速運(yùn)動(dòng)階段、減速運(yùn)動(dòng)階段和減減速運(yùn)動(dòng)階段[2]。如圖3所示。由此可以看出加速度能夠平穩(wěn)地過(guò)渡,能夠平穩(wěn)地實(shí)現(xiàn)加速和減速。

圖3 拋物線算法
此算法的變加速度隨時(shí)間的變化規(guī)律如下:

加速度相對(duì)時(shí)間的變化規(guī)律:

對(duì)加速度進(jìn)行積分,即可得到相應(yīng)的速度相對(duì)時(shí)間的變化規(guī)律:

再對(duì)速度進(jìn)行積分,即可得到位移相對(duì)時(shí)間的變化規(guī)律。作為加減速控制系統(tǒng),接收的是步進(jìn)電動(dòng)機(jī)最終的位移,輸出的是步進(jìn)電動(dòng)機(jī)驅(qū)動(dòng)芯片的邏輯脈沖,也就是位移隨時(shí)間的變化規(guī)律。但是不同位移要完全都轉(zhuǎn)換成上述七個(gè)加減速階段,必須要經(jīng)過(guò)復(fù)雜的數(shù)學(xué)運(yùn)算和邏輯推理,此部分如果在FPGA中實(shí)現(xiàn),需要的代價(jià)是非常大的。
因此,本文假設(shè)[0,t3]和[t4,t7]是固定步進(jìn)數(shù)的調(diào)整階段,大多數(shù)情況下步進(jìn)電動(dòng)機(jī)都要經(jīng)過(guò)這兩個(gè)階段的調(diào)整,只是勻速階段的步進(jìn)數(shù)不同而已(即圖3中的時(shí)間段[t3,t4]不同)。但對(duì)于總步進(jìn)數(shù)小于調(diào)整階段步進(jìn)數(shù)的情況,則需省去中間的某些運(yùn)行階段,由此可得以下四種情況:(1)無(wú)勻速運(yùn)行階段,即去掉圖3的[t3,t4]時(shí)間段,如圖4(a)所示;(2)無(wú)勻速運(yùn)行階段,僅運(yùn)行部分減加速運(yùn)動(dòng)階段和部分加減速運(yùn)動(dòng)階段,即去掉全部的[t3,t4]時(shí)間段,部分[t2,t3]時(shí)間段和部分[t4,t5]時(shí)間段,如圖4(b)所示;(3)無(wú)勻速運(yùn)行階段,無(wú)減加速運(yùn)行階段和加減速運(yùn)行階段,即省去全部的[t2,t3]、[t3,t4]和[t5,t6]時(shí)間段,如圖 4(c)所示;(4)僅有加加速運(yùn)行階段和減減速運(yùn)行階段,如圖4(d)所示。

圖4 其他調(diào)整曲線
整體控制結(jié)構(gòu)包括SPI通訊模塊、步進(jìn)計(jì)數(shù)模塊、地址產(chǎn)生模塊、ROM模塊、脈沖計(jì)數(shù)模塊和步進(jìn)邏輯發(fā)生模塊。SPI通訊模塊解析通訊協(xié)議以完成通訊數(shù)據(jù)的傳送。步進(jìn)計(jì)數(shù)模塊對(duì)步進(jìn)電動(dòng)機(jī)的步進(jìn)數(shù)實(shí)時(shí)統(tǒng)計(jì)。數(shù)據(jù)存儲(chǔ)模塊存儲(chǔ)步進(jìn)電動(dòng)機(jī)每個(gè)步進(jìn)所需要的時(shí)間間隔。脈沖計(jì)數(shù)模塊則具體對(duì)系統(tǒng)頻率進(jìn)行計(jì)數(shù),計(jì)數(shù)結(jié)束后產(chǎn)生信號(hào)以驅(qū)動(dòng)步進(jìn)邏輯發(fā)生模塊。步進(jìn)邏輯發(fā)生模塊產(chǎn)生步進(jìn)電動(dòng)機(jī)驅(qū)動(dòng)芯片所需要的驅(qū)動(dòng)邏輯。各部分之間的關(guān)系如圖6所示。

圖5 整體控制框圖
此模塊解析SPI通訊協(xié)議,控制單元在spi_cs為低電平時(shí),在spi_clk的上升沿對(duì)spi_data信號(hào)進(jìn)行采樣,采集過(guò)程中將數(shù)據(jù)放入臨時(shí)寄存器,結(jié)束之后再將數(shù)據(jù)存入指定的寄存器中。此模塊設(shè)計(jì)兩個(gè)寄存器的目的是存取前后兩次步進(jìn)電動(dòng)機(jī)的目標(biāo)位移,這樣此系統(tǒng)接收的是步進(jìn)電動(dòng)機(jī)的最終位移而不是相對(duì)位移。此控制系統(tǒng)設(shè)計(jì)的寄存器位寬為16位,即可以存取0~65 535之間的數(shù)據(jù),能夠滿足一般系統(tǒng)的要求。控制框圖如圖6所示。
此模塊接收SPI通訊模塊發(fā)送的數(shù)據(jù),根據(jù)接收到的數(shù)據(jù)計(jì)算出要行走的步進(jìn)數(shù)。因?yàn)樵诩訙p速的過(guò)程中,步進(jìn)間隔是不同的,所以此模塊需要脈沖計(jì)數(shù)模塊的計(jì)數(shù)滿信號(hào)作為反饋信號(hào)。另外值得注意的是SPI通訊模塊和步進(jìn)計(jì)數(shù)模塊屬于不同時(shí)鐘域,為了避免亞穩(wěn)態(tài)產(chǎn)生,此處采用雙跳技術(shù)[3]來(lái)解決此問(wèn)題。此模塊框圖如圖7所示。

圖7 步進(jìn)計(jì)數(shù)模塊框圖
此模塊要根據(jù)步進(jìn)絕對(duì)值和當(dāng)前步進(jìn)電動(dòng)機(jī)的計(jì)數(shù)值產(chǎn)生ROM地址。如果實(shí)際的步進(jìn)數(shù)大于加減速調(diào)整階段的步進(jìn)數(shù),則會(huì)存在加速度為零、速度不變的時(shí)刻,那么在此階段每一步的步進(jìn)間隔是相同的,ROM中的數(shù)據(jù)也是相同的,所以在ADDR就不會(huì)發(fā)生變化。如果實(shí)際的步進(jìn)數(shù)小于加減速調(diào)整階段的步進(jìn)數(shù),則根據(jù)大小省去中間的運(yùn)行階段,由此可得addr的變化符合以下規(guī)律。

圖8 addr變化規(guī)律
此模塊存儲(chǔ)的是每一步的時(shí)間間隔,對(duì)應(yīng)的是時(shí)間對(duì)位移的關(guān)系。此處我們?cè)O(shè)定標(biāo)準(zhǔn)的七段拋物線的時(shí)間段是相同的,加速與減速階段是對(duì)稱的,則ROM存儲(chǔ)的時(shí)間間隔也是對(duì)稱的,因此此處只需要計(jì)算其中一段即可。根據(jù)式(3),積分可得到時(shí)間對(duì)位移的關(guān)系,由于步進(jìn)電動(dòng)機(jī)的每一步都是相同的,所以我們需要根據(jù)上述關(guān)系得到相同位移下的時(shí)間間隔。首先假設(shè)步進(jìn)電動(dòng)機(jī)的步進(jìn)距離為Δs,則從零開始依次計(jì)算出每個(gè)步進(jìn)距離所需要的時(shí)間Δt1,Δt2,…,Δtn,再根據(jù)相鄰兩個(gè) ROM 中的數(shù)據(jù)是對(duì)應(yīng)成比例的,即:

同時(shí),ROM中的數(shù)據(jù)對(duì)應(yīng)著步進(jìn)時(shí)間,即:

這樣如果我們已知?jiǎng)蛩贂r(shí)每個(gè)步進(jìn)所需要的時(shí)間ΔTn和系統(tǒng)頻率 f,由式(5)可得 Xn,再根據(jù)式(4)和 Δt1,Δt2,…,Δtn,即可得到 X1,X2,…,Xn-1。
此模塊根據(jù)對(duì)ROM發(fā)送的數(shù)據(jù)進(jìn)行計(jì)數(shù),如果計(jì)數(shù)結(jié)束,則表示步進(jìn)電動(dòng)機(jī)需要行進(jìn)一步,同時(shí)發(fā)出計(jì)數(shù)滿信號(hào)以指示其他模塊。
本文電機(jī)的控制方式為二相雙四拍。步進(jìn)電動(dòng)機(jī)的兩相繞組為:A(+)、B(-)、C(+)、D(-),AB為一相,CD為一相。驅(qū)動(dòng)方式為AC-BC-BDAD。選擇 TI的步進(jìn)電動(dòng)機(jī)驅(qū)動(dòng)芯片DRV8833[4],此芯片包括兩個(gè)H橋,每個(gè)H橋控制一相,如果AB相連接第一個(gè)橋,CD橋連接第二個(gè)橋,且每個(gè)H橋輸入與輸出之間的對(duì)應(yīng)關(guān)系如表1所示。則可以得到H橋的輸入(AIN1 AIN2 BIN1 BIN2)為:1010、0110、0101、1001。另外當(dāng)電機(jī)處于空閑狀態(tài)時(shí),設(shè)置輸入為1111,使電機(jī)處于剎車狀態(tài)。

表1 H橋邏輯表
所以步進(jìn)電動(dòng)機(jī)邏輯發(fā)生模塊在電機(jī)正轉(zhuǎn)時(shí),輸出為1010-0110-0101-1001-1010-…;電機(jī)反轉(zhuǎn)時(shí),輸出為1010-1001-0101-0110-1010-…??臻e時(shí)輸出1111。
由仿真圖可以看出,系統(tǒng)復(fù)位之后,F(xiàn)PGA通過(guò)SPI通訊模塊接收到十六進(jìn)制數(shù)據(jù)0X50,并且存儲(chǔ)在spi_Y2寄存器中。接收結(jié)束之后,步進(jìn)計(jì)數(shù)模塊中的motor_cnt寄存器開始對(duì)步進(jìn)電動(dòng)機(jī)進(jìn)行計(jì)數(shù),地址產(chǎn)生模塊根據(jù)motor_cnt和abs_value產(chǎn)生相應(yīng)的地址,此地址連接 ROM,最后脈沖計(jì)數(shù)模塊對(duì)ROM發(fā)送的數(shù)據(jù)進(jìn)行計(jì)數(shù),計(jì)數(shù)結(jié)束之后產(chǎn)生計(jì)數(shù)滿信號(hào),最后驅(qū)動(dòng)步進(jìn)邏輯發(fā)生模塊及其他模塊。從stepdrive可以看出,系統(tǒng)空閑時(shí)產(chǎn)生1111,系統(tǒng)工作時(shí)產(chǎn)生1010-0110-0101-1001-1010-…。同時(shí)每一步的時(shí)間間隔是由脈沖計(jì)數(shù)模塊對(duì)ROM中的數(shù)據(jù)計(jì)數(shù)得到的,從大變小變化,表明步進(jìn)電動(dòng)機(jī)的速度在變快。
經(jīng)過(guò)若干步之后,addr的數(shù)據(jù)不再發(fā)生變化,這屬于前面提到的地址產(chǎn)生模塊的第一種情況,即步進(jìn)電動(dòng)機(jī)進(jìn)入勻速運(yùn)行階段。
最后步進(jìn)電動(dòng)機(jī)在接近步進(jìn)終點(diǎn)時(shí),步進(jìn)時(shí)間間隔逐漸變大,即步進(jìn)電動(dòng)機(jī)速度逐漸變小,最后停止。第一次運(yùn)行結(jié)束之后,F(xiàn)PGA通過(guò)SPI通訊接口重新接收到新的數(shù)據(jù)0X40,并且存儲(chǔ)在spi_Y2寄存器中,同時(shí)將以前的數(shù)據(jù)存儲(chǔ)在spi_Y1寄存器中。由于系統(tǒng)采用的是絕對(duì)計(jì)數(shù)方式,所以在接收結(jié)束之后,abs_value變?yōu)?X10,dir信號(hào)變?yōu)榈碗娖?,表示方向?yàn)樨?fù),同時(shí)stepdrive產(chǎn)生1010-1001-0101-0110-1010-…。


經(jīng)過(guò)若干步之后,addr的數(shù)據(jù)由0X0008突變?yōu)?X0038,這屬于前面提到的地址產(chǎn)生模塊的第二種情況,即步進(jìn)數(shù)較小,運(yùn)行過(guò)程中無(wú)中間調(diào)整階段。
圖11為示波器測(cè)量結(jié)果,由圖可以看出FPGA依次輸出1111-1010-0110-0101-1001-1010-…,表示驅(qū)動(dòng)邏輯為電機(jī)正轉(zhuǎn),并且周期遞減,表示電機(jī)正處于加速運(yùn)行階段。

圖11 示波器測(cè)量結(jié)果
基于FPGA的步進(jìn)電動(dòng)機(jī)控制系統(tǒng)能夠?qū)崿F(xiàn)標(biāo)準(zhǔn)的拋物線加減速算法和修改后的加減速算法。實(shí)現(xiàn)了對(duì)步進(jìn)電動(dòng)機(jī)起動(dòng)和停止階段的加減速控制,有效避免了步進(jìn)電動(dòng)機(jī)由于慣性產(chǎn)生的起停失步和起停沖擊大等問(wèn)題,大大提高了步進(jìn)電動(dòng)機(jī)的運(yùn)行性能。
[1] 王玉琳,王強(qiáng).步進(jìn)電機(jī)的速度調(diào)節(jié)方法[J].電機(jī)與控制應(yīng)用,2006,33(1):53-64.
[2] 王勇,王偉,楊文濤.步進(jìn)電機(jī)升降速曲線控制系統(tǒng)設(shè)計(jì)及其應(yīng)用[J].控制工程,2008,15(5):576-579.
[3] Steve Kilts.高級(jí)FPGA設(shè)計(jì):結(jié)構(gòu)、實(shí)現(xiàn)和優(yōu)化[M].北京:機(jī)械工業(yè)出版社,2009.68-70.