デバウンスボタン


32

最近記事を読みましたボタンのデバウンスについてが、たとえばArduino(ATMega mC)で作業するときにこれを念頭に置いておくべきかどうか疑問に思っていましたか?私はそれが問題であると思います、特に割り込みを扱うとき

それでは、コードのバウンスを検出する方が良いでしょうか、それともハードウェアでこれを処理する必要がありますか?詳しく説明してください。


回答:


17

スイッチにスコープを接続することを強くお勧めします(希望する場合は、スコープを使用するか、使用できるようにしてください)。スイッチでバウンスが発生し、5vから-5v、最大4v、最小3v、最大2v、そして再び0vに戻る学生のプロジェクトを見てきました。スコープの現在の描画を見ると、非常に大きなスパイクがいくつかありました。

彼の特定のケースでは、ハードウェアのスイッチをデバウンスすることが非常に必要でした。

ただし、一方で、ソフトウェアで簡単に削除できる、はるかに小さい効果を持つスイッチを見てきました。

ただし、オプションを検討する必要があります。ファームウェアの量が非常に複雑な場合、プログラマーとしてのオーバーヘッドとCPUの使用量の両方を追加しても価値がない場合があり、ハードウェアを少し追加するだけの方が良いでしょう。一方、コストとサイズを削減しようとしている場合は、できるだけ多くのハードウェアを削除し、可能であればファームウェアですべて実行する必要があります。


スイッチバウンスの画像をスコープし、Wikipediaに投稿しました:en.wikipedia.org/wiki/File
トーマスO

@Thomas Oそれはバウンスのかなり楽しい写真です。@Vincent Van Den Bergheが、すべてのバウンスがそのように見えるとは限らないことを理解したいだけです。そのバウンスは0-5vに制限されており、常にそのようには見えません。
ケレンイブ

2
@Thomas O、サイドノートとして、私たちはそのようなOscope画像を撮る学生を失敗させる練習を作成しました。画面上のフラッシュは恐ろしいです。また、さらに一歩進んで、レポートやデータ分析で簡単に使用できるように、CSVやlabviewなどを使用して、学生に実際のデータポイントを収集するように促します。
ケレンブ

@ Kellenjb、HP-IBをサポートするスコープ用のプリンターをもうすぐ入手できます。また、カメラの「スポーツ」モードでは、フラッシュなしでぶれのないスコープ画面の良い写真を撮ることができることを発見しました。
トーマスO

1
@Lundinリアルタイム環境では、割り込みに大きく依存します。割り込みでボタンを押している場合、ボタンを1回押すだけでリアルタイムシステムが数回中断されることは望ましくありません。また、10ミリ秒待機するためにリソースを割り当てる必要はありません。
ケレンイブ

15

あなたがプロの電子機器デザイナーなら、上司がハードウェアでそれをさせさえしない可能性があります。理由は簡単です。生産バッチが十分に大きい場合、ソフトウェアは事実上無料です。ですが、生産するユニットごとにハードウェアを購入する必要があります。また、抵抗とコンデンサは安価でありながら、PCBに取り付けると、購入価格の最大20倍の費用がかかる場合があります。

ソフトウェアでデバウンスするかハードウェアでデバウンスするかに関係なく、高品質のプッシュボタンを選択する必要があります。この記事の悪名高い15​​7msボタンは、どのアプリケーションに当てはまりません。
通常、ボタンを32ms間隔サンプリングします。これは、適切なボタンのデバウンス時間を埋めるのに十分です。私はAlps SKQG TACTスイッチが大好きです。

アルプスタクトスイッチ

私がテストしたいくつかのデバイスでは、初期バウンス時間は10 ns未満でした。それは100 000サイクルの寿命を有しているが、我々はそれをテストした200 000サイクル、さらにはその後、32msのデバウンスは十分でした。(デバウンスの実際のレベルを測定すべきだったと思いますが、当時の主な関心は最終製品の動作でした。とにかく、仕様外で使用していました。)

ハードウェアソリューションが本当に必要な場合は、記事で技術的に最適なソリューションとして言及されているSRフリップフロップソリューションを2番目に取り上げます。

デバウンス回路

フリップフロップは、たとえば小さなVSSOP8パッケージで利用可能なデュアルNANDゲートで構成できます。このソリューションの主な欠点は、SPSTがより一般的に利用可能なSPDTプッシュボタンが必要なことです。


12

ボタンのデバウンスにはさまざまな方法があります。ソフトウェアで実行するかハードウェアで実行するかは、プロジェクトの要件とスイッチの種類によって異なります。

さまざまな方法へのリンクを次に示します。

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

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


質問を見たとき、私はガンスールへのリンクを取得するつもりでした。
-Kortuk

ガンスールの記事がこの質問をした理由であり、私の質問にリンクされています:)デバウンスコードスニペットへのリンクをありがとう。
ビンセントヴァンデンベルゲ

ソフトウェア/ハードウェアをいつ使用するかを説明するために、いくつかのユースケースを要約していただけますか (これはおそらく主観的ですが、とにかくいくつかの例をお願いします)
ビンセントヴァンデンベルゲ

1
@ Vincent、Kellenjbは彼の答えで決定方法をまとめました。リンクに面白い名前が付いていたため、クリックしませんでした。クリックすると、ガンスールが表示されます。
-Kortuk

それがコンセンサス/一般的なルールである場合、実際、それ以上の例は必要ありません。
ビンセントヴァンデンベルゲ

6

