Arduino UNO(のチップ)を使ったUSB電流計
単電源で反転アンプ マイナスの入力電圧は増幅できます
は、電流をアナログ出力するだけのものでしたが、
Arduino UNOのチップATmega328Pと3桁7seg LEDで
USBラインの電流値を表示してみました。
※ちょっと訂正。 TNX ラジオペンチさん
※電源側のコネクタ、USBではなくXHにしてるのは
こちらの都合です。
スケッチをアップするためのArduino UNOとのつなぎ
はこんな具合。 +5Vラインはつないでいません。
こんな目的です。
・回路の動作テスト、通電OKとなれば(電源周りは正常だと
わかったら)CVCC電源じゃなく、5V出力のACアダプタ
(USBコネクタで出てる)を使うことが多くなった。
・CVCC電源にしても手持ちのUSB電流計にしても、電流
表示の最小桁が10mA。
・試運転中の回路の動作電流、せめて1mAの桁で見ておき
たい。
ということで、1mA表示の電流計が欲しいとなった次第です。
電流を見るのにテスターをつないだままにするのもちょっと
なぁだし、常用的に電流を監視できるようにと作りました。
内蔵のVref=1.1Vを使っている関係で、電流の計測、
ATmega328Pの10bit A/Dではちょっとチカラ不足。
1bitが1mAステップじゃなく値によっては2mA飛び
になる所も。
電圧のほうは5V±1Vを計るようにしましたんで、
10bitで0.01V表示は余裕です。
携帯電話などの充電時、充電した電流量をチェックで
きます。
でも、電流は10mAが最小。
文字も小さいし。
せっかくなんで中味も。
PIC16F1933が使われています。
電源はレギュレータで落として3.3Vで動いています。
電流検出のアナログ部はこんな具合。
電流検出抵抗はGND側に入っています。
50mΩを2パラで25mΩ
LM358で増幅。
R38が01Bで1kΩ。
R39が30Cで20kΩ。
20倍か21倍かのアンプ。
1Aで25mV。 それを20倍だと0.5V。
スペックでは最大3.5Aとなっているので
4Aで2V。 2Vあたりの基準電源でしょうか。
基板をこのケースに入れるつもりで大きさを決めました。
「ダイソー ミニケース 5個組」が見つからない
この記事で紹介した
「No.1434 トラベルケース S 2P」
完全に透明なのでLEDもエエ感じ。
(フィルタが欲しいか)
スケッチのアップはもうちょい整理してからに。
※実験ベンチのCVCC電源(下段)と低周波発振器二つ
上のが「8038」で。
中段のが「MAX038」で。
・トラ技Jr.2018年秋号に「8038」復活の記事
・20MHzまでの正弦波をスイープ出力するMAX038を使った周波数スイープ・ジェネレータの製作
・実験用電源の中身
・電源を改造 AD8724D
電流値表示の最小桁が「0.01A =10mA」。
装置をデバッグする時、1mAを読みたいなぁ~と
なったわけです。
※追記
7seg LEDの表示タイミングとA/D変換の関係。
7seg LED表示は500Hz(2ms)割り込みで。
タイマー1のOC1A割り込みが周期
そのタイミングを使ってA/D変換(電流,電圧の2ch)。
2ms × 2ch × 128回平均で512msごとにデータを
更新。
上図波形の「電流,電圧値計算」の時間で、
「浮動小数点化したmap関数」で2点calを実行。
512ms周期でこれを実行。
AVRマイコンの浮動小数点計算、なかなか
早いゾ!
まずタイマー1のOC1B割り込みでLEDの駆動をオフ。
COMをLに。セグメントをHに
その10us後のOC1A割り込みでA/D変換の
開始を指令。
A/D変換中はLEDがオフしているので、チップ
内の電流増加の影響は少ないはず。
A/D変換完了割り込み(100usちょい後)でLEDの
駆動を再開。
そして10bit A/D結果を平均処理。
2ch × 128回の平均加算完了をメインルーチン側に
知らせて「浮動小数点化したmap」で2点cal。
こんな流れです。
※追記
これが2点cal用の校正データ
1~4が電流用、5~8が電圧用
1,3,5,7がY軸の値(out)。
それぞれ10mA 900mA、4.50V 5.50Vが校正点。
2,4,6,8がその時のX軸(in)、つまりA/D値。
# 1 mA-Lo : 10 …10mA
# 2 mA-Lo A/D : 13
# 3 mA-Hi : 900 …900mA
# 4 mA-hi A/D : 882
# 5 V-Lo : 450 …4.50V
# 6 V-Lo A/D : 264
# 7 V-Hi : 550 …5.50V
# 8 V-Hi A/D : 779
ターミナルとつないで変更できるようにしています。
EEPROMに保存。
浮動小数点化したmap関数にはmAとVの実値と
A/D値をそのまま食わせます。
いったん電流値や電圧値に変換してからゴソゴソは
ありませんので「1023 vs 1024」は関係ありません。
AREF電圧(定格1.1V)の偏差や抵抗の誤差、A/D変換に
つきまとう誤差は、実値による校正操作で考えなくて
良くなります。
これが本来の「map関数」だぁ!
・Arduino なんとかして誤用を正したい:A/Dの1/1023とmap関数
・Arduino 10bit A/D値をmap関数でスケーリングする例
※こまかい補足
AD4の電流入力、1MΩで4Vにプルアップ(!)してるでしょ。
その先はINA180の出力につながる1kΩ。
ちょっとだけプラスに持ち上げることで、0V付近のADC
データを使わないで良いようにしています。
INA180の出力も完全に0Vにならないし。
※追記が続く
・単電源で反転アンプ マイナスの入力電圧は増幅できます
この最終回路「INA180を使ったハイサイド電流検出回路」で
表示回路の電流を計ってみました。
一番上の波形(ノイズでジャギジャギ)がこのアンプの出力
です。
つなぐのにGNDラインが15cmほど延びてい
るので、ノイズの影響大。
プローブのGNDは表示回路側。
負荷電流を「18mA」にしました。
7seg表示は「ブランク 1 8.」となり、
COM1の最右桁を点灯したときの電流がいちばん
大きくなります。
そしてCOM3のブランクの所が、負荷電流+回路電流
となります。
全セグメントを点けている「8.」表示で、ブランクより
20mAほどアップ。
セグメントあたり2.5mAの電流ということで、おもわく
通りの駆動ができています。
※「88mA」だと。
表示は「ブランク 8 8.」となります。
「8.」と「8」で電流がちょいと変化しているのが
見えるかと。
中央を拡大。
A/D変換中は全桁をブランクにしている様子が
見えています。
INA180A3(100倍アンプ)の帯域幅は「150kHz」。
それによる遅れも見ておかなくてはなりません。
使っているオシロには「高分解モード」という
平均処理的モードがあって(平均回数を指定できる
モードとは別に)、ノイズを低減できます。
ただし細いパルスは抜けちゃう
それを使うと、こんな具合にジャギジャギを
消すことができます。
見やすくなりますが、割り込みタイミングの細い
パルスは消えかけています。
※とりあえずスケッチを (ZIP圧縮)
・ダウンロード - usb_cur2.zip
900行ほどのプログラムです。
校正はターミナルとつないでということに
なります。
※ちょっとしたバグを発見しましたんで注意。
校正モードでの「.」入力の処理。
※追記が続く
Arduino-UNO基板と、アノードコモン7seg LED、
抵抗、ボリューム、スイッチがあれば、電流検出ICが
無くてもこんな接続で「試運転」できます。
calしなくてもボリュームを回せば表示が変化するはず。
最近のコメント