最近記事を読みましたボタンのデバウンスについてが、たとえばArduino(ATMega mC)で作業するときにこれを念頭に置いておくべきかどうか疑問に思っていましたか?私はそれが問題であると思います、特に割り込みを扱うとき
それでは、コードのバウンスを検出する方が良いでしょうか、それともハードウェアでこれを処理する必要がありますか?詳しく説明してください。
最近記事を読みましたボタンのデバウンスについてが、たとえばArduino(ATMega mC)で作業するときにこれを念頭に置いておくべきかどうか疑問に思っていましたか?私はそれが問題であると思います、特に割り込みを扱うとき
それでは、コードのバウンスを検出する方が良いでしょうか、それともハードウェアでこれを処理する必要がありますか?詳しく説明してください。
回答:
スイッチにスコープを接続することを強くお勧めします(希望する場合は、スコープを使用するか、使用できるようにしてください)。スイッチでバウンスが発生し、5vから-5v、最大4v、最小3v、最大2v、そして再び0vに戻る学生のプロジェクトを見てきました。スコープの現在の描画を見ると、非常に大きなスパイクがいくつかありました。
彼の特定のケースでは、ハードウェアのスイッチをデバウンスすることが非常に必要でした。
ただし、一方で、ソフトウェアで簡単に削除できる、はるかに小さい効果を持つスイッチを見てきました。
ただし、オプションを検討する必要があります。ファームウェアの量が非常に複雑な場合、プログラマーとしてのオーバーヘッドとCPUの使用量の両方を追加しても価値がない場合があり、ハードウェアを少し追加するだけの方が良いでしょう。一方、コストとサイズを削減しようとしている場合は、できるだけ多くのハードウェアを削除し、可能であればファームウェアですべて実行する必要があります。
あなたがプロの電子機器デザイナーなら、上司がハードウェアでそれをさせさえしない可能性があります。理由は簡単です。生産バッチが十分に大きい場合、ソフトウェアは事実上無料です。ですが、生産するユニットごとにハードウェアを購入する必要があります。また、抵抗とコンデンサは安価でありながら、PCBに取り付けると、購入価格の最大20倍の費用がかかる場合があります。
ソフトウェアでデバウンスするかハードウェアでデバウンスするかに関係なく、高品質のプッシュボタンを選択する必要があります。この記事の悪名高い157msボタンは、どのアプリケーションにも当てはまりません。
通常、ボタンを32ms間隔でサンプリングします。これは、適切なボタンのデバウンス時間を埋めるのに十分です。私はAlps SKQG TACTスイッチが大好きです。
私がテストしたいくつかのデバイスでは、初期バウンス時間は10 ns未満でした。それは100 000サイクルの寿命を有しているが、我々はそれをテストした200 000サイクル、さらにはその後、32msのデバウンスは十分でした。(デバウンスの実際のレベルを測定すべきだったと思いますが、当時の主な関心は最終製品の動作でした。とにかく、仕様外で使用していました。)
ハードウェアソリューションが本当に必要な場合は、記事で技術的に最適なソリューションとして言及されているSRフリップフロップソリューションを2番目に取り上げます。
フリップフロップは、たとえば小さなVSSOP8パッケージで利用可能なデュアルNANDゲートで構成できます。このソリューションの主な欠点は、SPSTがより一般的に利用可能なSPDTプッシュボタンが必要なことです。
ボタンのデバウンスにはさまざまな方法があります。ソフトウェアで実行するかハードウェアで実行するかは、プロジェクトの要件とスイッチの種類によって異なります。
さまざまな方法へのリンクを次に示します。
http://www.ganssle.com/debouncing.htm
http://hackaday.com/2010/11/09/debounce-code-one-post-to-rule-them-all/
その記事は、デバウンスに関する「聖書」です。連絡先のバウンスはどのアプリケーションでも問題になる可能性があります。
特定のスイッチは接点の跳ね返りの量が異なるため、特定のスイッチの遅延を簡単に調整できるため、ソフトウェアでスイッチのバウンスを解除するのが一般的に最善です。多くの場合、キーリリースのデバウンスも必要です。スイッチメーカーは、製品のバウンスの量を指定することがよくあり、通常は約10ms〜20msです。
スイッチのバウンスは数十ミリ秒続くことがあります。タイマーで実行される割り込みルーチンからスイッチをポーリングしている場合、バウンスは問題になりません。バウンスストームの途中でスイッチをポーリングしても、すぐに新しい状態になるためです。 、または最悪の場合、古い状態を取得し、次のタイマーベースのポーリングまで新しい状態を表示しません。このようなタイミングのあるISRからのポーリングは、ソフトウェアのデバウンスの形式を構成します。
ただし、そのスイッチを使用して割り込みを発生させ、割り込みサービスルーチンが10ミリ秒未満ですばやく実行されると予想される場合は、ハードウェアのデバウンスが必要になります。そうしないと、1つのスイッチイベントがややランダムな数の割り込み、そして多くの場合、予想されたものだけではありません。一方、割り込みルーチンが十分に長く実行されると、ISRが終了する前にスイッチのバウンスが安定するため、問題はありませんが、ほとんどの適切に構築されたISRはそれほど長くかかりません。
anyhtingを行うための最良の方法は、あなたに最適な方法です。しかし、すでにマイクロコントローラーを持っている場合、コードを作成するだけでソフトウェアをデバウンスできます。
ソフトウェアでデバウンスを行う最も簡単な方法は、最長のバウンス時間よりもさらに離れた瞬間にボタンをチェックすることです。50ミリ秒は、「通常の」スイッチのバウンス時間の上限のようです。そのため、このようにソフトウェアを配置できる場合、明確になります。
forever loop
wait (at least) 50 ms
check buttons
do procesing
end loop