ボタンを検出するスマートな方法(電力消費が少ない)


28

特定のプロジェクトの会議中に、MCUでボタンのプッシュを検出する方法について考えるように依頼されました。検出はできるだけ少ない電力を消費する必要があります。一見、プルアップまたはプルダウンのある典型的な回路を考えました:

回路図

この回路のシミュレーションCircuitLabを使用して作成された回路

反バウンス機能については、この質問の範囲を超えているため、ここでは説明しません。いずれの場合でも、ボタンを押したときに流れる合計電流値は抵抗値に依存します。それ(電流)を最小化するために、抵抗値を大きくすることはできますが、そうでない場合は、入力ピンのリーク値にも依存するため、それほど大きくすることはできません。さらに、大きな抵抗はゆっくり回復します。

私の質問は次のとおりです:電力を消費しないボタンが押されたことを検出するスマートな方法は何ですか(通常、高電力を消費するアプリケーションの場合)?ボタンが押されたときにほとんど電力を消費しない方法はありますか?


5
10kのプルダウンはほとんど電力を消費しません。3.3Vは330uAを供給します。また、ほとんどの最新のMCUには、内部で設定するオプションがあり、さらに高い耐性があります。つまり、BJTまたはMOSFETを介してMCUピンからボタン電源をアクティブにできます。読み取り中にのみアクティブにし、ポーリングで読み取ります。
ランディン

27
@Lundinで「現代」という用語は、330 Aは、高電流かもしれ...μ
awjlogan

6
実際、多くのマイクロコントローラーは2〜10μAの低いスリープ電流を得ることができます。1回のプルダウンで30倍も無駄にするのは、特にバッテリー駆動の状況では、ちょっと悲しいことです。
whatsisname

1
プルダウンで使用できる抵抗器の大きさは、ピンのインピーダンスとスイッチの電圧によって異なります。2.4vで切り替わる高インピーダンス状態の3.3vピンがあるとしましょう。本当に必要なのは、入力よりわずかに低いインピーダンスです。ポテンショメータを取り付けて、信頼性の高い動作を維持するためにピンに使用できる抵抗器の値を測定し、マージンを維持するために値を20%下げることをお勧めします。
酒に酔ったコードモンキー

回答:


29

一度使用した低電流の方法は、2つのマイクロコントローラーI / Oピン間にスイッチを接続することでした。

1つのI / Oが出力(SWO)として構成されました。2番目は、プログラム可能な内部プルアップを有効にして入力(SWI)として構成されました。

スイッチの状態は、ソフトウェア割り込みルーチンによってまれに(10 msごとに)サンプリングされました。読み取りシーケンスは、SWOを低く、SWIを読み取り、SWOを高く駆動しました。

これは、押されたスイッチがそれ自体とSWOを介してスキャン中に1 us未満だけSWIプルダウン電流を引き込み、押されていないスイッチが電流を引き出さなかったことを意味しました。10 msごとに1 us未満のこの消費電流により、平均消費電流はごくわずかになりました。


この手法を使用してプルアップが必要な理由は疑問です。シーケンスSWOのロー、SWIの読み取り、SWOのハイ、SWIの読み取りは、ピンが接続されているかどうかを判断するのに十分な場合があります。多数のスイッチ間でSWOを共有することもできます。
Trevor_G

8
@Trevorスイッチが開いているときに入力をフローティングのままにすることは、特に良い考えではありません。テクノロジーによっては、入力が中間状態にある場合、入力バッファが電力を消費する可能性があります。
RoyC

1
@Trevorプルアップ抵抗にsw1 sw2デューティサイクルを効果的に掛けます。それでも、OPのスキーム1に戻ります。これは、低ノイズ環境で機能する場合があります。
RoyC

2
割り込みに依存するのではなく、MCUがポーリングを実行するために起きている必要があるという事実は、短いスイッチデューティサイクルからの節約を完全にキャンセルしませんか?
AndreKR

5
@AndreKRさん、バッテリー駆動のマイクロコントローラーアプリケーションがあり、いくつかのスイッチを接続する必要があったので、この手法をかなり簡単に使用できました。スイッチを検出するためだけにMCUを入れたわけではありません。MCUは、10ミリ秒の割り込みの間にスリープモードで900nAのようなものを消費したため、プルアップの節約に値しました。
トニーM

23

A SPDT(SイングルP OLE D ouble Tの HROW)ボタンはあなたの超効率的なボタンであろう。

ここに画像の説明を入力してください

出典:http : //www.ni.com/white-paper/3960/en/

