概要
電流計測と,電源ラインの電圧監視ができる.
本質情報→データシート
秋月にモジュールが売ってる.
INA219使用 電流センサーモジュール(カレントセンサー)
I2Cレジスタ
アドレス | 機能 |
---|---|
0x00 | コンフィグ |
0x01 | シャント電圧 |
0x02 | バス電圧 |
0x03 | 消費電力 |
0x04 | シャント電流 |
0x05 | キャリブレーション |
計算式
乗算器
2つの乗算器が入ってる
(シャント電流)=(シャント電圧)*(キャリブレーション)/4096
(消費電力)=(シャント電流)*(バス電圧)/5000
※(キャリブレーション)はデフォルトでは0なので,設定を書き込まないと(シャント電流)は機能しない
ADC
(バス電圧)の単位は4[mV]
(シャント電圧)の単位は0.01[mV]
実験
条件
1[kΩ]の抵抗とシャント抵抗0.1[Ω]を直列につなぐ
電源はiphoneの充電器(5[V])
バス電圧は5[V]=5000[mV]=0x04E2[4mV]
シャント電流は5[V]/1[kΩ]=5[mA]
シャント電圧は5[mA]*0.1[Ω]=0.5[mV]=0x32[0.01mV]
コード
#include <stdio.h>
#include <stdint.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>
#define DRIFT -11
int fd;
int BusV,SntV,SntA;
uint16_t BusV_raw,SntV_raw,SntA_raw;
int init(int adr){
fd = wiringPiI2CSetup(adr);
// Config
// wiringPiI2CWriteReg16(fd,0x00,0x399F);
// Caribraion 0.1ohm 1%
// wiringPiI2CWriteReg16(fd,0x05,0x0000);
return 0;
}
uint16_t swap(uint16_t hoge){
return ((hoge & 0xFF00)/0x0100 + (hoge & 0x00FF)*0x0100);
}
int update(){
BusV_raw = swap(wiringPiI2CReadReg16(fd,0x02)) >> 3;
SntV_raw = swap(wiringPiI2CReadReg16(fd,0x01));
SntA_raw = swap(wiringPiI2CReadReg16(fd,0x04));
BusV = BusV_raw * 4;
SntV = SntV_raw - 0x10000 - DRIFT;
SntA = SntA_raw;
return 0;
}
int main(void){
init(0x40);
for(;;){
update();
printf("Bus:%5u[mV] ",BusV);
printf("Snt:%5d[0.01mV] ",SntV);
printf("Cur:%5d[0.01mA]",SntV*10);
printf("\n");
delay(100);
}
return 0;
}
コンフィグ
####[15]
リセットビット
1をセットするとレジスタをクリアする
リセットされるとリセットビットは0になる
####[13]
バス電圧の計測範囲(0:16V/1:32V)
####[11:12]
シャント電圧の測定可能範囲
(00:±40mv/01:±80mv/10:±160mv/11:±320mv)
####[7:10]
バスADCの分解能
####[3:6]
シャントADCの分解能
####[0:2]
動作モード(0b111にしとけば全部動く)