夏奇
(同濟大學 電信學院,上海 200092)
在交流伺服系統的使用過程中,需要將電機編碼器上的正交脈沖信號反饋給上位機,以實現對電機的監控,達到閉環控制的目的。一旦伺服電機的運行發生錯誤,上位機能夠發出指令,讓電機停止運轉,避免造成大的損失。但是在編碼器脈沖信號的反饋過程中,如果脈沖的頻率過高,可能會導致脈沖信號無法接收,或者在傳輸過程中丟失,因此需要對編碼器的脈沖信號進行分頻[1]。
正交脈沖信號的分頻與一般的信號分頻不同,正交脈沖信號包括A相和B相兩個信號,通過兩個信號的相對位置來表示脈沖信號的方向。在分頻過程中必須考慮正交脈沖的方向,不能簡單地通過對兩個信號的分頻達到對正交信號分頻的目的。特別是在脈沖方向切換的時候,孤立對待A相和B相信號的分頻方法,極易導致脈沖信號的丟失。
整數分頻的方法比較簡單,只需要通過一些數字電路的搭建,就可以實現。但是編碼器反饋正交脈沖信號的頻率與上位機所需要的脈沖頻率往往不成整數倍關系,這兩者的比例通常是一個不可整除的分數。這時簡單的幾個數字器件的組合,無法滿足分頻設計的需要。采用CPLD器件實現分頻功能,不但電路體積大大縮小,而且可靠性大大提高了[2]。使用了Altera公司的一款CPLD芯片EPM1270來實現對電機編碼器正交脈沖信號的任意分數分頻。
分數分頻的實現方法有很多種,但是其基本原理都是一樣的,就是在若干個分頻周期中,使用某種方法,使某幾個周期多計或少計一個數[3],使整個分頻過程平均下來得到一個分數分頻比例。下面介紹的就是其中一種方法。
假設要進行分頻比為K的分數分頻,K可表示為:

式中N、M為正整數,N>M。N可以認為是輸入的脈沖數,M則是輸出的脈沖數。分頻器每接收到N個脈沖,就輸出M個脈沖,N個脈沖其實就是分頻器的一個分頻周期。
設置一個M倍頻的累加器,N為累加器的模。分頻器每接收到一個脈沖,M倍頻累加器就加M。當累加值大于或者等于它的模N時,分頻器輸出一個脈沖,累加值減去N后,得到一個余數。下一個脈沖來的時候,在余數的基礎上繼續累加。當接收到N個脈沖時,剛好輸出M個脈沖。
以接收N個脈沖,輸出M個脈沖為一個周期。無數個周期疊加,在整個時間周期內,可以得到一個總體上均勻,頻率固定的分數分頻結果。
以K=5/3為例,分頻過程如表1所示。

表1 K=5/3的分頻過程Tab.1 the procedure of an example K=5/3 frequency division
如表1所示[3],當分頻器接收到第一個脈沖時,累加值為3,小于5,不輸出脈沖;接收到第二個脈沖時,累加值為6,減去5,得到余數1,輸出一個脈沖;接收到第三個脈沖時,在余數1的基礎上累加,得到累加值4,不輸出;接收到第四個脈沖時,累加值為7,減去5,輸出第二個脈沖;接收到第五個脈沖時,累加值為5,輸出第三個脈沖,余數為0。
這是一個完整的分頻周期,很好地完成了一個計數循環。最后余數等于0,表明不會有誤差累積。
正交脈沖的計數、方向鑒別,以及正交脈沖的生成,都需要了解正交脈沖的特性。正交脈沖由相位相差90°的兩相脈沖信號(A相和B相)組成。
如圖1所示,當正交脈沖方向為正向時,A相超前B相四分之一個周期,A相和B相的狀態變化順序依次為00、10、11、01、00,不斷循環;反之,當方向為負向時,B 相超前 A 相四分之一個周期,A相和B相的狀態變化順序依次為00、01、11、10、00,不斷循環[4]。

圖1 正交脈沖特性示意圖Fig.1 The diagram of orthogonal pulses
正交脈沖每一次狀態的變化都代表一個脈沖,變化的順序代表脈沖的方向。
伺服系統正交脈沖信號的分數分頻功能在CPLD中可以利用下面3個模塊實現,如圖2所示。
脈沖接收模塊用于掃描外部輸入脈沖,針對伺服系統經常出現中的AB相正交脈沖,實現對正交脈沖的計數和方向鑒別。