あなたの場合、1PはMCUに、1TはVCCに、2TはGNDに行きます。


+1 ...それは常に...超小型SPDTsがあまりにも多くのいずれかの非常に見つけるのは難しいやコストの方法であることを、私を盗聴している
Trevor_G

1
@Trevorうん...いくつかのことは悲しいことに非常に高価です。他のアイテムは低価格です(例:MCU)。すべてを手に入れることはできません。
ハリースベンソン

これは素晴らしいアイデアです。残念ながら、自分のニーズに合ったSPDT CMSボタンを見つけることができませんでした。でも、私は心の中で、この回路をしておこう
vionyst

10

ボタンはどれくらい押し続けられますか?トグルスイッチ(状態を保持する)ではなく、瞬間的なスイッチである場合、ボタンが実際に閉じられる時間が短いため、ボタンが押されたときに流れる電流はほとんど無関係です。

表示する2つの回路のどちらでも構いませんが、問題ではありません。

入力リークやMCU入力への電流は無視できると仮定できます。すべてのMCUは最近CMOSテクノロジーに組み込まれており、入力電流は実質的にゼロです。だから、それを考えるのをやめて、そこにはない。

外部抵抗を使用する代わりに、多くのMCUの入力に組み込まれた内部プルアップ抵抗を使用することもできます。この抵抗は比較的低い値(おそらく50kΩ)であるため、ボタンを押したときに小さな電流が流れます。

プルアップ/プルダウンには、1 Mohmの抵抗でも安全に使用できます。非常に「汚れた」(電気的に言えば)環境でのみ、より低い値が必要になる場合があります。100 nFコンデンサをスイッチと並列に配置して、近くの他の回路からの干渉を抑えることもできます。

プロのヒント:PCB上のこのようなコンデンサーの場所を予約しますが、キャップは取り付けないでください。まだ。問題の場合:それを配置し、それが役立つかどうかを確認します。

スイッチの状態を検出するには、ポーリング(TonyMの答えのように)を使用するか、割り込みを使用します。(MCUの)消費電力のどちらが良いかは、アプリケーションによって異なります。


実際にボタンが瞬間的に1になりますが、それが押される時間が十分に長い時間(分)とすることができる
vionyst

デバイスが24時間年中無休の場合、数分はまだそれほど長くないかもしれません。重要なのはデューティサイクルです。1時間あたり5分は5 x 60/3600 = 8.3%です。したがって、私のシナリオでは、100 uAの電流でもスイッチは平均 8.3 uA 消費します。私のメッセージは次のとおりです。完全なシステムの消費電流と比較せずに、スイッチが押されたときに使用する電流にあまり焦点を合わせないでください。寄与が同じ場合にのみ、スイッチの消費電流を改善することが理にかなっています。MCUが継続的に1uAを使用する場合、0.1 uAスイッチを使用しても意味がありません。
Bimpelrekkie

「MCUが継続的に1uAを使用する場合、0.1 uAスイッチを使用しても意味がありません。それは鳴ります。1uAピークを意味すると思います。スイッチのためだけに10%が過剰になります;)
Trevor_G

@Trevorピークではなく、MCUの平均電流は1uAですが、スイッチを押したときの平均電流は0.1uAです。平均電流は100%x 1 uA + 8.3%* 0.1 uA = 1.0083 uA (8.3%上記のコメントから再利用)。
Bimpelrekkie

2
スイッチで平均0.1uAを意味するように読みます。ディップスイッチのように不合理ではないでしょう。
Trevor_G

10

私が使用した1つの方法は、CMOS入力の容量性を利用しています。

回路図

この回路のシミュレーションCircuitLabを使用して作成された回路

スイッチの上の回路では、閉じたときに、プルダウン抵抗がGPIOの入力容量をグランドレベルまで充電/放電できます。

この回路のコツは、GPIOの双方向性を使用して、スイッチが開いているときに入力をロジックハイレベルに充電し続けることです。

制御ルーチンは、定期的にピンをハイレベルにするか、またはプルアップを一時的に有効にします。これは、キャップの充電を維持するのに十分な時間です。入力ピンはダイナミックメモリビットのように機能し、ほとんどのデバイスで、かなりの使用可能な時間にわたってその電荷を保持します。

適切に設定されている場合、ボタンが押されると、ピンの電荷はリフレッシュレートよりも速く放電します。その状態は、リフレッシュ操作の前の読み取りとしてリフレッシュアルゴリズムの一部として検出されるか、割り込みの駆動に使用されます。

