我最近閱讀了有關按鈕抖動的文章,並且想知道在使用Arduino(ATMega mC)時是否應該記住這一點?我認為這是一個問題,尤其是在處理中斷時。
那麼檢測代碼中的反彈是否更好,還是應該由硬件來解決?請詳細說明。
我最近閱讀了有關按鈕抖動的文章,並且想知道在使用Arduino(ATMega mC)時是否應該記住這一點?我認為這是一個問題,尤其是在處理中斷時。
那麼檢測代碼中的反彈是否更好,還是應該由硬件來解決?請詳細說明。
我強烈建議將一個示波器(希望有一個示波器或可以使用一個示波器)掛接到交換機上。我見過一個學生的項目,該項目的開關從5v下降到-5v,再到4v,下降到-3v,然後上升到2v,然後又下降到0v。當我們在示波器上查看當前繪製時,會有一個非常大的尖峰。
在他的特殊情況下,非常需要他對硬件開關進行反跳操作。
但是,另一方面,我看到的開關效果要小得多,可以很容易地在軟件中將其刪除。
不過,您確實需要權衡一下您的選擇。如果您的固件數量非常複雜,那麼增加程序員和cpu使用量的開銷可能不值得,那麼最好增加一點硬件。現在,另一方面,如果您想降低成本和減小尺寸,則將希望盡可能多地刪除硬件,並在固件中全部完成。
如果您是一位專業的電子設計師,那麼您的老闆甚至都不會讓您使用硬件。原因很簡單:如果您的生產批次足夠大,軟件實際上是免費的,而必須為您生產的每個單元支付硬件費用。儘管電阻器和電容器非常便宜,但將它們安裝在PCB上的價格可能是其購買價格的20倍。
無論您是通過軟件還是硬件進行防彈跳操作,仍然必須選擇優質的按鈕。文章中臭名昭著的157ms按鈕根本不適合 any 應用程序。
我通常以 32ms間隔對按鈕進行採樣,這足以縮短抖動消除時間。任何好的按鈕。我非常喜歡阿爾卑斯山SKQG TACT開關。
在我測試的少數設備上,其初始跳動時間為小於10ns。儘管它的使用壽命為100 000個週期,但我們對其進行了 200 000 個週期的測試,即使如此,32毫秒的去抖動也足夠了。 (我想我應該已經測量了實際的反跳水平,但是當時我們的主要興趣是最終產品的行為。無論如何,我們使用的是不合規格的產品。)
如果您真的想要硬件解決方案我將文章中提到的SR觸發器解決方案作為技術上最好的解決方案,其次:
可以使用構造觸發器雙NAND門,例如,採用小型VSSOP8封裝。此解決方案的主要缺點是您需要一個SPDT按鈕,而SPST按鈕更為常見。
有很多(和很多)不同的方式來反跳按鈕。是用軟件還是硬件來完成將取決於您的項目要求和開關類型。
以下是一些指向不同方法的鏈接:
http:// www .ganssle.com / debouncing.htm
http://hackaday.com/2010/11/09/debounce-code-one-post-to-rule-them-全部/
該文章是有關反跳的“聖經”。接觸反彈可能是任何應用程序都存在的問題。
通常最好在軟件中對開關進行反跳,因為針對特定開關的延遲,因為它們的接觸反彈量不同,因此更容易調整延遲。通常,也有必要對密鑰釋放進行反彈。開關製造商通常會為其產品指定跳動量,通常為10ms-20ms。
開關彈跳可能會持續數十毫秒。如果您要從計時器上運行的中斷例程中輪詢開關,則跳動不會成為問題,因為即使您碰巧在跳動風暴中輪詢開關,也可以立即獲得新狀態,或者最壞的情況是獲取舊狀態,直到下一次基於計時器的輪詢才會看到新狀態。從這樣的定時ISR輪詢構成一種軟件反跳。
但是,如果您使用該開關來引起中斷,並且您希望該中斷服務程序能夠運行在不到10毫秒的時間內,您將需要硬件去抖動,否則,一個切換事件可能會導致某種程度的隨機中斷,並且肯定經常會超過預期的中斷次數。另一方面,如果中斷例程運行足夠長的時間,則在ISR完成之前,開關反彈將已經穩定,您會沒事的,但是大多數結構良好的ISR並不需要那麼長時間。
做任何事情的最佳方法是最適合您的方法。但是,當您已經擁有微控制器時,只需花費一些代碼即可在軟件中進行反跳操作。
在軟件中進行反跳操作的最簡便的方法是,在比分開的時間點檢查按鈕最長的彈跳時間。 50毫秒似乎是“普通”開關彈跳時間的上限,因此,當您可以像這樣安排軟件時,您會很清楚:
永遠循環等待(至少) 50毫秒的檢查按鈕會繼續循環
一種尚未提及的去抖動方法是使用雙擲開關,其中一個擲與VDD相連,另一個與地相連。將其饋入引腳(通過軟件或硬件)將被弱地拉回其當前狀態。這種方法將提供雙擲開關的優點,但只需要一個I / O引腳,而不是兩個。