Texas Instruments INA230 hi/lo side, bi-directional current and voltage monitor with I2C. Code hacked and enhanced from the INA219 driver from TI

Fork of INA219 by Kenji Arai

Committer:
loopsva
Date:
Fri Mar 24 00:13:28 2017 +0000
Revision:
3:3ee11c82acdb
Initial release of the INA230 I2C driver

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loopsva 3:3ee11c82acdb 1 /*
loopsva 3:3ee11c82acdb 2 * mbed library program
loopsva 3:3ee11c82acdb 3 * INA230 High/Low-Side Measurement,Bi-Directional CURRENT/POWER MONITOR with I2C Interface
loopsva 3:3ee11c82acdb 4 * by Texas Instruments
loopsva 3:3ee11c82acdb 5 *
loopsva 3:3ee11c82acdb 6 * Kevin Braun hack of INA219 code by TI
loopsva 3:3ee11c82acdb 7 * 23-MAR-2017
loopsva 3:3ee11c82acdb 8 */
loopsva 3:3ee11c82acdb 9
loopsva 3:3ee11c82acdb 10 #ifndef MBED_INA230
loopsva 3:3ee11c82acdb 11 #define MBED_INA230
loopsva 3:3ee11c82acdb 12
loopsva 3:3ee11c82acdb 13 // Set data into "addr"
loopsva 3:3ee11c82acdb 14 #define INA230_ADDR_GG 0x80
loopsva 3:3ee11c82acdb 15 #define INA230_ADDR_GV 0x82
loopsva 3:3ee11c82acdb 16 #define INA230_ADDR_GA 0x84
loopsva 3:3ee11c82acdb 17 #define INA230_ADDR_GL 0x86
loopsva 3:3ee11c82acdb 18 #define INA230_ADDR_VG 0x88
loopsva 3:3ee11c82acdb 19 #define INA230_ADDR_VV 0x8a
loopsva 3:3ee11c82acdb 20 #define INA230_ADDR_VA 0x8c
loopsva 3:3ee11c82acdb 21 #define INA230_ADDR_VL 0x8e
loopsva 3:3ee11c82acdb 22 #define INA230_ADDR_AG 0x90
loopsva 3:3ee11c82acdb 23 #define INA230_ADDR_AV 0x92
loopsva 3:3ee11c82acdb 24 #define INA230_ADDR_AA 0x94
loopsva 3:3ee11c82acdb 25 #define INA230_ADDR_AL 0x96
loopsva 3:3ee11c82acdb 26 #define INA230_ADDR_LG 0x98
loopsva 3:3ee11c82acdb 27 #define INA230_ADDR_LV 0x9a
loopsva 3:3ee11c82acdb 28 #define INA230_ADDR_LA 0x9c
loopsva 3:3ee11c82acdb 29 #define INA230_ADDR_LL 0x9e
loopsva 3:3ee11c82acdb 30
loopsva 3:3ee11c82acdb 31 // INA230 ID
loopsva 3:3ee11c82acdb 32 #define INA_219_DIE 0x4000
loopsva 3:3ee11c82acdb 33 #define INA_230_DIE 0x2260
loopsva 3:3ee11c82acdb 34
loopsva 3:3ee11c82acdb 35 // INA230 register set
loopsva 3:3ee11c82acdb 36 #define INA230_CONFIG 0x00
loopsva 3:3ee11c82acdb 37 #define INA230_SHUNT_V 0x01
loopsva 3:3ee11c82acdb 38 #define INA230_BUS_VOLT 0x02
loopsva 3:3ee11c82acdb 39 #define INA230_POWER 0x03
loopsva 3:3ee11c82acdb 40 #define INA230_CURRENT 0x04
loopsva 3:3ee11c82acdb 41 #define INA230_CALIB 0x05
loopsva 3:3ee11c82acdb 42 #define INA230_MASK_ENABLE 0x06
loopsva 3:3ee11c82acdb 43 #define INA230_ALERT_LIMIT 0x07
loopsva 3:3ee11c82acdb 44 #define INA230_DIE_ID 0xff
loopsva 3:3ee11c82acdb 45
loopsva 3:3ee11c82acdb 46 // CONFIG regisrer bits
loopsva 3:3ee11c82acdb 47
loopsva 3:3ee11c82acdb 48 //Number of Averages in 230 CONFIG register
loopsva 3:3ee11c82acdb 49 #define INA230_AVG_1 0x0000
loopsva 3:3ee11c82acdb 50 #define INA230_AVG_4 0x0200
loopsva 3:3ee11c82acdb 51 #define INA230_AVG_16 0x0400
loopsva 3:3ee11c82acdb 52 #define INA230_AVG_64 0x0600
loopsva 3:3ee11c82acdb 53 #define INA230_AVG_128 0x0800
loopsva 3:3ee11c82acdb 54 #define INA230_AVG_256 0x0a00
loopsva 3:3ee11c82acdb 55 #define INA230_AVG_512 0x0c00
loopsva 3:3ee11c82acdb 56 #define INA230_AVG_1024 0x0e00
loopsva 3:3ee11c82acdb 57
loopsva 3:3ee11c82acdb 58 //Bus Voltage Conv Time in 230 CONFIG REG
loopsva 3:3ee11c82acdb 59 #define INA230_BUS_CT_140u 0x0000
loopsva 3:3ee11c82acdb 60 #define INA230_BUS_CT_204u 0x0040
loopsva 3:3ee11c82acdb 61 #define INA230_BUS_CT_332u 0x0080
loopsva 3:3ee11c82acdb 62 #define INA230_BUS_CT_588u 0x00c0
loopsva 3:3ee11c82acdb 63 #define INA230_BUS_CT_1m100 0x0100
loopsva 3:3ee11c82acdb 64 #define INA230_BUS_CT_2m116 0x0140
loopsva 3:3ee11c82acdb 65 #define INA230_BUS_CT_4m156 0x0180
loopsva 3:3ee11c82acdb 66 #define INA230_BUS_CT_8m244 0x01c0
loopsva 3:3ee11c82acdb 67
loopsva 3:3ee11c82acdb 68 //Shunt Voltage Conv Time in 230 CONFIG REG
loopsva 3:3ee11c82acdb 69 #define INA230_SHUNT_CT_140u 0x0000
loopsva 3:3ee11c82acdb 70 #define INA230_SHUNT_CT_204u 0x0008
loopsva 3:3ee11c82acdb 71 #define INA230_SHUNT_CT_332u 0x0010
loopsva 3:3ee11c82acdb 72 #define INA230_SHUNT_CT_588u 0x0018
loopsva 3:3ee11c82acdb 73 #define INA230_SHUNT_CT_1m100 0x0020
loopsva 3:3ee11c82acdb 74 #define INA230_SHUNT_CT_2m116 0x0028
loopsva 3:3ee11c82acdb 75 #define INA230_SHUNT_CT_4m156 0x0030
loopsva 3:3ee11c82acdb 76 #define INA230_SHUNT_CT_8m244 0x0038
loopsva 3:3ee11c82acdb 77
loopsva 3:3ee11c82acdb 78 // Set data into "mode"
loopsva 3:3ee11c82acdb 79 #define INA230_PAR_M_PDWN 0
loopsva 3:3ee11c82acdb 80 #define INA230_PAR_M_SHNT_TRG 1
loopsva 3:3ee11c82acdb 81 #define INA230_PAR_M_BUS_TRG 2
loopsva 3:3ee11c82acdb 82 #define INA230_PAR_M_SHNTBUS_TRG 3
loopsva 3:3ee11c82acdb 83 #define INA230_PAR_M_ADC_OFF 4
loopsva 3:3ee11c82acdb 84 #define INA230_PAR_M_SHNT_CONT 5
loopsva 3:3ee11c82acdb 85 #define INA230_PAR_M_BUS_CONT 6
loopsva 3:3ee11c82acdb 86 #define INA230_PAR_M_SHNTBUS_CONT 7 // Default
loopsva 3:3ee11c82acdb 87
loopsva 3:3ee11c82acdb 88 // Mask/Enable and Alert/Limit regisrer bits
loopsva 3:3ee11c82acdb 89 #define INA230_MEAL_SOL 0x8000
loopsva 3:3ee11c82acdb 90 #define INA230_MEAL_SUL 0x4000
loopsva 3:3ee11c82acdb 91 #define INA230_MEAL_BOL 0x2000
loopsva 3:3ee11c82acdb 92 #define INA230_MEAL_BUL 0x1000
loopsva 3:3ee11c82acdb 93 #define INA230_MEAL_POL 0x0800
loopsva 3:3ee11c82acdb 94 #define INA230_MEAL_CNVR 0x0400
loopsva 3:3ee11c82acdb 95
loopsva 3:3ee11c82acdb 96 #define INA230_MEAL_AFF 0x0010
loopsva 3:3ee11c82acdb 97 #define INA230_MEAL_CVRF 0x0008
loopsva 3:3ee11c82acdb 98 #define INA230_MEAL_OVF 0x0004
loopsva 3:3ee11c82acdb 99 #define INA230_MEAL_APOL 0x0002
loopsva 3:3ee11c82acdb 100 #define INA230_MEAL_LEN 0x0001
loopsva 3:3ee11c82acdb 101
loopsva 3:3ee11c82acdb 102 // Set data into "shunt_register"
loopsva 3:3ee11c82acdb 103 #define INA230_PAR_R_005MOHM 5
loopsva 3:3ee11c82acdb 104 #define INA230_PAR_R_010MOHM 10
loopsva 3:3ee11c82acdb 105 #define INA230_PAR_R_020MOHM 20
loopsva 3:3ee11c82acdb 106 #define INA230_PAR_R_025MOHM 25
loopsva 3:3ee11c82acdb 107 #define INA230_PAR_R_033MOHM 33
loopsva 3:3ee11c82acdb 108 #define INA230_PAR_R_050MOHM 50
loopsva 3:3ee11c82acdb 109 #define INA230_PAR_R_068MOHM 68
loopsva 3:3ee11c82acdb 110 #define INA230_PAR_R_075MOHM 75
loopsva 3:3ee11c82acdb 111 #define INA230_PAR_R_100MOHM 100
loopsva 3:3ee11c82acdb 112
loopsva 3:3ee11c82acdb 113
loopsva 3:3ee11c82acdb 114 /**
loopsva 3:3ee11c82acdb 115 * Private data structure for INA230 data values.
loopsva 3:3ee11c82acdb 116 *
loopsva 3:3ee11c82acdb 117 **/
loopsva 3:3ee11c82acdb 118 typedef struct {
loopsva 3:3ee11c82acdb 119 // I2C Address
loopsva 3:3ee11c82acdb 120 uint8_t addr; /*!< I2C address*/
loopsva 3:3ee11c82acdb 121 //Alternate CONFIG
loopsva 3:3ee11c82acdb 122 uint16_t average; /*!< CONFIG Reg - Averaging bits 11-9*/
loopsva 3:3ee11c82acdb 123 uint16_t bus_ct; /*!< CONFIG Reg - Bus CT bits 8-6 */
loopsva 3:3ee11c82acdb 124 uint16_t shunt_ct; /*!< CONFIG Reg - Shunt CT bits 5-3*/
loopsva 3:3ee11c82acdb 125 uint16_t mode; /*!< CONFIG Reg - Mode bits 2-0*/
loopsva 3:3ee11c82acdb 126 // CALBLATION REG
loopsva 3:3ee11c82acdb 127 uint16_t cal_data; /*!< CALIB Reg value*/
loopsva 3:3ee11c82acdb 128 //DIE ID REG
loopsva 3:3ee11c82acdb 129 uint16_t die_id_data; /*!< Device ID - s/b 0x2260*/
loopsva 3:3ee11c82acdb 130 int16_t shunt_res; /*!< Shunt Resistor value * 100, 100 = 0.100 ohm*/
loopsva 3:3ee11c82acdb 131 } INA230_TypeDef;
loopsva 3:3ee11c82acdb 132
loopsva 3:3ee11c82acdb 133 /**
loopsva 3:3ee11c82acdb 134 * Default values for data structure above
loopsva 3:3ee11c82acdb 135 *
loopsva 3:3ee11c82acdb 136 **/
loopsva 3:3ee11c82acdb 137 const INA230_TypeDef ina230_std_paramtr = {
loopsva 3:3ee11c82acdb 138 // I2C Address
loopsva 3:3ee11c82acdb 139 INA230_ADDR_GG,
loopsva 3:3ee11c82acdb 140 // CONFIG Register
loopsva 3:3ee11c82acdb 141 INA230_AVG_16, // averages
loopsva 3:3ee11c82acdb 142 INA230_BUS_CT_588u, // bus voltage conv time
loopsva 3:3ee11c82acdb 143 INA230_SHUNT_CT_588u, // bus voltage conv time
loopsva 3:3ee11c82acdb 144 INA230_PAR_M_SHNTBUS_CONT, // Measure continuously both Shunt voltage and Bus voltage
loopsva 3:3ee11c82acdb 145 // Calibration Register
loopsva 3:3ee11c82acdb 146 16384, // Calibration data
loopsva 3:3ee11c82acdb 147 //Die ID Register
loopsva 3:3ee11c82acdb 148 0, // should be non-zero if read correctly
loopsva 3:3ee11c82acdb 149 // Shuny Resistor
loopsva 3:3ee11c82acdb 150 INA230_PAR_R_075MOHM // shunt resistor value
loopsva 3:3ee11c82acdb 151 };
loopsva 3:3ee11c82acdb 152
loopsva 3:3ee11c82acdb 153 /** INA230 High/Low-Side Measurement,Bi-Directional CURRENT/POWER MONITOR with I2C Interface
loopsva 3:3ee11c82acdb 154 *
loopsva 3:3ee11c82acdb 155 * @code
loopsva 3:3ee11c82acdb 156 * //
loopsva 3:3ee11c82acdb 157 * // to date, only tested with...
loopsva 3:3ee11c82acdb 158 * // * 0.050 shunt resistor
loopsva 3:3ee11c82acdb 159 * // * I2C address 0x80 (1000000xb)
loopsva 3:3ee11c82acdb 160 * // * +-0-1.5A range
loopsva 3:3ee11c82acdb 161 * // * 0-2.8V range
loopsva 3:3ee11c82acdb 162 * //
loopsva 3:3ee11c82acdb 163 * @endcode
loopsva 3:3ee11c82acdb 164 */
loopsva 3:3ee11c82acdb 165
loopsva 3:3ee11c82acdb 166 class INA230
loopsva 3:3ee11c82acdb 167 {
loopsva 3:3ee11c82acdb 168 public:
loopsva 3:3ee11c82acdb 169 /** Configure data pin
loopsva 3:3ee11c82acdb 170 * @param data SDA and SCL pins
loopsva 3:3ee11c82acdb 171 * @param parameter address chip (INA230_TypeDef)
loopsva 3:3ee11c82acdb 172 * @param or just set address or just port
loopsva 3:3ee11c82acdb 173 */
loopsva 3:3ee11c82acdb 174 INA230(PinName p_sda, PinName p_scl, const INA230_TypeDef *ina230_parameter);
loopsva 3:3ee11c82acdb 175 INA230(PinName p_sda, PinName p_scl, uint8_t addr);
loopsva 3:3ee11c82acdb 176 INA230(PinName p_sda, PinName p_scl);
loopsva 3:3ee11c82acdb 177
loopsva 3:3ee11c82acdb 178 /** Configure data pin (with other devices on I2C line)
loopsva 3:3ee11c82acdb 179 * @param I2C previous definition
loopsva 3:3ee11c82acdb 180 * @param parameter address chip (INA230_TypeDef)
loopsva 3:3ee11c82acdb 181 * @param or just set address or just port
loopsva 3:3ee11c82acdb 182 */
loopsva 3:3ee11c82acdb 183 INA230(I2C& p_i2c, const INA230_TypeDef *ina230_parameter);
loopsva 3:3ee11c82acdb 184 INA230(I2C& p_i2c, uint8_t addr);
loopsva 3:3ee11c82acdb 185 INA230(I2C& p_i2c);
loopsva 3:3ee11c82acdb 186
loopsva 3:3ee11c82acdb 187 /** Read Current data
loopsva 3:3ee11c82acdb 188 * @param none
loopsva 3:3ee11c82acdb 189 * @return current [mA]
loopsva 3:3ee11c82acdb 190 */
loopsva 3:3ee11c82acdb 191 float read_current(void);
loopsva 3:3ee11c82acdb 192 int16_t read_current_reg(void);
loopsva 3:3ee11c82acdb 193 float read_current_by_shuntvolt(void);
loopsva 3:3ee11c82acdb 194
loopsva 3:3ee11c82acdb 195 /** Read Power data
loopsva 3:3ee11c82acdb 196 * @param none
loopsva 3:3ee11c82acdb 197 * @return power [w]
loopsva 3:3ee11c82acdb 198 */
loopsva 3:3ee11c82acdb 199 float read_power(void);
loopsva 3:3ee11c82acdb 200
loopsva 3:3ee11c82acdb 201 /** Read Bus voltage
loopsva 3:3ee11c82acdb 202 * @param none
loopsva 3:3ee11c82acdb 203 * @return voltage [v]
loopsva 3:3ee11c82acdb 204 */
loopsva 3:3ee11c82acdb 205 float read_bus_voltage(void);
loopsva 3:3ee11c82acdb 206
loopsva 3:3ee11c82acdb 207 /** Read Shunt voltage data
loopsva 3:3ee11c82acdb 208 * @param none
loopsva 3:3ee11c82acdb 209 * @return voltage [v]
loopsva 3:3ee11c82acdb 210 */
loopsva 3:3ee11c82acdb 211 float read_shunt_voltage(void);
loopsva 3:3ee11c82acdb 212
loopsva 3:3ee11c82acdb 213 /** Read configration reg.
loopsva 3:3ee11c82acdb 214 * @param none
loopsva 3:3ee11c82acdb 215 * @return configrartion register value
loopsva 3:3ee11c82acdb 216 */
loopsva 3:3ee11c82acdb 217 uint16_t read_config(void);
loopsva 3:3ee11c82acdb 218
loopsva 3:3ee11c82acdb 219 /** Set configration reg.
loopsva 3:3ee11c82acdb 220 * @param
loopsva 3:3ee11c82acdb 221 * @return configrartion register value
loopsva 3:3ee11c82acdb 222 */
loopsva 3:3ee11c82acdb 223 uint16_t set_config(uint16_t cfg);
loopsva 3:3ee11c82acdb 224
loopsva 3:3ee11c82acdb 225 /** Read calibration reg.
loopsva 3:3ee11c82acdb 226 * @param none
loopsva 3:3ee11c82acdb 227 * @return calibration register value
loopsva 3:3ee11c82acdb 228 */
loopsva 3:3ee11c82acdb 229 uint16_t read_calb(void);
loopsva 3:3ee11c82acdb 230
loopsva 3:3ee11c82acdb 231 /** Set calibration reg.
loopsva 3:3ee11c82acdb 232 * @param
loopsva 3:3ee11c82acdb 233 * @return calibration register value
loopsva 3:3ee11c82acdb 234 */
loopsva 3:3ee11c82acdb 235 uint16_t set_calb(uint16_t clb);
loopsva 3:3ee11c82acdb 236
loopsva 3:3ee11c82acdb 237 /** Set I2C clock frequency
loopsva 3:3ee11c82acdb 238 * @param freq.
loopsva 3:3ee11c82acdb 239 * @return none
loopsva 3:3ee11c82acdb 240 */
loopsva 3:3ee11c82acdb 241 void frequency(int hz);
loopsva 3:3ee11c82acdb 242
loopsva 3:3ee11c82acdb 243 /** Read register (general purpose)
loopsva 3:3ee11c82acdb 244 * @param register's address
loopsva 3:3ee11c82acdb 245 * @return register data
loopsva 3:3ee11c82acdb 246 */
loopsva 3:3ee11c82acdb 247 uint8_t read_reg(uint8_t addr);
loopsva 3:3ee11c82acdb 248
loopsva 3:3ee11c82acdb 249 /** Write register (general purpose)
loopsva 3:3ee11c82acdb 250 * @param register's address
loopsva 3:3ee11c82acdb 251 * @param data
loopsva 3:3ee11c82acdb 252 * @return register data
loopsva 3:3ee11c82acdb 253 */
loopsva 3:3ee11c82acdb 254 uint8_t write_reg(uint8_t addr, uint8_t data);
loopsva 3:3ee11c82acdb 255 /*
loopsva 3:3ee11c82acdb 256 / ** Temporary display of data structure for debug
loopsva 3:3ee11c82acdb 257 * - Needs "Rawserial pc;" statement
loopsva 3:3ee11c82acdb 258 * @param none
loopsva 3:3ee11c82acdb 259 * @return none
loopsva 3:3ee11c82acdb 260 * /
loopsva 3:3ee11c82acdb 261 void dumpStructure();
loopsva 3:3ee11c82acdb 262 */
loopsva 3:3ee11c82acdb 263 /** Get the Die ID value
loopsva 3:3ee11c82acdb 264 * @param none
loopsva 3:3ee11c82acdb 265 * @return register data
loopsva 3:3ee11c82acdb 266 */
loopsva 3:3ee11c82acdb 267 uint16_t read_die_id();
loopsva 3:3ee11c82acdb 268
loopsva 3:3ee11c82acdb 269 /** Get the Mask/Enable value
loopsva 3:3ee11c82acdb 270 * @param none
loopsva 3:3ee11c82acdb 271 * @return register data
loopsva 3:3ee11c82acdb 272 */
loopsva 3:3ee11c82acdb 273 uint16_t read_mask_enable();
loopsva 3:3ee11c82acdb 274
loopsva 3:3ee11c82acdb 275 /** Get the Alert/Limit value
loopsva 3:3ee11c82acdb 276 * @param none
loopsva 3:3ee11c82acdb 277 * @return register data
loopsva 3:3ee11c82acdb 278 */
loopsva 3:3ee11c82acdb 279 uint16_t read_alert_limit();
loopsva 3:3ee11c82acdb 280
loopsva 3:3ee11c82acdb 281 /** Set the Mask/Enable value
loopsva 3:3ee11c82acdb 282 * @param data for register
loopsva 3:3ee11c82acdb 283 * @return data sent
loopsva 3:3ee11c82acdb 284 */
loopsva 3:3ee11c82acdb 285 uint16_t set_mask_enable(uint16_t cfg);
loopsva 3:3ee11c82acdb 286
loopsva 3:3ee11c82acdb 287 /** Set the Alert/Limit value
loopsva 3:3ee11c82acdb 288 * @param data for register
loopsva 3:3ee11c82acdb 289 * @return data sent
loopsva 3:3ee11c82acdb 290 */
loopsva 3:3ee11c82acdb 291 uint16_t set_alert_limit(uint16_t cfg);
loopsva 3:3ee11c82acdb 292
loopsva 3:3ee11c82acdb 293 /** Get the Shunt Resistor value
loopsva 3:3ee11c82acdb 294 * @param none
loopsva 3:3ee11c82acdb 295 * @return resistor value * 100
loopsva 3:3ee11c82acdb 296 */
loopsva 3:3ee11c82acdb 297 int16_t get_shunt_res();
loopsva 3:3ee11c82acdb 298
loopsva 3:3ee11c82acdb 299 protected:
loopsva 3:3ee11c82acdb 300 I2C _i2c;
loopsva 3:3ee11c82acdb 301
loopsva 3:3ee11c82acdb 302 void initialize(void);
loopsva 3:3ee11c82acdb 303
loopsva 3:3ee11c82acdb 304 private:
loopsva 3:3ee11c82acdb 305 INA230_TypeDef ina230_set_data;
loopsva 3:3ee11c82acdb 306 int32_t scale_factor;
loopsva 3:3ee11c82acdb 307 uint8_t dt[4];
loopsva 3:3ee11c82acdb 308
loopsva 3:3ee11c82acdb 309 };
loopsva 3:3ee11c82acdb 310
loopsva 3:3ee11c82acdb 311 #endif // MBED_INA230