その記事は、デバウンスに関する「聖書」です。連絡先のバウンスはどのアプリケーションでも問題になる可能性があります。

特定のスイッチは接点の跳ね返りの量が異なるため、特定のスイッチの遅延を簡単に調整できるため、ソフトウェアでスイッチのバウンスを解除するのが一般的に最善です。多くの場合、キーリリースのデバウンスも必要です。スイッチメーカーは、製品のバウンスの量を指定することがよくあり、通常は約10ms〜20msです。


なぜ人々はこれを投票するのですか?
トビージャフィー

キーリリースのデバウンスについての良い点!
ビンセントヴァンデンベルゲ

1
私はそれを支持しませんでしたが、ソフトウェアでそれをするだけで言うのはひどい考えです。特徴づけることは良い考えです。
Kortuk

私は「一般的に」と言ったが、それが事実であり、その理由を述べた。また、BOMコストを最小化し、信頼性を高めます。
レオン・ヘラー

信号がコントローラーの安全な範囲内にある場合にのみ、信頼性が向上します。コンポーネントの摩耗を増やすことなくコンポーネント数を減らした場合、このアクションにより信頼性が向上します。私はあなたの投稿のコンセプトに同意しなかったとは言っていませんでしたが、私は常にフィールドに来ているエンジニアとこのような答えを常に手伝っています。常に特徴づける必要があります。私もあなたに反対票を投じませんでしたが、私も賛成票を投じませんでした。ソフトウェアのような幅広い答えは、新しい開発者がハードウェアを危険にさらすリスクがあると思います。
-Kortuk

1

スイッチのバウンスは数十ミリ秒続くことがあります。タイマーで実行される割り込みルーチンからスイッチをポーリングしている場合、バウンスは問題になりません。バウンスストームの途中でスイッチをポーリングしても、すぐに新しい状態になるためです。 、または最悪の場合、古い状態を取得し、次のタイマーベースのポーリングまで新しい状態を表示しません。このようなタイミングのあるISRからのポーリングは、ソフトウェアのデバウンスの形式を構成します。

ただし、そのスイッチを使用して割り込みを発生させ、割り込みサービスルーチンが10ミリ秒未満ですばやく実行されると予想される場合は、ハードウェアのデバウンスが必要になります。そうしないと、1つのスイッチイベントがややランダムな数の割り込み、そして多くの場合、予想されたものだけではありません。一方、割り込みルーチンが十分に長く実行されると、ISRが終了する前にスイッチのバウンスが安定するため、問題はありませんが、ほとんどの適切に構築されたISRはそれほど長くかかりません。


割り込みを発生させるスイッチを持つことは良い考えです。しかし、いったんそれを取得したら、それ以上の割り込みを許可しないでください-それらをシャットオフし、代わりに指定されたデバウンス時間のタイマーを開始します。
ランディン

@Lundin-タイマーが使用可能な場合、タイマーを使用してポーリングアプローチを実装することができ、スイッチに割り込みを生成させる必要はまったくありません。
ジャストジェフ

0

anyhtingを行うための最良の方法は、あなたに最適な方法です。しかし、すでにマイクロコントローラーを持っている場合、コードを作成するだけでソフトウェアをデバウンスできます。

ソフトウェアでデバウンスを行う最も簡単な方法は、最長のバウンス時間よりもさらに離れた瞬間にボタンをチェックすることです。50ミリ秒は、「通常の」スイッチのバウンス時間の上限のようです。そのため、このようにソフトウェアを配置できる場合、明確になります。

forever loop
   wait (at least) 50 ms
   check buttons
   do procesing
end loop

これには、MCUのオンチップタイマーを使用します。
ランディン

もちろんそれは可能ですが、多くのプログラムを書かなくても作成できます。
ウーターヴァンOoijen

3
高品質な製品のプロフェッショナルソフトウェアは、常にオンチップタイマーを使用します。愛好家は、ループまたはデッドウェイトポーリング用の「NOP」を使用して逃げることができます。しかし、リアルタイムの要件にかかわらず、実際の製品でこれを行う理由はありません。「タイマーの仕組みがわからず、怠deadな自分が書くのにこのデッドループは10秒かかります」は、エンジニアにとって有効な議論ではありません。
ランディン

去勢牛。プロフェッショナルは効果的である必要があります(手元のプロジェクトに応じて)(とりわけ)「ハードウェアを可能な限り効果的に使用する」または「プロフェッショナルの時間を可能な限り効果的に使用する」ことを意味します。したがって、あなたのコミングは確かにいくつかの場合に適用されます(おそらくあなたが扱ったすべての場合)それは確かにすべての場合に適用されません。
ウーターヴァンOoijen

オンチップタイマーを実装するには、最大で1時間かかります。これは複雑なことではなく、日常的なパンとバターのエンジニアリングです。大幅に優れたソリューションと全体的な優れた品質を得るためにプロジェクトに1時間も投資することはできませんか?ええと...プログラミングについてあまり知らない場合は、1週間かかるかもしれません。しかし、その後、そもそもソフトウェアで作業するべきではないかもしれません...または、おそらくそれをもっと使用する必要があるので、この単純な小さなことをすぐに実装することを学ぶでしょう。
ランディン

0

まだ言及されていないデバウンスへのアプローチの1つは、1投をVDDに、もう1投をグランドに接続した双投スイッチを使用することです。それを(ソフトウェアまたはハードウェアを介して)現在の状態に弱く引っ張られるピンに送ります。このようなアプローチは、双投スイッチの利点を提供しますが、2つではなく1つのI / Oピンのみを必要とします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.