李 華,劉寶盈,劉 萌,謝 謙
(商洛學院,陜西商洛,726000)
在實際工程應用中,數據采集是最重要的設計環節之一。傳統的設計形式存在一次只采集一路數據且傳輸距離較短、容易丟包等缺陷,已經遠遠不能滿足實際應用的需要。另一方面,從設計的角度考慮,因為同時采集并傳輸多路數據要兼顧準確性和速度等眾多因素,所以必須采用新的設計思路與方法來實現。本文以Xilinx公司的FPGA為主控芯片,結合TI公司的多路、高速ADC以及Philips公司的CAN協議芯片—SJA1000實現了對8路模擬數據的實時采集與傳輸。文章在理論分析的同時還給出了相關設計的ModelSim時序仿真波形,并對系統的實際采集與傳輸效果進行了分析與評價。
本文所設計的8數據采集與傳輸系統以FPGA為核心,首先用于產生ADC128正常工作所需要的時序,當ADC128正常工作并輸出一位數字信號時,將一位信號送入FPGA進行串并轉換,同時進行數據重組,用于改變數據格式以適應SJA1000的傳輸需要,然后將數據通過SJA1000協議芯片輸出,經PCA82C250后傳給應用系統。整個系統充分發揮了FPGA并行運算的優勢,有效提高了數據采集和傳輸的速度和精度。

圖1 系統原理框圖
圖1 所示為本文系統的原理框圖,系統的具體工作過程為:將需要采集的8路模擬信號連接到ADC128的輸入端(IN0-IN7),為了使ADC能夠工作在50kSPS采集模式下,FPGA提供給ADC128的時鐘頻率為0.8MHz,這時ADC就開始以0.8MHz的數據速率輸出一位數字信號。為了應用方便,系統首先將一位數字信號經過串并轉換,變成12位的數字信號。但是一般傳輸系統的數據形式是8位,因此為了節約帶寬,通過數據重組單元將12位信號重組成8位數字信號。因為ADC128以50kSPS的速率采集數據時,它每秒輸出的數據量為50k*12b=0.6Mb,相應的帶寬為0.6Mbps,而CAN的最大傳輸速率為1Mbps,滿足帶寬要求;和一般的通信總線相比,CAN總線具有更好的數據通信可靠性、實時性和靈活性,因此應用領域越來越廣泛,鑒于以上考慮,本文利用CAN總線傳輸采集到的數據。
ADC128是美國TI公司的一款單5V供電的12位高速、低功耗、8通道同步采樣模數轉換器。ADC128的控制主要由SCLK、DOUT、DIN和CS完成,其中,SCLK 是AD時鐘,控制著轉換過程和讀出過程,它的頻率直接影響著轉換速率,本文設計使用的是0.8MHz,保證了50kSPS的轉換速率;DOUT是數字信號輸出端口,位寬為1,在SCLK的下降沿輸出結果;DIN是控制信號,主要用于設置ADC的寄存器用于轉換信號的選擇,位寬為1 ,在SCLK的上升沿使能;CS是芯片使能信號,位寬為1,只有當CS為低電平時,ADC的AD轉換過程才能繼續。
圖2所示為ADC128采集8路數據,經過串并轉換得到12位并行數據的時序仿真波形。在CS為低時,Din用于對輸入模擬通道進行選擇,本設計從0-7依次累加,完成8路數據的采集。ADC128在設計時需要注意的是,它是延時輸出器件,即第0個過程選擇的數據,在第1個過程數據才輸出,所以,一次數據周期總共的轉換過程為9個,即第7個數據選擇完成后,還要加一個讀出周期,這樣才能將輸入的8路數據完整的采集出來。

圖2 ADC128采集8路數據仿真波形
由于ADC128每次輸出的數據是12bit,而CAN總線的數據幀格式是8bit,因此,為了傳輸方便且不浪費帶寬,我們將ADC128輸出且經過串并轉換過的數據進行了處理,其思路是數據拼接,例如取第一個數據的高8位輸出給CAN,再將第一個數據的低4位和第二個數據的高4位組合輸給CAN,把第二個數余下的8位作為CAN的第三個數據,如此處理之后,就實現了ADC128和CAN總線之間數據格式的匹配,不會造成數據的丟失,同時充分利用了CAN總線的帶寬,不會造成浪費。
但是,數據拼接后,在數據傳輸過程中給數據的識別帶來了一定的影響,因為CAN協議一次只能傳輸8個字節的數據,而ADC一次輸出的數據轉化成8位數據需要12字節,因此,整個采集傳輸過程就變為了一個數據流,即:無法區分什么地方是數據開始,什么地方是數據結束。為了解決這個問題,我們采取了添加數據標識的方法,即每包數據的開始用0x55標識,而一幀數據結束則用0xAA標識,這樣,數據解析單元就可以根據這兩個標識碼,將其中間的數據提取,并按照拼接規則解析即可。
CAN總線的操作主要是通過對CAN總線控制器—SJA1000進行操作來完成, SJA1000的操作主要分為三個步驟:初始化、數據發送和數據接收,如圖3所示。

圖3 SJA1000控制流圖
2.3.1 初始化過程
在SJA1000上電后,首先進行硬件復位,即給reset管腳一個低電平,并且要持續100ms的時間,再將該信號抬高,完成硬件的初始化。然后進行軟件復位,即進行寄存器的初始化以完成特定的功能,由于本設計使用的是BasicCAN模式,因此主要是對以下寄存器進行賦初值:控制寄存器、命令寄存器、狀態寄存器、中斷寄存器、驗收代碼寄存器、驗收屏蔽寄存器、總線定時0、總線定時1、輸出控制寄存器和時鐘分頻器。其中,驗收代碼寄存器和驗收屏蔽寄存器主要用于標識碼的確認;總線定時0、總線定時1用于總線傳輸速度的設定,最大總線長度越長,傳輸速度越低;輸出控制寄存器用于設置總線輸出驅動方式。
軟件的初始化本質上是對SJA1000的特定寄存器進行寫操作,但是前提是要在復位模式下進行,即寫之前先要設置模式寄存器的RM為1使SJA1000進入復位模式。SJA1000的初始化過程的時序仿真如圖4所示。在ALE的下降沿將寄存器打入,在WR的上升沿將數據寫入,完成對SJA1000的初始化。

