Wayne Taylor / INA260

Dependents:   INA260_Test

Committer:
Waynan
Date:
Sun Dec 10 14:44:24 2017 +0000
Revision:
0:a1b8d2c9420d
First commit of INA260 Library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Waynan 0:a1b8d2c9420d 1 /**
Waynan 0:a1b8d2c9420d 2 * @section DESCRIPTION
Waynan 0:a1b8d2c9420d 3 * INA260 - Bi-Directional 15A CURRENT/POWER MONITOR with I2C
Waynan 0:a1b8d2c9420d 4 *
Waynan 0:a1b8d2c9420d 5 */
Waynan 0:a1b8d2c9420d 6 #include "mbed.h"
Waynan 0:a1b8d2c9420d 7 #include "INA260.hpp"
Waynan 0:a1b8d2c9420d 8
Waynan 0:a1b8d2c9420d 9 INA260::INA260(I2C &i2c_,int addr_,int freq_) : i2c(i2c_),i2c_addr(addr_),freq(freq_)
Waynan 0:a1b8d2c9420d 10 {
Waynan 0:a1b8d2c9420d 11 i2c.frequency(freq);
Waynan 0:a1b8d2c9420d 12 }
Waynan 0:a1b8d2c9420d 13
Waynan 0:a1b8d2c9420d 14 int INA260::isExist(void)
Waynan 0:a1b8d2c9420d 15 {
Waynan 0:a1b8d2c9420d 16 char p_addr = 0; //Select Configuration Register.
Waynan 0:a1b8d2c9420d 17 i2c.frequency(freq);
Waynan 0:a1b8d2c9420d 18 if(i2c.write(i2c_addr | 0,&p_addr,sizeof(p_addr)) == 0){
Waynan 0:a1b8d2c9420d 19 return 1;
Waynan 0:a1b8d2c9420d 20 }
Waynan 0:a1b8d2c9420d 21 return 0;
Waynan 0:a1b8d2c9420d 22 }
Waynan 0:a1b8d2c9420d 23
Waynan 0:a1b8d2c9420d 24 int INA260::rawWrite(char pointer_addr,unsigned short val_)
Waynan 0:a1b8d2c9420d 25 {
Waynan 0:a1b8d2c9420d 26 char val[3];
Waynan 0:a1b8d2c9420d 27 val[0] = pointer_addr;
Waynan 0:a1b8d2c9420d 28 val[1] = static_cast<char>((val_ >> 8) & 0x00ff);
Waynan 0:a1b8d2c9420d 29 val[2] = static_cast<char>(val_ & 0x00ff);
Waynan 0:a1b8d2c9420d 30 i2c.frequency(freq);
Waynan 0:a1b8d2c9420d 31 if(i2c.write(i2c_addr | 0,val,sizeof(val)) == 0){
Waynan 0:a1b8d2c9420d 32 return 0;
Waynan 0:a1b8d2c9420d 33 }
Waynan 0:a1b8d2c9420d 34 return 1;
Waynan 0:a1b8d2c9420d 35 }
Waynan 0:a1b8d2c9420d 36
Waynan 0:a1b8d2c9420d 37 int INA260::rawRead(char pointer_addr,unsigned short *val_)
Waynan 0:a1b8d2c9420d 38 {
Waynan 0:a1b8d2c9420d 39 char p_addr = pointer_addr;
Waynan 0:a1b8d2c9420d 40 char val[2];
Waynan 0:a1b8d2c9420d 41 i2c.frequency(freq);
Waynan 0:a1b8d2c9420d 42 if(i2c.write(i2c_addr | 0,&p_addr,sizeof(p_addr)) == 0){
Waynan 0:a1b8d2c9420d 43 if(i2c.read(i2c_addr | 0x01,val,sizeof(val)) == 0){
Waynan 0:a1b8d2c9420d 44 *val_ = static_cast<unsigned short>(val[0]);
Waynan 0:a1b8d2c9420d 45 *val_ = (*val_ << 8) | static_cast<unsigned short>(val[1]);
Waynan 0:a1b8d2c9420d 46 return 0;
Waynan 0:a1b8d2c9420d 47 }
Waynan 0:a1b8d2c9420d 48 }
Waynan 0:a1b8d2c9420d 49 return 1;
Waynan 0:a1b8d2c9420d 50 }
Waynan 0:a1b8d2c9420d 51
Waynan 0:a1b8d2c9420d 52 int INA260::getVoltage(double *V_)
Waynan 0:a1b8d2c9420d 53 {
Waynan 0:a1b8d2c9420d 54 unsigned short val;
Waynan 0:a1b8d2c9420d 55 if(rawRead(0x02,&val) == 0){
Waynan 0:a1b8d2c9420d 56 *V_ = static_cast<double>(val) * 0.00125;
Waynan 0:a1b8d2c9420d 57 return 0;
Waynan 0:a1b8d2c9420d 58 }
Waynan 0:a1b8d2c9420d 59 return 1;
Waynan 0:a1b8d2c9420d 60 }
Waynan 0:a1b8d2c9420d 61
Waynan 0:a1b8d2c9420d 62 int INA260::getCurrent(double *I_)
Waynan 0:a1b8d2c9420d 63 {
Waynan 0:a1b8d2c9420d 64 unsigned short val;
Waynan 0:a1b8d2c9420d 65 if(rawRead(0x01,&val) == 0){ //current register 0X1
Waynan 0:a1b8d2c9420d 66 char *s_p = reinterpret_cast<char *>(&val);
Waynan 0:a1b8d2c9420d 67 short d_s;
Waynan 0:a1b8d2c9420d 68 char *d_p = reinterpret_cast<char *>(&d_s);
Waynan 0:a1b8d2c9420d 69 *(d_p + 0) = *(s_p + 0);
Waynan 0:a1b8d2c9420d 70 *(d_p + 1) = *(s_p + 1);
Waynan 0:a1b8d2c9420d 71 *I_ = static_cast<double>(d_s) * 1.25;
Waynan 0:a1b8d2c9420d 72 return 0;
Waynan 0:a1b8d2c9420d 73 }
Waynan 0:a1b8d2c9420d 74 return 1;
Waynan 0:a1b8d2c9420d 75 }
Waynan 0:a1b8d2c9420d 76
Waynan 0:a1b8d2c9420d 77
Waynan 0:a1b8d2c9420d 78 int INA260::getPower(double *P_)
Waynan 0:a1b8d2c9420d 79 {
Waynan 0:a1b8d2c9420d 80 unsigned short val;
Waynan 0:a1b8d2c9420d 81 if(rawRead(0x03,&val) == 0){ //power register 0x3
Waynan 0:a1b8d2c9420d 82 char *s_p = reinterpret_cast<char *>(&val);
Waynan 0:a1b8d2c9420d 83 short d_s;
Waynan 0:a1b8d2c9420d 84 char *d_p = reinterpret_cast<char *>(&d_s);
Waynan 0:a1b8d2c9420d 85 *(d_p + 0) = *(s_p + 0);
Waynan 0:a1b8d2c9420d 86 *(d_p + 1) = *(s_p + 1);
Waynan 0:a1b8d2c9420d 87 *P_ = static_cast<double>(d_s) * 10;
Waynan 0:a1b8d2c9420d 88 return 0;
Waynan 0:a1b8d2c9420d 89 }
Waynan 0:a1b8d2c9420d 90 return 1;
Waynan 0:a1b8d2c9420d 91 }
Waynan 0:a1b8d2c9420d 92
Waynan 0:a1b8d2c9420d 93 int INA260::setConfig(unsigned short val)
Waynan 0:a1b8d2c9420d 94 {
Waynan 0:a1b8d2c9420d 95 return rawWrite(0x00,val); //config register 0x00
Waynan 0:a1b8d2c9420d 96 }
Waynan 0:a1b8d2c9420d 97
Waynan 0:a1b8d2c9420d 98 int INA260::setAlert(unsigned short val1)
Waynan 0:a1b8d2c9420d 99 {
Waynan 0:a1b8d2c9420d 100 return rawWrite(0x06,val1); //config register 0x00
Waynan 0:a1b8d2c9420d 101 }
Waynan 0:a1b8d2c9420d 102
Waynan 0:a1b8d2c9420d 103 int INA260::setLim(unsigned short val2)
Waynan 0:a1b8d2c9420d 104 {
Waynan 0:a1b8d2c9420d 105 return rawWrite(0x07,val2); //config register 0x00
Waynan 0:a1b8d2c9420d 106 }
Waynan 0:a1b8d2c9420d 107
Waynan 0:a1b8d2c9420d 108 void INA260::readAlert(void)
Waynan 0:a1b8d2c9420d 109 {
Waynan 0:a1b8d2c9420d 110 unsigned short val4;
Waynan 0:a1b8d2c9420d 111 rawRead(0x06,&val4);
Waynan 0:a1b8d2c9420d 112
Waynan 0:a1b8d2c9420d 113 }