單片機用一個IO口采集多個按鍵信號?
在設(shè)計中如果用到IO口不夠用,我們肯定第一時間想到的就是通過電阻分壓,根據(jù)按下不同按鍵,來讓不同阻值的電阻接到分壓電路中,然后ADC模塊做電壓數(shù)據(jù)讀取分析對應(yīng)按鍵按下。下文就和大家分享下單片機設(shè)計AD按鍵的內(nèi)容。
AD按鍵設(shè)計硬件部分電路有兩種電路形式,一種的電阻串聯(lián),您一種是電阻并聯(lián),這兩種都是通過電阻分壓的原理實現(xiàn)的,下面通過電路圖一一介紹。
電阻并聯(lián)型AD按鍵上圖有10個按鍵,不同按鍵按下,分到的電壓值不同,電阻值我已經(jīng)計算好了,有部分誤差,但已經(jīng)是算成最小誤差值了,以后大家可直接使用。對應(yīng)的分壓依次值有0.1Vref、0.2Vref ~ 0.9Vref、0.99Vref,共10個檔位。單片機ADC通過讀取電路中ADCIN處的電壓識別對應(yīng)按鍵按下。
上圖電阻并聯(lián)型AD按鍵電路有一個缺點就是如果有兩個按鍵同時按下,會有錯誤識別的可能出現(xiàn),扛干擾差,所以并聯(lián)型AD按鍵電路很少使用。
電阻串聯(lián)型AD按鍵上圖中有10個按鍵,對應(yīng)電阻值按照ADCIN處的電壓分別為Vref的x/10(x=1,2,3...9,10)倍算好,使用的電阻值也已經(jīng)按照最小誤差定的,可直接使用。不同按鍵按下,ADCIN處的電壓不同,單片機ADC模塊讀出ADC值,從而識別對應(yīng)哪個按鍵按下。
上圖中電阻使用串聯(lián)的方式接在電路中,這樣也就有一個電阻壞,就會影響到其他按鍵檢測的問題。如果兩個按鍵按下,只會識別一個靠近圖中ADCIN處的按鍵,這樣不會有像并聯(lián)型AD按鍵電路哪有識別有誤的問題存在,但是這里電阻的誤差不好控制,所以我對上面電路做了改進。如下圖:
這個電路的好處就是這里將串聯(lián)的電阻設(shè)計成等值的形式,這樣在生產(chǎn)時也不必買更多阻值的電阻了。具體怎么分壓的相信大家一看就懂。這里只是巧妙的應(yīng)用了一個1M的電阻,一個電阻和大于它很多倍(一般理解為10倍以上)的電阻并聯(lián),并聯(lián)后的阻值依然可以理解為和這個電阻值相等。同樣的可以將電阻并聯(lián)型AD按鍵電路改成等阻值的,這里就不在做出解答,有興趣的朋友可以發(fā)揮下自己的腦力看看怎么設(shè)計。
使用AD按鍵時有個需要注意的地方就是,按鍵盡量選擇好些的。因為按鍵本身按下也是有阻值的,特別是用了久的按鍵,其按鍵接觸點容易氧化,造成按鍵按下,有一定的按鍵阻值接在電路中。從而影響程序的識別,特別是我國南方較潮濕的地區(qū),差一定的按鍵觸電特別容易生銹氧化。所以AD按鍵也就存在了比單獨通過讀IO電平識別的按鍵短的壽命短的問題。所以這種按鍵也不是很推薦使用的。特別是按鍵數(shù)量越多,出現(xiàn)問題的數(shù)量也就越多。
AD按鍵程序設(shè)計在程序設(shè)計前,首先要明白AD按鍵設(shè)計的原理和程序設(shè)計的思路。如果一個8位的ADC模塊,要設(shè)計成10個按鍵,就是將8位ADC滿值255等分成10份,沒份之間有大約25個差值,比如一個按鍵按下的ADC值在25±11的位置,那么它臨近的按鍵就是50±11的位置。對應(yīng)的識別這些值,就可以識別那個按鍵按下了。當(dāng)然為了抗干擾強,最好等分的數(shù)要少,8位的話等分最好不要超過8個按鍵,否則抗干擾不是很好,如果是8個按鍵的話每個按鍵的ADC差值為32,按鍵間的ADC差值越大,越有利于抗干擾。
AD按鍵程序思路:
每隔10ms(這個時間是按鍵抖動的濾波時間)讀一次ADC按鍵值,根據(jù)值的范圍,將對應(yīng)的按鍵數(shù)值加到AD按鍵FIFO中(這里緩沖區(qū)8個字節(jié)長),如果AD按鍵FIFO滿了,如果FIFO前4個值是0(對應(yīng)按鍵沒按下),最后2個值是相等的(對應(yīng)按鍵按下),中間的2個值對應(yīng)按鍵抖動時的值,不用管,相當(dāng)于有20ms的抖動濾波時間,那么就人為最后這兩個相等的值的對應(yīng)按鍵按下了。
最后歡迎大家轉(zhuǎn)發(fā)評論交流!覺得寫的好的話就來個轉(zhuǎn)發(fā)吧,讓更多人知道。也歡迎大家關(guān)注我的頭條號:單片機嵌入式愛好者。會有源源不斷的干貨分享,能真正快速幫大家解決實際工作中遇到的問題哦!