圖4 SJA1000初始化過程
2.3.2 發送數據
SJA1000的數據發送和初始化類似,也是將要發送的數據寫入SJA1000。但是SJA1000在發送數前,一般先檢查狀態寄存器的3個狀態位:
1)接收狀態位(SR.4):如果目前SJA1000正在接收信息,則不能發送,至少等到本次接收完畢才能申請發送;
2)發送狀態位(SR.3):檢查SJA1000是否正在發送信息,如果正在發送,則需要等一次發送完成才能啟動新的發送任務;
3)發送緩存區(SR.2):只有該緩沖區處于釋放狀態時才能發送信息。
當以上3個寄存器滿足寫要求時,開始SJA1000的寫操作。因為BasicCAN一包數據由10個字節組成,因此,一包數據的發送要連續對10-19共10個寄存器進行連續10次的數據寫入,其中,前兩個字節為描述符,分別定義了識別碼、數據類型和數據長度。因為,我們在驗收代碼寄存器設置了相應的代碼約定,因此,描述符的第一個字節要和設置的代碼完全一致才能發送成功,同時,驗收代碼位和信息識別碼的高8位相等且與驗收屏蔽位的相應位相或應該為1,因此,驗收屏蔽寄存器設置成0xFF的形式。1位的遠程發送請求PTR,為1時表示無數據,為0時根據數據長度確定后面的數據,數據長度DLC,有8、4、2、1四個選項,數據的長度位設置的是要發送數據的長度。接下來的8個字節用于存放數據。這樣,一個完整的CAN數據幀就完成了,使能發送寄存器CMR.0完成數據幀的發送。相應的時序仿真波形如圖5所示:

圖5 SJA1000寫數據時序仿真波形
2.3.3 接收數據
相比發送過程,接收過程要相對復雜一些,有些文獻使用了查詢方式進行,即接收緩存器RXFIFO中有數據時,接收緩沖標志位RBS為1,這時就可以進行讀操作,但是,這種方式要不停的查詢該位以判斷何時進行讀操作,因此,實際操作過于麻煩。本文設計將SJA1000的/INT管腳作為外部觸發條件,即當系統捕獲到/INT的下降沿時,表明有中斷,再查詢是不是數據中斷,是表明接收緩存器RXFIFO有數據存在,開始讀取數據。這樣的設計避免了不停的查詢,因此,簡化了設計。其中,SJA1000的查詢操作是將需要查詢的寄存器送入地址A7-A0,然后讀取數據D7-D0,根據D7-D0的值判斷下一步的動作,當然此處僅需發送一包數據即可,如果要查詢多個寄存器,就一次發送多個數據包。
發送緩存器的地址是10-19,而接收緩存器的識別碼、遠程發送請求位和數據長度碼同發送緩沖器的相同只不過地址是20-29。讀一般也要連續進行10次,前面2包是描述符,包括11位的識別碼,1位的遠程發送請求PTR和數據長度DLC信息。由于本文系統約定了數據長度是8字節,因此,后面8字節全是有效數據。讀完一包數據,需要釋放緩沖區,返回空閑狀態,即使能寄存器CMR.2,為下一包數據的接收做準備。
本文系統使用了模塊化設計思想和自頂向下的設計思路,利用VerilogHDL語言、在Xilinx公司的ISE10.1軟件環境下實現,硬件平臺選用的是xilinx公司的XC2V3000。為了驗證本文系統的數據采集效果,我們從兩方面進行說明。一方面,3.1和3.3節的時序仿真波形從理論上證明了設計的正確性;另一方面,本文系統設計完成后,進行了芯片燒寫,并對實際數據進行了采集,為了直觀,我們使用的是Xilinx自帶的Chipscope進行觀測,結果如圖6所示,表示的是將ADC128采集的一包數據發給SJA1000的情況,數據以0x55開始,后面緊接采集到的數據,進一步證明了設計的可行性和正確性。

圖6 發送采集數據過程截圖
本文設計僅采用一片FPGA完成了對8路模擬數據的采集、數據格式的轉換和數據的CAN總線傳輸,使傳統復雜的系統得到簡化,同時采用了流水線設計的思想,充分發揮了FPGA的并行設計優勢,使整個過程做到了實時處理,相比傳統的基于單片機的設計,更加靈活,并且移植更加方便,從而大大提高了效率。目前,該系統已經成功應用到某工業現場。另外,雖然本文設計用于采集8路模擬信號,但是,我們對整個系統分析可知,只要修改一下采集對象和路數,該系統就可以應用到其它數據采集系統中,具有較好的通用性。
[1]仲建鋒,胡慶生,孫遠.基于FPGA的多路高速串并轉換器設計[J].電子器件,2008, 31(2):657~660.
[2]張貴清,朱磊,顏露新,等.基于FPGA的多路同步實時數據采集方案設計與實現[J].測控技術 ,2005,24(12):26~29.
[3]儲成君,任勇峰,劉東海,等.基于FPGA的多通道信號采集電路設計[J].科學技術與工程,2013,13(19):5692~5695。
[4]陳彥,張宏偉,林宏宇.基于FPGA的CMOS圖像傳感器LUPA-4000時序設計[J].航天器返回與遙感 ,2012,33(5):62~67.