マイコンで電流測定するには電流センサモジュール等を使うのが手軽であり、当ブログでも電流センサINA219を使ったMicroPythonによる電流測定を扱った。一方でESP32などのマイコンには内蔵ADCが備わっており、回路にシャント抵抗を挟むことによってESP32内蔵ADCだけで電流測定する実験もやってみた。ただ、この時はシャント抵抗に1Ωを用いたため電圧ドロップが大きすぎて実用性はイマイチ。
こんな時は小さなシャント抵抗を使い電流変化に伴う小さな電圧変化をオペアンプで増幅してあげれば良い。今回はシャント抵抗+オペアンプ増幅による電流センスアンプを設計しLTspiceでシミュレーションを行った結果をまとめる。
精度はそこそこで良いから簡単な回路で測定したい
ローサイド測定をチョイス
回路にシャント抵抗を挟んで電流を測定する回路には大きく分けるとシャント抵抗を電源側に置く「ハイサイド測定」とGND側に置く「ローサイド測定」がある。
どちらもシャント抵抗の両端に現れる電位差をオペアンプで増幅する事に変わりは無いのだが、ハイサイド測定の場合はほぼ電源電圧のオフセットが乗った電位差を測定するためレールToレールのオペアンプが必要。一方ローサイド測定は負荷がGNDから浮いてしまう欠点があるが、使用するオペアンプは普通の汎用オペアンプで良いので、今回はローサイド測定で行うことにする。
オペアンプの差動増幅を使った電流センスアンプ
オペアンプによる電流センスアンプで良く見かけるのは差動増幅回路を使った物。この差動増幅回路が正しく動作する条件はR1=R3およびR2=R4で、これら4本の抵抗の精度が悪いと回路が期待した動作をしないため、なかなかハードルが高い…
非反転増幅に簡略化
ローサイド測定の場合はシャント抵抗の片側はGNDに接続されており、セオリー通りに差動増幅回路を使わなくても普通の非反転増幅回路で十分じゃないかと思う。下の回路はオペアンプによる非反転増幅回路を使った電流センスアンプで、上の差動増幅回路との違いはR3,R4をとっぱらって非反転入力をシャント抵抗と直結しただけだ。
この回路なら電圧増幅率はR1とR2の比で決まるので抵抗の精度が多少バラついていても回路動作そのものがおかしくなる事は無いし、抵抗の定数ばらつきに起因する誤差はADCで読み取った値を校正すれば済んでしまう。
ユニバーサル・オペアンプを使った回路でシミュレーション
ひとまずユニバーサル・オペアンプ(UniversalOpamp2)を使って原理回路の動作を確認しておく。
基本回路
0.1Ωのシャント抵抗Rsを負荷RLのローサイドに置いて、オペアンプの非反転増幅回路で増幅率10倍に増幅するようにした回路は以下。
負荷に流れる電流をIと置くと、この回路の出力電圧Voutとは以下のような関係となる。
.step解析を行うと、上の関係式の通り負荷を流れる電流値がVoutに同じ値の電圧へと変換されていることが確認出来る。
但し、RLが小さくなって負荷が軽くなると誤差が出てしまうようだ。グラフを拡大すると、低い電流値になるほど誤差が大きくなる事が確認出来る。
両電源化
RLが小さくなると誤差が出る原因は正直良く分からないが、オペアンプを両電源で動作させれば誤差が解消する。
軽負荷時も.step解析結果が綺麗に重なるようになった。
双方向電流もOK
充電式バッテリーの充放電モニタだと電流が双方向になるので、電源+負荷抵抗の代わりに電流源を置いた回路で確認してみる。
オペアンプが出せる電圧幅の範囲であれば電流→電圧の変換は問題なく出来そうだ。
実回路に近いシミュレーション
マイコン回路では単電源で動作させることが多く正負電源を用意するのはあまり現実的でない。
また、オペアンプは安価な汎用品を使いたい。
というわけで、上記原理回路から以下2点を変更してシミュレーションを行う。
- 電源極性反転IC(ICL7660)を使って負電源を作る
- 汎用オペアンプLM358を使う
下がその回路。ICL7660の代わりにピン互換でLTspiceにデフォルトでインストールされているLTC1044を使った。LM358のSPICEモデルはこの記事の方法で回路に取り込んだ。
LTC1044は時間軸モデルのため動作点解析(.op解析)をやろうとすると「意味のある結果は得られないよ」と警告が出てしまうため、電流源をサイン波にして過渡解析(.tran解析)によるシミュレーションを実行してみた。±2Aの範囲であれば問題なく測定出来そう。
出力電圧をシフトさせる
マイコンの内蔵ADCだと負電圧を測定出来ない場合が多いので、更に電圧をシフトする回路を追加したのが以下。
U3の回路はボルテージフォロワ(増幅率1の非反転増幅回路)で、U3の出力Voを電源V+と抵抗分圧させることでVoutに得られる電圧を電源側にシフトさせる。VoutとVpの関係は以下の式の通り。
Vout = \frac{R3 * Vp+R4 * V^+}{(R3+R4)}シミュレーションを実行し各点の電圧をプロットしてみると、概ね測定対象の電流が±1.5Aの範囲であれば上の式の関係になっている事が確認出来る。
測定結果を電流値に変換するには?
一番最後の回路を用い、マイコンのADCでVoutを測定した結果から電流値を得るためには、
Vp = \frac{(R3+R4) * Vout - R4 * V^+}{R3} = \frac{Rs*(R1+R2)}{R2} Iの関係式から、
により求まる。式の中に電源電圧V+の項があり電源電圧の測定も必要だが、計算そのものはマイコンなら楽勝で出来るだろう。回路定数のバラツキによる誤差もプログラムで簡単に校正出来る。
まとめ
オペアンプによる電流センスアンプの設計とLTspiceによるシミュレーションをやってみた。本来はオペアンプのオフセット電圧や抵抗の温度特性などについても気を配るべき所だけれど「ざっくり電流を測定出来ればOK」と割り切っている事もあって敢えて細かいことを気にせずに作った感じ。
わざわざ専用ICを用意せずとも、汎用部品を使った回路で手軽に電流測定出来るのはメリットかなと思う。ただ簡単な回路を目指した筈なのに結局は部品点数が増えて回路が複雑になってしまった点はイマイチかも。
コメント