基於獨立按鍵消抖及原理分析
獨立按鍵模型如下:
分析:在按鍵按下時,圖中電路形成通路,在實際電路設計中將按鍵的一側接到系統電源的GND上,另一側接到FPGA晶片的管腳上,這樣便可以通過FPGA IO口的狀態判斷按鍵是否按下,為了保證FPGA的管腳在按鍵沒有被按下時是一個確定的電平,所以在電路設計時加上一個上拉電阻,這樣當獨立按鍵沒有被按下時,FPGA管腳預設會檢測到高電平1,按鍵被按下時,FPGA的管腳直接與地接通,FPGA管腳就會檢測到低電平0。
通過以上分析,從而可以畫出按鍵從沒有按下到按下FPGA (I/O)口上的電平的波形如下:
實際波形是否如上圖所示呢?通過使用示波器對按鍵連線在FPGA管腳的線路進行波形抓取發現實際波形並非上圖所示,實際波形如下:
通過觀察理想波形與實際波形瞭解到在按鍵按下與按鍵擡起時都有明顯的抖動過程,通過示波器抓取抖動時間,發現一般為20ms抖動階段(按鍵按下、按鍵擡起)。由於FPGA工作速度是非常快,例如:系統時鐘為50MHz,週期為20ns,即FPGA會以20ns的速度去取樣管腳上的電平狀態,當檢測到抖動階段的下降沿時,FPGA會認為發生了一次按鍵按下,讓led燈加1很短的時間又彈回到高電平,在經過很短的時間又出現下降沿,FPGA又會誤認為又來了一次按鍵事件,讓led燈狀態再次加1,在這樣的情況下,一次按鍵便會觸發led燈多次變化,並且不可預期,釋放時同理,不再分析。因此便需要對這樣的不穩定期作濾波處理,即按鍵消抖。(以按鍵驅動led燈為例)
本次設計利用狀態機,對獨立按鍵進行消抖,因此需要分析在實際電路中,獨立按鍵分為哪幾個狀態,如下所示:
通過以上分析顯而易見共有四個狀態,分別為:空閒狀態,按下抖動濾除狀態(按下抖動狀態),按下穩定狀態,釋放抖動濾除狀態(擡起抖動狀態)。
分析完狀態之後,需明確分析,這幾個狀態之間是怎麼進行跳轉的,即狀態跳轉條件是什麼。狀態轉移圖如下: