基于嵌入式技術(shù)的智能儀器觸摸屏接口設(shè)計(jì)
研究開(kāi)發(fā)了嵌入式智能儀器的觸摸屏接口; 分析了電阻式觸摸屏的工作原理; 設(shè)計(jì)了觸摸屏與微處理器的接口電路; 開(kāi)發(fā)了嵌入式L inux框架下的觸摸屏設(shè)備驅(qū)動(dòng)程序; 闡述了采用觸摸屏作為輸入的MiniGU I應(yīng)用程序的編寫方法。
設(shè)計(jì)的觸摸屏接口已成功應(yīng)用在故障診斷儀器產(chǎn)品上, 增強(qiáng)了儀器的人機(jī)交互功能, 方便了現(xiàn)場(chǎng)操作人員使用。
0 引言
在現(xiàn)代化生產(chǎn)中, 為了確保機(jī)械設(shè)備安全可靠地運(yùn)行, 通常要采用適宜的儀器儀表, 利用故障診斷技術(shù)及時(shí)發(fā)現(xiàn)故障, 并采取合理的維修或保護(hù)措施來(lái)排除故障, 預(yù)防和避免事故的發(fā)生?;趯?duì)儀器尺寸、便攜性和操作方便性的考慮, 在工業(yè)領(lǐng)域如煤炭、鋼鐵、冶金、電力、化工等行業(yè)中大量的儀器儀表和設(shè)備, 都逐漸選用觸摸屏作為系統(tǒng)的輸入設(shè)備。
針對(duì)這一情況, 作者在開(kāi)發(fā)面向機(jī)械故障診斷的智能儀表過(guò)程中, 對(duì)觸摸屏輸入接口進(jìn)行了研究。設(shè)計(jì)了四線電阻式觸摸屏與PXA255 處理器的接口電路, 分析了Linux框架下的字符設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)原理, 完成了觸摸屏的接口驅(qū)動(dòng)程序開(kāi)發(fā), 并設(shè)計(jì)了用觸摸屏作為輸入設(shè)備的MiniGU I用戶程序。觸摸屏作為儀器的輸入設(shè)備, 人機(jī)交互直截了當(dāng), 大大方便了現(xiàn)場(chǎng)操作人員的使用。
1 硬件結(jié)構(gòu)和工作原理
依據(jù)工作原理和傳輸介質(zhì)的不同, 觸摸屏主要分電阻式、電容式、紅外線式以及表面聲波式等多種類型。電阻式觸摸屏是一塊4層透明的復(fù)合薄膜屏,如圖1所示。下面是玻璃或有機(jī)玻璃構(gòu)成的基層; 上面是一層外表面經(jīng)過(guò)硬化處理從而光滑防刮的塑料層; 中間是兩層金屬導(dǎo)電層, 在導(dǎo)電層之間有許多細(xì)小的透明隔離點(diǎn)把兩層隔開(kāi)。兩個(gè)金屬導(dǎo)電層是觸摸屏的工作面, 其兩端各涂有一條銀膠, 稱為觸摸屏工作面的一對(duì)電極。四線式觸摸屏的X 工作面和Y 工作面分別加在兩個(gè)導(dǎo)電層上, 共有4根引出線, 分別連到觸摸屏的X 電極對(duì)和Y 電極對(duì)上。在觸筆觸摸屏幕時(shí), 兩導(dǎo)電層在接觸點(diǎn)處接觸。電阻式觸摸屏作為輸入設(shè)備與顯示屏配合使用時(shí), 其工作的實(shí)質(zhì)就是通過(guò)測(cè)量X、Y兩個(gè)方向電阻的分壓, 確定觸摸屏的觸點(diǎn)坐標(biāo), 并將該坐標(biāo)映射到顯示屏坐標(biāo)上, 從而實(shí)現(xiàn)人機(jī)交互。由于電阻式觸摸屏工作面與外界完全隔離, 受環(huán)境影響小, 所以具有不怕灰塵和水汽、穩(wěn)定性高、不漂移等優(yōu)點(diǎn), 特別適合工業(yè)現(xiàn)場(chǎng)使用。
圖1 電阻式觸摸屏結(jié)構(gòu)
在設(shè)計(jì)過(guò)程中, 選用ADS7843 作為觸摸屏接口的AD轉(zhuǎn)換芯片,它具有12 位的轉(zhuǎn)換精度, 最大支持4 096 ×4 096點(diǎn)陣的LCD, 滿足儀器設(shè)計(jì)要求。
儀器系統(tǒng)處理器選用Intel Xscale架構(gòu)的PXA255處理器,用其GPIO口模擬SPI接口與ads7843進(jìn)行通信。其接口原理如圖2所示。ADS7843完成采集通道的切換和接觸點(diǎn)處電壓的采集, 其操作時(shí)序主要由控制字輸入、電壓采集和模數(shù)轉(zhuǎn)換組成, 詳見(jiàn)參考文獻(xiàn)。只要在驅(qū)動(dòng)程序中根據(jù)時(shí)序要求向D IN口發(fā)送控制字, 即可從DOUT處得到相應(yīng)通道的采集結(jié)果。
圖2 ADS7843與PXA255的接口電路
2 觸摸屏接口驅(qū)動(dòng)程序
Linux驅(qū)動(dòng)程序是系統(tǒng)內(nèi)核的一部分, 它把軟件和硬件分離開(kāi)來(lái), 并向上提供應(yīng)用程序訪問(wèn)硬件的通信接口, 向下管理保護(hù)系統(tǒng)硬件。觸摸屏在Linux下被定義為字符設(shè)備, 其驅(qū)動(dòng)主要完成觸點(diǎn)電壓的采集, 并向用戶空間傳遞X 坐標(biāo)、Y坐標(biāo)和筆動(dòng)作(按下、抬起或拖拽) 數(shù)據(jù)。當(dāng)觸筆按下時(shí), ADS7843的11腳輸出低電平, 觸發(fā)PXA255通用IO口的12腳產(chǎn)生外部中斷, 開(kāi)啟定時(shí)器, 實(shí)現(xiàn)觸摸屏的動(dòng)作。觸摸屏的驅(qū)動(dòng)流程如圖3所示。
圖3 觸摸屏驅(qū)動(dòng)程序結(jié)構(gòu)流程
2.1 驅(qū)動(dòng)的編寫
觸摸屏驅(qū)動(dòng)在Linux框架下屬于字符設(shè)備驅(qū)動(dòng)。
驅(qū)動(dòng)的入口函數(shù)為ads7843 _ ts_ init , 在該函數(shù)中,初始化I/O口, 注冊(cè)筆中斷和設(shè)備節(jié)點(diǎn), 完成設(shè)備文件系統(tǒng)創(chuàng)建標(biāo)準(zhǔn)字符設(shè)備的初始化工作[ 8 - 10 ].觸摸屏設(shè)備操作的結(jié)構(gòu)通過(guò)ads7843_ts_fop s定義。
STatic struct file_operatiONs ads7843_ts_fop s = {
read: ads7843_ts_read,
poll: ads7843_ts_poll,
ioctl: ads7843_ts_ioctl,
fasync: ads7843_ts_fasync,
open: ads7843_ts_open,
release: ads7843_ts_release,
};
這樣, 只需根據(jù)實(shí)際需要正確定義該結(jié)構(gòu)中的幾個(gè)函數(shù)過(guò)程, 就可完成設(shè)備驅(qū)動(dòng)的開(kāi)發(fā)。
當(dāng)觸摸屏設(shè)備被打開(kāi)時(shí), 首先執(zhí)行到ads7843_ts_open 函數(shù), 并在該函數(shù)中, 初始化一個(gè)緩沖區(qū), 用于存儲(chǔ)坐標(biāo)數(shù)據(jù)。在觸摸屏被按下后, 系統(tǒng)首先觸發(fā)中斷, 在ads7843_ts_interrup t 中斷程序中, 判斷in_timehandle全局變量的狀態(tài), in_ timehandle在定時(shí)器函數(shù)中被改變, 也就是說(shuō)進(jìn)入中斷后, 先經(jīng)過(guò)定時(shí)器延時(shí)20ms, 完成觸摸屏的軟件去抖, 再判斷觸摸屏是否被按下。然后通過(guò)read_xy 函數(shù)分別切換至X和Y 通道, 完成觸點(diǎn)電壓的AD轉(zhuǎn)換, 并讀取12 位坐標(biāo)值。
static void ads7843_ ts_ interrup t ( int IRq, void 3 dev_ id,
struct p t_regs3 regs)
{
sp in_lock_irq (&tsdevlock) ;
if ( in_timehandle > 0)
{
sp in_unlock_irq (&tsdevlock) ;
return;
}
disable_irq ( IRQ_GPIO_ADS7843) ;
ads7843_ts_starttimer ;
sp in_unlock_irq (&tsdevlock) ;
}
應(yīng)用程序調(diào)用read 函數(shù)時(shí), 進(jìn)入驅(qū)動(dòng)的ads7843_ts_read 接口函數(shù)。在該接口函數(shù)中獲取采樣結(jié)果, 判斷是否要對(duì)坐標(biāo)進(jìn)行校準(zhǔn), 將最終結(jié)果寫入到緩沖區(qū)中, 并通過(guò)copy_to_user 函數(shù)將其從內(nèi)核空間復(fù)制到用戶空間, 以使應(yīng)用程序能夠使用。在ads7843_ts_read 函數(shù)中采用了非阻塞型操作, 使得在沒(méi)有數(shù)據(jù)到達(dá)的時(shí)候立即返回, 然后用異步觸發(fā)fasync 來(lái)通知數(shù)據(jù)的到來(lái)。ads7843 _ ts_poll 函數(shù)用于驅(qū)動(dòng)程序的非阻塞操作, ads7843_ts_fasync 函數(shù)用于驅(qū)動(dòng)異步觸發(fā)。ads7843_ts_ioctl 函數(shù)中, 提供了可從用戶態(tài)控制的參數(shù), 如觸摸屏是否在驅(qū)動(dòng)中校準(zhǔn)、屏幕的最大最小坐標(biāo)值等。ads7843_ts_release( )函數(shù)用來(lái)關(guān)閉觸摸屏設(shè)備。
2.2 觸摸屏的校準(zhǔn)
在儀器開(kāi)發(fā)過(guò)程中,觸摸屏作為輸入設(shè)備與LCD配合使用。為了能使從觸摸屏采樣得到坐標(biāo)與屏幕的顯示坐標(biāo)對(duì)應(yīng), 還需要做一個(gè)映射, 也就是要對(duì)觸摸屏進(jìn)行校準(zhǔn)。如圖4所示, 所用的觸摸屏和液晶屏都是標(biāo)準(zhǔn)的矩形, 只要安裝合理, 可以認(rèn)為觸摸屏的X 方向坐標(biāo)只與顯示屏X 方向相關(guān), Y方向坐標(biāo)只與顯示屏的Y方向相關(guān)。假設(shè)顯示屏的分辨率是W ×H, 顯示區(qū)域的左上角對(duì)應(yīng)的觸摸屏采樣坐標(biāo)是( x1 , y1 ) ,右下角對(duì)應(yīng)的坐標(biāo)是( x2 , y2 ) , 那么觸摸屏上任意一點(diǎn)采樣坐標(biāo)( x, y) 與顯示屏坐標(biāo)( xd , yd ) 的對(duì)應(yīng)關(guān)系可以按照如下公式計(jì)算:
這樣, 在測(cè)得( x1 , y1 ) 和( x2 , y2 ) 點(diǎn)觸摸屏的采樣值后, 利用上述公式編制校準(zhǔn)函數(shù), 在觸摸屏工作的過(guò)程中, 計(jì)算出實(shí)際觸摸點(diǎn)對(duì)應(yīng)的顯示坐標(biāo),完成觸摸屏的校準(zhǔn)。
圖4 觸摸屏的校準(zhǔn)
3 觸摸屏用戶應(yīng)用程序
創(chuàng)建的Linux設(shè)備文件系統(tǒng)觸摸屏節(jié)點(diǎn)為/dev/ts.在應(yīng)用程序中, 可以像打開(kāi)文件一樣用open函數(shù)打開(kāi)設(shè)備文件, 然后用read 函數(shù)讀取由驅(qū)動(dòng)傳遞到用戶空間的數(shù)據(jù)。儀器應(yīng)用程序的開(kāi)發(fā)采用MiniGU I進(jìn)行, MiniGU I是由北京飛漫公司開(kāi)發(fā), 可應(yīng)用于實(shí)時(shí)嵌入式系統(tǒng)中的輕量級(jí)圖形用戶界面支持系統(tǒng)。其函數(shù)接口與Windows SDK類似, 開(kāi)發(fā)方便。
MiniGU I的輸入抽象層( IAL: Input Abstract Layer)提供了對(duì)觸摸屏、鼠標(biāo)等輸入設(shè)備的豐富支持, 并支持PXA255處理器平臺(tái)。只要經(jīng)過(guò)簡(jiǎn)單的設(shè)置就可以在應(yīng)用程序中使用觸摸屏。配置安裝MiniGU I時(shí), 使用22enable2px255bial項(xiàng), 由于在安裝MiniGU I時(shí)采用了內(nèi)嵌資源的靜態(tài)編譯方式, 所以在編譯之前, 需在MiniGU I的src / sysres/目錄下建立mgetc2pxa1c 文件,并在其中用下面語(yǔ)句設(shè)置系統(tǒng)參數(shù), 將觸摸屏設(shè)為輸入設(shè)備。
static char * SYSTEM_VALUES[ ] = { " fbcon" ," PX255B" , " /dev/ ts" , " none" };
MiniGU I對(duì)觸摸屏輸入的處理方式如圖5 所示。
圖5 MiniGU I中的觸摸屏輸入
MiniGU I通過(guò)觸摸屏設(shè)備驅(qū)動(dòng)程序接收原始的輸入數(shù)據(jù), 把它轉(zhuǎn)換為MiniGU I抽象的觸摸屏事件和數(shù)據(jù)。
相關(guān)的底層事件處理例程把這些觸摸事件轉(zhuǎn)換為上層的觸摸消息, 放到相應(yīng)的消息隊(duì)列中。應(yīng)用程序通過(guò)消息循環(huán)獲取這些消息, 交由窗口過(guò)程處理。編制針對(duì)觸摸屏的應(yīng)用程序時(shí), 需要做的只是在窗口接收到諸如MSG _LBUTTONDOWN 等觸屏消息時(shí), 調(diào)用相應(yīng)的語(yǔ)句, 完成預(yù)期操作。
4 結(jié)論
嵌入式智能儀器觸摸屏接口增強(qiáng)了儀器系統(tǒng)的人機(jī)交互功能, 方便了操作人員的使用; 接口電路和驅(qū)動(dòng)程序的模塊化方便了儀器的后續(xù)改進(jìn)和新產(chǎn)品的開(kāi)發(fā), 并可根據(jù)需要移植應(yīng)用到各種不同場(chǎng)合。設(shè)計(jì)的觸摸屏接口已經(jīng)成功應(yīng)用在故障診斷巡檢儀器中, 其工作穩(wěn)定, 運(yùn)行可靠, 具有很好的實(shí)用價(jià)值。