圖2 分頻模塊結構圖Fig.2 The structural chart of frequency division module
算法模塊根據之前提到的分數分頻原理,對脈沖進行分頻,分頻比通過外部總線寫入。由于分頻的對象是正交脈沖,要考慮脈沖的方向性,分頻的算法與之前介紹的略有不同。當脈沖為正向時,M倍頻累加器累加,大于或者等于N時,減去N,輸出一個脈沖,方向標志為正;當脈沖為負向時,需要進行M倍頻累減,當累計值小于或者等于-N時,累計值加上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硬件描述語言編寫的,使用自頂而下的設計方法,易于模塊劃分和復用,移植性強,通用性好[5]。分頻比K=N/M中N與M的值可以直接在程序內部設定,也可以由DSP通過數據總線給出[6]。
以K=5/3為例,采用分數分頻對正交脈沖分頻的仿真波形如下。
正交脈沖以沿的一個變化計為一個脈沖,如圖3所示,當輸入正交脈沖A和B總計有5個沿的變化時,輸出正交脈沖剛好有3個沿的變化。輸出脈沖數量符合要求,沒有丟失。
正交脈沖的相對相位代表脈沖的方向。如圖4所示,當輸入正交脈沖方向發生變化時,輸出正交脈沖的方向也隨之變化[7]。輸入的脈沖數量和輸出的脈沖數量也成比例為K的比例關系。

圖3 正交脈沖K=5/3的分頻仿真波形圖Fig.3 Simulation waves of 5/3 frequency division

圖4 正交脈沖方向切換時的分頻仿真波形圖Fig.4 Simulation waves of frequency division when reversing
制作一個測試工裝,測試分頻過程中脈沖是否丟失。使用脈沖發生器發送頻率為f1的正交脈沖n1個,然后切換脈沖方向,發送反向的正交脈沖n2個。將已設置分頻比K=N/M的伺服驅動器A設定為位置模式接收脈沖,控制電機轉動,并通過控制面板將接收到的脈沖數n顯示出來。電機編碼器反饋的脈沖經過A中的分頻器,輸出到伺服驅動器B。 B中DSP的QEP模塊統計接收到的正交脈沖數量m,并通過控制面板顯示。

表2 分頻測試數據(K=7/3)Tab.2 the test data of frequency division when K=7/3
由于輸入脈沖的數量n,不一定能被分頻比K整除,分頻后得到的脈沖數量m與理論值n/K可能存在小于一個脈沖的誤差。在后續電機編碼器增量計算中,誤差會被計入,從而消除前次誤差的積累,保證了積累誤差也小于一個脈沖。因此,如果n與m之間的關系符合下列不等式,即認為分頻的結果正確。

如表2所示,測試得到的實驗數據經過驗算,都滿足不等式(1),可以判斷脈沖沒有丟失。
伺服系統控制中,需要對編碼器反饋的正交脈沖信號進行任意分數分頻處理。為實現正交脈沖的分數分頻,本文首先研究了分數分頻的原理,舉例分析了如何實現分數分頻。然后,在了解了正交脈沖特性的基礎上,利用VHDL語言設計了CPLD分頻電路。最后,通過仿真和實驗測試,驗證了分頻結果的正確性。由于分頻的實驗測試完全模擬了伺服系統中分頻模塊的實際使用過程,證明了分頻器在伺服系統中應用的可行性,有較強的工程應用價值。
[1]楊明,劉可述,牛里,等.基于CPLD的光電碼盤正交脈沖任意小數分頻研究[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實現[J].計算技術與自動化,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的小數分頻器的實現[J].現代電子技術,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]廖保華,鄭紹春,趙凱.正交脈沖信號發生器的設計[J].儀表技術,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設計(基礎篇)[M].北京:人民郵電出版社,2005.
[6]全婕,尹泉.光電碼盤正交脈沖的任意小數分頻實現[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]張偉,陳鋒,馬軍強,等.軌/姿控發動機脈沖后效沖量快速算法的研究及應用[J].火箭推進,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.