摘要:給出S3C2410上觸摸屏的實現(xiàn)原理、硬件結(jié)構(gòu)和軟件程序;對軟件進行優(yōu)化,改進軟件濾波的實現(xiàn)方法。其算法使用C語言實現(xiàn),可移植到任何操作系統(tǒng)的觸摸屏驅(qū)動程序中。
引言
隨著個人數(shù)字助理(PDA)、瘦容戶機等的普及,觸摸屏作為終端與用戶交互的媒介,在我們的生活中使用得越來普遍。觸摸屏分為電阻式、電容式、聲表面波式和紅外線掃描式等類型,使用得最多的是4線電阻式觸摸屏。
本文以三星公司ARM9內(nèi)核芯片S3C2410觸摸屏接口為基礎(chǔ),通過外接4線電阻式觸摸屏構(gòu)成硬件基礎(chǔ)。在此基礎(chǔ)上,開發(fā)了觸摸屏面圖板程序。
1 觸摸屏原理
S3C2410接4線電阻式觸摸屏的電路原理如圖1所示。整個觸摸屏由模向電阻比和縱向電阻線組成,由nYPON、YMON、nXPON、XMON四個控制信號控制4個MOS管(S1、S2、S3、S4)的通斷。S3C2410有8個模擬輸入通道。其中,通道7作為觸摸屏接口的X坐標輸入(圖1的AIN[7]),通道5作為觸摸屏接口的Y坐標輸入(圖1的AIN[5])。電路如圖2所示。在接入S3C2410觸摸屏接口前,它們都通過一個阻容式低通濾器濾除坐標信號噪聲。這里的濾波十分重要,如果傳遞給S3C2410模擬輸入接口的信號中干擾過大,不利于后續(xù)的軟件處理。在采樣過程中,軟件只用給特殊寄存器置位,S3C2410的觸摸屏控制器就會自動控制觸摸屏接口打開或關(guān)閉各MOS管,按順序完成X坐標點采集和Y坐標點采集。
2 S3C2410觸摸屏控制器
S3C2410觸摸屏控制器有2種處理模式:
①X/Y位置分別轉(zhuǎn)換模式。觸摸屏控制器包括兩個控制階段,X坐標轉(zhuǎn)換階段和Y坐標轉(zhuǎn)換階段。
②X/Y位置自動轉(zhuǎn)換模式。觸摸屏控制器將自動轉(zhuǎn)換X和Y坐標。
本文使用X/Y位置自動轉(zhuǎn)換模式。
3 S3C2410觸摸屏編程
由于觸摸屏程序中參數(shù)的選取優(yōu)化需要多次試驗,而加入操作系統(tǒng)試驗參數(shù),每次編譯下載耗費時間過多,不易于試驗的進行,因而我們直接編寫裸機觸摸屏程序。三星公司開放了S3C2410測試程序2410test(可在三星網(wǎng)站下載),提供了觸摸屏接口自動轉(zhuǎn)換模式的程序范例ts_auto.c,見本刊網(wǎng)站www.dpj.com.cn。本文在此范例的基礎(chǔ)上編寫了觸摸屏畫圖板程序——在顯示屏上畫出觸摸筆的流走痕跡。
針對坐標點采樣時產(chǎn)生的噪聲,本文采用噪聲濾波算法,編寫了相應(yīng)的噪聲濾波程序,濾除干擾采樣點。整個觸摸屏畫圖板程序的處理流程如圖3所示。
3.1 程序初始化
初始化觸摸屏控制器為自動轉(zhuǎn)換模式。其中寄存器ADCDLY的值需要根據(jù)具體的試驗選取,可運行本文提供的程序看畫線的效果來選取具體的參數(shù)。觸摸屏中斷處理程序Adc_or_TsAuto是判斷觸摸屏是否被按下了。觸摸屏被按下,給全局變量Flag_Touch賦值為Touch_Down,否則賦值為Touch_Up。
初始化脈寬調(diào)制計時器(PWM TIMER),選擇計時器4為時鐘,定義10ms中斷1次,提供觸摸屏采樣時間基準,即10ms觸摸屏采樣1次。計數(shù)器中斷處理程序Timer4Intr中判斷Flag_Touch被賦值為Touch_Down,則給全局變量gTouchStartSample置位,以控制觸摸屏采樣。
之后清除觸摸屏中斷和計時器中斷屏蔽位,接受中斷響應(yīng),同時計時器開始計時。
3.2 觸摸屏采樣程序
如果gTouchStartSample為TRUE,觸摸屏接口開始對坐標X和Y的模擬量進行采樣,根據(jù)試驗選取適合的的采集次數(shù)。本文中使用9次采集,分別記入到ptx[TouchSample]和pty[TouchSample]數(shù)組中,TouchSample為采集次數(shù)。
為了減少運算量,將ptx[]和pty[]分別分三組取平均值,存儲在px[3]和py[3]中。這里以處理X坐標為例:
px[0]=(ptx[0]+ptx[1]+ptx[2])/3;
px[1]=(ptx[3]+ptx[4]+ptx[5])/3;
px[2]=(ptx[6]+ptx[7]+ptx[8])/3;
計算以上三組數(shù)據(jù)的差值:
dlXDiff0=px[0]-px[1];
dlXDiff1=px[1]-px[2];
dlXDiff2=px[2]-px[0];
然后對上述差值取絕對值,所得結(jié)果簡稱絕對差值:
dlXDiff0=dlXDiff0>0?dlXDiff0:-dlXDiff0;
dlXDiff1=dlXDiff1>0?dlXDiff1:-dlXDiff1;
dlXDiff2=dlXDiff2>0?dlXDiff2:-dlXDiff2;
判斷上述計算的色對差值是否都超過差值門限,如果這3個絕對差值都超過門限值,判定這次采樣點為野點,拋棄采樣點,程序返回等待下次采樣。其中的差值門限需要根據(jù)試驗測試得到,本文取值為2。
找出其中絕對差值最小的2組數(shù)據(jù),再將它們作平均,同時賦值給tmx:
if(dlXDiff0 if(dlXDiff2 tmx=((px[0]+px[2]>>1); } else{ tmx=((px[0]+px[1])>>1); } } else if(dlXDiff2 tmx=((px[0]+px[2])>>1); } else{ tmx=((px[1]+px[2])>>1); } Touch_CoordinateConversio(int*px){ TmpX=(tmx>=TOUCH_MAX_X)?(TOUCH_MAX_X):*px; TmpX-=TOUCH_MIN_X; TmpX=(TmpX)?TmpX:0; *px=(TmpX*TOUCH_X)/(TOUCH_MAX_X-TOUCH_MIN_X); } 3.3 坐標濾波程序 坐標濾波程序Touch_Pen_filtering,考慮人機界面中對觸摸屏的操作有3種: *觸摸筆在觸摸屏上的位置不變; *觸摸筆在觸摸屏上連續(xù)滑過; *觸摸筆在觸摸屏上有大幅度的跳躍。 假設(shè)三次連續(xù)采樣時刻為T1、T2、T3(T3>T2>T1),采樣間隔為10ms。由于采樣間隔遠小于人的反應(yīng)時間,所以在前兩種操作模式下,如果采樣點有效,將T1和T3時刻的采樣值作平均。其平均值和T2時刻的采樣值比較一般不會大于某個門限,否則判定此次采樣點為野點。而對于第三種模式下,采樣點數(shù)據(jù)會有很大的跳變。跳變過程中的數(shù)據(jù)是不穩(wěn)定的,雖然記入了數(shù)據(jù),但被判定成無效的采樣點,所以需要在程序中定義一個靜態(tài)數(shù)組x[2]記錄相鄰的兩次采樣數(shù)據(jù)。只有當前后數(shù)據(jù)持續(xù)穩(wěn)定一段時間,才認為這時的采樣點有效。程序中使用的間隔門限FILTER_LIMIT是需要經(jīng)過試驗來選取的。這里只給出X坐標的濾波過程。 //*px為T3時刻的采樣值,count是記錄連續(xù)有效采樣點次數(shù)的靜態(tài)變量,標志當前數(shù)據(jù)持續(xù)穩(wěn)定時間,一旦發(fā)現(xiàn)大于//FILTER_LIMIT,count的值又要從0開始計數(shù)。 Int Touch_Pen_filtering(int *px){ BOOL retVal; Static int count=0; count++; //如果連續(xù)有效采樣點次數(shù)大于2次,開始進行濾波算法 if(count>2){ count=2; //將T3時刻采樣值和T1時刻采樣值作平均 TmpX=(x[0]+*px)/2; //計算平均值和T2時刻采樣值的差值 dx=(x[1]>TmpX)?(x[1]-TmpX):(TmpX-x[1]); if((dx>FIL TER_LIMIT)){ *px=x[1]; retVal=FLASE; count=0; } //否則采樣點有效返回值為TRUE,將T3的采樣點記入到x[1]中,T2的采樣點移到x[0]中 else{ x[0]=x[1]; x[1]=*px; retVal=TRUE; } } else{ //連續(xù)有效采樣次數(shù)小于2,將T3的采樣值記入到x[1],T2的采樣值移動到x[0],并不進行濾波處理 x[0]=x[1]; x[1]=*px; retVal=FLASE; } return retVal; } 3.4 后續(xù)處理 經(jīng)過上述的篩選和濾波,如果被判定采樣值有效,則將其濾波值送給操作系統(tǒng)進行后續(xù)處理,否則程序返回,等待下一次采樣。在2410 test程序中,可以結(jié)合LCD的畫點函數(shù),將有效的采樣點在LCD上畫出,以此檢驗參數(shù)設(shè)置是否合理。 結(jié)語 本文以三星公司ARM9內(nèi)核芯片S3C2410和4線電阻式觸摸屏為硬件基礎(chǔ)。基于此硬件結(jié)構(gòu),開發(fā)了觸摸屏畫圖板程序。通過軟件濾波,提高了系統(tǒng)性能,得到了很好的處理效果,有很強的實用性。用此算法實現(xiàn)的Windows CE觸摸屏驅(qū)動,在漢王手寫輸入軟件的測試下得到了很高的識別率。軟件使用C語言實現(xiàn),可以方便地移植到任何操作系統(tǒng)上。 相關(guān)推薦
圖3
函數(shù)Touch_Coordinate Conversion完成觸摸屏采樣值轉(zhuǎn)換成顯示坐標,根據(jù)不同的硬件有不同的轉(zhuǎn)換方法。本觸摸屏采樣坐標及顯示坐標如圖4、圖5所示。其中TOUCH_MAX_X和TOUCH_MIN_X是觸摸屏X坐標采樣值的最大和最小值;Y坐標同理。可以運行本文程序,同時使用觸摸筆在觸摸屏的4個角取得最大最小采樣值。這里使用的是320×240的TFT屏,所以TOUCH_X值為320。下面是X坐標的轉(zhuǎn)換程序:
//如果差值大于門限值,說明T3的采樣值無效,判為野點返回值為FALSE。為了避免過大的跳躍,認為觸摸筆坐標沿變,使用T2時刻采樣值來代替本次采樣點,同時靜態(tài)變量x[]中的數(shù)據(jù)不變,count重新開始記錄連續(xù)有效采樣點次數(shù)
S3C2410在光電測量仿真檢測系統(tǒng)中的應(yīng)用
S3C2410處理器與Nand flash 的問題
S3C2410微處理器與CS8900A開發(fā)應(yīng)用實例
S3C2410的UART0總是漏數(shù)據(jù),求助
s3c2410 datasheet 中文數(shù)據(jù)手冊
s3c2410協(xié)處理器指令的意思是什么?
觸摸屏有哪些類型?
觸摸屏沒有反應(yīng)
觸摸屏鐘控cd機,觸摸屏壞了,如何繞過觸摸屏的開關(guān)來開機?
AD7888與S3C2410的SPI接口及Linux下嵌入式驅(qū)動的實現(xiàn)
ARM9 S3C2410 串口通信
ARM9芯片S3C2410怎么驅(qū)動VGA接口?
FPGA上觸摸屏的使用
Linux 系統(tǒng)移植(七)- 添加觸摸屏驅(qū)動
[求助]關(guān)于ARM9 S3C2410和GPRS的疑問
altium designer 9 s3c2410 的引腳怎么少了那么多
emwin的例程為什么一會兒不動觸摸屏,再動觸摸屏就沒反應(yīng)了的原因是什么?
labview 觸摸屏
mini2440觸摸屏驅(qū)動分析
串口接收到的數(shù)據(jù)如何顯示在觸摸屏上
為什么7寸電容觸摸屏應(yīng)用在F4探索板時觸摸無效?
關(guān)于8寸觸摸屏的問題
關(guān)于s3c2410開發(fā)平臺 GPS模塊 無法獲取數(shù)據(jù)的問題
關(guān)于觸摸屏的接法
初學者學習arm 是學習s3c2410還是STM32好?各位高手給意見啊...
基于S3C2410的黃金礦工游戲的設(shè)計資料分享
基于ARM S3C2410處理器的PDA人機接口電路設(shè)計
基于ARM9 s3c2410的SD卡驅(qū)動它的傳輸速度如何測試呢
基于FPGA的電阻觸摸屏接口設(shè)計
基于嵌入式Linux與S3C2410平臺的視頻采集
如何使用Harmony和觸摸屏LCD
如何修改ucGUI例程才能支持觸摸屏呢?
如何利用S3C2410設(shè)計氫氣濃度監(jiān)測系統(tǒng)?
如何點亮S3C2410主芯片的兩個燈呢
定制觸摸屏的價格貴嗎?
小弟arm新人 老師期末作業(yè)s3c2410 求大神指導(dǎo)
怎樣測試基于ARM9 s3c2410的SD卡驅(qū)動傳輸速度呢
接線端子設(shè)計和觸摸屏安裝設(shè)計是什么
用uCGUI在觸摸屏上顯示一個對話框
窮根究底linux內(nèi)核函數(shù)之s3c2410_gpio_cfgpin()
若讓S3C2410的H端口除GPH8-GPH10設(shè)置為輸出外,GPHCON=?
請問觸摸屏校準原理是什么?
請問為什么beaglebone black 上觸摸屏用不了?
調(diào)試觸摸屏時觸摸屏一直發(fā)01 03 FF FF FF FF 00 01 73 38硬件環(huán)境是:觸摸屏---MODBUS協(xié)議的單片機開發(fā)板,觸摸屏做主機
觸摸屏在S3C2410 上的應(yīng)用實例
觸臻屏在S3C2410上的應(yīng)用實例
基于S3C2410的RTC模塊應(yīng)用設(shè)計
評論
查看更多