Global Sources
電子工程專輯
 
電子工程專輯 > 介面技術
 
 
介面技術  

為標準觸控式螢幕介面硬體編寫驅動程式

上網時間: 2006年02月24日     打印版  Bookmark and Share  字型大小:  

關鍵字:觸控式螢幕  驅動程式  視差  玻璃  電阻觸控式螢幕 

儘管觸控式螢幕正迅速普及開來,但大多數開發人員以前從來沒有開發過觸控式螢幕產品。本文詳細介紹了觸控式螢幕產品的設計步驟,指導讀者了解使觸控式螢幕首次工作需要的軟硬體細節。

基於兩種較新的CPU(它們都內建了對觸控式螢幕輸入的支援),本文將介紹如何編寫軟體驅動程式,因而能夠使用這些微處理器配置、校準觸控式螢幕以及對觸控式螢幕輸入持續響應。最終將提供可免費下載和使用的工作程式碼,作為讀者進一步設計基礎。

觸控式螢幕技術

這裡重點介紹電阻觸控式螢幕。電阻觸控式螢幕非常普及,主要原因是其價格便宜,而且在電氣上可以直接接取用戶的系統。

電阻觸控式螢幕分為幾種類型,如四線、五線和八線。線越多,精密度就越高,溫度漂移也越少,但基本的作業是一樣的。在最簡單的四線設計中,有一層稱為X軸的電阻層,上面加有一定的電壓,另一個稱為Y軸的電阻層作為接受層測量對應X軸位置的電壓值。這一過程再反過來執行一遍,即Y軸層加電,X軸層用於電壓檢測。

圖1:觸控式螢幕的視差(橫截面圖)。

圖2是電阻觸控式螢幕的簡單等效電路。注意必須獲取二個完全獨立的讀數,即X軸位置和Y軸位置數據。這些數據在四線或五線電阻觸控式螢幕中是無法同時讀取的。軟體必須先讀一個軸,然後再讀另外一個軸。讀取的順序則無關緊要。

本文將介紹二種整合了觸控式螢幕控制功能的CPU的參考板。第一塊板是飛思卡爾的MX9823ADS評估板,採用了飛思卡爾的MC9328MX1處理器。評估套件包括QVGA(240x320)彩色LCD和觸控式螢幕。

第二塊板採用了夏普LH79524 ARM處理器。有幾種可更換的顯示套件供選擇,解析度範圍從QVGA到800 x 600畫素不等。

本文主要是討論為這兩款CPU設計觸控式螢幕驅動程式的方法和流程。讀者可以從ftp://ftp.embedded.com/pub/2005/07maxwell下載每個驅動程式的全部原始程式碼,並按照自己的意圖使用和修改。整體來看,軟體提供的功能完成以下這些步驟:

1. 配置控制器硬體;

2. 判斷螢幕是否被觸控;

3. 獲得穩定的、去抖動的位置測量數據;

4. 校準觸控式螢幕;

5. 將觸控狀態和位置變化資訊發送給更高層的圖形軟體。

硬體配置

觸控驅動程式要做的第一件事是配置硬體。對這些整合控制器來說,這意味著透過向映射到記憶體的暫存器中寫入數據將控制器配置成某個確定狀態。這一過程是由每個驅動程式中的TouchConfigureHardware()函數完成的。

