sanguisorbaのアイコン画像

Arduinoで簡易電流計を作りたかった(一応完成)

sanguisorba 2020年05月22日に作成  (2020年05月25日に更新)

未完成です。 何か進展があったら書き直します。
間違っている点やお気づきの点がありましたらコメントいただけると助かります。
未完成なので実際にやって大事故が起こっても責任は取りません。

追記 それっぽいものができました。

何故作ろうと思ったのか

Arduinoってありますよね。手軽で便利です。

電圧はアナログピンから簡単に測れるんですけど、電流ってなかなか測るのが大変だったりします。

今回紹介するのは筆者がどうやってArduinoで電流を計測しようか悩んだ痕跡です。まだ悩んでいる最中なのでこれはあくまで今思いつく最善の方法です。

電流計の使い方

電流計は次のようにして使います。
キャプションを入力できます

左側の三角は電流計、右側の抵抗は負荷、すなわち電流を計測する機械を示します。下側の電源は計測先の入力電源です。

今回用いる電流計システム

簡易的で組みやすい回路にしました。
理想的な、売られている電流計と比べると精度が低いです。
(ちゃんとした電流計は、例えば無抵抗電流計というものがある。)
電流計を今回用いる電流計回路に置き換えると次の回路図になります。

キャプションを入力できます

右側の抵抗は負荷を示します。左上側の+が書いてあるものは電圧計、そして電圧計の下にあるのが電流計のミソとなる抵抗です。

抵抗と電圧計を並列に繋ぐと何故電流が測れるのかについて説明します。

分圧抵抗というものがあります。電圧計側の抵抗をRAR_A、負荷をRLR_L、入力電圧をVinV_{in}とします。すると、電圧計に来る電圧VAV_Aは次の式で表せます。

VA=RARA+RLVinV_A=\frac{R_A}{R_A+R_L}V_{in}

また、負荷の電圧VLV_Lは次の式で表せます。

VL=RLRA+RLVin=VinVAV_L=\frac{R_L}{R_A+R_L}V_{in}=V_{in}-V_A

上の式のように、この電流計は電圧低下が生じます。負荷が大きければ大きい程、負荷として設定している抵抗の値は小さくなる(V=RIV=RIより、電流IIが増大すると負荷抵抗RRは減少)のでその分VAV_Aが大きくなり、VLV_LVAV_A分電圧が低下します。これは注意です。

さて、この時RL=0R_L=0とするとどうなるでしょう。VA=VinV_A=V_{in}となり、電圧計に入力電圧が100%来ることになります。VAV_Aはなるべく小さい方が電圧低下がその分起きないという事になりますから、電圧計は当然微小な電圧を読み取る事を想定している訳です。ここに高電圧が加わると電圧計が壊れる事が容易に想像できると思います。

何故これで電流が測れるのか

簡単です。直列に抵抗を2本つなぐと、電圧は上のように変動しますが、電流は一定になります。なので、

IL=VLRL=IA=VARAI_L=\frac{V_L}{R_L}=I_A=\frac{V_A}{R_A}

今回はVAV_Aを電圧計で測定し、またRAR_Aのパラメータは自分で設定します。よって、IAI_Aを求める事でILI_Lが求まるという事になります!また、VAV_AからVLV_Lがどれくらい電流計によって電圧低下しているのかも計測できます。

実際に組み込む例

今回の電流計では以下の条件で計測する事を想定します。

  • 電圧計: 0 ~ 5 Vの間を変動する (Arduinoのアナログピンに直接刺せる。1024段階で電圧がわかる。)
  • 計測負荷: 最大10A

私が持ってるテスターは2Aまでしか測れないので今回はもう少し頑張ってもらって10Aまで測れる電流計を作ります。電圧計がArduinoなので、分解能は0.00976Aです。中途半端ですが仕様なのでしょうがないです。

電圧計抵抗をどうするか

実は、殆ど1つに定まっています。

先ほど、電圧は低下するが電流は一定であるといいました。つまり、10Aに耐えられる抵抗が必要という事になります。

また、電圧低下もありますから、RAR_Aの値はなるべく小さいほうが良いです。

この条件を満たす抵抗が2つあります。メタルクラッド抵抗シャント抵抗です。

大体どちらも0.1Ωが最も低い抵抗値になります。0.1Ωで10Aを測ろうとなると、10A×10A×0.1Ω = 10W級の抵抗が必要です。また、20Aを測ろうとなると20A×20A×0.1Ω=40W級のものが必要です。

V=RIV=RIから0~10Aの間を0~1Vに変換する事がわかります。
しかし最大1V低下する事を意味するので、乾電池やリポバッテリで駆動する機械の負荷に対してこの電流計を使うのは難しいという欠点があります。

そこで、抵抗を並列に接続して抵抗値を小さくします。

抵抗値を小さくする

0.1Ω抵抗を並列に接続する事で非常に小さな値の抵抗を作ります。
0.1Ωを2個並列につなぐと0.05Ωになります。これを使う事で10A流れても0.5Vの損失で済む事になります。
ついでにかかる電流も半分ずつになるので2.5W耐えられる抵抗を用意すれば良い事になります。2.5Wと言うともっと安価な5Wセメント抵抗や3W金属皮膜抵抗を使う事ができます。

これを用いて次のような回路を作りました。
入力電圧10V、 負荷10A (負荷抵抗1Ω)時、LM741使用時のシミュレートした電圧計値付きです。

キャプションを入力できます

