RC電容觸摸感應(yīng)按鍵
1:RC感應(yīng)原理
RC采樣原理就是通過測量感應(yīng)極電容的微小變化,來感知人體對電容式感應(yīng)器(按鍵、輪鍵或者滑條)的感應(yīng)。電極電容(C)通過一個固定的電阻(R)周期性地充放電。
(原文件名:image001.png)
固定電壓施加在VIN,VOUT的電壓隨著電容值的變化而相應(yīng)增加或者降低, 如圖2所示。
(原文件名:image002.png)
通過計算VOUT的電壓達到閥值VTH所需要的充電時間(tC),來得到電容值(C)。
在觸摸感應(yīng)應(yīng)用中,電容值(C)由兩部分組成:固定電容(電極電容,CX)和當(dāng)人手接觸或者靠近電極時,由人手帶來的電容(感應(yīng)電容,CT)。電極電容應(yīng)該盡可能的小,以保證檢測到人手觸摸。因為通常人手觸摸與否,帶來的電容變化一般就是幾個pF(通常5pF)。
利用該原理,就可以檢測到手指是否觸摸了電極。
(原文件名:image003.jpg)
2:硬件實現(xiàn)
圖4顯示了一個實現(xiàn)的實例。由R1,R2以及電容電極(CX)和手指電容(CT)并聯(lián)的電容(大約5pF)形成一個RC網(wǎng)絡(luò),通過對該RC網(wǎng)絡(luò)充放電時間的測量,可以檢測到人手的觸摸。 所有電極共用一個“負載I/O”引腳。電阻R1和R2盡量靠近MCU放置。電電R1(阻值在幾百千歐到幾兆歐之間)是主要電電阻,用于調(diào)節(jié)觸摸檢測的靈敏度。電阻R2(10K?)是可選的,用于減少對噪聲影響。
(原文件名:image004.jpg)
3:充放電時間測量原理
為了保證健壯的電容觸摸感應(yīng)的應(yīng)用,充電時間的測量需要足夠的精確。通常有兩種方式來測量充電時間:
1.第一種方法是采用輸入捕獲(IC)定時器,當(dāng)電壓達到閥值時,觸發(fā)定時器開始工作。該方案中時間測量的精確度直接取決于定時器計數(shù)器的頻率。但是,由于每個電極都需要一個輸入捕獲通道,普通的MCU就不適合這種類型的電容感應(yīng)應(yīng)用了。
2.第二種方法采用一個簡單的定時器(無需IC功能)和一系列簡單的軟件操作,即定時地檢查感應(yīng)I/O端口上的電壓是否達到閥值。這樣的話,時間測量的精確度就取決于執(zhí)行一次完整軟件查詢需要的CPU周期數(shù)。這種測量方法會由于多次測量帶來一些抖動,但是由于沒有硬件限制,這種方法適用于需要很多電極的場合。
第二種方法修改一下,使用自適應(yīng)的軟件序列,就可以在測量時間時獲得和CPU頻率(fCPU)一樣的精度。
目前ST觸摸感應(yīng)采用第二種方法。
使用普通定時器進行充電時間的測量。對電容充電開始之前,定時器的計數(shù)器數(shù)值被記錄下來。當(dāng)采樣I/O端口上的電壓達到某個閥值(VTH)時,再次記錄定時器計數(shù)器的值。二者之差就是充電或者放電的時間。
(原文件名:image05.jpg)
為了提高在電壓和溫度變動情況下的穩(wěn)定性,對電極會進行連續(xù)兩次的測量:第一次測量對電容的充電時間,直到輸入電壓升至VIH。第二次測量電容的放電時間,直到輸入電壓降至VIL。下圖以及以下的表格詳細說明了對感應(yīng)電極(感應(yīng)I/O)和負載I/O引腳上的操作流程。
(原文件名:image06.jpg)
4:電容充放電測量步驟
由于是測量整個充電和放電為一個過程,因此在電容充電開始時候計時器開始計數(shù),在電容放電完成時候才停止計數(shù),同時保存計數(shù)值
(原文件名:biao1.jpg)
以上文字基本摘錄至ST文獻
5:數(shù)據(jù)處理
a:采樣
由于我們在判斷的時候是要花3個周期(while(PIND_X);),但是我們的計數(shù)器是1個周期的,這樣判斷采樣值就會有誤差。
舉例說,在充電過程中比如在T=49點上好是VIH到達點。會出現(xiàn)以下三種情況:
(原文件名:調(diào)整大小 圖形1.jpg)
1:在前一個判斷點在46時間點上,剛好可以在49時間點判斷采樣到VIH
2:在前一個判斷點在47時間點上,只能在50時間點判斷采樣到VIH,相差1個字
3:在前一個判斷點在48時間點上,只能在51時間點判斷采樣到VIH,相差2個字
我們當(dāng)然希望每次都是情況1出現(xiàn),但是不可能啊!
采用軟件方法測量3次,在3次中我們假設(shè)49,50,51點各出現(xiàn)一次。
第1次49 第2次 50 第3次 51
第1次49 第2次 50-1=49 第3次 51-2=49
但是我們怎么知道哪次測量是49或者50或者51呢?很簡單我們每次測量比前一次延時1個周期,連續(xù)測量3次,這樣就基本理論上跨越了3種可能出現(xiàn)的情況。但是如果三次都是一樣的值,那就只有埋怨老天怨天了。
我們測量的是整個充放電過程,所以理論上要跨越3*3=9個延遲周期,同時我們還順便把跨越的這9次測量當(dāng)做1組多點測量的平均數(shù)據(jù)。
B手指同步
我們的程序一般都是采樣多點,然后求平均。問題就出在這里,比如程序判斷9個點,在前6個點手指沒有觸摸,后3個點手指按觸摸,這樣求出的平均值就偏小,和手指遠離按鍵的效果一樣了。特別是平均點越多越是會出現(xiàn)這樣的問題。
因此要求判斷和手指觸摸同步。比如程序判斷9個點,在前3個點手指沒有觸摸,后三個點手指觸摸,我們判斷到第4個點有手指,從4-13掃描9個點。這樣就包含了手指的同步狀態(tài)。當(dāng)然有人說要是我在第7個點把手移開了不就變成后面幾點沒有按鍵嗎?開玩笑的,CPU的速度那么快,也許CPU掃描完成9個點然后再出去轉(zhuǎn)悠一圈回來,你的手指狀態(tài)還沒有來的及改變呢。
當(dāng)然然我們也可以采用連續(xù)掃描兩次9個點,如果兩次值相差在一定范圍內(nèi),說明手指狀態(tài)一樣。筆者還是采用該種辦法,雖說CPU速度快,但我怕他出去溜達的時候給什么大姨媽纏住不回來就慘了。
C:按鍵判別
經(jīng)過以上處理假如我們得到觸摸值為80,沒有觸摸時候的值是60,取一個按鍵開啟值70,只要按鍵值大于70就表示有觸摸。但是不是只要觸摸值小于70就表示沒有按鍵呢?當(dāng)然不是,手指畢竟是抖動的,一會大于70,一會兒小于70。按鍵就抖動了。
我們采用一個按鍵釋放值63,這樣當(dāng)觸摸值大于70按鍵開啟,一直到觸摸值小于63才表示按鍵釋放,就消除了按鍵抖動。
當(dāng)然我們實際沒有必要知道每次按鍵的掃描值,只要給每個通道設(shè)置一個差值,讓CPU自己去做觸摸值和基本值之間的差值比較就可以了。如差值大于10按鍵開啟,差值小于3按鍵釋放。
D:按鍵抑制和校準
按鍵抑制:我們把沒有觸摸時候的電容充放電值掃描紀錄下來保存為基本按鍵值。然后把以后掃描道的觸摸電容充放電值和基本值比較,在所有通道中差值最大那一組才開啟。起到相鄰按鍵抑制作用。不過筆者認為該功能真的作用不大,有時候還會起反作用。
按鍵校準:該步驟很重要,由于環(huán)境溫度,電壓等造成基本電容變大,這樣如果不重新校準基本值的話,差值很小,會造成靈敏度降低,甚至檢測不到按鍵。校準其實很簡單,采用1個定時器,在2秒鐘內(nèi)如果沒有檢測到觸摸狀態(tài)就重新掃描保存基本值。
好了就這樣基本上RC電容按鍵就完成了。
寫在這里,不得不說一下,筆者用AT2313編譯過6鍵的RC觸摸按鍵,穩(wěn)定性還是不錯的,不過在實驗室,為什么不在惡劣的環(huán)境下試驗?zāi)兀?br/>下面說一下RC電容感應(yīng)的缺點,不談優(yōu)點,筆者認為基本沒有。
1) 要求CPU速度要快,一般8M以上
2) 容易受干擾,輸入檢測是高阻態(tài)嘛
3) 該方法檢測的手指電容變換不大(靈敏度和干擾相克,同時電容的穿透感應(yīng)最強是在充放電的瞬間,而不是整個過程,RC原理恰恰是運用的整個過程)
4) 軟件處理麻煩
建議玩玩,或者用在搞死人不償命的設(shè)備上還是可以的,比如小玩具,手機等。嚴禁用在工業(yè)產(chǎn)品上啊。
筆者用2313做過RC電容感應(yīng)按鍵6個,模仿ST的
PD1作為公共腳
PA1PA0PD2PD3PD4PD5做K0-K5 6個按鍵
PB4PB3PB2PB1PB0PD6接發(fā)光二極管來反映狀態(tài)
本來還留有I2C口的,由于感覺該方案實在不能用于工業(yè),所以就到此為止。(以后會提供工業(yè)上的觸摸方案)
下面提供該方案的hex文件。和原代碼供大家玩玩。
(順便說一句,本人源代碼寫的垃圾,只供參考,還有用WINAVR編寫的話,代碼夠嗆,現(xiàn)在才發(fā)現(xiàn)AVR的代碼空間好小喲,真的有點限制AVR單片機的發(fā)展?。?br/>