Kenji Arai / INA226
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers INA226.h Source File

INA226.h

00001 /*
00002  * mbed library program
00003  *  INA226 High-or Low-Side Measurement,Bi-Directional CURRENT/POWER MONITOR with I2C Interface
00004  *  by Texas Instruments
00005  *
00006  * Copyright (c) 2015,'17 Kenji Arai / JH1PJL
00007  *  http://www.page.sannet.ne.jp/kenjia/index.html
00008  *  http://mbed.org/users/kenjiArai/
00009  *      Created: January    25th, 2015
00010  *      Revised: August     23rd, 2017
00011  */
00012 /*
00013  *---------------- REFERENCE ----------------------------------------------------------------------
00014  * Original Information
00015  *  http://www.ti.com/product/INA226/description
00016  *  http://www.ti.com/lit/ds/symlink/ina226.pdf
00017  * Device kit
00018  *  http://strawberry-linux.com/catalog/items?code=12031
00019  *  http://strawberry-linux.com/catalog/items?code=12226
00020  */
00021 
00022 #ifndef        MBED_INA226
00023 #define        MBED_INA226
00024 
00025 /////////// ADDRESS /////////////////////////////
00026 //  7bit address = 0b1000000(0x40)
00027 //  G=GND, V=VS+, A=SDA, L=SCL
00028 //  e.g. _VG: A1=VS+, A0=GND
00029 //    -> Please make sure your H/W configuration
00030 // Set data into "addr"
00031 #define INA226_ADDR_GG             (0x40 << 1)
00032 #define INA226_ADDR_GV             (0x41 << 1)
00033 #define INA226_ADDR_GA             (0x42 << 1)
00034 #define INA226_ADDR_GL             (0x43 << 1)
00035 #define INA226_ADDR_VG             (0x44 << 1)
00036 #define INA226_ADDR_VV             (0x45 << 1)
00037 #define INA226_ADDR_VA             (0x46 << 1)
00038 #define INA226_ADDR_VL             (0x47 << 1)
00039 #define INA226_ADDR_AG             (0x48 << 1)
00040 #define INA226_ADDR_AV             (0x49 << 1)
00041 #define INA226_ADDR_AA             (0x4a << 1)
00042 #define INA226_ADDR_AL             (0x4b << 1)
00043 #define INA226_ADDR_LG             (0x4c << 1)
00044 #define INA226_ADDR_LV             (0x4d << 1)
00045 #define INA226_ADDR_LA             (0x4e << 1)
00046 #define INA226_ADDR_LL             (0x4f << 1)
00047 
00048 /////////// REGISTER DEFINITION /////////////////
00049 #define INA226_CONFIG              0x00
00050 #define INA226_SHUNT_V             0x01
00051 #define INA226_BUS_VOLT            0x02
00052 #define INA226_POWER               0x03
00053 #define INA226_CURRENT             0x04
00054 #define INA226_CALBLATION          0x05
00055 #define INA226_MASK_EN             0x06
00056 #define INA226_ALERT_LMT           0x07
00057 #define INA226_DIE_ID              0xff
00058 
00059 /////////// PARAMETER SETTING for Configuration Reg. //////////////////////////
00060 // Set data into "shunt_register"
00061 #define INA226_PAR_R_2MORM         2    // Strawberry Linux borad
00062 #define INA226_PAR_R_25MOHM        25
00063 #define INA226_PAR_R_MORM(x)       (x)
00064 // Set data into "average", Averaging Mode
00065 #define INA226_PAR_A_1             0    // Default
00066 #define INA226_PAR_A_4             1
00067 #define INA226_PAR_A_16            2
00068 #define INA226_PAR_A_64            3
00069 #define INA226_PAR_A_128           4
00070 #define INA226_PAR_A_256           5
00071 #define INA226_PAR_A_512           6
00072 #define INA226_PAR_A_1024          7
00073 // Set data into "b_volt_cnv_time" Bus Voltage Conversion Time
00074 #define INA226_CFG_BUS_V_TR140     0
00075 #define INA226_CFG_BUS_V_TR204     1
00076 #define INA226_CFG_BUS_V_TR332     2
00077 #define INA226_CFG_BUS_V_TR588     3
00078 #define INA226_CFG_BUS_V_T1R1      4    // Default
00079 #define INA226_CFG_BUS_V_T2R116    5
00080 #define INA226_CFG_BUS_V_T4R156    6
00081 #define INA226_CFG_BUS_V_T8R244    7
00082 // Set data into "s_volt_cnv_time", Shunt Voltage Conversion Time
00083 #define INA226_CFG_SHT_V_TR140     0
00084 #define INA226_CFG_SHT_V_TR204     1
00085 #define INA226_CFG_SHT_V_TR332     2
00086 #define INA226_CFG_SHT_V_TR588     3
00087 #define INA226_CFG_SHT_V_T1R1      4    // Default
00088 #define INA226_CFG_SHT_V_T2R116    5
00089 #define INA226_CFG_SHT_V_T4R156    6
00090 #define INA226_CFG_SHT_V_T8R244    7
00091 // Set data into "mode", Operating Mode
00092 #define INA226_PAR_M_PDWN          0
00093 #define INA226_PAR_M_SHNT_TRG      1
00094 #define INA226_PAR_M_BUS_TRG       2
00095 #define INA226_PAR_M_SHNTBUS_TRG   3
00096 #define INA226_PAR_M_ADC_OFF       4
00097 #define INA226_PAR_M_SHNT_CONT     5
00098 #define INA226_PAR_M_BUS_CONT      6
00099 #define INA226_PAR_M_SHNTBUS_CONT  7    // Default
00100 
00101 ////////////// DATA TYPE DEFINITION ///////////////////////
00102 typedef struct {
00103     uint8_t addr;
00104     uint16_t shunt_register;
00105     uint8_t average;
00106     uint8_t b_volt_cnv_time;
00107     uint8_t s_volt_cnv_time;
00108     uint8_t mode;
00109     uint16_t calibration_data;
00110 } INA226_TypeDef;
00111 
00112 ////////////// DEFAULT SETTING ////////////////////////////
00113 // Standard parameter for easy set-up
00114 const INA226_TypeDef ina226_std_paramtr = {
00115     // I2C Address
00116     INA226_ADDR_GG,
00117     // CONFIG REG
00118     INA226_PAR_R_2MORM, // 2 milli-ohm
00119     INA226_PAR_A_1,     // Averaging Mode
00120     INA226_CFG_BUS_V_T1R1,
00121     INA226_CFG_SHT_V_T1R1,
00122     INA226_PAR_M_SHNTBUS_CONT,
00123     // CALBLATION REG
00124     2560
00125 };
00126 
00127 /** INA226 High-or Low-Side Measurement,Bi-Directional CURRENT/POWER MONITOR with I2C Interface
00128  *
00129  * @code
00130  * //--------- Default setting -----------------
00131  * #include "mbed.h"
00132  * #include "INA226.h"
00133  *
00134  * // I2C Communication
00135  * INA226 current(dp5, dp27, INA226_ADDR_GG);
00136  * // If you connected I2C line not only this device but also other devices,
00137  * //     you need to declare following method.
00138  * I2C    i2c(dp5, dp27);
00139  * INA226 current(I2C& p_i2c, INA226_ADDR_GG);
00140  *
00141  * int main() {
00142  *     while(1){
00143  *         printf("I=%+6.3f [A]\r\n", current.read_current());
00144  *         wait(1.0):
00145  *     }
00146  * }
00147  * //--------- Detail setting -----------------
00148  * #include "mbed.h"
00149  * #include "INA226.h"
00150  *
00151  * const INA226_TypeDef ina226_my_paramtr = {
00152  *    // I2C Address
00153  *    INA226_ADDR_GG,
00154  *    // CONFIG REG
00155  *    INA226_PAR_R_100MOHM,     // 100 milli-ohm
00156  *    INA226_PAR_A_1,           // Averaging Mode
00157  *    INA226_CFG_BUS_V_T1R1,    // Bus Voltage Conversion Time
00158  *    INA226_CFG_SHT_V_T1R1,    // Shunt Voltage Conversion Time
00159  *    INA226_PAR_M_SHNTBUS_CONT,// Operating Mode
00160  *    // CALBLATION REG
00161  *    2560
00162  * };
00163  *
00164  * I2C    i2c(dp5,dp27);
00165  * INA226 current(I2C& p_i2c, &ina226_my_paramtr);
00166  *
00167  * int main() {
00168  *     while(1){
00169  *         printf("I=%+6.3f [A]\r\n", current.read_current());
00170  *         wait(1.0):
00171  *     }
00172  * }
00173  *  @endcode
00174  */
00175 
00176 class INA226
00177 {
00178 public:
00179     /** Configure data pin
00180       * @param data SDA and SCL pins
00181       * @param parameter address chip (INA226_TypeDef)
00182       * @param or just set address or just port
00183       */
00184     INA226(PinName p_sda, PinName p_scl, const INA226_TypeDef *ina226_parameter);
00185     INA226(PinName p_sda, PinName p_scl, uint8_t addr);
00186     INA226(PinName p_sda, PinName p_scl);
00187 
00188     /** Configure data pin (with other devices on I2C line)
00189       * @param I2C previous definition
00190       * @param parameter address chip (INA226_TypeDef)
00191       * @param or just set address or just port
00192       */
00193     INA226(I2C& p_i2c, const INA226_TypeDef *ina226_parameter);
00194     INA226(I2C& p_i2c, uint8_t addr);
00195     INA226(I2C& p_i2c);
00196 
00197     /** Read Current data
00198       * @param none
00199       * @return current [mA]
00200       */
00201     float read_current(void);
00202     float read_current_by_shuntvolt(void);
00203 
00204     /** Read Power data
00205       * @param none
00206       * @return power [w]
00207       */
00208     float read_power(void);
00209 
00210     /** Read Bus voltage
00211       * @param none
00212       * @return voltage [v]
00213       */
00214     float read_bus_voltage(void);
00215 
00216     /** Read Shunt voltage data
00217       * @param none
00218       * @return voltage [v]
00219       */
00220     float read_shunt_voltage(void);
00221 
00222     /** Read Shunt voltage data
00223       * @param none
00224       * @return voltage related value
00225       */
00226     int16_t read_shunt_raw_voltage(void);
00227 
00228     /** Read configration reg.
00229       * @param none
00230       * @return configrartion register value
00231       */
00232     uint16_t read_config(void);
00233 
00234     /** Set configration reg.
00235       * @param configuration data
00236       * @return configrartion register value
00237       */
00238     uint16_t set_config(uint16_t cfg);
00239 
00240     /** Read calibration reg.
00241       * @param none
00242       * @return calibration register value
00243       */
00244     uint16_t read_calb(void);
00245 
00246     /** Set calibration reg.
00247       * @param calibration data
00248       * @return calibration register value
00249       */
00250     uint16_t set_calb(uint16_t clb);
00251 
00252     /** Read Mask/Enable reg.
00253       * @param none
00254       * @return calibration register value
00255       */
00256     uint16_t read_msk_enbl(void);
00257 
00258     /** Set Mask/Enable reg.
00259       * @param mask enable data
00260       * @return calibration register value
00261       */
00262     uint16_t set_msk_enbl(uint16_t clb);
00263 
00264     /** Read ID
00265       * @param none
00266       * @return ID
00267       */
00268     uint8_t read_ID();
00269 
00270     /** Set I2C clock frequency
00271       * @param freq.
00272       * @return none
00273       */
00274     void frequency(int hz);
00275 
00276     /** Read register (general purpose)
00277       * @param register's address
00278       * @return register data
00279       */
00280     uint8_t read_reg(uint8_t addr);
00281 
00282     /** Write register (general purpose)
00283       * @param register's address
00284       * @param data
00285       * @return register data
00286       */
00287     uint8_t write_reg(uint8_t addr, uint8_t data);
00288 
00289 protected:
00290     I2C *_i2c_p;
00291     I2C &_i2c;
00292 
00293     void initialize(void);
00294 
00295 private:
00296     uint8_t id_number;
00297     INA226_TypeDef ina226_set_data;
00298     int32_t scale_factor;
00299     uint8_t dt[4];
00300 };
00301 
00302 #endif  //  MBED_INA226
00303