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