基於STM32的觸控螢幕學習筆記

2020-11-25 電子產品世界

  本文共有三個內容:一、電阻觸控螢幕的原理;二、XPT2046的控制字與數字接口;三、程序源碼講解(參考正點原子的代碼)

本文引用地址:http://www.eepw.com.cn/article/201709/364995.htm

  一、電阻觸控螢幕的原理,上圖:

    

 

  圖上的文字介紹了觸摸的原理,下面總結一下觸摸的原理:

  觸控螢幕工作主要是兩個電阻屏(上下兩層)在工作,如上圖,當某一層電級加上電壓時,會在該網絡上形成電壓梯度。如果有外力使得上下兩層在某一點接觸,則在未加電壓的那一層可以測得接觸點的電壓,從而得出接觸點的坐標(X或Y)。舉個例子:當我們在上層的電極間(Y+和Y-)加上電壓,則會在上層形成電壓梯度(這裡讀者可以想想AD轉換的原理),當有外力使得上下兩層在某一點接觸時,在底層X層就可以測得接觸點處的電壓(每個點電壓都不同),再根據測得電壓和電極電壓的關係與距離成正比關係(看上圖的關係式)就可以得到該點的Y坐標。然後,將電壓切換到下層電極(X+和X-)上,並在頂層Y層上測量接觸點的電壓,從而得到X坐標。

  原理說完了,不知道讀者注沒注意到上一段中提到 『要測得接觸點的電壓』,怎麼測得電壓還轉換為數字呢?那就需要一個AD轉換器,AD轉換器在哪兒?下面就來介紹一下本文中的觸控螢幕控制晶片-XPT2046:4導線控制器;內含12位解析度,125KHz轉換速率逐步逼近型A/D轉換器;支持從1.5V~5.25V的低電壓IO接口。通過兩次AD轉換查出被按的屏幕位置。除此之外,該晶片還有內部自帶2.5V參考電壓作為輔助輸入,溫度測量和電池監測模式,電池監測的範圍可以從0V~6V,功耗小等等。XPT2046引腳圖如下:

    

 

  二、XPT2046的控制字與數字接口:

    

 

    

 

  再來看XPT2046的數字接口(傳輸格式):

    

 

  下面詳細解釋下XPT2046的轉換時序:

  1、為完成一次電壓切換和AD轉換,前8個時鐘通過DIN引腳往XPT2046發8位控制字節(控制字);

  2、轉換器收到有關下次轉換的足夠信息之後,接著根據獲得的信息設置輸入多路選擇器和參考源輸入,並進入採樣模式;

  3、3個多時鐘周期後,控制字節設置完成,轉換器進入轉換狀態;

  4、接著12個時鐘周期你將完成真正的AD轉換;

  5、如果是度量比例轉換方式(控制字節的第2位)=0,驅動器將一直工作,第13個時鐘將輸出轉換結果的最後一位,剩下3個時鐘完成轉換器忽略的最後字節。

  一次完整的轉換需要24個串行同步時鐘(DCLK)來完成。

  三、程序源碼講解(參考正點原子的代碼)

  首先我們要知道觸控螢幕控制器XPT2046的哪些引腳與STM32的IO相連。在上文的XPT2046引腳圖中,11,12,13,14,15,16引腳,13引腳(轉換狀態信號)不用;第二,我們這裡不用筆中斷(引腳11),而是將筆中斷引腳接到了STM32的F10上。

  注意:拿萬用表測F10引腳,不觸摸時輸出3.3幾V,觸控螢幕幕時,此引腳會輸出低電平(0V)。其實我之前用的是示波器測的,不觸摸時輸出3.3幾V,當觸摸時,F10的輸出電壓會在幾百mV到2V之間,不知道咋回事,折騰半天。可能是我不會使示波器。感興趣的讀者可以去測一測

  1、通過模擬SPI時序往XPT2046中寫一個字節void TP_Write_Byte(u8 num)

    

 

  和通過模擬SPI時序從XPT2046中讀取adc值(AD轉換結果)u16 TP_Read_AD(u8 CMD),

    

 

  這裡說一下,形參CMD是命令控制字,詳情第二講。。這裡我們可以CMD_RDX=0xD0和CMD_RDY=0x90傳入CMD中,就是讀取X方向的AD值時,把控制字的A2~A0配置為101,讀取Y方向的AD值時,把控制字的A2~A0配置為001,都是選擇12位模式,差分輸入,低功率模式。

  注意:這裡提一下為什麼要用差分輸入模式:手冊說,配置為差分輸入模式可有效消除由於驅動開關的寄生電阻及外部的幹擾帶來的測量誤差,提高轉換精度。

  一般來說我們要調用多次u16 TP_Read_AD(u8 CMD)這個函數,因為一次轉換往往與真實值存在較大誤差,故我們設定一個次數:READ_TIMES,多次轉換。然後斬頭去尾留中間,再取平均值,這樣得到的AD轉換結果就相當精確了。看函數u16 TP_Read_XOY(u8 xy)。

    

 

  2、還有u8 TP_Read_XY(u16 *x,u16 *y)就是同時讀取X、Y的AD轉換值,是上一個函數u16 TP_Read_XOY(u8 xy)的升級版~

  而u8 TP_Read_XY2(u16 *x,u16 *y)是連續兩次讀取X和Y的AD轉換值,並將有效的AD值存入*x和*y指向的內存中,這樣得到的AD值就很準確了,再通過相應的比例計算就可以轉換為實際坐標了。。

    

 

  ——————————————————————— 華麗分割線 ———————————————————————————

  上面一直在講AD值的精確獲取。。。下面就要把獲得的精確AD值轉換為實際坐標。譬如我們點了一下觸控螢幕,返回的AD值為(1600,1200),即觸點X方向的AD值為1600,Y方向的AD值為1200,下面就是介紹如何把像1600和1200這種AD值轉換為實際坐標。

  在轉換為實際坐標之前要講一下一個非常重要的知識點------觸控螢幕校正,為什麼要校正,博主在這裡就不給大家列舉了,請讀者自己查閱相關資料~

  校正原理(借鑑了一些網絡上的優秀文章):

  因為我們再實際中無法確定TFT屏的原點,那麼我們只能在TFT屏上先確定4個點,如圖:

    

 

  這4個點的坐標是我們知道的,然後用筆去觸摸這4個點,記錄下這4個點的AD值,分別為:(AD_X1,AD_Y1),(AD_X2,AD_Y2),(AD_X3,AD_Y3),(AD_X4,AD_Y4),根據這四個點,我們計算出四個校準參數(下文會詳細介紹):xfac,yfac,xoff,yoff,我們把得到的所有物理坐標都按這個關係式來計算:

  LCDx=xfac*Px+xoff

  LCDy=yfac*PY+yoff

  其中(LCDx,LCDy)是在LCD上的實際坐標(像素坐標),(Px,Py)是從觸控螢幕讀到的物理坐標。剩下4個參數,下文會介紹

  校正代碼:

    

 

  圖上畫紅圈的,請讀者注意tp_dev.sta狀態位的變化,下面就進入第二個紅圈:tp_dev.scan(1)觸摸掃描函數中看看,這裡scan是函數指針:

    

 

  這裡應該從校準函數中說,應該能好理解。→_→在校準函數中,不斷掃描TP_Scan()函數,如果這時候你觸摸了一下屏幕,PEN所對應STM32的引腳將會從高電平跳變為低電平,詳情看上文第二講的注意→_→。即Ttp_dev.sta=1100,0000(根據上圖第一個方框得出)。不滿足校準函數中的if((tp_dev.sta&0xc0)==TP_CATH_PRES),故不會進行下面的畫點。如果之前並沒有按下觸控螢幕,這時同樣是不滿足上面if的。如果之前按下後松下了,這時Ttp_dev.sta=0111,1111,這時滿足校準函數中的if((tp_dev.sta&0xc0)==TP_CATH_PRES),然後在校準函數中標記下觸摸已經被處理了(清除tp_dev.sta),清除第一個點,畫第二個點,清除第二個點,畫第三個點,清除第三個點,畫第四個點,清除第四個點。也就是,觸控螢幕幕有兩個狀態:按下和鬆開。當按下時,程序執行的是將按下的AD值坐標存到兩個數組中即上圖中的TP_Read_XY2(&tp_dev.x[0],&tp_dev.y[0]);當鬆開時,清除原來的點,並畫一個新點。這樣觸摸4次。

  在校準函數中,由於之前重複觸摸了4下屏幕,觸摸的4個點的AD值被存入到了pos_temp[4][2]數組中,然後算出(x1,y1),

  (x2,y2)之間的距離d1和(x3,y3),(x4,y4)之間的距離d2,把這兩個水平距離相除得到一個比值fac1;再計算出(x1,y1),(x3,y3)之間的距離d3和(x2,y2),(x4,y4)之間的距離d4,把這兩豎直方向的距離相除,得到一個比值fac2.如果0.95 

  xfac、yfac:每個AD點對應的像素點數目。(液晶理論寬度-40)/(x2-x1) 即液晶理論寬度點陣值/AD測量值

  xoff、yoff:測量誤差值。[液晶理論寬度點陣值 - 每AD值對應多少點陣*(AD測量值)]/2 = 測量誤差值(理論值為 20 點陣,實際是有誤差的)

  啊,個人覺得亂七八糟的,不知道以後還能不能看懂了~~~→

