夏奇
(同濟(jì)大學(xué) 電信學(xué)院,上海 200092)
在交流伺服系統(tǒng)的使用過程中,需要將電機(jī)編碼器上的正交脈沖信號反饋給上位機(jī),以實現(xiàn)對電機(jī)的監(jiān)控,達(dá)到閉環(huán)控制的目的。一旦伺服電機(jī)的運(yùn)行發(fā)生錯誤,上位機(jī)能夠發(fā)出指令,讓電機(jī)停止運(yùn)轉(zhuǎn),避免造成大的損失。但是在編碼器脈沖信號的反饋過程中,如果脈沖的頻率過高,可能會導(dǎo)致脈沖信號無法接收,或者在傳輸過程中丟失,因此需要對編碼器的脈沖信號進(jìn)行分頻[1]。
正交脈沖信號的分頻與一般的信號分頻不同,正交脈沖信號包括A相和B相兩個信號,通過兩個信號的相對位置來表示脈沖信號的方向。在分頻過程中必須考慮正交脈沖的方向,不能簡單地通過對兩個信號的分頻達(dá)到對正交信號分頻的目的。特別是在脈沖方向切換的時候,孤立對待A相和B相信號的分頻方法,極易導(dǎo)致脈沖信號的丟失。
整數(shù)分頻的方法比較簡單,只需要通過一些數(shù)字電路的搭建,就可以實現(xiàn)。但是編碼器反饋正交脈沖信號的頻率與上位機(jī)所需要的脈沖頻率往往不成整數(shù)倍關(guān)系,這兩者的比例通常是一個不可整除的分?jǐn)?shù)。這時簡單的幾個數(shù)字器件的組合,無法滿足分頻設(shè)計的需要。采用CPLD器件實現(xiàn)分頻功能,不但電路體積大大縮小,而且可靠性大大提高了[2]。使用了Altera公司的一款CPLD芯片EPM1270來實現(xiàn)對電機(jī)編碼器正交脈沖信號的任意分?jǐn)?shù)分頻。
分?jǐn)?shù)分頻的實現(xiàn)方法有很多種,但是其基本原理都是一樣的,就是在若干個分頻周期中,使用某種方法,使某幾個周期多計或少計一個數(shù)[3],使整個分頻過程平均下來得到一個分?jǐn)?shù)分頻比例。下面介紹的就是其中一種方法。
假設(shè)要進(jìn)行分頻比為K的分?jǐn)?shù)分頻,K可表示為:
式中N、M為正整數(shù),N>M。N可以認(rèn)為是輸入的脈沖數(shù),M則是輸出的脈沖數(shù)。分頻器每接收到N個脈沖,就輸出M個脈沖,N個脈沖其實就是分頻器的一個分頻周期。
設(shè)置一個M倍頻的累加器,N為累加器的模。分頻器每接收到一個脈沖,M倍頻累加器就加M。當(dāng)累加值大于或者等于它的模N時,分頻器輸出一個脈沖,累加值減去N后,得到一個余數(shù)。下一個脈沖來的時候,在余數(shù)的基礎(chǔ)上繼續(xù)累加。當(dāng)接收到N個脈沖時,剛好輸出M個脈沖。
以接收N個脈沖,輸出M個脈沖為一個周期。無數(shù)個周期疊加,在整個時間周期內(nèi),可以得到一個總體上均勻,頻率固定的分?jǐn)?shù)分頻結(jié)果。
以K=5/3為例,分頻過程如表1所示。
表1 K=5/3的分頻過程Tab.1 the procedure of an example K=5/3 frequency division
如表1所示[3],當(dāng)分頻器接收到第一個脈沖時,累加值為3,小于5,不輸出脈沖;接收到第二個脈沖時,累加值為6,減去5,得到余數(shù)1,輸出一個脈沖;接收到第三個脈沖時,在余數(shù)1的基礎(chǔ)上累加,得到累加值4,不輸出;接收到第四個脈沖時,累加值為7,減去5,輸出第二個脈沖;接收到第五個脈沖時,累加值為5,輸出第三個脈沖,余數(shù)為0。
這是一個完整的分頻周期,很好地完成了一個計數(shù)循環(huán)。最后余數(shù)等于0,表明不會有誤差累積。
正交脈沖的計數(shù)、方向鑒別,以及正交脈沖的生成,都需要了解正交脈沖的特性。正交脈沖由相位相差90°的兩相脈沖信號(A相和B相)組成。
如圖1所示,當(dāng)正交脈沖方向為正向時,A相超前B相四分之一個周期,A相和B相的狀態(tài)變化順序依次為00、10、11、01、00,不斷循環(huán);反之,當(dāng)方向為負(fù)向時,B 相超前 A 相四分之一個周期,A相和B相的狀態(tài)變化順序依次為00、01、11、10、00,不斷循環(huán)[4]。
圖1 正交脈沖特性示意圖Fig.1 The diagram of orthogonal pulses
正交脈沖每一次狀態(tài)的變化都代表一個脈沖,變化的順序代表脈沖的方向。
伺服系統(tǒng)正交脈沖信號的分?jǐn)?shù)分頻功能在CPLD中可以利用下面3個模塊實現(xiàn),如圖2所示。
脈沖接收模塊用于掃描外部輸入脈沖,針對伺服系統(tǒng)經(jīng)常出現(xiàn)中的AB相正交脈沖,實現(xiàn)對正交脈沖的計數(shù)和方向鑒別。
圖2 分頻模塊結(jié)構(gòu)圖Fig.2 The structural chart of frequency division module
算法模塊根據(jù)之前提到的分?jǐn)?shù)分頻原理,對脈沖進(jìn)行分頻,分頻比通過外部總線寫入。由于分頻的對象是正交脈沖,要考慮脈沖的方向性,分頻的算法與之前介紹的略有不同。當(dāng)脈沖為正向時,M倍頻累加器累加,大于或者等于N時,減去N,輸出一個脈沖,方向標(biāo)志為正;當(dāng)脈沖為負(fù)向時,需要進(jìn)行M倍頻累減,當(dāng)累計值小于或者等于-N時,累計值加上N,輸出一個脈沖,方向標(biāo)志為負(fù)。這樣的處理方法還能有效彌補(bǔ)脈沖方向翻轉(zhuǎn)時產(chǎn)生的誤差。
正交脈沖輸出模塊就是要將算法模塊輸出的脈沖和它的方向轉(zhuǎn)化成正交脈沖輸出。
CPLD分頻器算法模塊的描述程序如下:
If(Rstn='0')then
count:=0;
countrem:=0;
direction_out<="00";
else
if(clk='1'and clk'event)then
if(direction="01")then
count:=count+M+countrem;
countrem:=0;
elsif(direction="10")then
count:=count-M+countrem;
countrem:=0;
end if;
if(count>=N)then
direction_out<="01";
countrem:=count-N;
count:=0;
elsif(count<=-N)then
direction_out<="10";
countrem:=count+N;
count:=0;
else
direction_out<="00";
end if;
end if;
end if;
程序是用VHDL硬件描述語言編寫的,使用自頂而下的設(shè)計方法,易于模塊劃分和復(fù)用,移植性強(qiáng),通用性好[5]。分頻比K=N/M中N與M的值可以直接在程序內(nèi)部設(shè)定,也可以由DSP通過數(shù)據(jù)總線給出[6]。
以K=5/3為例,采用分?jǐn)?shù)分頻對正交脈沖分頻的仿真波形如下。
正交脈沖以沿的一個變化計為一個脈沖,如圖3所示,當(dāng)輸入正交脈沖A和B總計有5個沿的變化時,輸出正交脈沖剛好有3個沿的變化。輸出脈沖數(shù)量符合要求,沒有丟失。
正交脈沖的相對相位代表脈沖的方向。如圖4所示,當(dāng)輸入正交脈沖方向發(fā)生變化時,輸出正交脈沖的方向也隨之變化[7]。輸入的脈沖數(shù)量和輸出的脈沖數(shù)量也成比例為K的比例關(guān)系。
圖3 正交脈沖K=5/3的分頻仿真波形圖Fig.3 Simulation waves of 5/3 frequency division
圖4 正交脈沖方向切換時的分頻仿真波形圖Fig.4 Simulation waves of frequency division when reversing
制作一個測試工裝,測試分頻過程中脈沖是否丟失。使用脈沖發(fā)生器發(fā)送頻率為f1的正交脈沖n1個,然后切換脈沖方向,發(fā)送反向的正交脈沖n2個。將已設(shè)置分頻比K=N/M的伺服驅(qū)動器A設(shè)定為位置模式接收脈沖,控制電機(jī)轉(zhuǎn)動,并通過控制面板將接收到的脈沖數(shù)n顯示出來。電機(jī)編碼器反饋的脈沖經(jīng)過A中的分頻器,輸出到伺服驅(qū)動器B。 B中DSP的QEP模塊統(tǒng)計接收到的正交脈沖數(shù)量m,并通過控制面板顯示。
表2 分頻測試數(shù)據(jù)(K=7/3)Tab.2 the test data of frequency division when K=7/3
由于輸入脈沖的數(shù)量n,不一定能被分頻比K整除,分頻后得到的脈沖數(shù)量m與理論值n/K可能存在小于一個脈沖的誤差。在后續(xù)電機(jī)編碼器增量計算中,誤差會被計入,從而消除前次誤差的積累,保證了積累誤差也小于一個脈沖。因此,如果n與m之間的關(guān)系符合下列不等式,即認(rèn)為分頻的結(jié)果正確。
如表2所示,測試得到的實驗數(shù)據(jù)經(jīng)過驗算,都滿足不等式(1),可以判斷脈沖沒有丟失。
伺服系統(tǒng)控制中,需要對編碼器反饋的正交脈沖信號進(jìn)行任意分?jǐn)?shù)分頻處理。為實現(xiàn)正交脈沖的分?jǐn)?shù)分頻,本文首先研究了分?jǐn)?shù)分頻的原理,舉例分析了如何實現(xiàn)分?jǐn)?shù)分頻。然后,在了解了正交脈沖特性的基礎(chǔ)上,利用VHDL語言設(shè)計了CPLD分頻電路。最后,通過仿真和實驗測試,驗證了分頻結(jié)果的正確性。由于分頻的實驗測試完全模擬了伺服系統(tǒng)中分頻模塊的實際使用過程,證明了分頻器在伺服系統(tǒng)中應(yīng)用的可行性,有較強(qiáng)的工程應(yīng)用價值。
[1]楊明,劉可述,牛里,等.基于CPLD的光電碼盤正交脈沖任意小數(shù)分頻研究[J].微電機(jī),2013,46(1):13-16.YANG Ming,LIU Ke-shu,NIU Li,et al.Arbitrary decimal frequency division of optical encoder quadrate pulses based on CPLD[J].Micromotors,2013,46(1):13-16.
[2]潘明,龔然禮.分頻器的FPGA實現(xiàn)[J].計算技術(shù)與自動化,2003,22(3):26-29.PAN Ming,GONG Ran-li.The FPGA realization of the broken number frequency divider based on swallowing pulse technique[J].Computing Technology and Automation,2003,22(3):26-29.
[3]劉亞海,林爭輝.基于FPGA的小數(shù)分頻器的實現(xiàn)[J].現(xiàn)代電子技術(shù),2005,194(3):113-117.LIU Ya-hai,LIN Zheng-hui.Realization of Decimal frequency divider based on FPGA[J].Modern Electronics Technique,2005,194(3):113-117.
[4]廖保華,鄭紹春,趙凱.正交脈沖信號發(fā)生器的設(shè)計[J].儀表技術(shù),2007(11):25-27.LIAO Bao-hua,ZHENG Shao-chun,ZHAO Kai.Design of quadrate pulse signal generator[J].Instrumentation Technology,2007(11):25-27.
[5]吳繼華,王誠,范麗珍,等.Altera FPGA/CPLD設(shè)計(基礎(chǔ)篇)[M].北京:人民郵電出版社,2005.
[6]全婕,尹泉.光電碼盤正交脈沖的任意小數(shù)分頻實現(xiàn)[J].伺服控制,2008(9):58-60.QUAN Jie,YIN Quan.Arbitrary decimal frequency division of optical encoder quadrate pulses[J].Servo Control,2008(9):58-60.
[7]張偉,陳鋒,馬軍強(qiáng),等.軌/姿控發(fā)動機(jī)脈沖后效沖量快速算法的研究及應(yīng)用[J].火箭推進(jìn),2012(1):51-56.ZHANG Wei,CHEN Feng,MA Jun-qiang,et al.Research and application of fast algorithm for pulse residual impulse of divert and attitude control engine [J].Journal of Rocket Propulsion,2012(1):51-56.