概要
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アドレスは、基板のジャンパの接続で決めることができる。
私の基盤は0x40でした。
アドレス | 意味 |
---|---|
0x00 | 設定用 |
0x01 | シャント抵抗間電圧計測結果(LSB = 2.5uV?) |
0x02 | 電圧計測結果 |
0x03 | 電力計算結果 |
0x04 | 電流計測結果 |
0x05 | キャリブレーション |
の関係があります。
細かく見ていきます。
0x00:設定
モード設定・平均回数・A/D変換にかける時間の設定ができる。
電流のみを計測するならば101ですね。
平均回数は1回なら000ですね。
変換時間はここで決められます。
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;
}