配置中斷的方法因具體作業系統而異。讀者會發現對於每一個支援的RTOS都有被(#ifdef)限定的程式碼段。在所有情況下驅動程式實際會使用二種不同的中斷:

1. 當螢幕被初次觸控時喚醒主機的中斷,稱為PEN_DOWN中斷;

2. 當完成一組類比數位數據轉換時的第二種中斷訊號。

接下來的問題是我們希望以多快的速度從ADC接收採樣輸入讀數。採樣速度會影響如何配置時脈來驅動觸控式螢幕和ADC。我們希望時脈有足夠快的速度來提供可響應的輸入和實現精確的追蹤,但也不要太快,以至於影響轉換精密度,或讓系統消耗超過所需的功率。

圖2:觸控式螢幕電路簡單等效電路。

根據我的經驗,觸控式螢幕至少需要以20Hz或50ms間隔的速度向更高層軟體提供位置更新數據,只要高層軟體跟得上,速度越快越好,我們不太擔心功耗問題。

20Hz的更新速度聽起來並不是太有挑戰性,但提供20Hz的更新速度實際上要求採樣速度接近200Hz,具體數值取決於我們在確定輸入穩定之前準備採用多少讀數。為了去抖動和對觸控輸入位置值進行平均,我們需要進行過採樣。電阻觸控式螢幕,特別是便宜的那種,一般會有很大的噪音和抖動。

在向更高層軟體發送位置更新數據之前,驅動程式需要多次採樣每個軸上的輸入。我們提供的驅動程式默認情況下將以最少200Hz(5ms)的採樣速率配置各自處理器上的ADC時脈。這樣就能讓驅動程式對輸入原始數據進行充分的去抖動和過濾,並仍能向高層用戶介面軟體提供20Hz的實際位置更新速率。

飛思卡爾i.MX處理器中的觸控控制器模組叫做類比訊號處理器(ASP),i.MX處理器提供兩個由核心CPU時脈分頻得到的週邊設備時脈。輸入ASP模組埠的是PERCLK2(週邊設備時脈2),它經過再分頻產生ASP所需的最終輸入時脈。需注意的是,PERCLK2除了驅動ASP模組外,還驅動包括內部LCD控制器在內的其它子模組,因此觸控驅動程式無法只是為了更好的配合觸控採樣而對PERCLK2進行編程。PERCLK2被編程為所有附屬週邊設備所要求的最高速率(在大多數情況下是LCD控制器),然後透過分頻產生速度較慢的週邊設備所需的時脈。MC9328MX1參考手冊中包含一份表格,該表格定義了達到200Hz數據輸出速率所需的時脈編程值。

夏普LH79524在硬體配置時要求對幾個GPIO接腳進行編程以便為這些接腳分配ADC功能,並要求編程和啟動ADC時脈,還要對ADC序列器編程。

LH79524 ADC本身是一個令人稱奇的電路系統,能夠實現完全可程式的狀態機和序列器。該ADC無需核心CPU的任何干預就可以透過編程完成:驅動一個觸控層;延遲;進行測量;驅動另一層;延遲;進行測量等作業。瞭解如何對LH79524 ADC序列器控制單元編程可能是一個挑戰,不過利用夏普公司的應用指南可以使這項工作簡單很多。本文提供的驅動程式完全符合該應用指南對如何配置夏普ADC序列控制器提出的建議。

螢幕被觸控到了嗎?

一旦完成了基本的硬體設置,接下來就需要一種可靠的方法判斷螢幕是否被觸控了。如果用戶沒有觸控螢幕,那麼執行ADC獲得轉換後的讀數毫無意義。上述兩個控制器都提供了螢幕是否被觸控的檢測機制,並且當觸控事件發生時還可選擇是否中斷主處理器。判斷螢幕是否被觸控的驅動程式的函數為WaitForTouchState()。

當控制器處於觸控檢測模式時,Y軸觸控層透過一個上拉電阻上拉到高電平,X軸觸控層則連接到地。當用戶觸控螢幕的任何地方時,這兩層就發生短接,Y軸層被拉到低電平。該事件可以在驅動程式內部連接到名為PEN_OWN IRQ的中斷發生機制。

在正常工作期間,當觸控事件發生時驅動程式利用PEN_DOWN IRQ喚醒觸控驅動任務。這樣做可以讓驅動程式在螢幕沒有被觸控時中斷自己的執行,而不消耗任何CPU資源,而一旦用戶觸控螢幕,驅動程式就被喚醒並進入轉換模式。我們也可以在轉換模式沒被啟動時停止(disable)ADC時脈來節省功耗。

圖3:X軸移動時Y軸上的偏移。

在校準和主動採樣期間,驅動程式使用與上述基本相同的機制檢測螢幕是否被觸控;不過在這些模式下驅動程式會屏蔽實際的中斷,並透過人工方式簡單的檢查觸控狀態。對於飛思卡爾的處理器,這時要求把控制器編程到觸控檢測模式,並檢查PEN_DOWN IRQ的數據位元。對於夏普的處理器,觸控檢測內建在ADC命令序列中,不需要額外的步驟。

讀取觸控數據

在校準和正常作業期間,我們需要讀取X和Y軸的原始數據並去抖動,然後確定螢幕被觸控時是否有穩定的讀數。該過程在兩個驅動程式中都叫TouchScan()。該過程的要點是:

1. 檢查螢幕是否被觸控;

2. 採集每個軸上的多個原始讀數用於以後的過濾;

3. 檢查螢幕是否仍在被觸控。

在執行類比數位轉換時,兩個控制器都提供了由編程產生延遲的方法,以在給觸控層加電和開始實際的類比數位轉換之間插入一段延遲。飛思卡爾把這段延遲稱作數據設立計數(DSCNT),在兩層切換後會有很多個ASP輸入時脈長度的延遲。夏普把這段延遲稱為預充延遲。

兩種CPU都需要這種延遲,因為電阻觸控面板是二塊由薄絕緣層隔離的大面積導體,正好形成一個電容器。當從將要執行類比數位轉換的層切換到正加電的層時,需要一定的延遲才能保證電容器達到穩定狀態。

對於飛思卡爾的i.MX1處理器來說,一旦我們啟動轉換過程,那麼由ADC產生的數據將被保存在一個16位元寬x12個條目深度的FIFO中。ADC產生9位元無符號數據,因此每個16位元條目的高7位元將被忽略掉。這意味著這種觸控控制器的全部數據範圍從0到511,不過實際上沒有ADC或電阻觸控式螢幕會產生接近這個極限值的數據。

我們可以透過編程讓處理器在FIFO存有任何有效數據時就產生中斷,或在輸入FIFO裝滿時產生中斷。由於我們通常會做多次讀取,因此驅動程式一般會在FIFO裝滿時產生中斷。當該中斷產生時,會有12個原始的類比數位轉換數據等待處理,分別對應於X軸的6次讀數和Y軸的6次讀數。

夏普LH79524處理器允許在產生中斷前透過編程完成精確的步驟序列。在執行每個步驟時,結果同樣會保存在輸入FIFO中,等待驅動程式軟體的讀取。結果是以16位元數值進行保存。每個結果的高10位元是類比數位轉換值,最低4位元是序列索引。10位元轉換結果意味著這種觸控控制器的最大數值範圍是0到1023,當然你永遠也不會觀察到接近極限值的結果。

一旦序列器控制字在LH79524上被編好程,驅動程式獲取原始讀數所需要做的就是命令序列器執行。當EOS(序列結束)中斷產生時,我們獲得的結果就可以用於採集和檢查了。序列器可以被配置為當螢幕被觸控時自動觸發、根據軟體命令觸發或連續觸發三種模式。

要注意原始轉換器讀數中經常會有一些噪音和偏差,這是正常的。你只有緊緊壓住電阻觸控式螢幕才能得到兩個連續的讀數,並取得一致的9位元或10位元原始數據。然而你會發現當觸控筆或手指按上或離開觸控式螢幕時,讀數的變化要比你保持穩定壓力時大得多。要記住用戶是以機械的方式連通二個平面電阻-觸控層。當用戶按壓和釋放觸控式螢幕時,在很短的一段時間內兩層之間的電氣連接處於臨界狀態。我們需要丟棄這些讀數直到系統穩定下來,否則我們提交的觸控位置讀數會產生大幅跳躍,導致更高層的軟體無法進行合適的作業。

這裡不可避免要進行折衷考慮。如果我們要求較窄的穩定窗口,那麼驅動程式將無法追蹤快速的‘拖曳’作業。對於在簽名輸入期間發生的滑動或筆劃追蹤事件來說快速拖曳是非常重要的。如果加寬穩定窗口,就可能面臨著風險,這些風險包括接收到不精確的觸控數據和上文描述過的處於臨界狀態的層連接結果。因此需要透過實驗來確定適合自己系統的最佳值。智慧化的觸控控制器同樣允許你透過軟體命令調整這些參數。

每個樣值所需的讀取次數、連續讀取間允許的偏差以及採樣速率是每個驅動程式的全部可程式參數。可以透過#defines調整這些參數以便在你的系統上產生最佳結果。智慧化的外部觸控控制器一般會以很快的速度讀取數十或數百個數據用以改善精密度。由於我們是用核心CPU完成這種過濾,因此我們需要確定有多少時間可以合理地分配給觸控採樣任務。嵌入式系統包含折衷,你的任務就是想出最佳的折衷辦法,以產生能使用戶滿意的系統。

電阻觸控式螢幕的校準

電阻觸控式螢幕需要校準。我們需要一些參考值,以便能夠將接收到的原始類比數位轉換值轉換成高層軟體所需的螢幕畫素座標。理想情況下校準程式只要在產品初次加電測試過程中執行一次就可以了,參考值被儲存在非揮發性記憶體中。我已經安排好讓觸控驅動程式在一啟動時就執行校準程式,但要記住,你要把參考值保存起來,以免讓用戶在以後的加電啟動期間再做校準。不過無論如何你仍然需要向用戶提供一種進入校準例程的途徑,因而在由於溫度漂移或其它因素造成校準不準確時進行重新校準。

校準例程的名稱是CalibrateTouchScreen(),它是一個簡單的逐步作業過程,會在螢幕上向用戶提供圖形目標,並要求用戶觸控目標,然後記錄下原始的ADC讀數,該讀數將用於後面的原始數據轉換到畫素位置的調整例程。圖形目標和用戶提示透過使用可攜式圖形用戶介面(PEG)圖形軟體API顯示在螢幕上,不過這也可以透過類似的圖形軟體實現。

在理想情況下,只需兩組(X和Y)原始數據即可在螢幕對角讀取的最小和最大值。而在實際應用中,因為許多電阻觸控式螢幕存在顯著的非線性,因此如果在最小和最大值之間簡單的插入位置數值會導致驅動程式非常的不精確。

非線性意味著在螢幕上的等距實體移動會導致返回的原始數據的增量不等。更糟的情況下,即使我們只改變X軸的觸控位置,但從Y軸讀取的數據也會發生很大的變化。為了展示這一現象,我用觸控筆在一個典型的電阻觸控式螢幕上從左到右移動,盡量保持Y軸位置不變,同時在圖上記錄Y軸的讀數。你當然希望觸控筆從左到右在X軸上滑動時Y軸讀數能保持一定程度的?定,但從圖3可以看出完全不是這回事。

得出的結論是採用的校準點越多越好,盡量減少內插窗口的間距,才能產生可能的最佳精密度。如果你能在工廠做一次校準,那麼得到大量採樣點並不是件難事。如果無法在工廠完成校準,那你必須確定用戶需要輸入多少個點才能產生足夠精確的校準。本文提供的校準例程用了四個數據點,即螢幕的每個角一個。對於參考板上的VGA解析度(640x480)顯示螢幕來說,這樣做的精密度可達到一個或二個畫素之內。對於更高的螢幕解析度或其它觸控式螢幕,要產生一個精確的驅動程式這些點也許過多,也許不夠。做出準確判定的唯一途徑只能是對具體的硬體進行大量反覆測試。

在任何情況下,我的建議是盡可能多做些校準點。對用戶來說,難得做一次較長時間的校準作業總比正常狀態下系統無法對觸控輸入做出精確響應要好。

正常作業

一旦校準過程完成,我們就可以開始正常的作業,並開始向更高層軟體發送觸控事件。我把提供的每個觸控驅動程式在每種支援的RTOS環境中都作為低優先級任務加以執行。任務的入口名叫PegTouchTask,因為驅動程式需要與PEG圖形軟體進行交互通作業。這些驅動程式修改後,可與其它圖形軟體甚至你自己編寫的用戶介面環境協同工作。在任何時候PegTouchTask總是先調用硬體配置例程,然後調用校準例程,最後進入等待觸控輸入的無限循環中。

在MX1驅動程式中,無限循環透過等待前文描述的PEN_DOWN中斷事件中止自身循環。當螢幕被觸控時,該任務會持續讀取原始數據,將他們轉換成螢幕畫素座標,並將觸控位置或狀態的變化發送給更高層的軟體。我把這稱為‘活動追蹤’模式。

LH79524驅動程式以相似的方式工作。當產生PEN_DOWN中斷時,命令ADC序列器開始進行轉換。驅動程式以20Hz的速度工作,檢查位置的變化,直到螢幕不再處於被觸控的狀態。

當螢幕被觸控時,我們需要對每個軸連續讀取多個轉換值以確定觸控位置是否穩定。如果任何兩個連續讀數中的增量或變化超出#defined定義的噪音窗口範圍,就要重新開始。我們一直這樣做,直到讀取的多個連續值處於#defined定義的穩定範圍內,此時可以調整該結果並向更高層軟體報告更新。當螢幕不再被觸控時,又可以中斷此任務,等待觸控輸入事件的發生。

當螢幕被觸控時,驅動程式得到每個穩定的讀數,並利用簡單的線性插值法將原始數據轉換成畫素座標。讀取原始數據並將它們轉換成螢幕座標的例程名字叫GetScaleTouchPosition()。

最後部份

好了,我們終於調整好驅動程式,獲得了精確、調整過的、可靠的觸控資訊。這些重要的數據能用來做什麼呢?如果你正執行像PEG這樣的圖形用戶介面系統,大部份工作到此就結束了。你只要簡單的將這些觸控數據整理成消息,並將消息發送到PEG消息佇列。PEG軟體會對這些數據作出正確處理。

(更詳細內容已刊登於www.eettaiwan.com)

作者:Kenneth G. Maxwell

Swell軟體公司總裁




投票數:   加入我的最愛
我來評論 - 為標準觸控式螢幕介面硬體編寫驅動程式
評論:  
*  您還能輸入[0]個字
*驗證碼:
 
論壇熱門主題 熱門下載
 •   將邁入40歲的你...存款多少了  •  深入電容觸控技術就從這個問題開始
 •  我有一個數位電源的專利...  •  磷酸鋰鐵電池一問
 •   關於設備商公司的工程師(廠商)薪資前景  •  計算諧振轉換器的同步整流MOSFET功耗損失
 •   Touch sensor & MEMS controller  •  針對智慧電表PLC通訊應用的線路驅動器
 •   下週 深圳 llC 2012 關於PCB免費工具的研討會  •  邏輯閘的應用


EE人生人氣排行
 
返回頁首