題:
防彈跳按鈕
Vincent Van Den Berghe
2010-11-17 20:32:16 UTC
view on stackexchange narkive permalink

我最近閱讀了有關按鈕抖動的文章,並且想知道在使用Arduino(ATMega mC)時是否應該記住這一點?我認為這是一個問題,尤其是在處理中斷時。

那麼檢測代碼中的反彈是否更好,還是應該由硬件來解決?請詳細說明。

HTTP://hack a大於.com/2010/11/09/的bounce-code-one-post-to-入了-them-all/
七 答案:
Kellenjb
2010-11-17 20:51:45 UTC
view on stackexchange narkive permalink

我強烈建議將一個示波器(希望有一個示波器或可以使用一個示波器)掛接到交換機上。我見過一個學生的項目,該項目的開關從5v下降到-5v,再到4v,下降到-3v,然後上升到2v,然後又下降到0v。當我們在示波器上查看當前繪製時,會有一個非常大的尖峰。

在他的特殊情況下,非常需要他對硬件開關進行反跳操作。

但是,另一方面,我看到的開關效果要小得多,可以很容易地在軟件中將其刪除。

不過,您確實需要權衡一下您的選擇。如果您的固件數量非常複雜,那麼增加程序員和cpu使用量的開銷可能不值得,那麼最好增加一點硬件。現在,另一方面,如果您想降低成本和減小尺寸,則將希望盡可能多地刪除硬件,並在固件中全部完成。

我確定了開關彈跳的範圍,並將其發佈在Wikipedia上:http://en.wikipedia.org/wiki/File:Switch_bounce.JPG
@Thomas O,這是一個非常有趣的反彈畫面。我只想確保@Vincent Van Den Berghe理解並非所有反彈都會像這樣。反彈限制為0-5v,它不會總是這樣。
作為補充,@Thomas O我們創建了一種做法,使那些無法通過這種方式拍攝Oscope圖像的學生失敗。屏幕上的閃光燈太可怕了。我們還更進一步,鼓勵學生使用CSV或labview之類的東西收集實際的數據點,以便可以輕鬆地將其用於報告和數據分析中。
@Kellenjb,我即將購買支持我的支持HP-IB的示波器。另外,我還發現相機上的“運動”模式可以在沒有閃光燈且沒有模糊的情況下為示波器屏幕拍攝出良好的照片。
-1
-1
@Kellenjb,,我建議您閱讀舊的數據表(1980年前),您會發現很多示波器屏幕。儘管使用了示波器攝像機。實際上,一些較新的數據表僅使用數字示波器的屏幕​​截圖。
@Thomas O舊論文!=新論文!=數據表
反跳CPU到底有多密集?最簡單的標準方法是:在檢測到側面時讀取按鈕,等待10毫秒左右,再次讀取按鈕,比較是否相等,使用值是否相等,是否不使用並保留舊值。在大多數情況下,這已經“足夠好”,甚至可以用作粗糙的數字濾波器,從而消除了一些噪聲和毛刺。它完全不佔用任何CPU容量,您可以使用片上硬件計時器。
@Lundin在實時環境中,您非常依賴中斷。如果您在中斷上按下了按鈕,那麼您真的不希望您的實時系統被一次按鈕按下多次。您也不需要專用資源來等待10毫秒。
stevenvh
2011-08-31 11:53:32 UTC
view on stackexchange narkive permalink

如果您是一位專業的電子設計師,那麼您的老闆甚至都不會讓您使用硬件。原因很簡單:如果您的生產批次足夠大,軟件實際上是免費的,而必須為您生產的每個單元支付硬件費用。儘管電阻器和電容器非常便宜,但將它們安裝在PCB上的價格可能是其購買價格的20倍。

無論您是通過軟件還是硬件進行防彈跳操作,仍然必須選擇優質的按鈕。文章中臭名昭著的157ms按鈕根本不適合 any 應用程序。
我通常以 32ms間隔對按鈕進行採樣,這足以縮短抖動消除時間。任何好的按鈕。我非常喜歡阿爾卑斯山SKQG TACT開關。

Alps tact switch

在我測試的少數設備上,其初始跳動時間為小於10ns。儘管它的使用壽命為100 000個週期,但我們對其進行了 200 000 個週期的測試,即使如此,32毫秒的去抖動也足夠了。 (我想我應該已經測量了實際的反跳水平,但是當時我們的主要興趣是最終產品的行為。無論如何,我們使用的是不合規格的產品。)

如果您真的想要硬件解決方案我將文章中提到的SR觸發器解決方案作為技術上最好的解決方案,其次:

debounce circuit

可以使用構造觸發器雙NAND門,例如,採用小型VSSOP8封裝。此解決方案的主要缺點是您需要一個SPDT按鈕,而SPST按鈕更為常見。

Toby Jaffey
2010-11-17 20:38:41 UTC
view on stackexchange narkive permalink

有很多(和很多)不同的方式來反跳按鈕。是用軟件還是硬件來完成將取決於您的項目要求和開關類型。

以下是一些指向不同方法的鏈接:

http:// www .ganssle.com / debouncing.htm

http://hackaday.com/2010/11/09/debounce-code-one-post-to-rule-them-全部/

