一、概述
谷物品質(zhì)快速檢測(cè)儀是應(yīng)用近紅外光譜分析技術(shù)來檢測(cè)谷物的內(nèi)部品質(zhì),如粗蛋白,水分等。隨著光學(xué)、計(jì)算機(jī)處理技術(shù)、化學(xué)計(jì)量學(xué)理論和方法的不斷發(fā)展,以及新型近紅外儀器的不斷出現(xiàn)和軟件版本的不斷翻新,近紅外光譜技術(shù)的穩(wěn)定性、實(shí)用性和準(zhǔn)確性不斷提高;其分析快速,簡(jiǎn)便,非破壞性以及可同時(shí)測(cè)定多成分的優(yōu)點(diǎn)不斷為人們所認(rèn)識(shí);不僅可用來測(cè)定樣品的水分、粗蛋白、脂肪、淀粉等常量成分,還被用來測(cè)定氨基酸、脂肪酸,以及對(duì)生產(chǎn)加工過程進(jìn)行在線質(zhì)量控制;分析對(duì)象也從粉樣樣品擴(kuò)展到分析完整籽粒樣品[5]。
本文研究的目的就是快速、準(zhǔn)確地測(cè)得谷物品質(zhì)的相關(guān)參數(shù),所以儀器的性能就體現(xiàn)在快速、準(zhǔn)確的測(cè)試并分析測(cè)試結(jié)果的能力。圖1為近紅外光譜儀的裝置示意圖,近紅外光譜儀一般由光源、分光系統(tǒng)、測(cè)樣器件、檢測(cè)器和控制及數(shù)據(jù)采集處理系統(tǒng)組成;其中的關(guān)鍵部件就是光譜數(shù)據(jù)采集和分析單元,本文主要討論數(shù)據(jù)采集部分的設(shè)計(jì)及實(shí)現(xiàn)。
圖1.近紅外光譜儀器示意圖
1-光源;2-分光系統(tǒng);3-反光鏡;4-測(cè)樣器件;5-漫反射檢測(cè)器;
6-透射檢測(cè)器;7-計(jì)算機(jī);8-USB數(shù)據(jù)采集通訊部分
由于我們使用的是基于電荷耦合器件(CCD)的多通道近紅外光譜儀,這類儀器掃描光譜速度快,一般單張光譜的掃描速度只有幾十毫秒,所以對(duì)CCD信號(hào)的采集和傳輸速度有比較高的要求,為滿足這些速度要求所以采用USB接口方式取代原來的并口通訊方式。同時(shí)為了適應(yīng)現(xiàn)代儀器的小型化和通用化,儀器和計(jì)算機(jī)的連接也要求我們選擇USB接口總線,從而實(shí)現(xiàn)光譜數(shù)據(jù)的高速采集和傳輸,并完成谷物品質(zhì)的快速檢測(cè)。
二、系統(tǒng)設(shè)計(jì)
該系統(tǒng)可對(duì)4路模擬信號(hào)進(jìn)行不間斷采集,輸入信號(hào)范圍-10V~+10V,AD轉(zhuǎn)換位數(shù)16位。設(shè)計(jì)多通道數(shù)據(jù)采集目的,為了實(shí)現(xiàn)多通道的差分信號(hào)采集來補(bǔ)償溫度等其它因素產(chǎn)生的噪聲。由于溫度的變化對(duì)CCD有很大的影響,所以系統(tǒng)采用了兩個(gè)CCD,每?jī)陕穼?duì)同一個(gè)CCD進(jìn)行差分采集。其中一個(gè)CCD作為光譜掃描,另一個(gè)放置和前一個(gè)相鄰的位置用作差分補(bǔ)償。通過多通道差分補(bǔ)償能提高系統(tǒng)的性能,從而保證測(cè)量的準(zhǔn)確性。
該采集系統(tǒng)總體框架為主機(jī)(能支持USB2.0計(jì)算機(jī))、內(nèi)部包含CPU及FIFO高速緩存的USB接口控制芯片F(xiàn)X2和高速模數(shù)轉(zhuǎn)換器(ADS7825)。系統(tǒng)分為硬件設(shè)計(jì)和軟件設(shè)計(jì)兩部分。其中硬件設(shè)計(jì)主要是以ADS7825為核心的數(shù)據(jù)采集單元和以FX2為核心的USB接口單元兩部分。軟件可分為三部分:采用Keil C51語言編寫的FX2的芯片固件程序、Visual C++編寫的USB設(shè)備驅(qū)動(dòng)程序和上位機(jī)Win32應(yīng)用程序。下面分別介紹數(shù)據(jù)采集的軟硬件設(shè)計(jì)部分。
2.1 硬件設(shè)計(jì)
硬件設(shè)計(jì)主要是實(shí)現(xiàn)數(shù)據(jù)采集單元和USB數(shù)據(jù)傳輸單元電路設(shè)計(jì)。其數(shù)據(jù)傳輸為控制信號(hào)和采集數(shù)據(jù)??刂菩盘?hào)方向?yàn)橹鳈C(jī)到外設(shè)(OUT),數(shù)據(jù)量較??;采集到的數(shù)據(jù)由外設(shè)到主機(jī)(IN),數(shù)據(jù)量較大。系統(tǒng)基本操作過程為:主機(jī)給外設(shè)一個(gè)采樣控制信號(hào)CLK;A/D轉(zhuǎn)換完成的數(shù)據(jù)直接進(jìn)入CY7C68013的內(nèi)部端點(diǎn)FIFO,當(dāng)FIFO容量達(dá)到指定程度后,自動(dòng)將數(shù)據(jù)打包傳送給USB總線,主機(jī)進(jìn)行接收,保證有較高的傳輸速度。
1 數(shù)據(jù)采集模塊[1]
數(shù)據(jù)采集模塊主要實(shí)現(xiàn)以ADS7825為核心對(duì)4路模擬輸入信號(hào)進(jìn)行AD轉(zhuǎn)換。ADS7825是BB公司生產(chǎn)的高性能模數(shù)轉(zhuǎn)換器件,它具有4路模擬輸入通道,5V單電源供電,16位并行輸出等獨(dú)特性能。
其工作原理,在此著重介紹ADS7825在并行輸出方式下的工作過程,如下圖2所示為其并行輸出時(shí)電路原理圖。在并行輸出方式下,啟動(dòng)初始化過程是由R/C(pin22)腳變?yōu)榈碗娖讲⒅辽俦3?0ns開始,啟動(dòng)轉(zhuǎn)換。BUSY(pin24)腳變?yōu)榈碗娖?,并保持到?shù)據(jù)轉(zhuǎn)換和數(shù)據(jù)輸出寄存器刷新完畢。如果BYTE(pin21)腳為低電平,在BUSY的上升沿,觸發(fā)輸出信號(hào)的高8位數(shù)字;相反,若BYTE腳為高電平,輸出信號(hào)的低8位數(shù)字。最終轉(zhuǎn)換的數(shù)據(jù)以完全二進(jìn)制數(shù)字格式輸出。REF是外部參考電壓輸入端或內(nèi)部參考2.5V電壓輸出端。此引腳應(yīng)與一個(gè)2.2μF電容相連,并與REF腳的輸出阻抗構(gòu)成一個(gè)低通濾波器濾過帶限噪聲。CAP為內(nèi)部參考電壓的緩沖輸出端,也應(yīng)與一個(gè)2.2μF電容相連,在ADS7825的轉(zhuǎn)換周期內(nèi),這樣連接可提供給內(nèi)置D/A轉(zhuǎn)換器最佳的轉(zhuǎn)換寫入電流,同時(shí)對(duì)緩沖輸出也是一種補(bǔ)償。另外,在BUSY為低電平期間,不再接受新的轉(zhuǎn)換指令。ADS7825在并行輸出模式情況下,根據(jù)通道選擇方式的不同,還可以分為連續(xù)轉(zhuǎn)換方式和可編程通道選擇方式。在CS、R/C和PWRD同時(shí)接低電平的情況下,若CONTC(pin25)腳為高電平時(shí),ADS7825處于連續(xù)轉(zhuǎn)換工作模式。此時(shí),ADS7825將按順序連續(xù)采集和轉(zhuǎn)換4路通道中的信號(hào);而在CONTC變?yōu)楦唠娖街埃?dāng)前通道號(hào)就相應(yīng)存入A0和A1通道選擇的寄存器中,也就是說在連續(xù)轉(zhuǎn)換模式下(即CONTCE為HIGH),A0和A1為輸出端。對(duì)于前一個(gè)通道來說,輸出數(shù)據(jù)BUSY在跳變?yōu)楦唠娖綍r(shí)變?yōu)橛行АA硗猓恳淮无D(zhuǎn)換結(jié)束,BUSY要跳變?yōu)楦唠娖綍r(shí),A0和A1能夠輸出將要轉(zhuǎn)換信號(hào)的通道號(hào)。
在可編程通道選擇方式下,模擬輸入通道的選擇是由程序控制指令完成的。控制器發(fā)出數(shù)據(jù)轉(zhuǎn)換指令和要轉(zhuǎn)換的通道號(hào),通過片選信號(hào)與A0和A1端譯碼選擇需要的模擬通道,此時(shí)A0和A1為數(shù)據(jù)通道選擇輸入端。在完成數(shù)據(jù)通道的選擇之后,后續(xù)各引腳的工作過程與連續(xù)轉(zhuǎn)換方式下的情況類似。
圖2. ADS7825并行輸出電路原理圖
圖3. CY7C68013和ADS7825連接原理圖
2 USB接口單元
USB接口單元的主要實(shí)現(xiàn)芯片是Cypress公司的CY7C68013,負(fù)責(zé)完成硬件系統(tǒng)和PC上位機(jī)之間的數(shù)據(jù)傳輸。Cypress公司的EZ-USB FX2系列芯片是世界上第一個(gè)集成USB2.0協(xié)議的微處理器,它支持12Mb/s的全速傳輸和480Mb/s的高速傳輸,可使用4種USB傳輸方式:控制傳輸、中斷傳輸、塊傳輸和同步傳輸,完全適用于USB2.0,并向下兼容USB1.1。其CPU采用增強(qiáng)型8051,它比標(biāo)準(zhǔn)8051的速度更快、功能更強(qiáng),且指令集和標(biāo)準(zhǔn)8051完全兼容,并可使用C51編譯器。FX2內(nèi)部包含8.5KB的RAM,它們兼做程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器,增強(qiáng)型8051的固件代碼就存儲(chǔ)在該區(qū)域內(nèi),F(xiàn)X2也具有I2C總線,以使其能從外部EEPROM中下載芯片程序。另外,F(xiàn)X2系列芯片采用3.3V供電,且可使用USB總線電源,但是功耗較大。 [2]
本系統(tǒng)中使用CY7C68013的PA0-PA6管腳作為AD工作狀態(tài)的控制信號(hào),以決定ADS7825數(shù)據(jù)采集和存儲(chǔ),PB0-PB7為8位數(shù)據(jù)總線根據(jù)工作狀態(tài)進(jìn)行高低8位的數(shù)據(jù)傳輸。如圖3所示為CY7C68013和ADS7825連接原理圖。
2.2 軟件程序的編寫
軟件程序包括包括三部分,芯片固件程序、驅(qū)動(dòng)程序、上位機(jī)Win32應(yīng)用程序。
1 芯片固件程序
CY7C68013芯片固件程序負(fù)責(zé)PC發(fā)來的各種USB請(qǐng)求,以完成主機(jī)與外圍電路間的數(shù)據(jù)傳輸。該固件框架使用Keil C51 C編寫,其中使用了許多Keil C對(duì)標(biāo)準(zhǔn)C的擴(kuò)展。固件框架主要包含初始化、處理標(biāo)準(zhǔn)USB設(shè)備請(qǐng)求以及USB掛起時(shí)的電源管理。
框架完成了一個(gè)簡(jiǎn)單的任務(wù)循環(huán)(見圖4)。首先框架初始化內(nèi)部的狀態(tài)變量,然后條用用戶初始化函數(shù)TD_Init。從該函數(shù)返回后,框架初始化USB接口到未配置狀態(tài)并使能中斷。然后每隔1s進(jìn)行一次設(shè)備重枚舉,直到端點(diǎn)0接收到一個(gè)SETUP包。一旦檢測(cè)到SETUP包,框架將開始交互的任務(wù)調(diào)度,其任務(wù)調(diào)度的步驟如下:
①調(diào)用用戶函數(shù)TD_Poll,實(shí)現(xiàn)數(shù)據(jù)采集。
②判斷是否有標(biāo)準(zhǔn)設(shè)備請(qǐng)求等待處理,如果有,則分析該請(qǐng)求并響應(yīng);其中,DR_VendorCmnd函數(shù)負(fù)責(zé)處理上位機(jī)發(fā)出的供應(yīng)商定義請(qǐng)求,通過上位機(jī)發(fā)送請(qǐng)求來控制AD采集的開始和結(jié)束。
③判斷USB內(nèi)核是否收到USB掛起信號(hào)。如果收到,則調(diào)用用戶函數(shù)TD_Suspend。從該函數(shù)成功返回后,再檢測(cè)是否發(fā)生USB喚醒事件。如果未檢測(cè)到,則處理器進(jìn)入掛起方式;如果檢測(cè)到,則調(diào)用用戶函數(shù)TD_Resume,程序繼續(xù)運(yùn)行。如果從TD_Suspend函數(shù)返回FALSE,則程序繼續(xù)運(yùn)行。
圖4. 固件程序流程圖
圖5. 驅(qū)動(dòng)程序流程圖
2 USB驅(qū)動(dòng)程序和應(yīng)用程序的開發(fā)
GPD(General Purpose Driver)是一個(gè)通用目的的設(shè)備驅(qū)動(dòng)程序,是應(yīng)用程序與EZ-USB 外設(shè)進(jìn)行通信的橋梁。EZ-USB的GPD 代碼Cypress公司提供原型,用戶可以在此基礎(chǔ)上生成定制驅(qū)動(dòng)程序。
1)定制驅(qū)動(dòng)程序的生成
采用Cypress 提供的GPD,由于GPD 只能執(zhí)行一些標(biāo)準(zhǔn)的USB 設(shè)備請(qǐng)求和數(shù)據(jù)傳輸,
不能滿足用戶特定外設(shè)的需要,需進(jìn)行擴(kuò)充以生成用戶定制驅(qū)動(dòng)程序。對(duì)GPD 中的EZUSBSYS. C,EZUSBSYS. H,SOURCES 進(jìn)行修改,再在WindowsDDK 與VC ++ 6. 0 下利用Build 命令重新編譯即可生成用戶定制驅(qū)動(dòng)程序。
2)設(shè)備驅(qū)動(dòng)程序與應(yīng)用程序的接口
設(shè)備驅(qū)動(dòng)程序介于硬件與用戶應(yīng)用軟件之間。用戶可以以一種規(guī)范的方式調(diào)用Win32API函數(shù)訪問硬件,而不必考慮如何控制硬件。為了方便人們開發(fā)新的驅(qū)動(dòng)程序,Windows已經(jīng)自帶了一些類驅(qū)動(dòng)程序,用戶只需要在這些類驅(qū)動(dòng)程序的基礎(chǔ)上編寫功能驅(qū)動(dòng)程序來實(shí)現(xiàn)特定的功能。圖5給出了驅(qū)動(dòng)程序的調(diào)用流程,可以清楚地看到功能驅(qū)動(dòng)程序所處的層次。
開發(fā)過程中主要是了解應(yīng)用程序中如何調(diào)用驅(qū)動(dòng)提供的接口函數(shù)。用戶應(yīng)用程序通過
I / O 控制調(diào)用訪問EZ-USB 設(shè)備驅(qū)動(dòng)程序達(dá)到控制USB 設(shè)備的目的,應(yīng)用程序首先通過調(diào)用Win32函數(shù)CreateFile來取得訪問設(shè)備驅(qū)動(dòng)程序的句柄,再利用Win32函數(shù)DeviceIoControl對(duì)設(shè)備進(jìn)行I / O 控制。
(1) 獲取設(shè)備句柄。
EZ-USB 設(shè)備驅(qū)動(dòng)程序可以與多個(gè)EZ-USB 設(shè)備通信。每一個(gè)連接到主機(jī)的EZ-USB 設(shè)備,驅(qū)動(dòng)程序都為它創(chuàng)建一個(gè)形如Ezusb-i(i從0遞增)的鏈接符。Win32 函數(shù)CreateFile以設(shè)備鏈接符為參數(shù)獲取第i個(gè)Ezusb設(shè)備的句柄。通過CreateFile函數(shù)獲取USB 設(shè)備句柄后,再利用I / O控制來處理設(shè)備的I / O 請(qǐng)求。[2]
(2) 設(shè)備I / O 控制
應(yīng)用程序通過Win32 函數(shù)DeviceIoControl向設(shè)備驅(qū)動(dòng)程序發(fā)送I / O 請(qǐng)求。DeviceIoControl函數(shù)通過I / O 控制碼(IOCTRL)及其他輔助參數(shù)向設(shè)備驅(qū)動(dòng)程序發(fā)送特定的I / O 請(qǐng)求并返回操作結(jié)果,來實(shí)現(xiàn)數(shù)據(jù)或控制命令的傳輸。[2]
3.2.3 Win32應(yīng)用程序
上位機(jī)應(yīng)用程序主要負(fù)責(zé)讀取硬件所輸出的數(shù)據(jù)采集結(jié)果并向下發(fā)送控制指令,而且能存儲(chǔ)和顯示采集到的波形。Win32程序使用VC++6.0實(shí)現(xiàn),通過USB中斷或塊傳輸來讀取AD采集結(jié)果,采樣速度可以達(dá)到20K。
五、結(jié)速語
本文通過介紹ADS7825和EZ-USB FX2芯片的特點(diǎn)及相關(guān)的軟硬件基本開發(fā)過程,闡述了實(shí)現(xiàn)光譜數(shù)據(jù)采集系統(tǒng)的全過程。筆者根據(jù)上文提到方法設(shè)計(jì)了硬件并編寫了相應(yīng)的固件程序、驅(qū)動(dòng)程序和應(yīng)用程序,在實(shí)際應(yīng)用中已獲得正常使用。