集美大學(xué)信息工程學(xué)院 沈旭照 吳一亮
基于FPGA的圓弧插補算法的設(shè)計
集美大學(xué)信息工程學(xué)院 沈旭照 吳一亮
本項目設(shè)計了一款基于FPGA的圓弧插補系統(tǒng)。選用京微雅格CME-M7系列的集成了ARM 硬核的高性能開發(fā)板,步進最小精度可達(dá)0.005mm。圓弧半徑最大可達(dá)2.7m,但是由于受到滑臺的自身尺寸的限制,最大的整圓的最大半徑為40cm。插補速度可達(dá)3m/min。系統(tǒng)具有較高的集成度和良好的穩(wěn)定性。
FPGA;圓弧插補;DDA;步進電機
本次選用的是京微雅格CME-M7 系列,該系列是集成了ARM Cortex-M3硬核高性能FPGA,根據(jù)設(shè)計要求(輸入圓弧起點,終點,半徑,實現(xiàn)勻速和勻加速控制),可以將本次設(shè)計DDA圓弧插補功能主要劃分為如圖所示幾個部分(框圖中的路徑為數(shù)據(jù)路徑,時鐘路徑未畫出)。
該芯片內(nèi)嵌ARM Cortex-M3硬核,MCU主頻率最高達(dá)300M,MCU的時鐘也可由FPGA的PLL端供給,運用MCU高速的運算指令,將圓弧的起點、終點、半徑以及速度控制信號由pc的上位機通過UART串口輸入到MCU,通過一系列算法運算得到該圓弧的圓心位置以及x軸和y軸的總進給數(shù)。
本設(shè)計的FPGA端的時鐘頻率為50M,ARM核的時鐘頻率為200M,ARM端的時鐘通過FPGA的PLL端配置,但是由于FPGA與ARM核兩部分工作在不同頻域,為了減小亞穩(wěn)態(tài)等現(xiàn)象,本設(shè)計采用異步FIFO進行FPGA與ARM核跨時鐘域通信處理,ARM向FIFO中寫入圓心位置以及x軸和y軸的總進給數(shù),待ARM端寫結(jié)束后,F(xiàn)PGA向FIFO中讀取數(shù)據(jù)并送到數(shù)據(jù)接收端。具體的通信細(xì)節(jié)是FPGA通過GPIO口向ARM端發(fā)送FIFO空狀態(tài),ARM端確認(rèn)FIFO為空狀態(tài)時通過AHB FPGA slave port 1向FIFO中寫數(shù)據(jù),F(xiàn)PGA端監(jiān)測到ARM端寫結(jié)束后,開始從FIFO中讀取數(shù)據(jù),并驗證每次讀取的數(shù)據(jù)通過發(fā)送PASS或FAIL的信號到LED指示燈。
具體的FPGA和ARM核異步FIFO通信架構(gòu)如下圖所示。
3.1 PLL時鐘及脈沖發(fā)生模塊
CME-M7系列FPGA擁有資源豐富的PLL資源,8個de-skew全局時鐘,2個支持倍頻、分頻及de-skew 的PLL,ARM核的時鐘也由FPGA的PLL供給。根據(jù)DDA插補算法原理,積分器的累加是根據(jù)脈沖信號進行的,每來一個脈沖,積分器累加一次,并且根據(jù)DDA圓弧插補速度計算公式,合成的速度與源脈沖的頻率是成正比的,所以當(dāng)脈沖頻率一定時,合成的速度便是勻速運動,脈沖頻率隨時間呈現(xiàn)遞增趨勢時,合成速度便是勻加速運動,所以該模塊首先會用PLL產(chǎn)生一個全局時鐘,供給各個同步模塊,而且還要根據(jù)速度控制算法產(chǎn)生頻率固定的均勻脈沖和頻率隨時間遞增或遞減的脈沖。
3.2 數(shù)據(jù)接收模塊
數(shù)據(jù)接收模塊接收來自ARM核運算后的數(shù)據(jù),包括圓弧的起點,終點,半徑,圓心,x軸y軸各自需要的總進給數(shù),以及速度控制信號和圓弧插補方向信號。
3.3 數(shù)據(jù)左移規(guī)格化模塊
根據(jù)圓弧插補改進原理,需要將輸入的圓弧起點(經(jīng)過運算后的,即起點坐標(biāo)減去圓心坐標(biāo)的值)經(jīng)過左移規(guī)格化后送入到被積函數(shù)寄存器,本次設(shè)計的被積函數(shù)寄存器位數(shù)定為20位,在程序設(shè)計中可以用parameter根據(jù)需要靈活定義寄存器位數(shù),因為此時的數(shù)值為有符號數(shù),被積函數(shù)的最高位為符號位,所以本次設(shè)計規(guī)格化是使除符號位的次高位為1;因為被積函數(shù)是起點坐標(biāo)減去圓心坐標(biāo)的值,而且圓弧的起點和圓心坐標(biāo)都為有符號數(shù),所以圓弧的真正起點坐標(biāo)為20位有符號數(shù)。
3.4 DDA積分模塊
DDA積分模塊作為本次設(shè)計的算法核心,在PLL時鐘及脈沖發(fā)生模塊發(fā)出的脈沖控制下進行累加運算,這里余數(shù)寄存器的位數(shù)也為20位,因為余數(shù)寄存器中的值為無符號數(shù),所以每次進行累加都是用被積函數(shù)寄存器的絕對值進行累加的,當(dāng)最高位為1時即是發(fā)生溢出。發(fā)生溢出后最高位清零其余位不變。
DDA圓弧插補算法結(jié)構(gòu)圖如下所示。
3.5 位置判斷模塊
此模塊用于實時的位置判斷,根據(jù)動點的位置給出動點所在的象限,根據(jù)動點的象限位置給出累加器溢出時的進給脈沖和進給方向,并且需要根據(jù)象限相應(yīng)的修改被積函數(shù)值。
3.6 終點判斷模塊
終點判斷模塊開始會從數(shù)據(jù)接收模塊接收x軸和y軸的各自終點判斷的計數(shù)值,然后根據(jù)DDA積分模塊每當(dāng)有累加器溢出時,相應(yīng)的終點計數(shù)值會相應(yīng)的減一,直到x軸終點計數(shù)器和y軸終點計數(shù)器都為0時,停止插補,并輸出插補完成信號。
3.7 脈沖及進給方向輸出模塊
在DDA積分模塊累計溢出時,根據(jù)位置判斷模塊出相應(yīng)的盡給脈沖和進給方向,并且修改被積函數(shù)寄存器的值。