137 + 53 ★★★★☆
TI社製 INA226 を使った I2C/ IIC 双方向電流 電力モニタ 電源検出センサー 基板
電源から出力される電圧と電流を同時に計測できる基板
Aliexpressから@137円で購入。supplier shop
INA226は、以前買ったINA219よりも 高精度の電流計測ICだ。
TI INA226
TI INA226 datasheet
INA219に比べて、
ADC精度が12bit→16bit(±15bit)と大幅精度アップ(電圧測定は15bit)
入力端子のアンプゲインが固定になり(INA219のPGA=/2設定 相当)
電流測定時の入力レンジは -81.9175mV~81.9175mV と狭くなっていて
あまり大きいシャント抵抗を付けるとオーバーレンジになる可能性があるが
通常使用時には問題になることは無いだろう。(10mΩなら、±8.1Aまで測れる)
ハイサイド電位を測る VIN+,VIN- 端子の間に10mΩが接続されている
1A電流が流れても、0.01Vの電圧降下しか生じない。
(INA219の基板だと100mΩで接続されていた)
基板に型名さえ印刷されていない。 下記製品CJMCU-226の丸パクリっぽいが
電流測定抵抗が10mΩに変更されているのは数Aの電流が計れてGood。
(100mΩ抵抗のバリエーションもあるようだ。いいね。)
丸パクリのくせに、SCLとSDAのシルク印刷を間違えている。(直さないのかw)
(製品販売説明に、大きくSCLとSDAが間違えていますと記載がある)
ちなみに実物で見ると。裏面のA0とA1の印刷位置も反対だけど、大丈夫かな。
=> 実物パターン確認して大丈夫でした。
I2Cアドレス設定(半田ブリッジで変更可能)
A1=GND, A0=GND : 40h (デフォルト)
A1=GND, A0=VCC : 41h
A1=VCC, A1=GND : 44h
A1=VCC, A1=VCC : 45h
回路図(未保証): SCLとSDAはシルク印刷のとおり誤記した形で記載しています。
VBS端子を、IN-端子とショートしておけば 負荷にかかる電圧が読み取れる。
INA226は、同じ電流検出抵抗値での電流計測精度がINA219より良い
両者で3%誤差で測れるレンジを比較してみた。(TIの製品ページの計算使用)
特に小電流での計測誤差が小さいのがいいですね。
数十mAの電流も、数Aの電流も 1つの10mΩ抵抗で精度良く測れそうだ。
INA219,INA3221と 性能比較してみたよ:
INA226 INA219 INA3221 性能比較
その他資料:
INA226 Power Monitor + OLED Display – Arduino Tutorial
GitHub: Combined Arduino library for reading multiple INA2xx power monitor device
Texas Instruments のデジタル電圧・電流センサ INA226 を使う
PROGRAMING:
Shunt_Voltage(reg) = Shunt_Voltage(ADC);
// 1LSB=2.5uV; Fullscale=±81.92mV(±2.5uV*32767)
// 10mΩ Shunt: 1.000A -> shunt(reg)=10mV/2.5uV=4000
Current(reg) = Calibration(reg) * Shunt_Voltage(reg) / 2048 ;
/ Calib=512: Current = 1000[mA] (1LSB=1mA; Max=8.192A)
// Calib=2048: Current = 4000[250uA] (1LSB=250uA; Max=8.192A)
// Calib=5120: Current = 10000[100uA] (1LSB=250uA; Max=3.2767A)
Bus_Voltage(reg) = Bus_Voltage(ADC);
// 1LSB=1.25mV; Fullscale=40.96V(1.25mV*32767)
// VBUS=12.5V: Bus(reg) = 10000[*1.25mV} ;
Power(reg) = Current(reg) * Bus_Voltage(reg) / 20000 ;
// Calib=1280: Power = 2500 * 10000 / 20000 = 1250[*100mW]
// Calib=2048: Power = 4000 * 10000 / 20000 = 2000[*62.5mW]
Texas Instruments のデジタル電圧・電流センサ INA226 を使うからArduinoスケッチを流用した。
#include <Wire.h> // Connect INA226 with SCL (A5), SDA (A4) <= Arduino基板の印刷場所と違うので注意! // I2C address (default) const byte INA226_ADDR = B1000000; // Register Map const byte INA226_CONFIG = 0x00; //Pon value=B0100000100100111 const byte INA226_SHUNTV = 0x01; //Pon value=0x0000 const byte INA226_BUSV = 0x02; //Pon value=0x0000 const byte INA226_POWER = 0x03; //Pon value=0x0000 const byte INA226_CURRENT = 0x04; //Pon value=0x0000 const byte INA226_CALIB = 0x05; //Pon value=0x0000 //const byte INA226_MASK = 0x06; //Pon value=0x0000 //const byte INA226_ALERTL = 0x07; //Pon value=0x0000 //const byte INA226_MANU_ID = 0xfe; //Pon value=0x5449 //const byte INA226_DIE_ID = 0xff; //Pon value=0x2260 // INA226_CONFIG : RST,'000',AVG[2:0],VBUSCT[2:0],VSHCT[2:0],MODE[3:1] // INA226_CURRENT : void INA226_write(byte reg, unsigned short val) { Wire.beginTransmission(INA226_ADDR); Wire.write(reg); Wire.write(val >> 8); Wire.write(val & 0xff); Wire.endTransmission(); } short INA226_read(byte reg) { short ret = 0; // request the registor Wire.beginTransmission(INA226_ADDR); Wire.write(reg); Wire.endTransmission(); // read Wire.requestFrom((int)INA226_ADDR, 2); while(Wire.available()) { ret = (ret << 8) | Wire.read(); } return ret; } void setup() { // put your setup code here, to run once: Serial.begin(9600); while (!Serial) {} Wire.begin(); // average: 16 times, conversion time: 8.244ms/8.244ms INA226_write(INA226_CONFIG, 0x45ff); // current conversion INA226_write(INA226_CALIB, 2048); // Scale=250uA } void loop() { // put your main code here, to run repeatedly: int sv, bv, c; float bv_, c_; bv_ = bv = INA226_read(INA226_BUSV); //sv = INA226_read(INA226_SHUNTV); c_ = c = INA226_read(INA226_CURRENT); bv_ *= 1.250 ; c_ *= 0.2500 ; //Serial.print(bv); // bus voltage (reading) //Serial.print(","); //Serial.print(sv); // shunt voltage (reading) //Serial.print(","); Serial.print(bv_); // bus voltage in [mV] Serial.print(","); Serial.println(c_); // current in [mA] delay(100); }
最大32256バイトのフラッシュメモリのうち、スケッチが5358バイト(16%)を使っています。 最大2048バイトのRAMのうち、グローバル変数が412バイト(20%)を使っていて、 ローカル変数で1636バイト使うことができます。