分かりやすいように、本来は10k抵抗のところを20k抵抗にしています。抵抗値を2倍にしたことにより、出力が0~5V→0~10Vになります。

想定通り、本来10Aを消費する機械にこの電流計を接続すると0.5Vの電圧低下が起きます。また、アンプの効率の問題もあり本来なら9.524Vと表示されるべきですが実際は9.512Vとなっています。

キャプションを入力できます

10kにしました。 これでArduinoで扱えるようになりました。

接続方法

簡潔に。まず、アナログピンに上記回路図の電圧メータを接続します。この時、

  • アンプを通すと位相が逆転するので+-の向きに注意してください。(回路図通りに組めば良い)
  • パターンの配線に細心の注意が必要です。配線の抵抗に気を付けてください。

ソフトウェア面では、 AnalogRead関数を用いて0~5Vを0~1023の値で読み込み、計算をして電流値を出します。
この時の値はAnalogReadで得た1024段階の値をXXとすると次の式で電流が求まります。

I=101023XI=\frac{10}{1023}X

オフセット電圧調整

yusufuさんの指摘の通り、オペアンプにはオフセット電圧が存在するのでそれを補正します。

それっぽい補正回路を足すと次のような回路になります。
キャプションを入力できます

赤線で囲った部分は20kΩ可変抵抗、ボリュームです。シミュレートの際は5.16kΩと14.84kΩにしています。ここは繊細な微調整が必要です。

新たに追加した抵抗の値については使用するアンプによって異なります。実製作するときとシミュレートの時では値がだいぶ異なってくると思うので今回挙げた抵抗値は大分適当です。実製作回路では更に100kΩ抵抗を可変抵抗にしています。ここらへんは実際に使うオペアンプの性質、配線の内部抵抗などで変わってくると思います。

これについては次のサイトをご覧ください。
http://www.nteku.com/opamp/opamp-offset-chousei.aspx

上の回路より得られたシミュレート上の電流は次のようになります。

負荷抵抗 [Ω] 実際の消費電流 [mA] 電圧計から計算した消費電流 [mA]
1 9524 9518
10 995.02 994.46
100 99.95 99.89
1000 10.00 9.99
10000 1.000 1.000

一応それっぽい電流を示す電流計になりました。実際の電流よりも若干低いですが、実際は抵抗の誤差のほうが大きいのでなかなかこんなきれいな値はとれない事と、Arduinoを使う場合は表示分解能が0.97mAという事があるのでもっと適当な電流計になる筈です。設計段階でこれぐらいの精度が得られれば十分だと思います。

メモ

  • 計測対象の電圧が低い時はシャント抵抗を10個並列にして0.01Ωにする。 この時、10kΩ抵抗は50kΩ抵抗にする。
  • 電流計用の電源としてマキタバッテリ18Vを考えていたので+12V,-12Vになっているが、実際に製作をするときは9V, -9Vにした方が楽。生成にはレギュレータを使う。7809と7909。
  • シミュレータの都合上LM741を使っているが、実際に作る時は負電源を用意する必要がない単電源オペアンプを使うと良い。単電源オペアンプの増幅回路については検索すべし。
  • Arduinoの電源周りが面倒だという方はアンプの非反転増幅回路を使う。ゲイン倍率に注意。
2
sanguisorbaのアイコン画像
宇宙科学総合研究会で基板書いてます。マイコンを使わないもっと低レベルな電源回路とかPCBパターン製作を担当しています。 @keio_LYNCS
sanguisorba さんが 2020/05/22 に 編集 をしました。 (メッセージ: 初版)
Closed
yusufuのアイコン画像 yusufu 2020/05/22

シミュレーションでの結果が9.524Vではなく9.512Vとなるのはオペアンプの入力オフセット電圧によるものだと思います。

オペアンプは理想的には入力電圧が0にすると出力も0になりますが、実際は内部回路の差動回路の不ぞろいによって出力にオフセットが生じます。このオフセット電圧は図1のように等価的に入力端子に微小な電圧がかかっているとみなすことができます。

この微小な電圧信号が増幅回路で増幅されて出力電圧にでてくるので、増幅回路の出力が下がる(またはあがる)ことになります。

なので今回はオペアンプの効率によって増幅率が変化したのではなく、
出力電圧=20×(入力電圧-入力オフセット電圧)
となっているだけです。

実際にsanguisorbaさんの作った増幅回路の入力端子をGNDに落として、シミュレーションしてみてください。
出力電圧に20mVほどのオフセットが出てくると思います。(LTSpiceで確認できました)

本来はこの入力オフセット電圧と同時に入力バイアス電流によるオフセットもでてくるのですが、計算してみると数mV程度だったので、今回の犯人は入力バイアス電流だと思われます。

対策としましてはLM741はオフセット調節用のピンがありますので、そちらを使用すればよいと思います。
また抵抗にも誤差があり、オペアンプの帰還抵抗がずれている場合は増幅率が変化してしまうので、実測で増幅率を構成するか、可変抵抗で調節するのがいいと思います。

キャプションを入力できます

2 件の返信が折りたたまれています
sanguisorba さんが 2020/05/23 に 編集 をしました。
sanguisorba さんが 2020/05/23 に 編集 をしました。
sanguisorba さんが 2020/05/23 に 編集 をしました。
sanguisorba さんが 2020/05/23 に 編集 をしました。 (メッセージ: 抜け修正)
sanguisorba さんが 2020/05/25 に 編集 をしました。 (メッセージ: 交流計測時に対応する変換回路に変更)
ログインしてコメントを投稿する