劉 燕,張會生
(西北工業大學 明德學院,陜西 西安 710124)
光電編碼器是一種通過光電轉換將輸出軸上的機械幾何位移量轉換成脈沖或數字量的傳感器,是目前應用最多的傳感器。光電編碼器由光柵盤和光電檢測裝置組成。光柵盤是在一定直徑的圓板上等分地開通若干個長方形孔。由于光電碼盤與電動機同軸,電動機旋轉時,光柵盤與電動機同速旋轉,經發光二極管等電子元件組成的檢測裝置檢測輸出若干脈沖信號,其原理示意圖如圖1所示。通過計算每秒光電編碼器輸出脈沖的個數就能反映當前電動機的轉速。此外,為判斷旋轉方向,碼盤還可提供相位相差90°的兩路脈沖信號。根據檢測原理,編碼器可分為光學式、磁式、感應式和電容式;根據其刻度方法及信號輸出形式,可分為增量式、絕對式以及混合式3種。

圖1 光電編碼器原理示意圖
隨著電子設計技術的飛速發展,現場可編程邏輯門陣列(FPGA)的復雜程度越來越高,其所具備的功能也越來越多,芯片也向小型化發展,逐步成為復雜數字硬件電路設計的首選。FPGA/CPLD既繼承了ASIC的大規模、高集成度、高可靠性的優點,又克服了普通ASIC設計周期長、投資大、靈活性差的缺點。FPGA/CPLD的集成度很高,可完成極其復雜的時序和組合邏輯電路功能。本文所設計的系統就是基于CPLD芯片實現六十進制壓縮BCD碼加減運算功能。
系統主要實現六十進制壓縮BCD碼的加減運算的算法,即:根據一個度數A的變化量來對另一個度數B實現同樣的變化,并輸出B變化后的值,從而實現光電編碼器的快速運算,提升位置檢測系統的動態性能指標。具體如圖2所示,即B隨A變化而變化,當A變化到A′時,B變化到 B′,A與 B的變化量相等,即 A與 B相差的度數始終相等。

圖2 系統計算要求示意圖
程序采用分別對度、分、秒進行運算的辦法。
(1)實現對輸入數據的轉換,即從壓縮BCD碼轉化為二進制碼。
(2)計算部分。本程序采用對度、分、秒分別進行運算的辦法,三者之間存在進位、借位信號 c2、c3、c4、c5,其中 c2、c3分別為 A、B初始值作差時 A度分秒各部分間的進位、借位信號,c4、c5分別為B變化后的值C的各部分間的進位、借位信號。
(3)實現把運算結果從二進制碼轉化為壓縮BCD碼。
(1)當時鐘 clk為上升沿時,把輸入的壓縮 BCD碼轉換為二進制碼;
(2)當 reset有效時,置入 A與 B的初始值;
(3)當 load有效時,開始計算變化量;
(4)把變化后的 B變為壓縮BCD碼 C;
(5)由于本電路時鐘頻率為 5 MHz,輸入數據的頻率約為200 μs。為減小毛刺,設計一個300的計數器與一個鎖存器,使輸出效果更佳。具體為,每當計完300個數時,輸出一次程序的運算結果。
(6)設計鎖存器,當計數器計完300后輸出C。
以度部分為例,算法思路為:個位+十位×10+百位×100。
主要程序實現如下:
Q00:="00"& (Q (9 downto 8)*"1100100"+Q (7 downto 4)*"1010"+Q(3 downto 0))。
以分部分為例,算法思路如下。
(1)計算初始值 A00、B00 的差量 e,e=A00-B00-c2,其中c2為A的秒部分的進位或借位信號,若e為負則自加60,并輸出借位給A的度部分;
(2)計算變化后的 B 值 C,C=A0+e+c4,其中A0為變化后的A值,c4為C秒部分的進位或借位信號;
(3)判斷輸出 C是否大于 60,若 C≥60,則輸出進位給C的度部分,并自減60輸出結果C。
這一部分采用循環減的辦法,以C的度部分為例。
(1)判斷 C是否小于 10,若小于則對 C循環減 10,直到C小于10為止,C減完后的值為個位數;
(2)對步驟(1)中減的次數 n2再進行循環減 10,n2減完后的值為十位數;
(3)步驟(2)中減的次數n1為百位數。
圖3、 圖 4 為當 A 初 值為 0,B 為 359°59′57″時,A逐次增加1″,輸出結果C的變化過程。為方便檢查和觀看,圖3為 A、B、C為未壓縮BCD碼的仿真結果,圖4為A、B、C為壓縮BCD碼的仿真結果。

