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

Dependents:   INA226 INA226_part2 INA226_T2 BMS_6804_pb

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers INA226.cpp Source File

INA226.cpp

00001 #include "mbed.h"
00002 #include "INA226.hpp"
00003 
00004 INA226::INA226(I2C &i2c_,int addr_,int freq_) : i2c(i2c_),i2c_addr(addr_),freq(freq_)
00005 {
00006     i2c.frequency(freq);
00007 }
00008 
00009 int INA226::isExist(void)
00010 {
00011     char p_addr = 0;   //Select Configuration Register.
00012     i2c.frequency(freq);
00013     if(i2c.write(i2c_addr | 0,&p_addr,sizeof(p_addr)) == 0){
00014         return 1;
00015     }
00016     return 0;
00017 }
00018 
00019 int INA226::rawWrite(char pointer_addr,unsigned short val_)
00020 {
00021     char val[3];
00022     val[0] = pointer_addr;
00023     val[1] = static_cast<char>((val_ >> 8) & 0x00ff);
00024     val[2] = static_cast<char>(val_ & 0x00ff);
00025     i2c.frequency(freq);
00026     if(i2c.write(i2c_addr | 0,val,sizeof(val)) == 0){
00027         return 0;
00028     }
00029     return 1;
00030 }
00031 
00032 int INA226::rawRead(char pointer_addr,unsigned short *val_)
00033 {
00034     char p_addr = pointer_addr;
00035     char val[2];
00036     i2c.frequency(freq);
00037     if(i2c.write(i2c_addr | 0,&p_addr,sizeof(p_addr)) == 0){
00038         if(i2c.read(i2c_addr | 0x01,val,sizeof(val)) == 0){
00039             *val_ = static_cast<unsigned short>(val[0]);
00040             *val_ = (*val_ << 8) | static_cast<unsigned short>(val[1]);
00041             return 0;
00042         }
00043     }
00044     return 1;
00045 }
00046 
00047 int INA226::getVoltage(double *V_)
00048 {
00049     unsigned short val;
00050     if(rawRead(0x02,&val) == 0){
00051         *V_ = static_cast<double>(val) * 1.25;
00052         return 0;
00053     }
00054     return 1;
00055 }
00056 
00057 int INA226::getCurrent(double *I_)
00058 {
00059     unsigned short val;
00060     if(rawRead(0x04,&val) == 0){
00061         char *s_p = reinterpret_cast<char *>(&val);
00062         short d_s;
00063         char *d_p = reinterpret_cast<char *>(&d_s);
00064         *(d_p + 0) = *(s_p + 0);
00065         *(d_p + 1) = *(s_p + 1);
00066         *I_ = static_cast<double>(d_s) /* * 1.25 */;
00067         return 0;
00068     }
00069     return 1;
00070 }
00071 
00072 int INA226::setCurrentCalibration(unsigned short val)
00073 {
00074     return rawWrite(0x05,val);
00075 }