相關焦點

  • Stm32的TFT LCD顯示器控制學習筆記
    學習stm32,TFT LCD顯示屏控制是很重要的一章,本人在初步學習STM32遇到了很多困難,所以把學習中積累的部分感覺重要的知識點羅列出來
  • 基於STM32的電池管理系統觸控螢幕設計
    可見顯示模塊的人機互動功能是EMS中不可或缺的組成部分,從顯示模塊所需的功能看觸控螢幕是不錯的選擇。但如果購買市面上的觸控螢幕,不僅顯示內容會受觸控螢幕本身顯示功能固定的限制而降低顯示設計的靈活度、影響顯示質量,並且市面上觸控螢幕的價格也普遍較高,給產品增加了很大一部分成本,這無疑會大大降低產品的市場競爭力。基於這種情況本文提出一種以STM32F103單片機為控制核心的比較通用的液晶觸控螢幕的設計方案。
  • 13個基於STM32的經典項目設計實例,全套資料~
    今天總結了幾篇電路城上關於STM32 的製作,不能說每篇都是經典,但都是在其他地方找不到的,很有學習參考意義的設計實例。尤其對於新手,是一個學習stm32單片機的“活生生”的範例。
  • 基於STM32的EMS液晶顯示觸控螢幕設計方案
    摘要:提出一種基於STM32F103單片機的用於電動車電池能量管理系統(EMS)的液晶顯示觸控螢幕的設計方案,該方案以STM32F103
  • 基於STM32的帶觸控螢幕的無線解說器
    1 系統總體構成系統主要器件包括TFT觸控螢幕、STM32F103RCT6微控制器、SD卡、語音解碼晶片VS1003、揚聲器。STM32F103RCT6微控制器為系統終端的控制核心,通過它與手持式設備之間進行無線串口通訊,讀取SD卡中的音頻文件,控制VS1003解碼讀取的數據,實現聲音的播放與控制,該系統主體結構如圖1所示。
  • 用STM32設計個電池管理系統觸控螢幕
    可見顯示模塊的人機互動功能是EMS中不可或缺的組成部分,從顯示模塊所需的功能看觸控螢幕是不錯的選擇。但如果購買市面上的觸控螢幕,不僅顯示內容會受觸控螢幕本身顯示功能固定的限制而降低顯示設計的靈活度、影響顯示質量,並且市面上觸控螢幕的價格也普遍較高,給產品增加了很大一部分成本,這無疑會大大降低產品的市場競爭力。基於這種情況本文提出一種以STM32F103單片機為控制核心的比較通用的液晶觸控螢幕的設計方案。
  • 怎麼學習STM32單片機?看老司機是怎麼說的!
    本文引用地址:http://www.eepw.com.cn/article/201705/359058.htm  我不是說STM32不好,而是這種為了學習單片機而去學習單片機的思路不對。  你問,如何系統地入門學習stm32?  本身就是一個錯誤的問題。
  • STM32學習筆記——使用函數庫編程控制GPIO口輸出
    建立帶函數庫的IAR項目工程本文引用地址:http://www.eepw.com.cn/article/201611/322900.htm先從網上下載3.5版(據說3.0版以後的固件庫才逐漸穩定)stm32固件庫(stm32f10x_stdperiph_lib)。由於與固件庫版本兼容問題,重新下載安裝了IAR6.30版。
  • avr單片機和stm32區別與優缺點分析
    摘要:avr單片機和stm32單片機是目前使用較廣泛的單片機,那麼avr單片機和stm32單片機有什麼區別呢?有什麼優劣勢呢?C語言與51的C語言在寫法上存在很大的差異,這讓從開始學習51單片機的朋友很不習慣   3. 通用寄存器一共32個(R0~R31),前16個寄存器(R0~R15)都不能直接與立即數打交道,因而通用性有所下降。而在51系列中,它所有的通用寄存器(地址00~7FH)均可以直接與立即數打交道,顯然要優於前者。
  • 基於STM32的OV7670攝像頭總結
    的工作原理:      圖1:不帶FIFO  圖2:帶FIFO  下面就講解這兩種方式的適用範圍:  不帶FIFO:這種方法最簡單,最直接,但是最不好實現的方法,原因是多數的CMOS晶片(如OV7670)的時鐘速度可以高達24M,一般單片機的IO口速度根本達不到(stm32
  • 一文解析stm32產生spwm原理及程序
    打開APP 一文解析stm32產生spwm原理及程序 發表於 2018-05-18 09:11:49 本文主要詳解stm32產生spwm原理及程序,首先來了解一下生成SPWM波的基理是什麼,具體得跟隨小編一起來了解一下。
  • 基於PLC和觸控螢幕的高壓靜電除塵控制系統方案
    基於PLC和觸控螢幕的高壓靜電除塵控制系統方案 秦長葳,楊淑連等 發表於 2013-03-29 16:17:30   以單片機為核心的高壓靜電除塵控制器具有成本低廉,
  • 基於Cortex-M3的TFT觸控螢幕在環境監控系統中的應用
    0 引言 觸控螢幕是一種新型的電子輸入設備,是目前最簡單、方便、自然的一種人機互動方式,它賦予了多媒體以嶄新的面貌,是極富吸引力的全新多媒體交互設備
  • 乾貨 | 143條 超詳細整理STM32單片機學習筆記
    67、電容觸控螢幕原理:通過充放電的曲線不同來檢測是否被按下。實際的實驗過程中,TPAD可以用一塊覆銅區域來替代,通過電容的充放電常數來確定是否按下。118、觸控螢幕一般分為電阻式觸控螢幕和電容式觸控螢幕。前者檢測觸摸的位置原理是利用觸控螢幕控制器中的A/D轉換器經過兩次A/D讀值後得出X和Y的坐標值。注意:這個X和Y的值是相對於觸控螢幕的,而非LCD屏。
  • 基於STM32的多功能數字鐘(中文版)
    /**************************************************************************************程序功能:基於STM32的多功能數字鐘(中文版)
  • 什麼是電磁屏,什麼是電磁式觸控螢幕,電磁式觸控螢幕原理
    什麼是電磁屏,什麼是電磁式觸控螢幕,電磁式觸控螢幕原理 作者: 51Touch     時間:2013-01-10     源於:中國觸控螢幕網    總點擊:
  • 用STM32做一個微型掌上示波器項目——終於鼓起在大牛前獻醜的無比...
    因為製作時間很短,元器件不是很夠用,所以只能做出這個只有初級功能的示波器了,只是菜鳥級程序,不建議大家做學習之用。 我是從大二下學期開始學的51單片機,之後就對燒晶片興趣甚濃,用51做了很多小玩意出來:例如探頭式溫度器、基於霍爾元件的測速器,超聲波測距器,震動報警器等等。 而進入大三,我就開始學習ARM了。
  • 四線電阻觸控螢幕校準算法的實現
    一、四線電阻觸控螢幕簡介   四線電阻觸控螢幕,是要求輸入靈活性和個人化應用的理想觸摸解決方案:採用一體成型出線技術,和觸控螢幕專用基材,保證觸控螢幕精確、穩定、可靠和反應靈敏。四線電阻觸控螢幕,完全密封處理,徹底防水、防塵、防汙染,符合IP65密封標準。具有低成本、低功耗和可以提供最小尺寸的技術特性。
  • stm32開發板開發筆記(5)-2.4寸26萬色TFT觸控螢幕模塊
    因為產品要用到顯示屏和觸摸,就買了一個2.4寸的彩色觸控螢幕模塊。
  • stm32的微秒延時程序
    我的stm32系統時鐘為72MHZ,用軟體延時方法實現微秒級的延時,既空循環:延時函數為:本文引用地址:http://www.eepw.com.cn