尤 磊, 吳敬玉, 王 勇, 周承豫, 劉忠國
(1.上海航天控制技術研究所,上海201109;2.上海慣性工程技術研究中心,上海201109)
反作用飛輪在衛星姿態控制中發揮著至關重要的作用,其輸出精度的高低直接影響著衛星的控制精度,而其輸出角動量的精度與其轉速檢測有著直接的聯系。目前,在反作用飛輪中使用的轉速檢測傳感器主要為霍爾傳感器和光電編碼器?;魻杺鞲衅鞯膬烖c是體積小、抗干擾能力強,缺點是測速精度低,已漸漸無法滿足衛星日益增長的高精度要求。光電編碼器的輸出信號為數字量,可直接被數字信號處理器使用,優點是精度高[1],缺點是成本較高、環境適應性差,在高軌衛星中使用存在危險性。而旋轉變壓器體積小、抗干擾能力強,成本較光電編碼器低,同時相較于霍爾傳感器精度更高,是霍爾傳感器和光電編碼器的良好替代品。
旋轉變壓器使用專用解碼芯片解算飛輪轉子位置時,會導致飛輪成本大幅提高,故本文采用軟件的方法進行解碼。坐標旋轉數字計算機(Coordinate Rotation Digital Computer,CORDIC)算法[2-4]可以將復雜的三角函數問題轉換為一系列的移位和加減運算,實現了FPGA解碼的簡易高精度運算。但傳統CORDIC算法覆蓋范圍只有(-99.9°,99.9°),針對這一問題,文獻[5]增加了多次一級迭代, 使覆蓋范圍擴展到(-180°,180°), 但是該算法的調整因子為變量,需要額外的資源進行計算,而且CORDIC算法具有迭代特性,反復迭代會導致輸出延遲較大。為減少算法延遲,文獻[6]對旋轉角度值進行編碼,該方法有效減少了迭代次數,但同樣需要改變調整因子。文獻[7]使用高位進制數的CORDIC算法減少了迭代次數,然而Sn的判定增加了循環迭代次數。文獻[8]提出了一種旋轉固定角度的CORDIC算法,該算法顯著減少了資源消耗,但是由于每次旋轉固定角度值,使得該算法在相同位寬情況下精度較低。
本文針對傳統CORDIC算法只能計算角度范圍(-99.9°,99.9°)且在±90°附近精度較低等問題,結合旋轉變壓器輸出信號的特點,設計了一種改進CORDIC算法,以實現全范圍高精度角度解算。使用全流水線陣列結構,一定程度上解決了迭代算法速度慢、占用資源高等問題。最后,通過Modelsim仿真工具驗證了該方法的合理性。
旋轉變壓器是一種輸出電壓隨轉子轉角變化的信號元件,當激磁繞組以一定頻率的交流電壓勵磁時,輸出繞組的電壓幅值與轉子轉角成正弦、余弦函數關系[9]。正余弦旋轉變壓器的工作原理如圖1所示。

圖1 正余弦旋轉變壓原理圖Fig.1 Schematic diagram of sine and cosine rotary varying voltage
圖1中,U為輸入旋轉變壓器的勵磁電壓,θ為轉子角度,UC和US為兩路輸出電壓,ω為勵磁角頻率,k為電壓傳輸比。對輸出電壓做除法運算,有

由式(1)可知,求解反三角函數即可求出轉子角度θ。

1959年,Voder提出了 CORDIC算法。1971年,Walther統一了該算法形式。Meyer-Base第一次利用FPGA實現了該算法[10],其主要思想是對初始向量進行一系列特定角度的旋轉從而不斷逼近測量角度。CORDIC解碼算法將復雜的三角函數運算簡化成一系列移位和求和運算,極大地節約了系統資源,圖2為坐標的旋轉示意圖。

圖2 坐標旋轉示意圖Fig.2 Diagram of coordinate rotation
如圖 2所示,點A(xi,yi)逆時針旋轉θi(-99.9°≤θ≤ 99.9°)后到點B(xi+1,yi+1), 則A、B兩點的坐標變換可以用如下矩陣形式表示

為使硬件實現簡易方便,避免出現求解三角函數的情況,令tanθi=±2-i, 則式(3)可變為

式(4)中,di表示旋轉方向。其中,+1表示逆時針旋轉,-1表示順時針旋轉,di的值由yi決定

對于任意給定的角度θ,都可以通過多次旋轉到達給定的旋轉角度,即。 因此, 對于式(4)中的cosθi,可以通過在最終結果上乘一個已知的常數K來加以消除。

所以,式(4)中的cosθi在相位旋轉過程中可以不予考慮。在引入角度旋轉累加公式后,式(4)可變為

經過n次迭代后,有

