胡傳志,沈建華,李躍華
(1.南通大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,南通 226019;2.華東師范大學(xué))
一種實(shí)時(shí)性強(qiáng)并且可移植的按鍵消抖方法*
胡傳志1,2,沈建華2,李躍華1
(1.南通大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,南通 226019;2.華東師范大學(xué))
延時(shí)消抖方法是嵌入式系統(tǒng)中常見(jiàn)的按鍵消抖方法,其通過(guò)延時(shí)程序跳過(guò)抖動(dòng)態(tài),該方法雖然可行,但既不具備實(shí)時(shí)性,也不具備可移植性。針對(duì)這種情況,提出了一種新的按鍵消抖方法,該方法通過(guò)一個(gè)累乘算法來(lái)有效識(shí)別按鍵抖動(dòng)態(tài)和穩(wěn)定態(tài)的區(qū)別,達(dá)到消除抖動(dòng)影響的目的。實(shí)驗(yàn)結(jié)果表明,該方法不僅實(shí)時(shí)性強(qiáng)而且具備可移植性。
嵌入式系統(tǒng);按鍵消抖;抖動(dòng)態(tài);穩(wěn)定態(tài);實(shí)時(shí)性
在嵌入式系統(tǒng)中,按鍵消抖是一個(gè)常見(jiàn)問(wèn)題,延時(shí)消抖方法是教科書上常提到的一種按鍵消抖方法。延時(shí)消抖方法的原理是通過(guò)調(diào)用一個(gè)延時(shí)程序跳過(guò)抖動(dòng)態(tài),從而達(dá)到消抖的目的。這種方法有兩個(gè)致命的缺點(diǎn):一是延時(shí)期間CPU一直被延時(shí)程序占用,長(zhǎng)達(dá)幾十ms,這對(duì)于實(shí)時(shí)性要求很高的嵌入式系統(tǒng)來(lái)說(shuō)無(wú)異于死機(jī);二是延時(shí)程序通過(guò)指令周期的累加來(lái)實(shí)現(xiàn)延時(shí),而不同系統(tǒng)的指令周期是不同的,所以該方法不具備可移植性。
為了克服延時(shí)消抖的缺點(diǎn),有人提出了定時(shí)器中斷消抖方法,該方法的原理和延時(shí)消抖其實(shí)是一樣的,也是通過(guò)延時(shí)跳過(guò)抖動(dòng)態(tài),區(qū)別在于使用定時(shí)器取代延時(shí)程序。雖然通過(guò)定時(shí)器延時(shí)解決了實(shí)時(shí)性的問(wèn)題,但是定時(shí)器的配置和使用在不同系統(tǒng)中是不同的,所以依然沒(méi)有解決可移植性的問(wèn)題。
本文提出了一種新的按鍵消抖方法,與上述兩種方法不同,該方法不是機(jī)械地跳過(guò)抖動(dòng)態(tài),而是設(shè)法識(shí)別按鍵的抖動(dòng)態(tài)和穩(wěn)定態(tài),從而避開(kāi)抖動(dòng)影響。因?yàn)樵摲椒ǖ暮诵氖峭ㄟ^(guò)一個(gè)累乘算法來(lái)識(shí)別抖動(dòng)態(tài)和穩(wěn)定態(tài),所以將該方法命名為累乘消抖方法。
按鍵是嵌入式系統(tǒng)中常用的輸入單元,常見(jiàn)的電路形式如圖1所示。
按下按鍵SW,按鍵值(即keyin端電平)由高變低;松開(kāi)按鍵,keyin端電平由低變高,即在keyin端出現(xiàn)一個(gè)負(fù)脈沖,如圖2所示。
圖1 按鍵電路單元
圖2 理想的按鍵信號(hào)
這樣,系統(tǒng)通過(guò)讀取keyin端電平來(lái)識(shí)別按鍵狀態(tài),一個(gè)負(fù)脈沖代表一次按鍵。然而,實(shí)際中,在按下按鍵和松開(kāi)按鍵的瞬間,由于觸點(diǎn)的彈性作用而引發(fā)電信號(hào)不穩(wěn)定,導(dǎo)致在這兩個(gè)瞬間都會(huì)有非常短暫(10ms左右,取決于按鍵的機(jī)電特性)的抖動(dòng)毛刺存在,如圖3所示(為便于討論,將按鍵的狀態(tài)分為前沿抖動(dòng)態(tài)、穩(wěn)定按下態(tài)、后沿抖動(dòng)態(tài)和穩(wěn)定松開(kāi)態(tài))。
圖3 實(shí)際的按鍵信號(hào)
盡管抖動(dòng)時(shí)間非常短暫,但是對(duì)于指令周期ns級(jí)的微控制器來(lái)說(shuō)還是漫長(zhǎng)的,以至于在微控制器看來(lái)就不是一個(gè)負(fù)脈沖,而是很多個(gè)負(fù)脈沖,從而導(dǎo)致一次按鍵被誤認(rèn)為多次按鍵。按鍵消抖就是為了消除抖動(dòng)影響,對(duì)于一次按鍵,只讓系統(tǒng)看作一次。延時(shí)消抖的原理是通過(guò)延時(shí)程序跳過(guò)抖動(dòng)態(tài),本文介紹的累乘消抖方法的原理是有效地識(shí)別當(dāng)前按鍵所處狀態(tài),然后根據(jù)不同的按鍵狀態(tài)做相應(yīng)的處理。
2.1 抖動(dòng)態(tài)和穩(wěn)定態(tài)的區(qū)別
累乘消抖方法的關(guān)鍵是識(shí)別抖動(dòng)態(tài)和穩(wěn)定態(tài)的區(qū)別。由圖3可知,抖動(dòng)態(tài)是頻繁的1、0跳變;穩(wěn)定態(tài)或者一直為0(穩(wěn)定按下態(tài)),或者一直為1(穩(wěn)定松開(kāi)態(tài))。抖動(dòng)態(tài)的特征是變化,穩(wěn)定態(tài)的特征是不變,基于這點(diǎn),只要設(shè)計(jì)出一個(gè)能夠區(qū)別變化量和不變量的算法,就可以識(shí)別出抖動(dòng)態(tài)和穩(wěn)定態(tài)。
如圖3所示,在一次按鍵過(guò)程中,按鍵依次經(jīng)歷了前沿抖動(dòng)態(tài)、穩(wěn)定按下態(tài)、后沿抖動(dòng)態(tài)和穩(wěn)定松開(kāi)態(tài)。其中,前沿抖動(dòng)態(tài)是變化的,期間按鍵值keyin不會(huì)一直為0,會(huì)有若干次跳變回1;穩(wěn)定按下態(tài)是不變的,期間按鍵值一直為0;后沿抖動(dòng)態(tài)是變化的,期間按鍵值不會(huì)一直為1,會(huì)有若干次跳變?yōu)?;穩(wěn)定松開(kāi)態(tài)是不變的,期間按鍵值一直為1。
兩種“變化”都表現(xiàn)為“不一直”,兩種“不變”都表現(xiàn)為“一直”。按鍵狀態(tài)分析見(jiàn)表1。
表1 按鍵狀態(tài)分析
設(shè)計(jì)一種算法,如果能夠區(qū)別“不一直”和“一直”,那么問(wèn)題便迎刃而解。借助邏輯乘運(yùn)算的“全真才真,有假則假”的特點(diǎn)可以輕松解決這個(gè)問(wèn)題。
2.2 累乘算法
在等待按鍵按下時(shí),如果檢測(cè)到有低電平,則緊接著連續(xù)讀取按鍵信號(hào)N次。如果處于剛按下時(shí)的抖動(dòng)態(tài),這N次讀取可能發(fā)生在毛刺的底部(低電平),也可能發(fā)生在毛刺的頂部(高電平),當(dāng)N不是太小時(shí),能夠保證其中至少會(huì)有一次發(fā)生在毛刺的頂部。如果對(duì)這N次按鍵值是否為0進(jìn)行累計(jì)邏輯乘操作,那么結(jié)果為假。如果是處于穩(wěn)定的按下態(tài),這N次讀取都為低電平,則對(duì)這N次按鍵值是否為0進(jìn)行累計(jì)邏輯乘操作,結(jié)果為真。
在等待按鍵松開(kāi)時(shí),如果檢測(cè)到有高電平,緊接著連續(xù)讀取按鍵信號(hào)N次。如果處于剛松開(kāi)時(shí)的抖動(dòng)態(tài),這N次讀取可能發(fā)生在毛刺的頂部(高電平),也可能發(fā)生在毛刺的底部(低電平),當(dāng)N不是太小時(shí),能夠保證其中至少會(huì)有一次發(fā)生在毛刺的底部。如果對(duì)這N次按鍵值是否為1進(jìn)行累計(jì)邏輯乘操作,則結(jié)果為假。如果是處于穩(wěn)定松開(kāi)態(tài),這N次讀取都為高電平,對(duì)這N次按鍵值是否為1進(jìn)行累計(jì)邏輯乘操作,結(jié)果為真。
至此可以給出一個(gè)算法,在N次循環(huán)中,將按鍵值與期望值進(jìn)行比較,將它們是否與期望值相等的邏輯結(jié)果用邏輯乘運(yùn)算作累計(jì),根據(jù)累計(jì)值來(lái)判別按鍵狀態(tài),鑒于累計(jì)、邏輯乘這兩個(gè)關(guān)鍵要素,將此算法命名為累乘算法,描述如下:
算法分析:從循環(huán)條件可以看出,對(duì)于抖動(dòng)態(tài),是不會(huì)將循環(huán)執(zhí)行到底的,在第一次沒(méi)有讀到期望值時(shí),就否定了循環(huán)條件。對(duì)于穩(wěn)定態(tài),一直讀到的都是期望值,退出循環(huán)的原因是計(jì)數(shù)次數(shù)已到。退出循環(huán)后的累計(jì)值A(chǔ)ndup若為假,即為抖動(dòng)態(tài),若為真,即為穩(wěn)定態(tài)。
2.3 累乘消抖方法
基于累乘算法識(shí)別按鍵狀態(tài),建立的按鍵消抖程序如下:
程序分析:靜態(tài)布爾變量Pressed記錄按鍵的狀態(tài),假表示松開(kāi),真表示按下。當(dāng)按鍵處于穩(wěn)定按下態(tài)時(shí),返回真,其他狀態(tài)返回假。通過(guò)一個(gè)不超過(guò)COUNT次的循環(huán)檢測(cè)來(lái)判別抖動(dòng)態(tài)和穩(wěn)定態(tài),尚未達(dá)到COUNT次但因?yàn)锳ndup為假而退出循環(huán)的是抖動(dòng)態(tài);達(dá)到了COUNT次而退出循環(huán)的是穩(wěn)定態(tài),此時(shí)Andup為真。
循環(huán)次數(shù)COUNT的設(shè)置很重要,COUNT值太小,可能導(dǎo)致判斷不準(zhǔn)確;取值太大,則會(huì)浪費(fèi)。浪費(fèi)只會(huì)發(fā)生在穩(wěn)定態(tài),在抖動(dòng)態(tài)是不存在浪費(fèi)的,因?yàn)橐坏](méi)有讀到期望值就導(dǎo)致Andup值為假,從而否定了循環(huán)條件。只有在穩(wěn)定態(tài),直到COUNT次才退出循環(huán),總共循環(huán)COUNT次。COUNT次循環(huán)相對(duì)于延時(shí)消抖里的幾十ms來(lái)說(shuō),可以說(shuō)是完全釋放了CPU,大大提高了系統(tǒng)的實(shí)時(shí)性。另外,該方法不涉及指令周期和定時(shí)器等底層硬件,所以完全具備可移植性。
本文以Tiva C LaunchPad為實(shí)驗(yàn)平臺(tái)驗(yàn)證累乘消抖方法的可行性和實(shí)時(shí)性。在將算法實(shí)例化之前,首先要考慮的就是COUNT的取值問(wèn)題,因?yàn)镃OUNT的取值決定了算法的可行性和實(shí)時(shí)性。
3.1 COUNT取值方法
COUNT取值太小的話,不能保證在次數(shù)很少的循環(huán)累乘中一定能讀到抖動(dòng)態(tài)的某次逆跳變,所謂逆跳變指前沿抖動(dòng)態(tài)的跳回1,以及后沿抖動(dòng)態(tài)的跳回0??赡艹霈F(xiàn)這樣的情況,前沿抖動(dòng)時(shí)恰巧每次讀取都發(fā)生在0處,后沿抖動(dòng)時(shí)恰巧每次讀取都發(fā)生在1處。這樣就導(dǎo)致把抖動(dòng)態(tài)誤認(rèn)為穩(wěn)定態(tài),從而使算法失去了可行性。COUNT取值太大的話,又會(huì)在穩(wěn)定態(tài)的循環(huán)累乘中浪費(fèi)大量CPU時(shí)間,從而使算法損失了實(shí)時(shí)性。
實(shí)驗(yàn)中,依次取COUNT值為20、10、2。同時(shí),為了記錄每次循環(huán)累乘的執(zhí)行情況,在循環(huán)累乘的一開(kāi)始添加一條語(yǔ)句,將循環(huán)計(jì)數(shù)器n通過(guò)串行口輸出到上位機(jī)的串口終端程序,這樣便可以清楚地看到每次循環(huán)累乘都執(zhí)行了幾次。不到COUNT次的是抖動(dòng)態(tài),到了COUNT次的是穩(wěn)定態(tài)。特別要注意每次抖動(dòng)態(tài)的循環(huán)次數(shù),目的是了解大概幾次就可以讀到逆跳變。這為盡量縮小COUNT提供了依據(jù),縮小COUNT就等于提高實(shí)時(shí)性。
當(dāng)COUNT=20時(shí),按鍵靈敏,證明可行,其中隨機(jī)一次按鍵,串口記錄的執(zhí)行情況見(jiàn)表2。
表2 COUNT=20時(shí)串口記錄的執(zhí)行情況
第1次循環(huán)累乘,循環(huán)體執(zhí)行了2次,在第2次時(shí)讀到了逆跳變,說(shuō)明是抖動(dòng)。第2次循環(huán)累乘,循環(huán)體執(zhí)行了3次,在第3次時(shí)讀到了逆跳變,說(shuō)明是抖動(dòng)。第3次循環(huán)累乘,循環(huán)體執(zhí)行了20次,一直沒(méi)有讀到逆跳變,說(shuō)明是穩(wěn)定態(tài)。第4次循環(huán)累乘,循環(huán)體執(zhí)行了2次,在第2次時(shí)讀到了逆跳變,說(shuō)明是抖動(dòng)。第5次循環(huán)累乘,循環(huán)體執(zhí)行了3次,在第3次時(shí)讀到了逆跳變,說(shuō)明是抖動(dòng)。第6次循環(huán)累乘,循環(huán)體執(zhí)行了2次,在第2次時(shí)讀到了逆跳變,說(shuō)明是抖動(dòng)。第7次循環(huán)累乘,循環(huán)體執(zhí)行了20次,一直沒(méi)有讀到逆跳變,說(shuō)明是穩(wěn)定態(tài)。對(duì)于本次按鍵,抖動(dòng)態(tài)的循環(huán)累乘次數(shù)為2~3次。
當(dāng)COUNT=10時(shí),按鍵靈敏,證明可行。其中隨機(jī)一次按鍵,串口記錄情況見(jiàn)表3。
對(duì)于本次按鍵,抖動(dòng)態(tài)的循環(huán)累乘次數(shù)也為2~3次。
當(dāng)COUNT=2時(shí),按鍵不靈,說(shuō)明不可行。因?yàn)閮纱窝h(huán)不足以保證在抖動(dòng)態(tài)期間一定有一次能讀到逆跳變,以至于將抖動(dòng)態(tài)誤認(rèn)為穩(wěn)定態(tài),從而導(dǎo)致一次按鍵被誤認(rèn)為多次。
表3 COUNT=10時(shí)串口記錄的執(zhí)行情況表
多做幾次實(shí)驗(yàn)之后發(fā)現(xiàn),每次抖動(dòng)態(tài)的循環(huán)累乘最多需要三次就可以讀到逆跳變,所以COUNT值要大于3,為了留有一定冗余,取COUNT值為10即可。限于篇幅不能把每次實(shí)驗(yàn)結(jié)果都羅列出來(lái)。
3.2 評(píng)估
累乘消抖程序總是在執(zhí)行幾次循環(huán)后就交出執(zhí)行權(quán),最多的循環(huán)次數(shù)也就是COUNT次,相比較延時(shí)消抖中的百萬(wàn)次循環(huán)(將ns級(jí)的指令周期累加到ms級(jí),需要執(zhí)行百萬(wàn)次循環(huán))來(lái)說(shuō)大大提高了實(shí)時(shí)性。另外,累乘消抖程序并不涉及指令周期和定時(shí)器等底層硬件具有可移植性。
使用累乘消抖方法建立的消抖程序在識(shí)別出按鍵的狀態(tài)后立刻返回,交出CPU使用權(quán)。區(qū)別是不同的返回代碼反映了不同的按鍵狀態(tài),如果是抖動(dòng)態(tài)則不予處理,如果是穩(wěn)定態(tài)則給予相應(yīng)處理。如果把按鍵消抖比作家長(zhǎng)吩咐正在看電視的小孩看著燒水的水壺,抖動(dòng)態(tài)好比水正在燒,穩(wěn)定態(tài)好比水已燒開(kāi)。那么,延時(shí)消抖就好比一個(gè)笨小孩,離開(kāi)了電視機(jī),一直盯著水壺,直到水開(kāi)。
累乘消抖則好比一個(gè)聰明的小孩,沒(méi)有停止看電視,只是定期地看一眼水壺的狀態(tài),如果水沒(méi)開(kāi),繼續(xù)看電視,如果水開(kāi)了就告知家長(zhǎng)。通過(guò)這個(gè)比喻可以形象地看到累乘消抖具有很強(qiáng)的實(shí)時(shí)性。另外,累乘消抖不涉及指令周期和定時(shí)器等底層硬件,所以又具備可移植性。雖然為了達(dá)到最理想的實(shí)時(shí)性,要通過(guò)實(shí)驗(yàn)確定當(dāng)前系統(tǒng)最適合的COUNT值,但如果要求不是過(guò)于嚴(yán)苛,直接選用COUNT為100即可。
[1]卜登立.基于優(yōu)先級(jí)編碼器的非編碼矩陣鍵盤接口設(shè)計(jì)[J].化工自動(dòng)化及儀表,2010,37(4):93-95.
[2]張迎偉.基于嵌入式系統(tǒng)的機(jī)械設(shè)備點(diǎn)檢儀研制[D].西安:西安科技大學(xué),2011.
[3]曾立志.基于嵌入式系統(tǒng)的按鍵接口設(shè)計(jì)技術(shù)研究[J].軟件,2013,34(7):63-64.
[4]陳良琳,肖春發(fā).基于Atmel QTouch的ATmega48感應(yīng)按鍵設(shè)計(jì)[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2011,11(5):37-39.
[5]袁鑫.以MCU為核心的嵌入式系統(tǒng)通用硬件平臺(tái)設(shè)計(jì)[D].天津:南開(kāi)大學(xué),2011.
[6]楊茂林.基于移動(dòng)BREW3.1.5平臺(tái)的嵌入式應(yīng)用的開(kāi)發(fā)與研究[D].北京:北京郵電大學(xué),2010.
[7]孫強(qiáng),張振華,曹躍龍.使用UML和C語(yǔ)言實(shí)現(xiàn)基于對(duì)象的嵌入式軟件開(kāi)發(fā)[J].計(jì)算機(jī)測(cè)量與控制,2003,11(4):292-294.
[8]Maeda Y,Kentaro T,MIYAKAWA M.Quantitative Analysis on Usability of Button-Input Interfaces[J].IEICE transactions on fundamentals of electronics,communications and computer sciences,2011,94(2):789-794.
[9]Morimoto K,Miyajima C,Itou K,et al.A virtual button interface using fingertip movements[C]//Machine Learning and Cybernetics,2007International Conference on IEEE,2007(4):2089-2093.
胡傳志(碩士研究生),主要研究方向?yàn)榍度胧较到y(tǒng)和計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)。
High Real-time and Portable Method for Shaking Elimination of Keystroke
Hu Chuanzhi1,2,Shen Jianhua2,Li Yuehua1
(1.School of Computer Science&Technology,Nantong University,Nantong 226019,China;2.East China Normal University)
Time-lapse method is a common method of shaking elimination of keystroke in the embedded system,it skips shaking-state via a time-lapse program,but this method has neither real-time performance nor portability.For this reason,a new method of shaking elimination of keystroke is proposed.It recognizes the difference between the shaking-state and steady-state via an algorithm of accumulated multiplication,so that it can eliminate the influence of shaking.The experimental results show that the method has both high real-time performance and portability.
embedded system;shaking elimination of keystroke;shaking-state;steady-state;real-time performance
TP368.1
A
??楊迪娜
2015-01-26)
南通市應(yīng)用研究項(xiàng)目(BK2012068);南通大學(xué)自然科學(xué)基金(13Z002)。