周中鑫,張印強(qiáng),李麗娟,劉 琴
(南京工業(yè)大學(xué)電氣工程與控制科學(xué)學(xué)院,江蘇南京 211800)
MEMS(micro electromechanical system)陀螺儀與其他類型的陀螺儀相比,具有體積小、價格低、質(zhì)量輕和集成度高等優(yōu)點(diǎn),已經(jīng)在工業(yè)和汽車等領(lǐng)域得到廣泛應(yīng)用[1-3]。但其精度較低,不能滿足高性能要求,而基于數(shù)據(jù)融合技術(shù)的MEMS陀螺陣列可以大幅度提高測量精度,其數(shù)據(jù)信號的實時采集是慣性導(dǎo)航系統(tǒng)的關(guān)鍵部分?,F(xiàn)今采集系統(tǒng)的控制器大多使用單片機(jī)或DSP,完成任務(wù)的過程是將命令逐條執(zhí)行,若將其作為主控制器去讀取陀螺陣列的數(shù)據(jù),由于存在程序執(zhí)行延時,難以得到陀螺陣列同一時刻的數(shù)據(jù)。因此,采集系統(tǒng)選用大容量、并行運(yùn)行、高速度的現(xiàn)場可編程邏輯門陣列(FPGA)作為主控芯片。
本文設(shè)計了一種基于FPGA的MEMS陀螺陣列信號采集系統(tǒng)。搭建的系統(tǒng)由硬件設(shè)計與數(shù)據(jù)采集系統(tǒng)軟件實現(xiàn)這兩部分組成。以型號為EP4CE15F17C8N的FPGA為控制器,通過對SPI通訊協(xié)議模塊、存儲模塊、串口通信模塊等各個模塊的開發(fā),實現(xiàn)對ADXRS810陀螺陣列的數(shù)據(jù)采集,并通過實驗平臺進(jìn)行驗證,確保系統(tǒng)的實時可靠性。
MEMS陀螺陣列采集系統(tǒng)是通過控制器同時對多個陀螺儀進(jìn)行數(shù)據(jù)采集[4]。選用Cyclone IV系列的FPGA最小系統(tǒng)為控制器,設(shè)計ADXRS810陀螺陣列的外圍電路,通過SPI協(xié)議與從機(jī)上的MEMS陀螺進(jìn)行通信,采用雙口RAM模塊給陣列陀螺分配不同的地址并通過MAX232串口實現(xiàn)和上位機(jī)的通訊。圖1為陣列陀螺采集系統(tǒng)硬件連接框圖。
圖1 陣列陀螺采集系統(tǒng)硬件連接框圖
從機(jī)的MEMS陀螺儀選用ADXRS系列的810芯片。它是一款測量單軸(Z軸)角速度的傳感器且工作頻率最高可達(dá)8.8 MHz,通過SPI通信協(xié)議與主機(jī)實現(xiàn)命令接收與數(shù)據(jù)傳輸。ADXRS810工作電壓范圍為3.3~5 V,當(dāng)設(shè)計電路選取的供電電壓為3.3 V時,選用AMS1117-3.3穩(wěn)壓器芯片,將5 V電源轉(zhuǎn)化為3.3 V。其中電容是用來濾除直流電源中不需要的交流成分,使直流電壓變的平滑。陀螺儀外圍電路如圖2所示,MOSI、SCLK、CS和MISO為SPI通信引腳,為了確保內(nèi)部升壓調(diào)節(jié)器正常工作,VX引腳應(yīng)使用560 μH的電感值,同時要保證電感能夠承受50 mA的峰值電流。
圖2 ADXRS810電路圖
信號采集系統(tǒng)的處理器選用Cyclone iv系列芯片,該系列芯片相較于MAX系列功耗更低、集成度更高,數(shù)據(jù)處理的速度也顯著提高。芯片集成了收發(fā)器、DSP和PCle等硬件IP模塊,調(diào)用方便。芯片內(nèi)部的存儲容量大,邏輯單元豐富,可以滿足多種通信協(xié)議要求。FPGA內(nèi)部有4個PLL(鎖相環(huán))可通過其進(jìn)行倍頻或分頻,能夠滿足絕大部分外設(shè)備的時鐘要求[5-6]。
本文選用型號為EP4CE15F17C8N的FPGA開發(fā)板為下位機(jī)的控制器件,其硬件框圖如圖3所示。開發(fā)板外接存儲芯片包括:SDRAM、并行FLASH、串行FLASH、SRAM和EEPROM,可緩存和處理大容量數(shù)據(jù)。串口芯片為MAX232,可通過它實現(xiàn)和上位機(jī)的通訊。開發(fā)板有5路獨(dú)立按鍵,本文用其中一路給陀螺陣列做觸發(fā)信號。
圖3 FPGA硬件框圖
雙口RAM是在一個SRAM存儲器上的讀寫的地址線、數(shù)據(jù)線和控制線是獨(dú)立的,讀和寫互不干擾,允許對存儲單元同時異步地訪問,即共享式多端口存儲器。因為數(shù)據(jù)可以共享,因而在訪問過程中需要仲裁控制[7]。內(nèi)部的仲裁邏輯控制可以為調(diào)用IP核的用戶提供如下功能:對同一個地址單元進(jìn)行訪問時的時序先后控制;對存儲單元數(shù)據(jù)塊的訪問進(jìn)行權(quán)限的分配等。雙口RAM同樣可以作為實時的數(shù)據(jù)采集發(fā)送的緩沖器。
控制器FPGA與陀螺儀之間的通信協(xié)議是串行外設(shè)接口(serion perpheral interface,SPI),由于SPI協(xié)議是全雙工的,因而可以快速實現(xiàn)主機(jī)與外圍設(shè)備之間的同步信息交互。它主要是主從方式通信,通常是一主對一從和一主對多從的通訊[8]。標(biāo)準(zhǔn)的SPI是四根線,通常只占用芯片的4個接線口,如圖4所示。當(dāng)只有3根線的時候MOSI和MISO共用一根線,只能用于單向傳輸。
圖4 SPI總線時序
以本文的主從通信為例,圖4各個引腳的意義是:
(1)MOSI:FPGA(master,主機(jī))輸出命令,陀螺儀(slave,從機(jī))接收命令。
(2)MISO:陀螺儀(slave,從機(jī))輸出數(shù)據(jù),F(xiàn)PGA(master,主機(jī))接收數(shù)據(jù)。
(3)SCLK:時鐘信號,由主機(jī)產(chǎn)生。
(4)NSS:片選使能信號,由主機(jī)控制。
當(dāng)NNS為低電平時,主機(jī)使能從機(jī),可以進(jìn)行主從之間的通訊,此時注意主機(jī)和從機(jī)數(shù)據(jù)交互的形式。同步通信中,數(shù)據(jù)的發(fā)送和采樣是在一個時鐘周期的上升沿或者下降沿進(jìn)行的。同時,數(shù)據(jù)從產(chǎn)生到它能夠穩(wěn)定發(fā)送需要一定時間,所以,數(shù)據(jù)的接收最快只能在一個時鐘周期,如在上升沿發(fā)送數(shù)據(jù),那么接收數(shù)據(jù)最快只能是下降沿。反之如在下降沿發(fā)送數(shù)據(jù),那么接收最快只能是上升沿。
因而SPI的通訊模式被分為4種,從模式0(CPHA=0;CPOL=0)到模式3(CPHA=1;CPOL=1),具體模式由CPHA(時鐘的相位)和CPOL(時鐘的極性)共同決定。通信過程分為空閑時刻和通信時刻,若SCLK在數(shù)據(jù)發(fā)送前后的空閑狀態(tài)是高電平,那么CPOL=1,若是低電平,那么CPOL=0。
CPHA=1,表示數(shù)據(jù)是在一個時鐘的第一個沿輸出,若CPOL=0,數(shù)據(jù)在上升沿輸出;若CPOL=1,數(shù)據(jù)在下降沿輸出。
CPHA=0,表示數(shù)據(jù)是在一個時鐘的第一個沿采樣,若CPOL=0,數(shù)據(jù)在上升沿采樣;若CPOL=1,數(shù)據(jù)在下降沿采樣。
本文所采用的模式0,即CPHA=0;CPOL=0,如圖5所示,以8位數(shù)據(jù)傳輸為例,空閑狀態(tài)為低電平,且是在第一個時鐘的上升沿采集數(shù)據(jù)。
圖5 CPHA=0,CPOL=0;SPI時序
2.1.1 SPI通信狀態(tài)機(jī)的設(shè)計
主要設(shè)計了SPI通信協(xié)議狀態(tài)機(jī),將32位的數(shù)據(jù)收發(fā)過程轉(zhuǎn)化為4次8位傳輸。以發(fā)送過程為例,分為idle、WAIT、r_mem、w_reg和stop 5個狀態(tài)。首先通過按鍵啟動信號State~22,進(jìn)入idle狀態(tài),若接收到下降沿使能信號,則進(jìn)入WAIT狀態(tài),并且將第一次的8位數(shù)據(jù)緩存,判斷依據(jù)為wait_cnt[3]==1′b1;發(fā)送結(jié)束后進(jìn)入r_mem緩存狀態(tài),再進(jìn)入w_reg將8位數(shù)據(jù)依次發(fā)后再重新進(jìn)入WAIT狀態(tài),重復(fù)4次至32位數(shù)據(jù)發(fā)送完成,最后進(jìn)入stop狀態(tài),此時片選為高。一次發(fā)送結(jié)束,重新返回idle,等待接收片選使能信號,開始下一輪的數(shù)據(jù)發(fā)送。SPI通信狀態(tài)機(jī)轉(zhuǎn)移圖如圖6所示。
圖6 SPI通信狀態(tài)機(jī)轉(zhuǎn)移圖
2.1.2 SPI時序仿真
通過用時序模擬軟件Modelsim進(jìn)行仿真驗證,可以直觀的觀察到各個節(jié)點(diǎn)的時序圖,能夠觀察到時鐘的上升沿或者下降沿時,它們是否符合應(yīng)有的觸發(fā)關(guān)系,每一位的數(shù)據(jù)傳輸是否對應(yīng)。
2.1.2.1 建立testbench測試文本
利用for+forever循環(huán)實現(xiàn)50 MHz時鐘信號的模擬仿真程序。一開始clk=0,10 ns后,clk會翻轉(zhuǎn)形成上升沿,再隔10 ns,clk又會翻轉(zhuǎn)形成下降沿,這樣就形成了周期為20 ns,頻率為50 MHz的時序。原程序中的觸發(fā)條件是按下開始鍵給的觸發(fā)信號,可以寫為延時100 μs后形成一個上升沿觸發(fā)信號。同時源程序中的延時100 ms,50 ms, 1 ms都需要相應(yīng)的縮短為100 μs左右,這樣可以在接下來的view窗口中方便觀察,不會出現(xiàn)大面積的無數(shù)據(jù)現(xiàn)象。
2.1.2.2 輸入賦值
由于仿真時并不會由從機(jī)對其發(fā)送數(shù)據(jù),因而為了有效觀察,需要給MISO賦初值。本著簡單的原則,同樣寫了for+forever的循環(huán),使得MISO有規(guī)律的0,1變化,形成觀察中變化的輸入數(shù)據(jù)。
最后將vt文本和v文本放入仿真環(huán)境進(jìn)行測試。在view窗口進(jìn)行觀察顯示的CLK時序,以及各個需要觀測的節(jié)點(diǎn)對應(yīng)的數(shù)據(jù)。主要觀察SPI時序,觀察4個節(jié)點(diǎn)MOSI、MISO、SCLK、CS與給定的理想時鐘CLK之間的關(guān)系是否符合模式要求。
由圖7的SPI協(xié)議的局部觀察可知,CLK時鐘上升沿計數(shù)25次后,SPI協(xié)議時鐘翻轉(zhuǎn),時長為500 ns,一個周期為1 000 ns,剛好是20 ns周期的500倍,SCLK時鐘正確。同時從圖中的箭頭和所指直線可以觀察到MOSI是在SCLK為下降沿時產(chǎn)生變化,圖中三角形所顯示,當(dāng)SCLK為上升沿時,MOSI不變的情況下,接收緩存in_data仍然為1,圖中橢圓形所顯示,只有在上升沿時才會采集MISO變化的數(shù)據(jù)。CS為低電平,片選情況也正確,因而說明SPI的時序是符合
圖7 SPI時序仿真
模式0的。
圖8是去掉CLK信號觀察整體時序,由圖8可知Start_sig置1后,整個采集過程開始,當(dāng)CS低電平使能,圖中箭頭是初始化信號中MOSI高電位發(fā)送部分,發(fā)送完CS變?yōu)楦唠娖?,同時三角形所指是數(shù)據(jù)發(fā)送接收通訊部分結(jié)束,發(fā)送Spi_Done_sig高電平信號,則Spi_Start_sig信號置低,橢圓是向FIFO發(fā)送數(shù)據(jù)命令,而后片選使能,開始新一輪的數(shù)據(jù)通信。
圖8 整體時序仿真
基于Quartus ii軟件編程環(huán)境,陣列陀螺數(shù)據(jù)采集過程選用Verilog HDL作為輸入語言,通過控制每個時鐘來驅(qū)動信號與寄存器傳輸。數(shù)據(jù)采集系統(tǒng)的流程圖如圖9所示。
圖9 數(shù)據(jù)采集系統(tǒng)圖
數(shù)據(jù)采集系統(tǒng)具體分為以下步驟:
開關(guān)鍵:FPGA實驗板(主機(jī))和陀螺陣列(從機(jī))上電后,通過主機(jī)上的按鍵給從機(jī)一個初始Start信號,并且也可以通過它關(guān)閉二者的通信。
初始化:根據(jù)數(shù)據(jù)手冊的描寫,延時100 ms,向從機(jī)發(fā)送第一個32位命令2000_0003,將命令數(shù)據(jù)由Start_module發(fā)送給SPI_Module。之后再延時50 ms,發(fā)送命令2000_0000,重復(fù)3次。
ID地址讀?。合蛲勇輧x的ID寄存器讀取地址來確定SPI的通信時序是否正確,ID寄存器是2個8位地址組成的16位的寄存器,但只需向首地址發(fā)送命令即可。發(fā)送讀取ID地址命令8018_0000,返回的32位數(shù)據(jù)中data20-data5的16位數(shù)據(jù)為ID數(shù)據(jù)。若接收到的數(shù)據(jù)為0x5201或者是0x5202,則認(rèn)為整個初始化正確。
SPI通信:使用計數(shù)模塊為通信協(xié)議的SCLK提供1 MHz時鐘。由于晶振頻率為50 MHz,是SCLK時鐘頻率的50倍。那么當(dāng)晶振提供的時鐘完成25個周期時,SPI協(xié)議的時鐘才會產(chǎn)生變化,每計數(shù)25個周期產(chǎn)生時鐘沿的變化,則可形成1 MHz時鐘頻率。Start_module發(fā)送命令的同時,向SPI_Module發(fā)送片選信號和開始信號。片選信號由高變低后,檢測到SCLK為上升沿,則將32位數(shù)由高到低依次發(fā)送至MOSI口;若檢測到SCLK為下降沿,則將MISO口接收數(shù)據(jù)放置buf中。
雙口RAM:雙口RAM選取深度為64,寬度為32的存儲空間,并且對各個陀螺儀存儲地址進(jìn)行分配,Addr0-15、ADDR16-31、Addr32-47、Addr32-47分別分配給陀螺1、2、3和4。
串口模塊:檢測雙口RAM的發(fā)送信號,Tx_interface模塊讀出數(shù)據(jù),將數(shù)據(jù)存入TX_Control模塊。由于串口是8位數(shù)據(jù)進(jìn)行發(fā)送與接收,所以TX_Control模塊將32位數(shù)據(jù)由高位至低位分為4次發(fā)送至串口。設(shè)置串口波特率為9 600 bps,采用計數(shù)模塊,一個周期是5 208次,當(dāng)滿足2 604次,頻率時鐘翻轉(zhuǎn),當(dāng)檢測到波特率時鐘為上升沿時,向TX_Pin_Out口由高至低發(fā)送數(shù)據(jù)。將RAM_module模塊發(fā)來的四組數(shù)據(jù)傳輸完成后,才會接收下一次的數(shù)據(jù),避免數(shù)據(jù)發(fā)送混亂。串口發(fā)送部分程序如圖10所示。
圖10 串口發(fā)送部分程序圖
圖11是整個陣列陀螺采集系統(tǒng)的RTL視圖。
圖11 陣列陀螺RTL視圖
實驗系統(tǒng)測試:首先將MEMS陀螺陣列的電路板和FPGA實驗板相連放置在桌面上,接通電源,連接上位機(jī);然后通過FPGA實驗板的按鍵給從機(jī)一個初始化的信號開始讀取數(shù)據(jù);最后在上位機(jī)串口顯示MEMS陀螺陣列的Z軸輸出的數(shù)據(jù)。圖12是測試電路實物工作圖。
(a)串口數(shù)據(jù)
本文設(shè)計了MEMS陀螺陣列的信號采集系統(tǒng)。采用Cyclone IV系列的EP4CEF15F17C8最小系統(tǒng)作為信號采集的控制器,搭建了由4個ADXRS系列的MEMS陀螺儀組成的外圍電路,通過時序仿真驗證了程序的可行性,并通過實驗測試實現(xiàn)主機(jī)(FPGA)對從機(jī)(MEMS陀螺陣列)數(shù)據(jù)的實時讀取,具有一定的工程應(yīng)用價值。