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