INA226による電流測定

# 概要
INA226の使い方

datasheet

https://www.ti.com/lit/ds/symlink/ina226.pdf?ts=1646011119733&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252FINA226


# 接続

|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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/b709dece-67a0-9b7d-a67f-d8d6b71c07a7.png)

私の基盤は0x40でした。

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

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

### 0x00:設定
モード設定・平均回数・A/D変換にかける時間の設定ができる。
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/5f95f194-9339-45d3-1469-d7225c697f5b.png)

![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/9f8c341a-7939-3b01-1936-a015db69dcfe.png)

電流のみを計測するならば101ですね。
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/1622adf4-894d-98a2-6427-a8113139a621.png)
平均回数は1回なら000ですね。

![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/0f1762ad-58f2-7ae6-9ed6-7fb1d03aeb46.png)

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


### 0x04:電流
読み込まれる値は、ShuntVoltage＊（0x05で設定したシャント抵抗値）/2048だそうです。

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


### シャント抵抗
R010と印字されている抵抗でした。
0.01Ωみたいです。


### 実際に読み込むと

```C
#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のレジスタ値の関係は実際に確認するのがいいと思われる。

```C
#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;  
}
```