リフレッシュパルスの間、コンデンサを再充電するためと抵抗を介して電力が短時間使用され、抵抗が閉じている場合は切り替えます。ただし、リフレッシュパルスの長さは短く、ポーリング頻度により、リフレッシュ電流は比較的重要ではなくなります。

明らかに、このメソッドはアクティブなメソッドです。マイクロがスリープ状態になると、スイッチの状態はスリープ解除時に不定になります。ウェイクアップ後の最初のリフレッシュサイクルでは、ピンの読み取りを無視する必要があります。また、このメソッドを使用してマイクロをウェイクアップしないでください。就寝する前に、ピンを低出力として有効にして、電流がゼロの状態で待機させることも賢明です。

セットアップディップスイッチなど、より静的なスイッチを読み取るには、連続的な更新サイクルではなく、専用のルーチンを使用できます。読み取り後、GPIOピンはアクティブな低出力状態(ゼロ電流)で「パーク」され、フローティング入力の問題を回避する必要があります。

注:トレースの長さが長く、ノイズの多い領域を通過する場合、この手法はノイズ感度の影響を受けます。そのため、R1は入力ピンの近くに配置する必要があります。ただし、ピンの近くに余分な容量を追加しない限り、前面パネルのどこかにスイッチを接続することはお勧めしません。


1
これは確かにEMIに対して非常に脆弱です。その回路内に何らかの形の無線エネルギーが入り、すべての賭けがオフになったと思う。良いことは、ワイヤレスのものは最近ではそれほど一般的ではありません:)
ランディン

@Lundinはあなたが思うほど悪くはない。30pFとmegは、かなり良いフィルターを作成します。
Trevor_G

8

ボタンがピエゾスイッチの場合、必要な電力はボタンを押して生成される電力のみです。

例:R2 / C1は、ピエゾを押すことによって生成されるエネルギーを収集します。D1は、C1電圧が高くなりすぎるのを防ぎます。ボタンが放されると、R1はC1を排出します。MCU GPIOは入力モードで、プルモードではない必要があります。Voilà、電源からのゼロ電流引き込みでボタン検出。

回路図

この回路のシミュレーションCircuitLabを使用して作成された回路


3
うーん、その実用的なプロトタイプを作成/設計し、過去30年間使用してきた通常のスイッチでソリューションの利点を示すことができますか?
Bimpelrekkie

確かに。サンプル回路図を追加しました。単にそれを構築します。利点は、閉じた状態または開いた状態のいずれかで、電源からの電流がゼロになることです。短所には、スイッチをアクティブにするために必要な労力の制御が不十分である(アクティブな回路の方が優れていますが、それは回路の非常にわずかな利点を損ないます)こと、および30(300?)年前の通常のスイッチ設計と比較して斬新な設計であることが含まれます。
ヒースラフティ

それでも、私の計算機にはたくさんのボタンがあり、コイン電池で少なくとも5年間は動作します。それでも、あなたのソリューションがどのように利益をもたらすかはわかりません。私はまだ存在しない問題の「解決策」だと思います。また、より高価です。
Bimpelrekkie

1
そうだね!「できるだけ少ない電力を消費する」という元の基準は満たしていますが、実際に1ミリジュール未満の節約が実際に役立つ理由は想像しにくいです。
ヒースラフティ

MCUの入力インピーダンスは、ピエゾの高出力インピーダンスのために厄介なことをしませんか?
スコットサイドマン

5

デバイスがいずれかの状態を無期限に維持できる必要がある場合、SPDTスイッチを使用するのが最も低電力のアプローチです。これは、静的回路を作成して、内部リークとスイッチのリークを超えて電流を引き出さないようにすることができるためです。SPDTスイッチのもう1つの利点は、片方の接点が閉じたと最初に読み取る前に一方の接点がバウンドを停止する場合に限り、操作の速さや接点の粗さに関わらず、ほぼ完全にバウンスを除去できることです。

このようなスイッチを配線するには、次の2つの方法があります。

回路図

この回路のシミュレーションCircuitLabを使用して作成された回路

最初のアプローチは、2番目の抵抗より1つ少ない抵抗を必要としますが、2番目の抵抗は2つの極間のオーバーラップに対してより耐性があります(通常の電流よりも高い電流を引き込みますが、電源を完全に短絡させません)。スイッチが長時間中程度の抵抗性の状態になる場合、通常よりもはるかに多くの電流を消費する可能性がありますが、通常の使用中は、スイッチの状態が変化し、出力が応答する時間。


2

マイクロコントローラの内部プルアップを使用し、プレスが検出されたらプルアップを無効にします。その後、ボタンの状態を確認するために、時々一時的に再度有効にします。

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