Class Library of "INA226 CURRENT/POWER MONITOR with I2C"

Dependents:   INA226TEST Logger_V1 RS485R_2 SOUDA_YOKUTAN_R ... more

INA226 I2Cディジタル電流・電圧・電力計モジュールのクラスライブラリ

ストロベリー・リナックスから販売されてる電流・電圧計モジュールのクラスライブラリです

http://strawberry-linux.com/catalog/items?code=12031

/media/uploads/tosihisa/_scaled_2012-11-25_02.55.58.jpg /media/uploads/tosihisa/_scaled_2012-11-25_02.55.33.jpg

この写真では,INA226 を使って自作GPSロガーの電圧と電流を測定しています.

電圧と電流を同時に測定できますので,電源電圧の確認や,消費電力の計算に使えるでしょう.

テストプログラム

このクラスライブラリを使用したテストプログラムを公開しています.

Import programINA226TEST

INA226 Test Program. Using INA226 class library.

注意点

  • ストロベリーリナックスのマニュアルによると,「16ビットの電流の測定値に1.25を掛けたものがそのまま mA の直読になります.」とあるのですが,キャリブレーションレジスタに 0x0A00 を書き込んだ場合は,1.25 を掛ける必要は無さそうです.電圧は常に 1.25 を掛けます.
  • INA226 はキャリブレーションレジスタに書き込みを行わないと電流値は0のままです.電流を読み取る場合は,必ずキャリブレーションレジスタに値を書き込んでください.ストロベリーリナックスのモジュールであれば,シャント抵抗は 0.002Ω(2mΩ)と言う事で,INA226 の標準的な抵抗の様ですから,キャリブレーション値は 0x0A00 とおもいます.このクラスライブラリでは,キャリブレーション値の省略値は 0x0A00 にしています.
  • 持っているテスター(A&D AD-5518T)と測り比べをしてみました.電圧・電流共に,10〜20ミリ程の差がありそうです.

追記

mbed M0 (黄mbed) でも再コンパイルするだけで動きます.

/media/uploads/tosihisa/_scaled_2012-11-25_16.43.17.jpg

