Atsushi Hattori
/
20210627_Logger
hattori&ide
Diff: INA226/INA226.cpp
- Revision:
- 0:f77369cabd75
diff -r 000000000000 -r f77369cabd75 INA226/INA226.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/INA226/INA226.cpp Sun Dec 18 08:16:01 2022 +0000 @@ -0,0 +1,89 @@ +/** + * @section LICENSE + * Released under the MIT License: http://mbed.org/license/mit + * Copyright (C) 2012 tosihisa + * + * @section DESCRIPTION + * INA226 - Bi-Directional CURRENT/POWER MONITOR with I2C + * http://strawberry-linux.com/catalog/items?code=12031 + * + */ +#include "mbed.h" +#include "INA226.hpp" + +INA226::INA226(I2C &i2c_,int addr_,int freq_) : i2c(i2c_),i2c_addr(addr_),freq(freq_) +{ + i2c.frequency(freq); +} + +int INA226::isExist(void) +{ + char p_addr = 0; //Select Configuration Register. + i2c.frequency(freq); + if(i2c.write(i2c_addr | 0,&p_addr,sizeof(p_addr)) == 0){ + return 1; + } + return 0; +} + +int INA226::rawWrite(char pointer_addr,unsigned short val_) +{ + char val[3]; + val[0] = pointer_addr; + val[1] = static_cast<char>((val_ >> 8) & 0x00ff); + val[2] = static_cast<char>(val_ & 0x00ff); + i2c.frequency(freq); + if(i2c.write(i2c_addr | 0,val,sizeof(val)) == 0){ + return 0; + } + return 1; +} + +int INA226::rawRead(char pointer_addr,unsigned short *val_) +{ + char p_addr = pointer_addr; + char val[2]; + i2c.frequency(freq); + if(i2c.write(i2c_addr | 0,&p_addr,sizeof(p_addr)) == 0){ + if(i2c.read(i2c_addr | 0x01,val,sizeof(val)) == 0){ + *val_ = static_cast<unsigned short>(val[0]); + *val_ = (*val_ << 8) | static_cast<unsigned short>(val[1]); + return 0; + } + } + return 1; +} + +int INA226::getVoltage(double *V_) +{ + unsigned short val; + if(rawRead(0x02,&val) == 0){ + *V_ = static_cast<double>(val) * 1.25 / 1000; + return 0; + } + return 1; +} + +int INA226::getCurrent(double *I_) +{ + unsigned short val; + if(rawRead(0x04,&val) == 0){ + char *s_p = reinterpret_cast<char *>(&val); + short d_s; + char *d_p = reinterpret_cast<char *>(&d_s); + *(d_p + 0) = *(s_p + 0); + *(d_p + 1) = *(s_p + 1); + *I_ = static_cast<double>(d_s) / 1000; + return 0; + } + return 1; +} + +int INA226::setCurrentCalibration(unsigned short val) +{ + return rawWrite(0x05,val); +} + +int INA226::setConfiguration(unsigned short val){ + return rawWrite(0x00, val); // 設定レジスタに書き込む + }