按鍵開關在MCU的程式設計中初學者通常會遇到一個問題,就是按鍵彈跳現象,原因由於按鍵屬於機械結構,按下時會有機械彈跳的狀況出現,通常會讓判定按鍵的動作出現BUG,因此在程式當中或者硬體上須作處理才能消除彈跳的現象,下圖為量測按鍵按下時的彈跳現象,可以看出在100ms發生多次彈跳現象!
解決方法:
(1)加入電容做濾波
通常在按鍵的輸入設計來說,會透過上拉電阻將按鍵輸入到MCU的IO做Pull-up,上拉電阻可以是10k or 100k等,然後按鍵另一端接地,也就是說按鍵always pull-up,若按鍵被按下時,則tied GND,可以透過在輸入的IO pin接一顆小電容到GND,等同於按鍵旁並聯一顆電容,從電路上來看,電容電阻形成RC低通濾波器,RC時間為5RC,假設Pull-up 100k,電容為0.1uF, 5RC = 5 * 100k * 0.1uF = 50ms,也就是說當按鍵彈跳時,電容因為RC常數導致輸入pin上面的電壓不會瞬間變化,此時按鍵彈跳現象就被消除了!
(2)程式中加入Debounce機制
程式中可以在使用者按下按鍵之後,delay一段時間避開按鍵機械跳的發生,等彈跳現象消除之後再重新偵測按鍵動作,至於要delay多久可以透過示波器量測所選用的按鍵開關大概會彈跳的時間,不過不建議使用者以delay的方式來實作,會造成程式在delay時無法做其他事情,效率會比較差,因此可以透過timer interrupt,當按鍵按下之後,計時一段時間做Debounce之後再重新偵測,建議Debounce時間不要超過100ms,否則判定案件的動作會有不靈敏的感受,程式實作如下:
程式中可以在使用者按下按鍵之後,delay一段時間避開按鍵機械跳的發生,等彈跳現象消除之後再重新偵測按鍵動作,至於要delay多久可以透過示波器量測所選用的按鍵開關大概會彈跳的時間,不過不建議使用者以delay的方式來實作,會造成程式在delay時無法做其他事情,效率會比較差,因此可以透過timer interrupt,當按鍵按下之後,計時一段時間做Debounce之後再重新偵測,建議Debounce時間不要超過100ms,否則判定案件的動作會有不靈敏的感受,程式實作如下: