ホーム » Aliexpress » INA226 high side current sensor

INA226 high side current sensor

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まで測れる)

INA226     INA226_2

ハイサイド電位を測る VIN+,VIN- 端子の間に10mΩが接続されている
1A電流が流れても、0.01Vの電圧降下しか生じない。
(INA219の基板だと100mΩで接続されていた)

基板に型名さえ印刷されていない。 下記製品CJMCU-226の丸パクリっぽいが
電流測定抵抗が10mΩに変更されているのは数Aの電流が計れてGood。
(100mΩ抵抗のバリエーションもあるようだ。いいね。)
5-CJMCU-226-INA226-iic5-CJMCU-226-INA226-iica

丸パクリのくせに、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
2018-07-13 20_53_56-High-Side Measurement, Bi-Directional Current_Power Monitor w_I²C Interface

回路図(未保証): SCLとSDAはシルク印刷のとおり誤記した形で記載しています。
2018-07-13 20_45_54-C__Users_mokawa_Desktop_Yahoo_INA226.mdpf - Dynamic Draw
VBS端子を、IN-端子とショートしておけば 負荷にかかる電圧が読み取れる。

INA226は、同じ電流検出抵抗値での電流計測精度がINA219より良い
両者で3%誤差で測れるレンジを比較してみた。(TIの製品ページの計算使用)
特に小電流での計測誤差が小さいのがいいですね。
数十mAの電流も、数Aの電流も 1つの10mΩ抵抗で精度良く測れそうだ。
INA226per

INA219per

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バイト使うことができます。

投稿アーカイブ