Committer:
tosihisa
Date:
Sat Nov 24 18:37:00 2012 +0000
Revision:
2:8950b0f31d73
Parent:
1:e0ebc6af5e04
wrote class comment.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tosihisa 1:e0ebc6af5e04 1 /**
tosihisa 1:e0ebc6af5e04 2 * @section LICENSE
tosihisa 0:3a05c5755625 3 * Released under the MIT License: http://mbed.org/license/mit
tosihisa 1:e0ebc6af5e04 4 * Copyright (C) 2012 tosihisa
tosihisa 1:e0ebc6af5e04 5 *
tosihisa 1:e0ebc6af5e04 6 * @section DESCRIPTION
tosihisa 1:e0ebc6af5e04 7 * INA226 - Bi-Directional CURRENT/POWER MONITOR with I2C
tosihisa 1:e0ebc6af5e04 8 * http://strawberry-linux.com/catalog/items?code=12031
tosihisa 1:e0ebc6af5e04 9 *
tosihisa 0:3a05c5755625 10 */
tosihisa 0:3a05c5755625 11 #include "mbed.h"
tosihisa 0:3a05c5755625 12 #include "INA226.hpp"
tosihisa 0:3a05c5755625 13
tosihisa 0:3a05c5755625 14 INA226::INA226(I2C &i2c_,int addr_,int freq_) : i2c(i2c_),i2c_addr(addr_),freq(freq_)
tosihisa 0:3a05c5755625 15 {
tosihisa 0:3a05c5755625 16 i2c.frequency(freq);
tosihisa 0:3a05c5755625 17 }
tosihisa 0:3a05c5755625 18
tosihisa 0:3a05c5755625 19 int INA226::isExist(void)
tosihisa 0:3a05c5755625 20 {
tosihisa 0:3a05c5755625 21 char p_addr = 0; //Select Configuration Register.
tosihisa 0:3a05c5755625 22 i2c.frequency(freq);
tosihisa 0:3a05c5755625 23 if(i2c.write(i2c_addr | 0,&p_addr,sizeof(p_addr)) == 0){
tosihisa 0:3a05c5755625 24 return 1;
tosihisa 0:3a05c5755625 25 }
tosihisa 0:3a05c5755625 26 return 0;
tosihisa 0:3a05c5755625 27 }
tosihisa 0:3a05c5755625 28
tosihisa 0:3a05c5755625 29 int INA226::rawWrite(char pointer_addr,unsigned short val_)
tosihisa 0:3a05c5755625 30 {
tosihisa 0:3a05c5755625 31 char val[3];
tosihisa 0:3a05c5755625 32 val[0] = pointer_addr;
tosihisa 0:3a05c5755625 33 val[1] = static_cast<char>((val_ >> 8) & 0x00ff);
tosihisa 0:3a05c5755625 34 val[2] = static_cast<char>(val_ & 0x00ff);
tosihisa 0:3a05c5755625 35 i2c.frequency(freq);
tosihisa 0:3a05c5755625 36 if(i2c.write(i2c_addr | 0,val,sizeof(val)) == 0){
tosihisa 0:3a05c5755625 37 return 0;
tosihisa 0:3a05c5755625 38 }
tosihisa 0:3a05c5755625 39 return 1;
tosihisa 0:3a05c5755625 40 }
tosihisa 0:3a05c5755625 41
tosihisa 0:3a05c5755625 42 int INA226::rawRead(char pointer_addr,unsigned short *val_)
tosihisa 0:3a05c5755625 43 {
tosihisa 0:3a05c5755625 44 char p_addr = pointer_addr;
tosihisa 0:3a05c5755625 45 char val[2];
tosihisa 0:3a05c5755625 46 i2c.frequency(freq);
tosihisa 0:3a05c5755625 47 if(i2c.write(i2c_addr | 0,&p_addr,sizeof(p_addr)) == 0){
tosihisa 0:3a05c5755625 48 if(i2c.read(i2c_addr | 0x01,val,sizeof(val)) == 0){
tosihisa 0:3a05c5755625 49 *val_ = static_cast<unsigned short>(val[0]);
tosihisa 0:3a05c5755625 50 *val_ = (*val_ << 8) | static_cast<unsigned short>(val[1]);
tosihisa 0:3a05c5755625 51 return 0;
tosihisa 0:3a05c5755625 52 }
tosihisa 0:3a05c5755625 53 }
tosihisa 0:3a05c5755625 54 return 1;
tosihisa 0:3a05c5755625 55 }
tosihisa 0:3a05c5755625 56
tosihisa 0:3a05c5755625 57 int INA226::getVoltage(double *V_)
tosihisa 0:3a05c5755625 58 {
tosihisa 0:3a05c5755625 59 unsigned short val;
tosihisa 0:3a05c5755625 60 if(rawRead(0x02,&val) == 0){
tosihisa 0:3a05c5755625 61 *V_ = static_cast<double>(val) * 1.25;
tosihisa 0:3a05c5755625 62 return 0;
tosihisa 0:3a05c5755625 63 }
tosihisa 0:3a05c5755625 64 return 1;
tosihisa 0:3a05c5755625 65 }
tosihisa 0:3a05c5755625 66
tosihisa 0:3a05c5755625 67 int INA226::getCurrent(double *I_)
tosihisa 0:3a05c5755625 68 {
tosihisa 0:3a05c5755625 69 unsigned short val;
tosihisa 0:3a05c5755625 70 if(rawRead(0x04,&val) == 0){
tosihisa 0:3a05c5755625 71 char *s_p = reinterpret_cast<char *>(&val);
tosihisa 0:3a05c5755625 72 short d_s;
tosihisa 0:3a05c5755625 73 char *d_p = reinterpret_cast<char *>(&d_s);
tosihisa 0:3a05c5755625 74 *(d_p + 0) = *(s_p + 0);
tosihisa 0:3a05c5755625 75 *(d_p + 1) = *(s_p + 1);
tosihisa 0:3a05c5755625 76 *I_ = static_cast<double>(d_s) /* * 1.25 */;
tosihisa 0:3a05c5755625 77 return 0;
tosihisa 0:3a05c5755625 78 }
tosihisa 0:3a05c5755625 79 return 1;
tosihisa 0:3a05c5755625 80 }
tosihisa 0:3a05c5755625 81
tosihisa 0:3a05c5755625 82 int INA226::setCurrentCalibration(unsigned short val)
tosihisa 0:3a05c5755625 83 {
tosihisa 0:3a05c5755625 84 return rawWrite(0x05,val);
tosihisa 0:3a05c5755625 85 }