當我看到這個問題時,我打算去找ganssle的鏈接。
ganssle文章是我問這個問題的原因,它與我的問題相關:)感謝您鏈接到反跳代碼段。
您介意總結一些用例來說明何時使用軟/硬件嗎? (這可能是主觀的,但無論如何我都想舉一些例子)
@Vincent, Kellenjb總結了他的決定方法。我沒有點擊您的鏈接,因為它有一個有趣的名字,現在點擊它,我看到了!
如果這是共識/一般規則,那麼的確不需要更多示例。
您需要確保消除可能會損壞軟件中控制器的信號。然後,您可以在處理器時間和硬件成本之間取得平衡。
Leon Heller
2010-11-17 20:36:24 UTC
view on stackexchange narkive permalink

該文章是有關反跳的“聖經”。接觸反彈可能是任何應用程序都存在的問題。

通常最好在軟件中對開關進行反跳,因為針對特定開關的延遲,因為它們的接觸反彈量不同,因此更容易調整延遲。通常,也有必要對密鑰釋放進行反彈。開關製造商通常會為其產品指定跳動量,通常為10ms-20ms。

為什麼人們對此表示反對?
關於釋放按鍵彈跳的好地方!
我沒有拒絕投票,只是說在軟件中這樣做是一個可怕的主意。表徵是一個好主意。
我通常是這樣說的,並給出了原因。它還使BOM成本最小化並提高了可靠性。
僅當信號保持在控制器的安全範圍內時,它才會提高可靠性。如果您在不增加組件磨損的情況下減少了組件數量,則此操作將提高可靠性。我並不是說我不同意您的帖子概念,但我一直與剛進入該領域的工程師合作,並給出類似的答案,他們將消除軟件中的所有問題。您始終必須表徵。我也沒有對您投反對票,但我也沒有投反對票,我認為像軟件這樣的廣泛答案可能會使新開發人員冒著對其硬件進行冒險的風險。
JustJeff
2011-08-31 05:22:11 UTC
view on stackexchange narkive permalink

開關彈跳可能會持續數十毫秒。如果您要從計時器上運行的中斷例程中輪詢開關,則跳動不會成為問題,因為即使您碰巧在跳動風暴中輪詢開關,也可以立即獲得新狀態,或者最壞的情況是獲取舊狀態,直到下一次基於計時器的輪詢才會看到新狀態。從這樣的定時ISR輪詢構成一種軟件反跳。

但是,如果您使用該開關來引起中斷,並且您希望該中斷服務程序能夠運行在不到10毫秒的時間內,您將需要硬件去抖動,否則,一個切換事件可能會導致某種程度的隨機中斷,並且肯定經常會超過預期的中斷次數。另一方面,如果中斷例程運行足夠長的時間,則在ISR完成之前,開關反彈將已經穩定,您會沒事的,但是大多數結構良好的ISR並不需要那麼長時間。

有一個開關來引起中斷是一個好主意。但是一旦獲得,就不再允許進一步的中斷-將其關閉,而在指定的反跳時間啟動一個計時器。
@Lundin-如果可以使用計時器,則可以使用計時器來實現輪詢方法,而不必費心讓開關完全生成中斷。
Wouter van Ooijen
2011-08-31 00:14:04 UTC
view on stackexchange narkive permalink

做任何事情的最佳方法是最適合您的方法。但是,當您已經擁有微控制器時,只需花費一些代碼即可在軟件中進行反跳操作。

在軟件中進行反跳操作的最簡便的方法是,在比分開的時間點檢查按鈕最長的彈跳時間。 50毫秒似乎是“普通”開關彈跳時間的上限,因此,當您可以像這樣安排軟件時,您會很清楚:

 永遠循環等待(至少) 50毫秒的檢查按鈕會繼續循環 
並為此使用MCU上的片上定時器。
當然可以,但是您無需編寫許多程序。
高質量產品中的專業軟件將始終使用片上定時器。業餘愛好者可以通過“ NOP”進行循環或等待輪詢。但是,無論您的實時要求如何,都沒有理由在實際產品中執行此操作。 “我不知道計時器如何工作,這個死循環需要我懶惰的自我寫出10秒鐘”對於工程師來說不是有效的論據。
布洛克。專業人士必須是有效的,這(取決於當前的項目)可能意味著(除其他外)“盡可能有效地使用硬件”或“盡可能有效地利用專業人士的時間”。因此,您的查詢肯定在某些情況下適用(可能是您處理過的所有情況),在某些情況下當然並不適用。
實現片上定時器最多需要一個小時的時間。這幾乎不復雜,它是日常的麵包和黃油工程。您甚至不能在項目上投入一個小時來獲得更好的解決方案和總體上更好的質量?是的,如果您對編程不了解,可能需要一周的時間。但是,也許您不應該一開始就使用軟件……或者您應該使用_more_,因此您將很快學會實現這一簡單的小事情。
每次確實可以提供更好的解決方案時,我都會這樣做。並非總是如此。歸根結底,有效的工程設計創造了一種滿足最低成本標準的解決方案。
supercat
2011-10-12 03:41:27 UTC
view on stackexchange narkive permalink

一種尚未提及的去抖動方法是使用雙擲開關,其中一個擲與VDD相連,另一個與地相連。將其饋入引腳(通過軟件或硬件)將被弱地拉回其當前狀態。這種方法將提供雙擲開關的優點,但只需要一個I / O引腳,而不是兩個。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 2.0許可。
Loading...