201×2 + 49 ★☆☆☆☆
CJMCU-3221
TI社製 INA219の機能を3回路分集積したようなIC INA-3221 を使った I2C/ IIC 双方向電流 電力モニタ 電源検出センサー 基板
電源から出力される電圧と電流を同時に計測できる。
Aliexpressから@201円で購入 Seller
TI INA3221
TI INA3221 datasheet
INA219に比べて、ADCが12bit→13bitと ちょっぴりグレードアップ。
入力端子のアンプゲインが固定になっており(INA219のPGA=/4設定 相当)
電流測定時の入力レンジは -163mV~163mV に固定になっているが
通常時には問題になることは無いだろう。(100mΩなら、1.6Aまで測れる)
CH1,CH2,CH3 端子とPOW端子の間に100mΩが接続されている
1A電流が流れた場合0.1Vの電圧降下が生じるので注意。
実はこの基板では、電流測定ペア端子の片側は全てGNDに接続されている。
つまり独立した電源からのハイサイド電流の測定が出来ない仕様だ。
POWが1つしかないから、電源電圧が3端子で共通にしかできないし
POWからの配線抵抗が共通になってしまって性能低下の要因だ。
だったら 最初からCH端子をVIN+、VIN-のペアにしとけよ と思う。
端子の片方がGNDだから 普通にローサイド電流は測れるように思ってしまうが
POW端子をGND端子と短絡しないとローサイド電流も測れない という
超判りにくい回路構成 になっている。(説明書とか無い中華クオリティ製品だし)
さらに後述のように、I2Cのアドレスを決めるA0信号も初期状態はオープンで
I2Cアドレスが確定していない状態で出荷されているのである。
使う前にA0信号を必ず半田ブリッジ設定する必要があるので間違わないように。
もう、初心者をハマりまくらせるつもりで作ったとしか思えない基板である。
(LEDなんかいらないから、GNDへのプルダウン抵抗くらい付けとけよと思う。)
自分の目的では、電源電圧も独立して同時に測りたいので改造する予定。
電流測定ターミナルは裏側につけるべきかも知れない。
赤はカットするパターン。緑はジャンパ。
INA3221 構成図:
(電流はVIN+,VIN-間の電圧降下で測る。VINーとGND間電圧も測れる。)
ADCは1つしかないので、3つのVIN端子ペアから選択したものを順繰りに計測。
I2C address setting:
A0=OPEN: Address not defined (Default)
A0=GND: 40h
A0=VS: 41h
A0=SDA: 42h
A0=SCL: 43h
Programing:
https://github.com/switchdoclabs/SDL_Arduino_INA3221
から、Clone or Download から Download ZIP を選択。
SDL_Arduino_INA3221-master.zip をダウンロードする。
(SignUpしなくてもダウンロードできる)
このライブラリでは、I2Cアドレスが40hの初期値なので、
A0ピンをGNDにジャンパしておくのが簡単です。
ArduinoIDEから
[スケッチ]-[ライブラリをインクルード]-[.ZIP形式のライブラリをインストール,,,]
で、SDL_Arduino_INA3221-master.zip をライブラリインストール。
examplesフォルダの、SDL_Arduino_INA3221_Test.inoを実行。
: ちょっと変えてみた。
// // SDL_Arduino_INA3221 Library Test Code // SDL_Arduino_INA3221.cpp Arduino code - runs in continuous mode // Version 1.1 // SwitchDoc Labs January 31, 2015 // // // This was designed for SunAirPlus - Solar Power Controller - www.switchdoc.com // #include <Wire.h> #include <SDL_Arduino_INA3221.h> SDL_Arduino_INA3221 ina3221; // the three channels of the INA3221 named for SunAirPlus Solar Power Controller channels (www.switchdoc.com) //#define CH1 1 //#define CH2 2 //#define CH3 3 void setup(void) { Serial.begin(57600); // Serial.println("SDA_Arduino_INA3221_Test"); // Serial.println("Measuring voltage and current with ina3221 ..."); ina3221.begin(); } void loop(void) { Serial.println("------------------------------"); float shuntvoltageArray[3] = {0,0,0}; float busvoltageArray[3] = {0,0,0}; float current_mAArray[3] = {0,0,0}; float loadvoltageArray[3] = {0,0,0}; // channel scan for (int channel=1; channel <= 3; channel++){ busvoltageArray[channel-1] = ina3221.getBusVoltage_V(channel); shuntvoltageArray[channel-1] = ina3221.getShuntVoltage_mV(channel); current_mAArray[channel-1] = -ina3221.getCurrent_mA(channel); // minus is to get the "sense" right. - means the battery is charging, + that it is discharging loadvoltageArray[channel-1] = busvoltageArray[channel-1] + (shuntvoltageArray[channel-1] / 1000); delay(500); } // channel display for (int channel=1; channel <= 3; channel++){ Serial.print(channel); Serial.print(F("-ch Bus Voltage(V): ")); Serial.println(busvoltageArray[channel-1]); Serial.print(channel); Serial.print(F("-ch Shunt Voltage(mV): ")); Serial.println(shuntvoltageArray[channel-1]); Serial.print(channel); Serial.print(F("-ch Load Voltage(V): ")); Serial.println(loadvoltageArray[channel-1]); Serial.print(channel); Serial.print(F("-ch Load Current(mA): ")); Serial.println(current_mAArray[channel-1]); Serial.println(""); } }
最大32256バイトのフラッシュメモリのうち、スケッチが6162バイト(19%)を使っています。 最大2048バイトのRAMのうち、グローバル変数が445バイト(21%)を使っていて、 ローカル変数で1603バイト使うことができます。