圖3 BCD碼仿真波形

圖4 壓縮BCD碼仿真結果
由圖 3、圖 4可以看出,當 A初值為 0,B為 359°59′57″時,A逐次增加 1″,輸出結果C的變化過程為由初值0 變為 359°59′58″, 之后順次變為 359°59′59″、0、1″…,由結果可驗證程序的正確性。
硬件驗證就是將編譯、綜合生成的下載文件下載到指定的CPLD芯片上,然后進行硬件驗證。本項目通過一個轉盤改變原始輸入數據A,并用數碼管顯示出數據A,各輸入數據、時鐘、功能信號都由插頭輸入,輸出數據C也由插頭輸出,并用數碼管顯示出數據C。
當數據 A 輸入為 0°,B 為 359°59′59″,reset為高電平,load為高電平時,輸出顯示保持上一數據;當A變為1″,reset變為低電平,輸出顯示 0°;當 load變為低電平,輸出顯示 A的值 1″。
根據實驗數據,驗證了該電路功能的正確性與可靠性,達到了預期項目要求,實現了基于CPLD實現六十進制壓縮BCD碼加減運算功能。
本電路的時鐘頻率為5 MHz,時鐘頻率約為數據A更新頻率的1 000倍,當數據A的更新頻率與時鐘頻率較接近時,會出現進位滯后的情況,如圖5所示。
由圖 5 可知, 當 A 初值為 0,B 為 359°59′57″時,A逐次增加1″,輸出結果C的變化過程為由初值 0變為359°59′58″, 以 后 順 次 變 為 359°59′59″、359°59′00″、359°00′01″、2″、3″…。 可見從 359°59′59″不能直接變到000°00′00″,直到 000°00′02″才恢復正確值,在 359°59′59″與 000°00′02″之間應該存在的兩個數為 000°00′00″、000°00′01″實際為 359°59′00″、359°00′01″,這里可以看出 359°59′59″到 0°中間存在兩次進位,每次進位滯后一個時鐘周期,根本原因是由于數據更新相對較快,接近時鐘clk的頻率,在一個時鐘周期內計算不完全,從而導致了進位滯后的現象。

圖5 進位滯后波形
可用分頻的方法實現進位的同步,比如秒、分、度分別采用時鐘頻率的2分頻、4分頻、8分頻。
也可使用秒、分、度各自的計算部分占不同時鐘段的方法解決,比如:秒部分從時鐘上升沿開始計算,分部分從時鐘三分之一周期處開始計算,度部分從時鐘三分之二處開始計算。
[1]吳凡.高精度絕對式光電軸角編碼器高質量光電信號的提取方法[D].成都:電子科技大學,2001.
[2]王誠.Altera FPGA/CPLD設計[M].北京:人民郵電出版社,2005.
[3]方艷輝.增量式編碼器全數字量相加技術的研究[D].長春:中國科學院長春光學精密機械與物理研究所,2005.
[4]周志煒.基于FPGA的多路光電編碼器數據采集系統[D].哈爾濱:哈爾濱工業大學,2006.
[5]俞芳.基于 CPLDFPGA的IP核設計[D].蘇州:蘇州大學,2005.
[6]王蕾.基于FPGA的數據傳輸系統基帶處理單元的設計[D].哈爾濱:哈爾濱工業大學,2006.
[7]李宗伯,王蓉暉,王蕾.VHDL設計表示和綜合 [M].北京:機械工業出版社,2002.
[8]NELSON V P, NAGLE H T, CARROLL B D, et al.Digital Logic Circuit Analysis&Design[M].北京:清華大學出版社,1997.
[9]WAKERLY J F.Digit-Principles and Practices[M].北京:高等教育出版社,2001.