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しなくてもボリュームを回せば表示が変化するはず。
| 固定リンク
「ツール」カテゴリの記事
- DDS方式の2相パルス発生回路、周波数スキャン機能を付ける(2024.10.05)
- アナログ計器(2024.09.27)
- 秋月のI2C接続液晶 AQM1602XAを基板に直付け(2024.09.24)
- 「導通チェッカー」から「配線チェッカー」へ(2024.09.20)
- 40年前の「HAKKO DASH」(2024.07.17)
「Arduino」カテゴリの記事
- 1/nカウント方式とDDS方式の2相パルス発生回路(2024.10.13)
- おっと。map関数の計算桁に注意(2024.10.06)
- DDS方式の2相パルス発生回路、周波数スキャン機能を付ける(2024.10.05)
- 1クロックでも速くしたい 割込を「ISR_NAKED」で(2024.09.30)
- 1クロックでも速くしたい DDS方式の2相パルス発生器(2024.09.27)
コメント
教えてください。
アナログ測定にAD4,AD5を使い、AD3を使わなかったのはノイズ対策ですよね。
あと、細かいですが電圧測定のアンプのゲインは34/22=1.5454ではないかと。
投稿: ラジオペンチ | 2022年11月29日 (火) 21時07分
ゲイン計算ミスのご指摘、ありがとうございます。
訂正図をアップしておきました。
それと・・・A/D入力のチャンネルを4と5にした理由・・・
ピンの端のほうがテスターやオシロのプローブを当たりやすいから・・・ホンマかいな
LEDのコモン駆動をPC0から順に1、2としました。
ひょっとして4桁にすることもあるかと思って、
PC3を飛ばしてPC4、PC5がA/D入力になりました。
ノイズの影響は考慮外っす。
ただ・・・制御スケッチ(まだアップしてませんが)をちょい工夫。
A/D変換(時間約100uS)は、LEDを駆動していないタイミング(チップに流れる電流が少ないとき)にしています。
タイマー1(16bit)で500Hz割り込み。
この割り込みでLED駆動をオフ(ブランク)に。
割り込みを抜ける直前にA/D変換を開始。
変換中、LEDの駆動電流は流れません。
そして、A/D変換完了割り込みでLEDを再点灯。
こんなタイミングで、LEDの駆動電流によるA/D変換の変動を避けています。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2022年11月30日 (水) 09時11分
AD4,5を使っている理由の解説ありがとうございます。
実は、「AD4と5はデジタルからのノイズを受け難いように設計されている」と勝手に思い込んでいたのですが、改めてデーターシートを確認すると、
https://blog-imgs-156.fc2.com/r/a/d/radiopench/20221130ATmega328P_ADC23-6-2.jpg
ハードウエアI2Cを使う場合、AD4,5は影響を受けるけどAD0-3は影響を受けない、ということでした。
あと、電源電流を1mA分解能で読みたいという話、良く判ります。
投稿: | 2022年11月30日 (水) 13時06分
あれこれ「波形」を追加しました。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2022年12月 1日 (木) 10時53分