周海峰,李 俊,劉 嘉,陳 波
(南京工業(yè)大學(xué)自動化與電氣工程學(xué)院,江蘇南京 211816)
現(xiàn)代工業(yè)自動化控制中現(xiàn)場采集的信號多為模擬信號,而處理器不能直接處理模擬信號,因此就需要將模擬信號轉(zhuǎn)換成數(shù)字信號以供處理器處理[1]。AD7606是一個8通道16位AD轉(zhuǎn)換芯片可采用并口、SPI口與處理器進(jìn)行數(shù)據(jù)通信。嵌入式Linux是一款開源的操作系統(tǒng),在ARM處理器中移植嵌入式Linux操作系統(tǒng)并進(jìn)行AD的驅(qū)動編程可提高嵌入式系統(tǒng)數(shù)據(jù)采集精度,提高處理器資源利用率,增強(qiáng)系統(tǒng)可擴(kuò)展性。
本設(shè)計中AD轉(zhuǎn)換芯片采用AD7606,它是一款8通道16位同步采樣模數(shù)轉(zhuǎn)換器,可處理±10 V、±5 V雙極性輸入型號,提供16位/8位并口總線和SPI串行數(shù)據(jù)總線與處理器數(shù)據(jù)交換。處理器采用S3C2440,為32位精簡指令集(RISC)微處理器,基于ARM920T核心,低功耗、簡單、精致且全靜態(tài)設(shè)計。系統(tǒng)接線如圖1所示。
(1)OS為過采樣倍率引腳,可根據(jù)實際需求選擇無過采樣、2倍過采樣、4倍過采樣、8倍過采樣等,將3個OS引腳與ARM的GPIO口引腳相連,來控制采樣模式。
(2)RAGE為量程范圍選擇引腳,當(dāng)RAGE引腳電平拉低表示信號輸入范圍、±5 V,反之要求信號輸入范圍為±10V。
(3)CONVSTA、B為啟動轉(zhuǎn)換開始控制腳,和ARM的GPB1腳相連,定時觸發(fā)AD芯片啟動轉(zhuǎn)換。
圖1 系統(tǒng)框圖
(4)片選信號CS和RD信號與ARM的nGCS2相連,來控制轉(zhuǎn)換數(shù)據(jù)結(jié)果的讀取控制。
(5)BUSY引腳接ARM的EINT1以中斷方式觸發(fā)ARM讀取轉(zhuǎn)換結(jié)果。
(6)DB數(shù)據(jù)總線引腳和S3C2440的LDATA總線相連。
由于Linux操作系統(tǒng)開源代碼,支持的處理器品種多,具有可根據(jù)實際控制的需求對其進(jìn)行剪切的特點[2],其越來越多的被用于嵌入式中,加入Linux操作系統(tǒng)的嵌入式能更優(yōu)化的使用硬件資源,相比較于不加操作系統(tǒng)的嵌入式設(shè)備其性能更好擴(kuò)展性更高。本系統(tǒng)開發(fā)過程采用Linux的網(wǎng)路文件NFS系統(tǒng),可在計算機(jī)上面直接開發(fā)程序,調(diào)試過程直接通過網(wǎng)絡(luò)讀取硬盤上的內(nèi)核和文件系統(tǒng)可免去內(nèi)核制作燒錄Flash的麻煩。
設(shè)備驅(qū)動程序采用模塊化方式加載,由處理器定時觸發(fā)啟動轉(zhuǎn)換,AD轉(zhuǎn)換器8路模擬輸入信號完成模數(shù)轉(zhuǎn)換后將BUSY信號線拉低來觸發(fā)處理器執(zhí)行讀數(shù)據(jù)操作,處理器讀數(shù)據(jù)時將CS和RD信號線拉低,AD根據(jù)讀取觸發(fā)信號將數(shù)據(jù)送到數(shù)據(jù)引腳,處理器讀取數(shù)據(jù)到內(nèi)存。
2.1.1 模塊加載和卸載
Linux采用模塊機(jī)制加載和卸載驅(qū)動程序,可以在加入新驅(qū)動程序的時候不用重新編譯內(nèi)核[3],另外在運(yùn)行的過程中不需要用的設(shè)備驅(qū)動可以不加入內(nèi)存運(yùn)行,當(dāng)需要調(diào)用設(shè)備時候再由處理器調(diào)度加入內(nèi)存,這樣可大大提高設(shè)備的系統(tǒng)性能[4]。當(dāng)執(zhí)行輸入模塊加載指令時候,模塊初始化函數(shù)module_init()被調(diào)用,當(dāng)調(diào)用rmmod命令時候移除模塊,此時操作系統(tǒng)調(diào)用module_exit()模塊移除函數(shù)。
(1)注冊模塊函數(shù)實現(xiàn)adcdev_init():
若注冊成功misc_register()函數(shù)返回0。根據(jù)需要可將外部設(shè)備連接到內(nèi)存地址空間上或者連接到I/O地址空間,對于嵌入式設(shè)備,內(nèi)存一般使用很少,而ARM處理器支持1G內(nèi)存空間,所以可以將外部設(shè)備接到多余內(nèi)存空間上,這樣可以使用訪問內(nèi)存方式來讀寫外設(shè)數(shù)據(jù),在調(diào)用read函數(shù)讀取數(shù)據(jù)前需將物理地址映射到虛擬地址,在此調(diào)用ioremap()函數(shù)來實現(xiàn)。
(2)卸載模塊函數(shù)實現(xiàn)adcdev_exit():
調(diào)用雜設(shè)備注銷函數(shù)實現(xiàn)模塊移除。
2.1.2 file_operations結(jié)構(gòu)體
主要用來存儲驅(qū)動模塊提供的對設(shè)備進(jìn)行各種操作的函數(shù)的指針。該結(jié)構(gòu)體的各個域都對應(yīng)驅(qū)動模塊用來處理用戶層每個被請求的函數(shù)的地址,其實現(xiàn)如下。
例如當(dāng)上層應(yīng)用軟件調(diào)用open()函數(shù)打開設(shè)備時候,驅(qū)動程序便會調(diào)用驅(qū)動程序的adcdev_open()函數(shù)返回打開的文件節(jié)點。
2.1.3 設(shè)備打開接口函數(shù)
該函數(shù)主要實現(xiàn)中斷的注冊和定時發(fā)送觸發(fā)信號和進(jìn)程的并發(fā)沖突。在上層多任務(wù)運(yùn)行的時候會出現(xiàn)同時訪問同一個資源的時候,如果處理不好則會出現(xiàn)數(shù)據(jù)覆蓋甚至內(nèi)核奔潰的情況,因此在編寫驅(qū)動的時候加上互斥鎖[5],使得一個設(shè)備只能被一個進(jìn)程打開,在進(jìn)程結(jié)束之后釋放鎖以給其它進(jìn)程使用的機(jī)會,在open()函數(shù)中調(diào)用down_trylock(&lock)來查詢設(shè)備狀態(tài)是否可被用,若沒有被征用則獲得鎖,當(dāng)然在進(jìn)程結(jié)束后要在close()函數(shù)加入up(&lock)釋放鎖。
設(shè)置GPB1為PWM輸出引腳,并實現(xiàn)5kHZ的采用頻率,主要配置如下:
在open函數(shù)注冊中斷,設(shè)置為EINT1中斷輸入,中斷的實現(xiàn)函數(shù)為adcdev_interrupt(),中斷的觸發(fā)方式為下降沿觸發(fā)。
2.1.4 中斷服務(wù)函數(shù)
當(dāng)AD芯片轉(zhuǎn)換完后拉低BUSY引腳,從而觸發(fā)ARM的中斷響應(yīng),采用中斷避免了處理器不斷查詢導(dǎo)致的資源浪費,這樣處理器可以將時間片分配給其它進(jìn)程,提高了系統(tǒng)的運(yùn)行效率。聲明等待隊列以實現(xiàn)阻塞型輸入[6],在讀取完數(shù)據(jù)之后調(diào)用wake_up_interruptible()喚醒等待的進(jìn)程。
當(dāng)調(diào)用readw()時CS和RD引腳電平會被拉低,AD芯片會將AD轉(zhuǎn)化果從緩存區(qū)送到數(shù)據(jù)引腳。Linux下執(zhí)行著多個進(jìn)程,在中斷執(zhí)行的過程中如果有更高優(yōu)先級的中斷發(fā)生則會響應(yīng)更高級中斷可能會覆蓋一些變量[7],為了可靠性執(zhí)行中斷處理函數(shù)過程中需禁止其它中斷,在中斷服務(wù)函數(shù)中調(diào)用local_irq_disable()函數(shù)。
2.1.5 讀取AD轉(zhuǎn)換結(jié)果
Linux用戶層和內(nèi)核層分開,當(dāng)用戶層調(diào)用硬件讀取數(shù)值時候要通過調(diào)用copy_to_user()將數(shù)據(jù)傳送到用戶層。一般情況下在上層讀取數(shù)據(jù)而AD未轉(zhuǎn)換完時,進(jìn)程就會一直等待,直到AD轉(zhuǎn)換完并觸發(fā)中斷程序讀取數(shù)據(jù)后才能將數(shù)據(jù)讀到用空間[8],在此期間CPU還是會分配給該線程時間片,這樣就浪費了CPU的資源,因此在此采用阻塞的方式進(jìn)行讀取。建立等待隊列,在中斷函數(shù)響應(yīng)完后會喚醒等待讀取數(shù)據(jù)的進(jìn)程[9],該進(jìn)程在等待期間為睡眠狀態(tài),處理器可以將該睡眠狀態(tài)的進(jìn)程的時間片分給其它進(jìn)程以提高處理器多任務(wù)處理的能力。
在編寫驅(qū)動的同一目錄下編寫Makefile文件并執(zhí)行make命令,后將生成的adc.ko文件拷貝到網(wǎng)絡(luò)文件相關(guān)文件夾,開啟嵌入式系統(tǒng),到相關(guān)目錄執(zhí)行insmod adc.ko命令。
用戶空間在調(diào)用設(shè)備驅(qū)動讀取參數(shù)時候應(yīng)先調(diào)用open()函數(shù)打開設(shè)備找到相關(guān)文件節(jié)點[10],然后調(diào)用相關(guān)的讀寫控制函數(shù)進(jìn)行讀寫和控制。
將1號、5號通道加載3 V電,8號通道加載5 V電,其余通道接地,運(yùn)行應(yīng)用程序,將相關(guān)引腳接入示波器觀測AD轉(zhuǎn)換讀取狀態(tài),示波器波形如圖2所示,其中CH1為PWM啟動AD轉(zhuǎn)化信號,CH3為讀取信號,CH4為轉(zhuǎn)AD換完信號。
從圖2中可看出AD芯片在啟動轉(zhuǎn)換后正常發(fā)出轉(zhuǎn)換完標(biāo)志,CONVA,B信號觸發(fā)驅(qū)動程序中斷響應(yīng),中斷函數(shù)在接收到中斷信號后發(fā)出讀取8通道轉(zhuǎn)換結(jié)果信號。
圖2 數(shù)模轉(zhuǎn)換引腳信號顯示
在客戶端Linux操作系統(tǒng)輸入kermit啟動串口客戶端,接收嵌入式系統(tǒng)讀出的轉(zhuǎn)換結(jié)果如圖3所示。
圖3 數(shù)模轉(zhuǎn)換結(jié)果
現(xiàn)有的ARM處理器內(nèi)部雖然集成了AD轉(zhuǎn)換器但大多為10位或13位,在測量控制要求較高的場合利用外部AD可實現(xiàn)更高精度的數(shù)據(jù)采集。同時若在外部開發(fā)的嵌入設(shè)備中加入嵌入式Linux操作系統(tǒng)可使硬件資源得到優(yōu)化使用,且能提高系統(tǒng)的性能和擴(kuò)展性,同時可剪切的設(shè)計可大大降低設(shè)備的硬件要求。本系統(tǒng)外擴(kuò)了16位AD芯片,采用動態(tài)模塊方式編寫驅(qū)動,采用這種方式節(jié)省了內(nèi)存的使用空間,經(jīng)測式系統(tǒng)安全可執(zhí)行,有廣泛的應(yīng)用空間。
[1]李偉.基于專用信號采集設(shè)備的電路板故障診斷系統(tǒng)研究:[學(xué)位論文].武漢:武漢理工大學(xué),2012
[2]CORBET J,RUBINI A,HARTMAN G K.LINUX DEVICE DRIVER.3rd ed.United States of America:O'Reilly Media Inc,2005.
[3]陸爾東,鄧?yán)剑獾?,?Linux下的設(shè)備驅(qū)動及其管理機(jī)制.計算機(jī)應(yīng)用,2003(1):124-125.
[4]潘玲嬌.嵌入式16通道同步數(shù)據(jù)采集系統(tǒng)設(shè)計.儀表技術(shù)與傳感器,2013(11):91 -93.
[5]楊宗德.Linux高級程序設(shè)計.北京:人民郵電出版社,2008.
[6]LOVE R.Linux Kernel Development.3rd ed.United States of America:Addison - Wesley Professional,2010.
[7]張磊,王學(xué)慧.Linux內(nèi)核調(diào)試技術(shù).計算機(jī)工程,2003,29(10):81-83.
[8]陳鼐.基于ARM的嵌入式數(shù)據(jù)采集與處理系統(tǒng):[學(xué)位論文].南京:南京航空航天大學(xué),2007.
[9]顏庭柏,陳鐘榮.嵌入式系統(tǒng)數(shù)據(jù)采集和發(fā)布的構(gòu)建.計算機(jī)工程,2007,33(19):270 -272.
[10]艾紅,鄧大偉,鄺野.遠(yuǎn)程數(shù)據(jù)采集和監(jiān)測系統(tǒng)研究.自動化儀表,2012,33(8):31 -33.