1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

INA226による電流測定

Last updated at Posted at 2022-02-28

概要

INA226の使い方

datasheet

接続

pin 接続先 意味
IN+ 負荷or電源 電流流すピン
IN- 負荷or電源 電流流すピン
VBS 接続しない 電力測定する場合、電圧測定もする必要があるため接続が必要。電流のみの場合接続不要。GNDとの間の電圧を測る
ALE 接続しない ALERT:警告用
SDA A4 I2C用
SCL A5 I2C用
GND GND グラウンド
VCC 2.7V~5.5V 電源

I2C

I2Cアドレスは、基板のジャンパの接続で決めることができる。

18.png

私の基盤は0x40でした。

アドレス 意味
0x00 設定用
0x01 シャント抵抗間電圧計測結果(LSB = 2.5uV?)
0x02 電圧計測結果
0x03 電力計算結果
0x04 電流計測結果
0x05 キャリブレーション

の関係があります。
細かく見ていきます。

0x00:設定

モード設定・平均回数・A/D変換にかける時間の設定ができる。
19.png

20.png

電流のみを計測するならば101ですね。
21.png
平均回数は1回なら000ですね。

22.png

変換時間はここで決められます。

0x04:電流

読み込まれる値は、ShuntVoltage*(0x05で設定したシャント抵抗値)/2048だそうです。

0x05:シャント抵抗値設定

シャント抵抗

R010と印字されている抵抗でした。
0.01Ωみたいです。

実際に読み込むと

#define PWM1 5
#define A1 6
#define A2 7
#define STBY 8

#define INA_ADDRESS 0x40

#include <Wire.h>
#include<avr/io.h>
#include<avr/interrupt.h>

void setup() {
  pinMode(PWM1,OUTPUT);
  pinMode(A1,OUTPUT);
  pinMode(A2,OUTPUT);
  pinMode(STBY,OUTPUT);

  digitalWrite(STBY,HIGH);

  digitalWrite(A1,HIGH);
  digitalWrite(A2,LOW);

  analogWrite(PWM1,255);
  
  //INA226
  Wire.begin();

  Serial.begin(9600);
  Serial.println("start");
   
}

void loop() {
    int data;
  data = INA_read(0x01);
  Serial.println(data);

  delay(100);

}

void INA_write(byte address, byte data1, byte data2){
  Wire.beginTransmission(INA_ADDRESS);
  Wire.write(address);
  Wire.write(data1);    //0: 8kHz,260Hzcut   1:184Hz
  Wire.write(data2);
  Wire.endTransmission();
}

int INA_read(byte address){
  int data;
  Wire.beginTransmission(INA_ADDRESS);
  Wire.write(address);
  Wire.endTransmission();
  Wire.requestFrom(INA_ADDRESS, 2);
  if (Wire.available() >= 2){
    data = Wire.read() << 8 | Wire.read();
  }
  return data;  
}

テスターで測ると25mA。INA226によるシャント抵抗間電圧0x01の値は-300と計測されます。

0x05のデフォルト値は0x00で0x04は18720になぜか固定されています。

0x04による電流計測を使うために、0x05に0x0A00を書き込む

なんか、0x05を設定して使うのは大変そうです。

最終結果

0x01のシャント抵抗間電圧を計測するのが一番便利だと思われる。
電流値とINA226の0x01のレジスタ値の関係は実際に確認するのがいいと思われる。

#define PWM1 5
#define A1 6
#define A2 7
#define STBY 8

#define INA_ADDRESS 0x40

#include <Wire.h>
#include<avr/io.h>
#include<avr/interrupt.h>

void setup() {
  pinMode(PWM1,OUTPUT);
  pinMode(A1,OUTPUT);
  pinMode(A2,OUTPUT);
  pinMode(STBY,OUTPUT);

  digitalWrite(STBY,HIGH);

  digitalWrite(A1,HIGH);
  digitalWrite(A2,LOW);

  analogWrite(PWM1,255);
  
  //INA226
  Wire.begin();

  Serial.begin(9600);
  Serial.println("start");
/*
  unsigned int data;
  data = INA_read(0x05);
  Serial.println(data);
  */ 
  //INA_write(0x05,0x0A,0x00);
  INA_write(0x01,0x41,0x26);     //Currentのみ
}

void loop() {
  
  int data;
  data = INA_read(0x01);

  float ampare_m;
  ampare_m = data*0.0957;
  Serial.println(ampare_m);  

  delay(100);

}

void INA_write(byte address, byte data1, byte data2){
  Wire.beginTransmission(INA_ADDRESS);
  Wire.write(address);
  Wire.write(data1);    //0: 8kHz,260Hzcut   1:184Hz
  Wire.write(data2);
  Wire.endTransmission();
}

int INA_read(byte address){
  int data;
  Wire.beginTransmission(INA_ADDRESS);
  Wire.write(address);
  Wire.endTransmission();
  Wire.requestFrom(INA_ADDRESS, 2);
  int n= 0;
  while (Wire.available() < 2){
    n++;
    if(n>1000){
      break;
    }
  }
  data = Wire.read() << 8 | Wire.read();  
  return data;  
}
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?