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