式(8)中,x0=UC,y0=US,θ0=0。則旋轉變壓器定子的位置為

為了解決傳統CORDIC算法角度不能實現全二維平面的完整覆蓋、±處算法精度低等問題,在進行CORDIC算法迭代前,應對旋轉變壓器輸出的信號UC、US進行坐標變換[11]。因此,需要對初始信號進行角度預處理。

圖3 改進CORDIC算法原理圖Fig.3 Schematic diagram of improved CORDIC algorithm
1)將全二維平面角度值轉換到第一象限,在Verilog HDL語言中引入兩位二進制數的狀態量state來分別表示4個象限。當y0<0時,state[1]為1,否則為0;當x0<0時,state[0]為1,否則為0。因此,狀態量state的真值如表1所示。

表1 state真值表Table 1 Truth table of state
根據旋轉變壓器輸出的初始角度,通過坐標變換將初始角度轉換到第I象限。

圖4 改進CORDIC算法流程圖Fig.4 Flowchart of improved CORDIC algorithm
由于傳統CORDIC算法使用的迭代算法在FPGA中的輸出需要不斷反饋到輸入端口,會導致整個系統運行速度降低,吞吐量減小,資源占用率高[12]。因此,為了達到反作用飛輪高速高精度測速以及對FPGA資源占用率低的要求,必須采用流水線結構。全流水線結構的CORDIC陣列如圖5所示,該結構避免了系統狀態變量過多,使用一個模塊就可實現,減少了資源占用率。同時,通過多個解碼模塊的同時運行,可以提高系統運行速度。
對于全流水線結構來說,有限的流水級數使得實際輸出的角位移與CORDIC結算的角位移存在誤差。因此,引入殘余角誤差Δθ, 輸出的角度為

當n→∞ 時,殘余角誤差Δθ→0。 但在實際系統中,隨著流水級數的增長,會占用大量FPGA硬件邏輯資源。同時,當流水級數增長到一定程度后,對角位移精度的影響微乎其微。殘余角誤差Δθ的最大值如下

圖5 全流水線的CORDIC陣列結構Fig.5 Fully-pipelined CORDIC array structure

式(11)中,n為旋轉次數,即流水線級數。根據反作用飛輪要求的轉速精度進行計算,可得n=16。
本文使用 Xilinx公司的 XQV300-CB228型FPGA進行仿真試驗,表2為傳統CORDIC算法和改進CORDIC算法使用芯片資源和算法延遲時間的對比。根據綜合后結果,傳統CORDIC算法占500個邏輯資源,占整個芯片的16%,而改進CORDIC算法僅占438個邏輯資源,占整個芯片的14%,使用該改進CORDIC算法可以降低2%的邏輯資源占用率。

表2 傳統CORDIC算法和改進CORDIC算法的對比Table 2 Comparison between traditional CORDIC algorithm and improved CORDIC algorithm
圖6為改進CORDIC算法的仿真圖。當信號signal_start為1時,FPGA轉換開始。傳統CORDIC算法的整個轉化過程共經歷16個時鐘周期,在實際系統中耗時0.72μs,而改進CORDIC算法只需要12個時鐘周期,在實際系統中耗時0.54μs,大約降低了33%的延遲時間。

圖6 改進CORDIC算法的仿真結果Fig.6 Simulation results of improved CORDIC algorithm
表3為全周期系統的測量結果。其中,真實角度值為根據計算機輸入的數據求反切函數得到的值,計算角度值為FPGA運行改進CORDIC算法求解的數值換算成的角度值。根據測量結果可知,改進CORDIC算法能夠較好地求解計算角度值,相對于傳統CORDIC算法在±90°相對誤差較大,改進CORDIC算法在全角度范圍的相對誤差都小于0.01%,證明了該算法的可行性。

表3 兩種CORDIC算法求解的角度值對比Table 3 Comparison of angle values between traditional CORDIC algorithm and improved CORDIC algorithm
使用CORDIC算法解碼,旋轉變壓器的輸出直接輸入到FPGA中,其運算過程均通過硬件描述語言實現,且FPGA自身擁有較高的抗干擾性能,保證了該算法的抗干擾能力。同時,由于避免使用解碼芯片,很大程度上降低了反作用飛輪的設計和制造成本。研究結果表明,相較于傳統CORDIC算法,使用改進CORDIC算法能夠較為精確地計算出輸入的角度值,即飛輪轉子位置。改進CORDIC算法僅使用XQV300資源的14%,對當前反作用飛輪FPGA資源消耗影響較小。同時,改進CORDIC算法僅延時0.54μs,完全符合飛輪測速、換相準確性和實時性要求。該檢測方法可提供高精度位置檢測及高抗干擾能力,同時成本較低,在未來反作用飛輪應用中具有良好的前景。