« 単電源で反転アンプ マイナスの入力電圧は増幅できます | トップページ | ダイソーの400円LED電球、寿命! 昨晩、切れちゃいました »

2022年11月29日 (火)

Arduino UNO(のチップ)を使ったUSB電流計

単電源で反転アンプ マイナスの入力電圧は増幅できます
は、電流をアナログ出力するだけのものでしたが、
Arduino UNOのチップATmega328Pと3桁7seg LEDで
USBラインの電流値を表示してみました。
U51  
  ※ちょっと訂正。 TNX ラジオペンチさん
  ※電源側のコネクタ、USBではなくXHにしてるのは
   こちらの都合です。

スケッチをアップするためのArduino UNOとのつなぎ
はこんな具合。 +5Vラインはつないでいません。
Aa36
こんな目的です。
・回路の動作テスト、通電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表示は余裕です。

まず、これが5年ほど前に買ったUSB電流計。
B11_20221129172301  

携帯電話などの充電時、充電した電流量をチェックで
きます。
でも、電流は10mAが最小。
文字も小さいし。

せっかくなんで中味も。
B12_20221129172301
B13_20221129172401
PIC16F1933が使われています。
電源はレギュレータで落として3.3Vで動いています。
B14_20221129172401  

電流検出のアナログ部はこんな具合。
電流検出抵抗はGND側に入っています。
B15_20221129172501

50mΩを2パラで25mΩ
LM358で増幅。
R38が01Bで1kΩ。
R39が30Cで20kΩ。
20倍か21倍かのアンプ。
1Aで25mV。 それを20倍だと0.5V。
スペックでは最大3.5Aとなっているので
4Aで2V。 2Vあたりの基準電源でしょうか。

製作した回路。
A15_20221129174501

基板をこのケースに入れるつもりで大きさを決めました。
「ダイソー ミニケース 5個組」が見つからない

この記事で紹介した
No.1434 トラベルケース S 2P
完全に透明なのでLEDもエエ感じ。
  (フィルタが欲しいか)

A12_20221129172501

スケッチのアップはもうちょい整理してからに。

※実験ベンチのCVCC電源(下段)と低周波発振器二つ
B41_20221130102101
上のが「8038」で。
中段のが「MAX038」で。

トラ技Jr.2018年秋号に「8038」復活の記事
20MHzまでの正弦波をスイープ出力するMAX038を使った周波数スイープ・ジェネレータの製作
実験用電源の中身
電源を改造 AD8724D

電流値表示の最小桁が「0.01A =10mA」。
装置をデバッグする時、1mAを読みたいなぁ~と
なったわけです。

※追記
7seg LEDの表示タイミングとA/D変換の関係。
U11_20221201091701

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を使ったハイサイド電流検出回路」で
表示回路の電流を計ってみました。
U12_20221201102001

一番上の波形(ノイズでジャギジャギ)がこのアンプの出力
です。
  つなぐのにGNDラインが15cmほど延びてい
  るので、ノイズの影響大。
  プローブのGNDは表示回路側。

負荷電流を「18mA」にしました。
7seg表示は「ブランク 1 8.」となり、
COM1の最右桁を点灯したときの電流がいちばん
大きくなります。

そしてCOM3のブランクの所が、負荷電流+回路電流
となります。
全セグメントを点けている「8.」表示で、ブランクより
20mAほどアップ。
セグメントあたり2.5mAの電流ということで、おもわく
通りの駆動ができています。

※「88mA」だと。
表示は「ブランク 8 8.」となります。
U13

「8.」と「8」で電流がちょいと変化しているのが
見えるかと。

中央を拡大。
U14

A/D変換中は全桁をブランクにしている様子が
見えています。

INA180A3(100倍アンプ)の帯域幅は「150kHz」
それによる遅れも見ておかなくてはなりません。

使っているオシロには「高分解モード」という
平均処理的モードがあって(平均回数を指定できる
モードとは別に)、ノイズを低減できます。
  ただし細いパルスは抜けちゃう
それを使うと、こんな具合にジャギジャギを
消すことができます。
U15
  見やすくなりますが、割り込みタイミングの細い
  パルスは消えかけています。


※とりあえずスケッチを (ZIP圧縮)
  ・ダウンロード - usb_cur2.zip

900行ほどのプログラムです。
校正はターミナルとつないでということに
なります。
  ※ちょっとしたバグを発見しましたんで注意。
   校正モードでの「.」入力の処理。

※追記が続く
Arduino-UNO基板と、アノードコモン7seg LED、
抵抗、ボリューム、スイッチがあれば、電流検出ICが
無くてもこんな接続で「試運転」できます。
U21
calしなくてもボリュームを回せば表示が変化するはず。



|

« 単電源で反転アンプ マイナスの入力電圧は増幅できます | トップページ | ダイソーの400円LED電球、寿命! 昨晩、切れちゃいました »

ツール」カテゴリの記事

Arduino」カテゴリの記事

コメント

教えてください。
アナログ測定に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分

コメントを書く



(ウェブ上には掲載しません)




« 単電源で反転アンプ マイナスの入力電圧は増幅できます | トップページ | ダイソーの400円LED電球、寿命! 昨晩、切れちゃいました »