ブログ

κυσο βλογ

3つのスイッチの状態を一つのアナログポートで検知したい

経緯

あるマイクロコントローラの、自由に使える入力ポートがアナログ1ポートしかないという状況で、ノーマリオープンのスイッチ3つの開閉状態を検知したいという状況が発生しました。スイッチは同時に閉じられることもあるので、2^3 = 8通りの開閉状態を電圧の変化として検知できるかどうかを考えてみました。だいぶ無理がありそうですが。

回路案

cacoo.com

こんなもんしか思いつきませんでした。Rとr1,r2,r3の値をどう選ぶかが問題です。ヘタに選ぶと複数の状態が同じVoutになってしまいそうです。

抵抗の選択

スプレッドシート上でいろいろと計算した結果、以下の組み合わせが良さそうだと思います。

{ \displaystyle R = 1\text{k}, r_1 = 4\text{k}, r_2 = 2\text{k}, r_3 = 1\text{k} }

これらの比率だけが意味を持つので、全体を適当に定数倍してもVoutは変わりません。この組み合わせの結果、Voutは以下のようになります。

0V付近とVcc付近の空きが大きく、右のほうの電位差が小さいなどの欠点はありますが、とりあえず8通りの電圧として分離できているようです。最小の電位差が右端2つの0.036 Vcc [V]なので、分解能が8bitもあれば十分識別できそうです。あ、抵抗の誤差をちゃんと考えないとマズそうな気もします。

もっと良い組み合わせや回路はあるか

ほぼ間違いなくもっと良いアイディアがあるのでしょうが、腐って紫色に変色している私の脳みそではこの程度が限界でした。特にVcc付近がうまく利用できてない点が激しく間抜けです。

スイッチはいくつまで増やせるか?

A/D変換のビット数に応じて、限界が決まると思います。面倒なのでここで思考を停止します。

一応計算式

間違ってるかもしれませんが

https://www.circuitlab.com/

でシミュレートしたら同じVoutになったので多分合っているのでしょう。

{ \displaystyle V_{out}(SW1のみON) = \frac{V_{cc}}{ \frac{1}{\frac{R}{r_1}} + 1} }

{ \displaystyle V_{out}(SW1とSW2が共にON) = \frac{V_{cc}}{ \frac{1}{\frac{R}{r_1} + \frac{R}{r_2}} + 1} }

{ \displaystyle V_{out}(全てON) = \frac{V_{cc}}{ \frac{1}{\frac{R}{r_1} + \frac{R}{r_2} + \frac{R}{r_3}} + 1} }

こうやって具体的に例示すると見やすいですが、例えば

{ \displaystyle V(SWxのみON) = \frac{V_{cc}}{ \frac{1}{\frac{R}{r_x}} + 1} }

とか

{ \displaystyle V_{out}(SWxとSWyが共にON) = \frac{V_{cc}}{ \frac{1}{\frac{R}{r_x} + \frac{R}{r_y}} + 1} }

とか

{ \displaystyle V_{out}(SWkだけが全てON) = \frac{V_{cc}}{\frac{1}{\displaystyle {\sum_{ONになっているSWのk} \frac{R}{r_k}}}+1} }

とかいうふうに一般化した式を書くといきなり分かりづらくなって読む気が失せますね。

まとめ

雨が降って憂鬱だったので、いろんなリンクを埋め込んだり、数式を書いたりしてみたかった。反省はしていない。