日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

觸摸屏學(xué)習(xí)及觸控程序開(kāi)發(fā)

出處:wankai1982 發(fā)布于:2008-08-25 14:04:13

  為標(biāo)準(zhǔn)觸摸屏編寫(xiě)驅(qū)動(dòng)程序

  盡管觸摸屏正在迅速普及開(kāi)來(lái),但大多數(shù)開(kāi)發(fā)人員以前從來(lái)沒(méi)有開(kāi)發(fā)過(guò)觸摸屏產(chǎn)品。本文詳細(xì)介紹了觸摸屏產(chǎn)品的設(shè)計(jì)步驟,指導(dǎo)讀者了解使觸摸屏首次工作需要的軟硬件細(xì)節(jié)。

  觸摸屏如今隨處可見(jiàn)。工業(yè)控制系統(tǒng)、消費(fèi)電子產(chǎn)品,甚至醫(yī)療設(shè)備上很多都裝備了觸摸屏輸入裝置。我們平時(shí)不經(jīng)意間都會(huì)用到觸摸屏。在ATM機(jī)上取款、簽署包裹,辦理登機(jī)手續(xù)或查找電話號(hào)碼時(shí)都可能會(huì)用到觸摸屏。

  本文介紹了二種較新的CPU,它們都內(nèi)建了對(duì)觸摸屏輸入的支持。本文將介紹如何編寫(xiě)軟件驅(qū)動(dòng)程序,從而能夠使用這些微處理器配置、校準(zhǔn)觸摸屏以及對(duì)觸摸屏輸入持續(xù)響應(yīng)。終將提供可和使用的工作代碼,作為讀者進(jìn)一步設(shè)計(jì)的基礎(chǔ)。

  觸摸屏作為輸入手段的優(yōu)點(diǎn)和缺點(diǎn)

  沒(méi)有一種輸入方式是十全十美的,對(duì)某些特定的應(yīng)用和產(chǎn)品類型來(lái)說(shuō),觸摸屏不是的輸入手段。為了讓讀者清楚的了解觸摸屏的特性,下面先概括使用觸摸屏作為輸入手段的優(yōu)點(diǎn)和缺點(diǎn)。

  首先是優(yōu)點(diǎn):觸摸屏不可否認(rèn)的具有酷的感覺(jué),立刻就能使產(chǎn)品的使用變得更有樂(lè)趣。同時(shí)觸摸屏也非常直觀。當(dāng)用戶想要選擇A選項(xiàng)時(shí),他伸出手指碰一下A選項(xiàng)就可以了。這還不夠直觀嗎?連兩歲的嬰兒都知道怎樣伸手去觸摸他(或她)想要的東西。

  要說(shuō)的是,觸摸屏作為輸入裝置和系統(tǒng)固定在了一起。如果用戶忘記遙控器或鼠標(biāo)放的位置,就會(huì)無(wú)法進(jìn)行輸入。而如果具有觸摸屏的設(shè)備放在用戶前面,用戶馬上就可以用觸摸屏進(jìn)行輸入。

  再說(shuō)缺點(diǎn),觸摸屏可能會(huì)在不合適的場(chǎng)合下被錯(cuò)誤的使用。這里我是指對(duì)安全性要求嚴(yán)格的設(shè)備,對(duì)于這些設(shè)備,如果沒(méi)有適當(dāng)?shù)念A(yù)防措施,使用觸摸屏?xí)浅NkU(xiǎn)。下面我將概括一些明顯的潛在的問(wèn)題,如果讀者想作更進(jìn)一步的了解,可以參考更多的資料。

  個(gè)問(wèn)題是視差,即屏幕上看到的對(duì)象的位置與其在觸摸面板上的實(shí)際有效位置之間的差異。圖1說(shuō)明了這個(gè)問(wèn)題。我能想到的例子是典型的“免下車”ATM機(jī)。這種ATM機(jī)不會(huì)根據(jù)汽車的高度升高或降低自己的高度,因此如果你坐在較高的SUV或卡車?yán)?,那么你就?huì)從抬高的位置俯視顯示屏。為了保護(hù)昂貴的顯示器件免受惡意破壞,ATM機(jī)都會(huì)在用戶和顯示屏之間放置幾層強(qiáng)化玻璃。

  觸摸屏是不能這樣保護(hù)的。如果真這樣做的話,用戶就無(wú)法進(jìn)行觸摸了。因此觸摸屏放在表層上,而顯示屏放在表層下的幾層玻璃后面。這就造成了觸摸層和顯示層之間的物理隔離。如果用戶以某個(gè)角度觀看屏幕,就意味著用戶按壓觸摸屏進(jìn)行選擇的位置會(huì)與用戶接口軟件預(yù)期的輸入位置之間存在一定的距離偏差。


  圖1:視差(橫截面圖)。

  人們能很快適應(yīng)這種偏差。經(jīng)過(guò)幾次嘗試和錯(cuò)誤,使用者學(xué)習(xí)在觸摸屏的表面找到顯示信息的映射位置,然后觸摸到正確的位置。ATM設(shè)計(jì)師也認(rèn)識(shí)到這一點(diǎn),他們會(huì)采用大面積的按鍵,并盡量使它們相互遠(yuǎn)離,因此有助于防止錯(cuò)誤按鍵的誤觸發(fā)。當(dāng)然,不小心按下錯(cuò)誤的ATM按鍵不會(huì)使你得癌癥或使你失明。但如果這樣的失誤發(fā)生在醫(yī)療控制設(shè)備上,并且系統(tǒng)設(shè)計(jì)師沒(méi)有在系統(tǒng)內(nèi)置足夠的安全預(yù)防措施,那么以上兩種后果確實(shí)都有可能發(fā)生。

  通過(guò)縮短顯示層和觸摸層之間的物理距離可以盡量減少視差。在CRT或LCD前面總會(huì)有玻璃存在。的方法是將對(duì)觸摸敏感的電子元件嵌入到玻璃里,并且這層玻璃做得盡可能薄。這樣就減少了觸摸輸入層和顯示層之間的相隔距離。像Palm這樣的手持設(shè)備就可以采用這樣的策略,因?yàn)樗鼈儾槐靥珦?dān)心機(jī)械強(qiáng)度不夠或者遭受惡意破壞。隨著相隔距離的縮小(用戶覺(jué)得真的觸摸到了圖形元件),會(huì)大大提高。

  第二個(gè)明顯的問(wèn)題是,在用戶觸摸屏幕的過(guò)程中,觸摸屏幕的物體(觸控筆、手指)至少會(huì)遮擋屏幕上的一小部分面積,從而影響用戶的觀察。在工廠自動(dòng)化應(yīng)用中這種情況更容易發(fā)生,因?yàn)橛脩艉芸赡苁褂檬种富蚴痔锥怯|控筆,即使是使用觸控筆,在屏幕上做選擇動(dòng)作也會(huì)不時(shí)遮擋住一部分你給用戶展示的信息。例如,想象一下你想展示一個(gè)滑動(dòng)控制條給用戶調(diào)節(jié)數(shù)值(如速度或音量),并且你將用戶選擇的數(shù)值以數(shù)字形式顯示在滑動(dòng)控制條的左邊。這樣做一般工作情況會(huì)很好,但當(dāng)左撇子用戶操作你的系統(tǒng)時(shí),只有移開(kāi)他的手指他才能看到所選的值。因此你必須在你的用戶界面設(shè)計(jì)中考慮這類因素。

  觸摸屏硬件原理簡(jiǎn)介

  我們?cè)陂_(kāi)始編寫(xiě)觸摸屏驅(qū)動(dòng)程序之前,必須對(duì)硬件的工作原理有個(gè)基本的了解。許多不同的觸摸技術(shù)會(huì)把屏幕某個(gè)位置的壓力或接觸轉(zhuǎn)換成有意義的數(shù)字坐標(biāo)。典型的觸摸技術(shù)包括電阻觸摸屏、聲表面波觸摸屏、紅外線觸摸屏和電容觸摸屏。如果想詳細(xì)了解這些技術(shù),你可以登錄www.elotouch.com或www.apollodisplays.com網(wǎng)站。

  這里側(cè)重介紹電阻觸摸屏。電阻觸摸屏非常普及,你會(huì)發(fā)現(xiàn)許多評(píng)估板和開(kāi)發(fā)套件中都集成了電阻觸摸屏。電阻觸摸屏普及的主要原因是價(jià)格便宜,而且在電氣上可以直接接入用戶的系統(tǒng)中。

  之所以叫電阻觸摸屏,是因?yàn)樗鼈儽举|(zhì)上就是電阻分壓器。它們由兩個(gè)電阻薄層組成,這兩個(gè)薄層被非常薄的絕緣層隔開(kāi),絕緣層通常以塑料微粒子的形式存在。當(dāng)你觸摸屏幕時(shí),會(huì)使兩個(gè)電阻薄層變形到足以使它們之間發(fā)生電氣連接。然后由軟件通過(guò)檢測(cè)分壓器上產(chǎn)生的電壓計(jì)算出兩層的短接位置,并終確定觸摸位置。

  電阻觸摸屏分為幾種類型,比如"四線","五線"和"八線"。線越多,就越高,溫度漂移也越少,但基本的操作是一樣的。在簡(jiǎn)單的四線設(shè)計(jì)中,有一層稱為"X軸"的電阻層,上面加有一定的電壓,另一個(gè)稱為"Y軸"的電阻層作為接受層測(cè)量對(duì)應(yīng)X軸位置的電壓值。這一過(guò)程再反過(guò)來(lái)執(zhí)行一遍,即Y軸層加電,X軸層用于電壓檢測(cè)。

  圖2是電阻觸摸屏的簡(jiǎn)單等效電路。注意必須獲取二個(gè)完全獨(dú)立的讀數(shù),即X軸位置和Y軸位置數(shù)據(jù)。這些數(shù)據(jù)在四線或五線電阻觸摸屏中是無(wú)法同時(shí)讀取的。軟件必須先讀一個(gè)軸,然后再讀另外一個(gè)軸。讀取的順序則無(wú)關(guān)緊要。

  將電阻觸摸屏產(chǎn)生的電壓轉(zhuǎn)換成數(shù)字需要用到模數(shù)轉(zhuǎn)換器(ADC)。直到不久前這個(gè)ADC幾乎一直是主CPU的外圍器件。Burr Brown NS7843或NS7846就是這種ADC控制器。該器件為12位的模數(shù)轉(zhuǎn)換器,其內(nèi)嵌的邏輯電路通過(guò)交替給一個(gè)薄層加電,再?gòu)牧硗庖粚愚D(zhuǎn)換來(lái)控制觸摸屏。雖然可以使用諸如GPIO之類的信號(hào)線來(lái)完成薄層加電的切換,但該器件能夠分擔(dān)許多任務(wù),還能提供產(chǎn)生觸摸或筆壓中斷的方式。

  近有幾家CPU制造商開(kāi)始在主CPU中集成ADC模塊和專用的觸摸屏控制電路。在消費(fèi)類設(shè)備、遠(yuǎn)程信息通信或一些面向其它市場(chǎng)的產(chǎn)品中,LCD顯示屏和觸摸屏非常普遍,當(dāng)想把CPU用于這類產(chǎn)品中時(shí),在CPU中集成ADC和觸摸屏控制電路的做法會(huì)非常有意義。

  基于兩種CPU的參考板

  本文設(shè)計(jì)兩種集成了觸摸屏控制功能的CPU的參考板。這二種CPU都基于ARM處理器架構(gòu)。

  塊板是飛思卡爾的MX9823ADS評(píng)估板,采用了飛思卡爾的MC9328MX1處理器。該評(píng)估板可以直接從飛思卡爾的分銷商處定購(gòu)。評(píng)估套件包括QVGA(240x320)彩色LCD和觸摸屏。

  第二塊板采用了夏普LH79524 ARM處理器。這塊夏普的參考板以及集成的顯示和觸摸套件都可以從LogicPD公司處定購(gòu)。有幾種可更換的顯示套件供選擇,分辨率范圍從QVGA到800x600像素不等。

  本文中不提供每個(gè)驅(qū)動(dòng)程序的詳細(xì)代碼,而是介紹驅(qū)動(dòng)程序的設(shè)計(jì)和流程,并重點(diǎn)介紹其中的重要部分??偟膩?lái)看,軟件提供的功能完成以下這些步驟:

  1. 配置控制器硬件
  2. 判斷屏幕是否被觸摸
  3. 獲得穩(wěn)定的、去抖動(dòng)的位置測(cè)量數(shù)據(jù)
  4. 校準(zhǔn)觸摸屏
  5. 將觸摸狀態(tài)和位置變化信息發(fā)送給更高層的圖形軟件

  下面開(kāi)始詳細(xì)介紹每個(gè)步驟。

  硬件配置

  觸摸驅(qū)動(dòng)程序要做的件事是配置硬件。對(duì)這些集成控制器來(lái)說(shuō),這意味著通過(guò)向映射到存儲(chǔ)器的寄存器中寫(xiě)入數(shù)據(jù)將控制器配置成某個(gè)確定狀態(tài)。這一過(guò)程是由每個(gè)驅(qū)動(dòng)程序中的TouchConfigureHardware()函數(shù)完成的。

  為了配置硬件,需要事先做好某些決定。例如,驅(qū)動(dòng)程序應(yīng)該使用中斷驅(qū)動(dòng)嗎?為了獲得能夠響應(yīng)并且的觸摸位置信息需要什么樣的轉(zhuǎn)換速率?讓我們看看做出這些決定的具體過(guò)程吧。

  圖2:觸摸屏電路簡(jiǎn)單等效電路。

  關(guān)于觸摸驅(qū)動(dòng)程序是否應(yīng)該使用中斷驅(qū)動(dòng),事實(shí)上在范例的驅(qū)動(dòng)程序中用的就是中斷驅(qū)動(dòng)方式。坦率地講,我之所以這樣做是因?yàn)槭褂弥袛嗪苡腥ぁGf(wàn)不要由這個(gè)例子推斷出采用中斷永遠(yuǎn)是或正確的設(shè)計(jì)方式,也不要聽(tīng)信別人說(shuō)不采用中斷驅(qū)動(dòng)方式的觸摸驅(qū)動(dòng)程序就是"錯(cuò)誤的"。

  之所以這樣說(shuō)只是因?yàn)?輪詢"對(duì)嵌入式系統(tǒng)程序員來(lái)說(shuō)似乎變成了貶義詞。我曾經(jīng)問(wèn)過(guò)一位客戶,他的輸入設(shè)備采用的是輪詢還是中斷服務(wù)方式。回答是"這是嵌入式系統(tǒng),我們不做任何輪詢"。我當(dāng)時(shí)感覺(jué)問(wèn)這個(gè)問(wèn)題時(shí)我就像一個(gè)傻瓜,但進(jìn)一步探討后發(fā)現(xiàn)查詢其實(shí)也是一種合理且值得考慮的方式。如果使用的是RTOS,并且所有任務(wù)經(jīng)常為了等待某類外部事件而被中斷,處理器經(jīng)常處于空閑的循環(huán)狀態(tài),沒(méi)有什么有意義的事做。這種情況下使用空閑任務(wù)查詢觸摸屏上的輸入也許是更好的設(shè)計(jì)方式。根據(jù)你的總體系統(tǒng)需求,查詢也可能是一個(gè)值得考慮的合理的設(shè)計(jì)方式。

  配置中斷的方法因具體操作系統(tǒng)而異。讀者會(huì)發(fā)現(xiàn)對(duì)于每一個(gè)支持的RTOS都有被(#ifdef)限定的代碼段。在所有情況下驅(qū)動(dòng)程序?qū)嶋H會(huì)使用二種不同的中斷:
 
  1 當(dāng)屏幕被初次觸摸時(shí)喚醒主機(jī)的中斷,稱為PEN_DOWN中斷
  2 當(dāng)完成一組模數(shù)數(shù)據(jù)轉(zhuǎn)換時(shí)的第二種中斷信號(hào)

  后文會(huì)詳細(xì)介紹這些中斷和它們產(chǎn)生的過(guò)程。

  接下來(lái)的問(wèn)題是我們希望以多快的速度從ADC接收采樣輸入讀數(shù)。采樣速度會(huì)影響我們需要如何配置時(shí)鐘來(lái)驅(qū)動(dòng)觸摸屏和ADC。我們希望時(shí)鐘有足夠快的速度來(lái)提供可響應(yīng)的輸入和實(shí)現(xiàn)的跟蹤,但也不要太快,以至于影響轉(zhuǎn)換,或讓系統(tǒng)消耗超過(guò)所需的功率。

  根據(jù)我的經(jīng)驗(yàn),觸摸屏至少需要以20Hz或50ms間隔的速度向更高層軟件提供位置更新數(shù)據(jù),只要高層軟件跟得上,速度越快越好,我們不太擔(dān)心功耗問(wèn)題。如果觸摸輸入響應(yīng)比這慢得多,那么在用戶的觸摸輸入和顯示屏上可觀察到的響應(yīng)之間會(huì)出現(xiàn)明顯和煩人的遲滯現(xiàn)象。

  20Hz的更新速度聽(tīng)起來(lái)并不是太有挑戰(zhàn)性,但提供20Hz的更新速度實(shí)際上要求采樣速度接近200Hz,具體數(shù)值取決于我們?cè)诖_定輸入穩(wěn)定之前準(zhǔn)備采用多少讀數(shù)。為了去抖動(dòng)和對(duì)觸摸輸入位置值進(jìn)行平均,我們需要進(jìn)行過(guò)采樣。電阻觸摸屏,特別是便宜的那種,一般會(huì)有很大的噪聲和抖動(dòng)。
 
  在向更高層軟件發(fā)送位置更新數(shù)據(jù)之前,驅(qū)動(dòng)程序需要多次采樣每個(gè)軸上的輸入。我們提供的驅(qū)動(dòng)程序默認(rèn)情況下將以少200Hz(5ms)的采樣速率配置各自處理器上的ADC時(shí)鐘。這樣就能讓驅(qū)動(dòng)程序?qū)斎朐紨?shù)據(jù)進(jìn)行充分的去抖動(dòng)和過(guò)濾,并仍能向高層用戶接口軟件提供20Hz的實(shí)際位置更新速率。

  飛思卡爾i.MX處理器中的觸摸控制器模塊叫做模擬信號(hào)處理器(ASP),i.MX處理器提供兩個(gè)由內(nèi)核CPU時(shí)鐘分頻得到的外設(shè)時(shí)鐘。輸入ASP模塊端口的是PERCLK2(外設(shè)時(shí)鐘2),它經(jīng)過(guò)再分頻產(chǎn)生ASP所需的終輸入時(shí)鐘。需要注意的是,PERCLK2除了驅(qū)動(dòng)ASP模塊外,還驅(qū)動(dòng)包括內(nèi)部LCD控制器在內(nèi)的其它子模塊,因此觸摸驅(qū)動(dòng)程序無(wú)法只是為了更好的配合觸摸采樣而對(duì)PERCLK2進(jìn)行編程。PERCLK2被編程為所有附屬外設(shè)所要求的速率(在大多數(shù)情況下是LCD控制器),然后通過(guò)分頻產(chǎn)生速度較慢的外設(shè)所需的時(shí)鐘。MC9328MX1參考手冊(cè)中包含一份表格,該表格定義了達(dá)到200Hz數(shù)據(jù)輸出速率所需的時(shí)鐘編程值。

  夏普LH79524在硬件配置時(shí)要求對(duì)幾個(gè)GPIO引腳進(jìn)行編程以便給這些引腳分配ADC功能,并要求編程和激活A(yù)DC時(shí)鐘,還要對(duì)ADC序列器編程。

  LH79524 ADC本身是一個(gè)令人稱奇的電路系統(tǒng),能夠?qū)崿F(xiàn)完全可編程的狀態(tài)機(jī)和序列器。該ADC無(wú)需CPU的任何干預(yù)就可以通過(guò)編程完成:驅(qū)動(dòng)一個(gè)觸摸層;延時(shí);進(jìn)行測(cè)量;驅(qū)動(dòng)另一層;延時(shí);進(jìn)行測(cè)量等操作。理解如何對(duì)LH79524 ADC序列器控制單元編程可能是一個(gè)挑戰(zhàn),不過(guò)利用夏普(www.sharpsma.com)公司提供的應(yīng)用指南可以使這項(xiàng)工作簡(jiǎn)單很多。本文提供的驅(qū)動(dòng)程序完全符合該應(yīng)用指南對(duì)如何配置夏普ADC序列控制器提出的建議。

  圖3:X軸移動(dòng)時(shí)Y軸上的偏移。

  屏幕被觸摸到了嗎?

  一旦完成了基本的硬件設(shè)置,接下來(lái)就需要一種可靠的方法判斷屏幕是否被觸摸了。如果用戶沒(méi)有觸摸屏幕,那么運(yùn)行ADC獲得轉(zhuǎn)換后的讀數(shù)毫無(wú)意義。上述兩個(gè)控制器都提供了屏幕是否被觸摸的檢測(cè)機(jī)制,并且當(dāng)觸摸事件發(fā)生時(shí)還可選擇是否中斷主處理器。判斷屏幕是否被觸摸的驅(qū)動(dòng)程序的函數(shù)名叫WaitForTouchState()。

  當(dāng)控制器處于觸摸檢測(cè)模式時(shí),Y軸觸摸層通過(guò)一個(gè)上拉電阻上拉到高電平,X軸觸摸層則連接到地。當(dāng)用戶觸摸屏幕的任何地方時(shí),這兩層就發(fā)生短接,Y軸層被拉到低電平。該事件可以在驅(qū)動(dòng)程序內(nèi)部連接到名為PEN_OWN IRQ的中斷發(fā)生機(jī)制。

  在正常工作期間,當(dāng)觸摸事件發(fā)生時(shí)驅(qū)動(dòng)程序利用PEN_DOWN IRQ喚醒觸摸驅(qū)動(dòng)任務(wù)。這樣做可以讓驅(qū)動(dòng)程序在屏幕沒(méi)有被觸摸時(shí)中斷自己的執(zhí)行,而不消耗任何CPU資源,而一旦用戶觸摸屏幕,驅(qū)動(dòng)程序就被喚醒并進(jìn)入轉(zhuǎn)換模式。我們也可以在轉(zhuǎn)換模式?jīng)]被激活時(shí)停止(disable)ADC時(shí)鐘來(lái)節(jié)省功耗。

  在校準(zhǔn)和主動(dòng)采樣期間,驅(qū)動(dòng)程序使用與上述基本相同的機(jī)制檢測(cè)屏幕是否被觸摸;不過(guò)在這些模式下驅(qū)動(dòng)程序會(huì)屏蔽實(shí)際的中斷,并通過(guò)人工方式簡(jiǎn)單的檢查觸摸狀態(tài)。對(duì)于飛思卡爾的處理器,這時(shí)要求把控制器編程到觸摸檢測(cè)模式,并檢查PEN_DOWN IRQ的數(shù)據(jù)位。對(duì)于夏普的處理器,觸摸檢測(cè)內(nèi)建在ADC命令序列中,不需要額外的步驟。

  讀取觸摸數(shù)據(jù)

  在校準(zhǔn)和正常操作期間,我們需要讀取X和Y軸的原始數(shù)據(jù)并去抖動(dòng),然后確定屏幕被觸摸時(shí)是否有穩(wěn)定的讀數(shù)。該過(guò)程在兩個(gè)驅(qū)動(dòng)程序中都叫TouchScan()。該過(guò)程的要點(diǎn)是:

  1. 檢查屏幕是否被觸摸;
  2. 采集每個(gè)軸上的多個(gè)原始讀數(shù)用于以后的過(guò)濾;
  3. 檢查屏幕是否仍在被觸摸。

  在執(zhí)行模數(shù)轉(zhuǎn)換時(shí),兩個(gè)控制器都提供了由編程產(chǎn)生延遲的方法,以在給觸摸層加電和開(kāi)始實(shí)際的模數(shù)轉(zhuǎn)換之間插入一段時(shí)延。飛思卡爾把這段時(shí)延稱作數(shù)據(jù)建立計(jì)數(shù)(DSCNT),在兩層切換后會(huì)有很多個(gè)ASP輸入時(shí)鐘長(zhǎng)度的延時(shí)。夏普把這段時(shí)延稱為預(yù)充時(shí)延。

  兩種CPU都需要這種時(shí)延,因?yàn)殡娮栌|摸面板是二塊由薄絕緣層隔離的大面積導(dǎo)體,正好形成一個(gè)電容。當(dāng)從將要執(zhí)行模數(shù)轉(zhuǎn)換的層切換到正在加電的層時(shí),需要一定的延時(shí)才能保證電容達(dá)到穩(wěn)定狀態(tài)。

  對(duì)于飛思卡爾的i.MX1處理器來(lái)說(shuō),一旦我們啟動(dòng)轉(zhuǎn)換過(guò)程,那么由ADC產(chǎn)生的數(shù)據(jù)將被保存在一個(gè)16位寬x12個(gè)條目深度的FIFO中。ADC產(chǎn)生9位無(wú)符號(hào)數(shù)據(jù),因此每個(gè)16位條目的高7位將被忽略掉。這意味著這種觸摸控制器的全部數(shù)據(jù)范圍從0到511,不過(guò)實(shí)際上沒(méi)有ADC或電阻觸摸屏?xí)a(chǎn)生接近這個(gè)極限值的數(shù)據(jù)。

  我們可以通過(guò)編程讓處理器在FIFO存有任何有效數(shù)據(jù)時(shí)就產(chǎn)生中斷,或在輸入FIFO裝滿時(shí)產(chǎn)生中斷。由于我們通常會(huì)做多次讀取,因此驅(qū)動(dòng)程序一般會(huì)在FIFO裝滿時(shí)產(chǎn)生中斷。當(dāng)該中斷產(chǎn)生時(shí),會(huì)有12個(gè)原始的模數(shù)轉(zhuǎn)換數(shù)據(jù)等待處理,分別對(duì)應(yīng)于X軸的6次讀數(shù)和Y軸的6次讀數(shù)。

  夏普LH79524處理器允許在產(chǎn)生中斷前通過(guò)編程完成的步驟序列。在執(zhí)行每個(gè)步驟時(shí),結(jié)果同樣會(huì)保存在輸入FIFO中,等待驅(qū)動(dòng)程序軟件的讀取。結(jié)果是以16位數(shù)值進(jìn)行保存。每個(gè)結(jié)果的高10位是模數(shù)轉(zhuǎn)換值,4位是序列索引。10位轉(zhuǎn)換結(jié)果意味著這種觸摸控制器的數(shù)值范圍是0到1023,當(dāng)然你永遠(yuǎn)也不會(huì)觀察到接近極限值的結(jié)果。

  一旦序列器控制字在LH79524上被編好程,驅(qū)動(dòng)程序獲取原始讀數(shù)所需要做的就是命令序列器執(zhí)行。當(dāng)EOS(序列結(jié)束)中斷產(chǎn)生時(shí),我們獲得的結(jié)果就可以用于采集和檢查了。序列器可以被配置為當(dāng)屏幕被觸摸時(shí)自動(dòng)觸發(fā)、根據(jù)軟件命令觸發(fā)或連續(xù)觸發(fā)三種模式。

  要注意原始轉(zhuǎn)換器讀數(shù)中經(jīng)常會(huì)有一些噪聲和偏差,這是正常的。你只有緊緊壓住電阻觸摸屏才能得到兩個(gè)連續(xù)的讀數(shù),并取得一致的9位或10位原始數(shù)據(jù)。然而你會(huì)發(fā)現(xiàn)當(dāng)觸控筆或手指按上或離開(kāi)觸摸屏?xí)r,讀數(shù)的變化要比你保持穩(wěn)定壓力時(shí)大得多。要記住用戶是以機(jī)械的方式連通二個(gè)平面電阻-觸摸層。當(dāng)用戶按壓和釋放觸摸屏?xí)r,在很短的一段時(shí)間內(nèi)兩層之間的電氣連接處于臨界狀態(tài)。我們需要丟棄這些讀數(shù)直到系統(tǒng)穩(wěn)定下來(lái),否則我們提交的觸摸位置讀數(shù)會(huì)產(chǎn)生大幅跳躍,導(dǎo)致更高層的軟件無(wú)法進(jìn)行合適的操作。

  這里不可避免要進(jìn)行折衷考慮。如果我們要求較窄的穩(wěn)定窗口,那么驅(qū)動(dòng)程序?qū)o(wú)法跟蹤快速的"拖曳"操作。對(duì)于在簽名輸入期間發(fā)生的滑動(dòng)或筆劃跟蹤事件來(lái)說(shuō)快速拖曳是非常重要的。如果我們加寬穩(wěn)定窗口,我們就可能面臨著風(fēng)險(xiǎn),這些風(fēng)險(xiǎn)包括接收到不的觸摸數(shù)據(jù)和上文描述過(guò)的處于臨界狀態(tài)的層連接結(jié)果。因此需要通過(guò)實(shí)驗(yàn)來(lái)確定適合自己系統(tǒng)的值。智能化的觸摸控制器同樣允許你通過(guò)軟件命令調(diào)整這些參數(shù)。

  每個(gè)樣值所需的讀取次數(shù)、連續(xù)讀取間允許的偏差以及采樣速率是每個(gè)驅(qū)動(dòng)程序的全部可編程參數(shù)。可以通過(guò)#defines調(diào)整這些參數(shù)以便在你的系統(tǒng)上產(chǎn)生結(jié)果。智能化的外部觸摸控制器一般會(huì)以很快的速度讀取數(shù)十或數(shù)百個(gè)數(shù)據(jù)用以改善。由于我們是用CPU完成這種過(guò)濾,因此我們需要確定有多少時(shí)間可以合理地分配給觸摸采樣任務(wù)。嵌入式系統(tǒng)包含折衷,你的任務(wù)就是想出的折衷辦法,以產(chǎn)生能使用戶滿意的系統(tǒng)。

  出于游戲目的,我喜歡測(cè)試日常生活中所遇到的商業(yè)觸摸系統(tǒng)。下當(dāng)你使用觸摸屏進(jìn)行購(gòu)物簽名或包裹簽名時(shí),你可以嘗試快速大范圍波浪形地移動(dòng)觸控筆,然后觀察結(jié)果,查看屏幕跟蹤你移動(dòng)的程度如何。如果你能看到漂亮光滑的跟蹤軌跡,你就知道驅(qū)動(dòng)程序的采樣速率相當(dāng)快,可能在200Hz以上。經(jīng)常你會(huì)觀察到移動(dòng)軌跡變成了一條直線(慢速采樣)或完全丟失(由于數(shù)值改變過(guò)大而被拒絕輸入)。當(dāng)你在零售商店進(jìn)行這種小測(cè)試的時(shí)候千萬(wàn)不要大呼小叫,否則人們會(huì)用異樣的目光看你。正常人是不會(huì)理解什么東西會(huì)使工程師那么激動(dòng)。

  觸摸屏的校準(zhǔn)

  到此我們已經(jīng)介紹了驅(qū)動(dòng)程序所支持的全部功能,這是我們進(jìn)入下一步之前必須完成的繁瑣工作。既然各種功能都已就緒,可以讓用戶實(shí)際觸摸屏幕了。電阻觸摸屏需要校準(zhǔn)。我們需要一些參考值,以便我們能夠?qū)⒔邮盏降脑寄?shù)轉(zhuǎn)換值轉(zhuǎn)換成高層軟件所需的屏幕像素坐標(biāo)。理想情況下校準(zhǔn)程序只要在產(chǎn)品初次加電測(cè)試過(guò)程中運(yùn)行就可以了,參考值被存儲(chǔ)在非易失性存儲(chǔ)器中。我已經(jīng)安排好讓觸摸驅(qū)動(dòng)程序在一啟動(dòng)時(shí)就運(yùn)行校準(zhǔn)程序,但要記住,你要把參考值保存起來(lái),以免讓用戶在以后的加電啟動(dòng)期間再做校準(zhǔn)。不過(guò)無(wú)論如何你仍然需要向用戶提供一種進(jìn)入校準(zhǔn)例程的途徑,從而在由于溫度漂移或其它因素造成校準(zhǔn)不準(zhǔn)確時(shí)進(jìn)行重新校準(zhǔn)。

  校準(zhǔn)例程的名稱是CalibrateTouchScreen(),它是一個(gè)簡(jiǎn)單的逐步操作過(guò)程,會(huì)在屏幕上向用戶提供圖形目標(biāo),并要求用戶觸摸目標(biāo),然后記錄下原始的ADC讀數(shù),該讀數(shù)將用于后面的原始數(shù)據(jù)轉(zhuǎn)換到像素位置的調(diào)整例程。圖形目標(biāo)和用戶提示通過(guò)使用便攜式圖形用戶界面(PEG)圖形軟件API顯示在屏幕上,不過(guò)這也可以通過(guò)類似的圖形軟件實(shí)現(xiàn)。

  在理想情況下你只需兩組(X和Y)原始數(shù)據(jù),即在屏幕對(duì)角讀取的和值。而在實(shí)際應(yīng)用中,因?yàn)樵S多電阻觸摸屏存在顯著的非線性,因此如果在和值之間簡(jiǎn)單的插入位置數(shù)值會(huì)導(dǎo)致驅(qū)動(dòng)程序非常的不。

  非線性意味著在屏幕上的等距物理移動(dòng)會(huì)導(dǎo)致原始數(shù)據(jù)的增量不等。更糟的情況下,即使我們只改變X軸的觸摸位置,但從Y軸讀取的數(shù)據(jù)也會(huì)發(fā)生很大的變化。為了演示這一現(xiàn)象,我用觸控筆在一個(gè)典型的電阻觸摸屏上從左到右移動(dòng),盡量保持Y軸位置不變,同時(shí)在圖上記錄Y軸的讀數(shù)。你當(dāng)然希望觸控筆從左到右在X軸上滑動(dòng)時(shí)Y軸讀數(shù)能保持一定程度的恒定,但從圖3可以看出完全不是這回事。

  得出的結(jié)論是采用的校準(zhǔn)點(diǎn)越多越好,盡量減小內(nèi)插窗口的間距,才能產(chǎn)生可能的。如果你能在工廠做校準(zhǔn),那么得到大量采樣點(diǎn)并不是件難事。如果無(wú)法在工廠完成校準(zhǔn),那你必須確定用戶需要輸入多少個(gè)點(diǎn)才能產(chǎn)生足夠的校準(zhǔn)。本文提供的校準(zhǔn)例程用了四個(gè)數(shù)據(jù)點(diǎn),即屏幕的每個(gè)角一個(gè)。對(duì)于參考板上的VGA分辨率(640x480)顯示屏幕來(lái)說(shuō),這樣做的可達(dá)到一個(gè)或二個(gè)像素之內(nèi)。對(duì)于更高的屏幕分辨率或其它觸摸屏,要產(chǎn)生一個(gè)的驅(qū)動(dòng)程序這些點(diǎn)也許過(guò)多,也許不夠。做出準(zhǔn)確判定的途徑只能是對(duì)具體的硬件進(jìn)行大量反復(fù)測(cè)試。

  在任何情況下,我的建議是盡可能多做些校準(zhǔn)點(diǎn)。對(duì)用戶來(lái)說(shuō),難得做較長(zhǎng)時(shí)間的校準(zhǔn)操作總比正常狀態(tài)下系統(tǒng)無(wú)法對(duì)觸摸輸入做出響應(yīng)要好。

  正常操作

  一旦校準(zhǔn)過(guò)程完成,我們就可以開(kāi)始正常的操作,并開(kāi)始向更高層軟件發(fā)送觸摸事件。我把提供的每個(gè)觸摸驅(qū)動(dòng)程序在每種支持的RTOS環(huán)境中都作為低優(yōu)先級(jí)任務(wù)加以執(zhí)行。任務(wù)的入口名叫PegTouchTask,因?yàn)轵?qū)動(dòng)程序需要與PEG圖形軟件進(jìn)行交互操作。這些驅(qū)動(dòng)程序修改后,可與其它圖形軟件甚至你自己編寫(xiě)的用戶接口環(huán)境協(xié)同工作。在任何時(shí)候PegTouchTask總是先調(diào)用硬件配置例程,然后調(diào)用校準(zhǔn)例程,進(jìn)入等待觸摸輸入的無(wú)限循環(huán)中。
 
  在MX1驅(qū)動(dòng)程序中,無(wú)限循環(huán)通過(guò)等待前文描述的PEN_DOWN中斷事件中止自身循環(huán)。當(dāng)屏幕被觸摸時(shí),該任務(wù)會(huì)持續(xù)讀取原始數(shù)據(jù),將他們轉(zhuǎn)換成屏幕像素坐標(biāo),并將觸摸位置或狀態(tài)的變化發(fā)送給更高層的軟件。我把這稱為"活動(dòng)跟蹤"模式。

  LH79524驅(qū)動(dòng)程序以相似的方式工作。當(dāng)產(chǎn)生PEN_DOWN中斷時(shí),我們命令A(yù)DC序列器開(kāi)始進(jìn)行轉(zhuǎn)換。驅(qū)動(dòng)程序以20Hz的速度工作,檢查位置的變化,直到屏幕不再處于被觸摸的狀態(tài)。

  當(dāng)屏幕被觸摸時(shí),我們需要對(duì)每個(gè)軸連續(xù)讀取多個(gè)轉(zhuǎn)換值以確定觸摸位置是否穩(wěn)定。如果任何兩個(gè)連續(xù)讀數(shù)中的增量或變化超出#defined定義的噪聲窗口范圍,我們就要重新開(kāi)始。我們一直這樣做,直到讀取的多個(gè)連續(xù)值處于#defined定義的穩(wěn)定范圍內(nèi),此時(shí)我們可以調(diào)整該結(jié)果并向更高層軟件更新。當(dāng)屏幕不再被觸摸時(shí),我們又可以中斷此任務(wù),等待觸摸輸入事件的發(fā)生。

  在每個(gè)轉(zhuǎn)換過(guò)程的前后,驅(qū)動(dòng)程序必須檢查并確認(rèn)屏幕仍處于被觸摸狀態(tài)。我們不希望向更高層的軟件實(shí)際上是處于"開(kāi)路狀態(tài)"的穩(wěn)定讀數(shù)。我也看到過(guò)有的驅(qū)動(dòng)程序在屏幕被初始觸摸后會(huì)忽略掉N個(gè)讀數(shù)。不過(guò)對(duì)于這兩塊參考電路板,我沒(méi)有發(fā)現(xiàn)忽略掉一定數(shù)量的初始讀數(shù)是有必要或有益的。
 
  當(dāng)屏幕被觸摸時(shí),驅(qū)動(dòng)程序得到每個(gè)穩(wěn)定的讀數(shù),并利用簡(jiǎn)單的線性插值法將原始數(shù)據(jù)轉(zhuǎn)換成像素坐標(biāo)。讀取原始數(shù)據(jù)并將它們轉(zhuǎn)換成屏幕坐標(biāo)的例程名字叫GetScaleTouchPosition()。
 
  部分

  好了,我們終于調(diào)整好驅(qū)動(dòng)程序,獲得了、調(diào)整過(guò)的、可靠的觸摸信息。這些重要的數(shù)據(jù)能用來(lái)干什么呢?如果你正在運(yùn)行象PEG這樣的圖形用戶接口系統(tǒng),大部分工作到此就結(jié)束了。你只要簡(jiǎn)單的將這些觸摸數(shù)據(jù)整理成消息,并將消息發(fā)送到PEG消息隊(duì)列。PEG軟件會(huì)對(duì)這些數(shù)據(jù)作出正確地處理。

  PEG可以識(shí)別三種觸摸輸入事件類型,分別對(duì)應(yīng)于向下觸摸、向上觸摸和拖曳。發(fā)送拖曳事件是可選的,但如果你希望向用戶提供平滑的屏幕移動(dòng)操作,那么發(fā)送拖曳事件就是必須的了。確定該發(fā)送哪種類型的消息給PEG消息隊(duì)列的邏輯包含在所提供的源代碼中名為SendTouchMessage()的函數(shù)中。

  這里需要強(qiáng)調(diào)的一點(diǎn)是用于發(fā)送drag(PM_POINTERMOVE)消息的名為Fold()的函數(shù)的使用。這是一個(gè)方便使用的PEG API函數(shù),可以防止用戶接口的響應(yīng)落后于用戶的輸入。例如,如果用戶正在高分辨率顯示器上滾動(dòng)一個(gè)大窗口,那么用戶接口很可能在重畫(huà)滾動(dòng)窗口時(shí)遲滯一段時(shí)間。在用戶接口的響應(yīng)能跟上時(shí),用戶一釋放滾動(dòng)條屏幕就應(yīng)該立即停止?jié)L動(dòng)。但如果消息隊(duì)列已經(jīng)包含了一個(gè)PM_POINTERMOVE消息,我們只需要將這條消息更新到位置,而不用再發(fā)送新的消息。這樣做的效果就是用戶接口滾動(dòng)到位置,跳過(guò)了對(duì)處理器來(lái)說(shuō)太快的所有中間位置更新。

  這就是PEG提供Fold函數(shù)的目的。它會(huì)檢查這個(gè)消息類型是否已經(jīng)在消息隊(duì)列中,如果在,那么它只是簡(jiǎn)單的更新這條已有的消息,而不是發(fā)送全新的消息。如果你正在使用另外一種圖形軟件包,你也會(huì)希望實(shí)現(xiàn)類似的功能。

  動(dòng)手

  本文主要介紹了如何為兩個(gè)集成了觸摸屏控制電路的主流CPU編寫(xiě)觸摸屏驅(qū)動(dòng)程序。你可以從ftp://ftp.embedded.com/pub/2005/07maxwell 網(wǎng)站每個(gè)驅(qū)動(dòng)程序的源代碼,并按照你的意圖使用和修改。

  提供可靠的觸摸信息顯然要花費(fèi)大量的處理器時(shí)間。專門(mén)設(shè)計(jì)用于支持觸摸屏輸入的智能化的ADC可以顯著地減輕CPU的負(fù)擔(dān),并有效地提高觸摸屏輸入系統(tǒng)的。
  欲知詳情,請(qǐng)登錄維庫(kù)電子市場(chǎng)網(wǎng)(www.hbjingang.com


  
關(guān)鍵詞:觸摸屏學(xué)習(xí)及觸控程序開(kāi)發(fā)1023FIFOMC9328MX1

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問(wèn)題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

攝像頭模塊中的AL422B—FIFO芯片無(wú)所不能,用來(lái)和單片機(jī)做車牌識(shí)別系統(tǒng)也挺方便~
廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機(jī)號(hào)碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時(shí)間周一至周五
9:00-17:30

關(guān)注官方微信號(hào),
第一時(shí)間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫(kù)提出的寶貴意見(jiàn),您的參與是維庫(kù)提升服務(wù)的動(dòng)力!意見(jiàn)一經(jīng)采納,將有感恩紅包奉上哦!