INA226 (Texas Instruments) High-or Low-Side Measurement,Bi-Directional CURRENT/POWER MONITOR with I2C Interface

Committer:
kenjiArai
Date:
Tue May 05 07:54:46 2015 +0000
Revision:
0:d17469a618b3
Child:
2:b1e759cb121e
INA226 (Texas Instruments) High-or Low-Side Measurement,Bi-Directional CURRENT/POWER MONITOR with I2C Interface

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:d17469a618b3 1 /*
kenjiArai 0:d17469a618b3 2 * mbed library program
kenjiArai 0:d17469a618b3 3 * INA226 High-or Low-Side Measurement,Bi-Directional CURRENT/POWER MONITOR with I2C Interface
kenjiArai 0:d17469a618b3 4 * by Texas Instruments
kenjiArai 0:d17469a618b3 5 *
kenjiArai 0:d17469a618b3 6 * Copyright (c) 2015 Kenji Arai / JH1PJL
kenjiArai 0:d17469a618b3 7 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:d17469a618b3 8 * http://mbed.org/users/kenjiArai/
kenjiArai 0:d17469a618b3 9 * Created: January 25th, 2015
kenjiArai 0:d17469a618b3 10 * Revised: May 5th, 2015
kenjiArai 0:d17469a618b3 11 *
kenjiArai 0:d17469a618b3 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
kenjiArai 0:d17469a618b3 13 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
kenjiArai 0:d17469a618b3 14 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 0:d17469a618b3 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 0:d17469a618b3 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 0:d17469a618b3 17 */
kenjiArai 0:d17469a618b3 18 /*
kenjiArai 0:d17469a618b3 19 *---------------- REFERENCE ----------------------------------------------------------------------
kenjiArai 0:d17469a618b3 20 * Original Information
kenjiArai 0:d17469a618b3 21 * http://www.ti.com/product/INA226/description
kenjiArai 0:d17469a618b3 22 * http://www.ti.com/lit/ds/symlink/ina226.pdf
kenjiArai 0:d17469a618b3 23 * Device kit
kenjiArai 0:d17469a618b3 24 * http://strawberry-linux.com/catalog/items?code=12031
kenjiArai 0:d17469a618b3 25 * http://strawberry-linux.com/catalog/items?code=12226
kenjiArai 0:d17469a618b3 26 */
kenjiArai 0:d17469a618b3 27
kenjiArai 0:d17469a618b3 28 #ifndef MBED_INA226
kenjiArai 0:d17469a618b3 29 #define MBED_INA226
kenjiArai 0:d17469a618b3 30
kenjiArai 0:d17469a618b3 31 /////////// ADDRESS /////////////////////////////
kenjiArai 0:d17469a618b3 32 // 7bit address = 0b1000000(0x40)
kenjiArai 0:d17469a618b3 33 // G=GND, V=VS+, A=SDA, L=SCL
kenjiArai 0:d17469a618b3 34 // e.g. _VG: A1=VS+, A0=GND
kenjiArai 0:d17469a618b3 35 // -> Please make sure your H/W configuration
kenjiArai 0:d17469a618b3 36 // Set data into "addr"
kenjiArai 0:d17469a618b3 37 #define INA226_ADDR_GG (0x40 << 1)
kenjiArai 0:d17469a618b3 38 #define INA226_ADDR_GV (0x41 << 1)
kenjiArai 0:d17469a618b3 39 #define INA226_ADDR_GA (0x42 << 1)
kenjiArai 0:d17469a618b3 40 #define INA226_ADDR_GL (0x43 << 1)
kenjiArai 0:d17469a618b3 41 #define INA226_ADDR_VG (0x44 << 1)
kenjiArai 0:d17469a618b3 42 #define INA226_ADDR_VV (0x45 << 1)
kenjiArai 0:d17469a618b3 43 #define INA226_ADDR_VA (0x46 << 1)
kenjiArai 0:d17469a618b3 44 #define INA226_ADDR_VL (0x47 << 1)
kenjiArai 0:d17469a618b3 45 #define INA226_ADDR_AG (0x48 << 1)
kenjiArai 0:d17469a618b3 46 #define INA226_ADDR_AV (0x49 << 1)
kenjiArai 0:d17469a618b3 47 #define INA226_ADDR_AA (0x4a << 1)
kenjiArai 0:d17469a618b3 48 #define INA226_ADDR_AL (0x4b << 1)
kenjiArai 0:d17469a618b3 49 #define INA226_ADDR_LG (0x4c << 1)
kenjiArai 0:d17469a618b3 50 #define INA226_ADDR_LV (0x4d << 1)
kenjiArai 0:d17469a618b3 51 #define INA226_ADDR_LA (0x4e << 1)
kenjiArai 0:d17469a618b3 52 #define INA226_ADDR_LL (0x4f << 1)
kenjiArai 0:d17469a618b3 53
kenjiArai 0:d17469a618b3 54 /////////// REGISTER DEFINITION /////////////////
kenjiArai 0:d17469a618b3 55 #define INA226_CONFIG 0x00
kenjiArai 0:d17469a618b3 56 #define INA226_SHUNT_V 0x01
kenjiArai 0:d17469a618b3 57 #define INA226_BUS_VOLT 0x02
kenjiArai 0:d17469a618b3 58 #define INA226_POWER 0x03
kenjiArai 0:d17469a618b3 59 #define INA226_CURRENT 0x04
kenjiArai 0:d17469a618b3 60 #define INA226_CALBLATION 0x05
kenjiArai 0:d17469a618b3 61 #define INA226_MASK_EN 0x06
kenjiArai 0:d17469a618b3 62 #define INA226_ALERT_LMT 0x07
kenjiArai 0:d17469a618b3 63 #define INA226_DIE_ID 0xff
kenjiArai 0:d17469a618b3 64
kenjiArai 0:d17469a618b3 65 /////////// PARAMETER SETTING for Configuration Reg. //////////////////////////
kenjiArai 0:d17469a618b3 66 // Set data into "shunt_register"
kenjiArai 0:d17469a618b3 67 #define INA226_PAR_R_2MORM 2 // Strawberry Linux borad
kenjiArai 0:d17469a618b3 68 #define INA226_PAR_R_25MOHM 25
kenjiArai 0:d17469a618b3 69 #define INA226_PAR_R_MORM(x) (x)
kenjiArai 0:d17469a618b3 70 // Set data into "average", Averaging Mode
kenjiArai 0:d17469a618b3 71 #define INA226_PAR_A_1 0 // Default
kenjiArai 0:d17469a618b3 72 #define INA226_PAR_A_4 1
kenjiArai 0:d17469a618b3 73 #define INA226_PAR_A_16 2
kenjiArai 0:d17469a618b3 74 #define INA226_PAR_A_64 3
kenjiArai 0:d17469a618b3 75 #define INA226_PAR_A_128 4
kenjiArai 0:d17469a618b3 76 #define INA226_PAR_A_256 5
kenjiArai 0:d17469a618b3 77 #define INA226_PAR_A_512 6
kenjiArai 0:d17469a618b3 78 #define INA226_PAR_A_1024 7
kenjiArai 0:d17469a618b3 79 // Set data into "b_volt_cnv_time" Bus Voltage Conversion Time
kenjiArai 0:d17469a618b3 80 #define INA226_CFG_BUS_V_TR140 0
kenjiArai 0:d17469a618b3 81 #define INA226_CFG_BUS_V_TR204 1
kenjiArai 0:d17469a618b3 82 #define INA226_CFG_BUS_V_TR332 2
kenjiArai 0:d17469a618b3 83 #define INA226_CFG_BUS_V_TR588 3
kenjiArai 0:d17469a618b3 84 #define INA226_CFG_BUS_V_T1R1 4 // Default
kenjiArai 0:d17469a618b3 85 #define INA226_CFG_BUS_V_T2R116 5
kenjiArai 0:d17469a618b3 86 #define INA226_CFG_BUS_V_T4R156 6
kenjiArai 0:d17469a618b3 87 #define INA226_CFG_BUS_V_T8R244 7
kenjiArai 0:d17469a618b3 88 // Set data into "s_volt_cnv_time", Shunt Voltage Conversion Time
kenjiArai 0:d17469a618b3 89 #define INA226_CFG_SHT_V_TR140 0
kenjiArai 0:d17469a618b3 90 #define INA226_CFG_SHT_V_TR204 1
kenjiArai 0:d17469a618b3 91 #define INA226_CFG_SHT_V_TR332 2
kenjiArai 0:d17469a618b3 92 #define INA226_CFG_SHT_V_TR588 3
kenjiArai 0:d17469a618b3 93 #define INA226_CFG_SHT_V_T1R1 4 // Default
kenjiArai 0:d17469a618b3 94 #define INA226_CFG_SHT_V_T2R116 5
kenjiArai 0:d17469a618b3 95 #define INA226_CFG_SHT_V_T4R156 6
kenjiArai 0:d17469a618b3 96 #define INA226_CFG_SHT_V_T8R244 7
kenjiArai 0:d17469a618b3 97 // Set data into "mode", Operating Mode
kenjiArai 0:d17469a618b3 98 #define INA226_PAR_M_PDWN 0
kenjiArai 0:d17469a618b3 99 #define INA226_PAR_M_SHNT_TRG 1
kenjiArai 0:d17469a618b3 100 #define INA226_PAR_M_BUS_TRG 2
kenjiArai 0:d17469a618b3 101 #define INA226_PAR_M_SHNTBUS_TRG 3
kenjiArai 0:d17469a618b3 102 #define INA226_PAR_M_ADC_OFF 4
kenjiArai 0:d17469a618b3 103 #define INA226_PAR_M_SHNT_CONT 5
kenjiArai 0:d17469a618b3 104 #define INA226_PAR_M_BUS_CONT 6
kenjiArai 0:d17469a618b3 105 #define INA226_PAR_M_SHNTBUS_CONT 7 // Default
kenjiArai 0:d17469a618b3 106
kenjiArai 0:d17469a618b3 107 ////////////// DATA TYPE DEFINITION ///////////////////////
kenjiArai 0:d17469a618b3 108 typedef struct {
kenjiArai 0:d17469a618b3 109 uint8_t addr;
kenjiArai 0:d17469a618b3 110 uint8_t shunt_register;
kenjiArai 0:d17469a618b3 111 uint8_t average;
kenjiArai 0:d17469a618b3 112 uint8_t b_volt_cnv_time;
kenjiArai 0:d17469a618b3 113 uint8_t s_volt_cnv_time;
kenjiArai 0:d17469a618b3 114 uint8_t mode;
kenjiArai 0:d17469a618b3 115 uint16_t calibration_data;
kenjiArai 0:d17469a618b3 116 } INA226_TypeDef;
kenjiArai 0:d17469a618b3 117
kenjiArai 0:d17469a618b3 118 ////////////// DEFAULT SETTING ////////////////////////////
kenjiArai 0:d17469a618b3 119 // Standard parameter for easy set-up
kenjiArai 0:d17469a618b3 120 const INA226_TypeDef ina226_std_paramtr = {
kenjiArai 0:d17469a618b3 121 // I2C Address
kenjiArai 0:d17469a618b3 122 INA226_ADDR_GG,
kenjiArai 0:d17469a618b3 123 // CONFIG REG
kenjiArai 0:d17469a618b3 124 INA226_PAR_R_2MORM, // 2 milli-ohm
kenjiArai 0:d17469a618b3 125 INA226_PAR_A_1, // Averaging Mode
kenjiArai 0:d17469a618b3 126 INA226_CFG_BUS_V_T1R1,
kenjiArai 0:d17469a618b3 127 INA226_CFG_SHT_V_T1R1,
kenjiArai 0:d17469a618b3 128 INA226_PAR_M_SHNTBUS_CONT,
kenjiArai 0:d17469a618b3 129 // CALBLATION REG
kenjiArai 0:d17469a618b3 130 2560
kenjiArai 0:d17469a618b3 131 };
kenjiArai 0:d17469a618b3 132
kenjiArai 0:d17469a618b3 133 /** INA226 High-or Low-Side Measurement,Bi-Directional CURRENT/POWER MONITOR with I2C Interface
kenjiArai 0:d17469a618b3 134 *
kenjiArai 0:d17469a618b3 135 * @code
kenjiArai 0:d17469a618b3 136 * //--------- Default setting -----------------
kenjiArai 0:d17469a618b3 137 * #include "mbed.h"
kenjiArai 0:d17469a618b3 138 * #include "INA226.h"
kenjiArai 0:d17469a618b3 139 *
kenjiArai 0:d17469a618b3 140 * // I2C Communication
kenjiArai 0:d17469a618b3 141 * INA226 current(dp5, dp27, INA226_ADDR_GG);
kenjiArai 0:d17469a618b3 142 * // If you connected I2C line not only this device but also other devices,
kenjiArai 0:d17469a618b3 143 * // you need to declare following method.
kenjiArai 0:d17469a618b3 144 * I2C i2c(dp5, dp27);
kenjiArai 0:d17469a618b3 145 * INA226 current(I2C& p_i2c, INA226_ADDR_GG);
kenjiArai 0:d17469a618b3 146 *
kenjiArai 0:d17469a618b3 147 * int main() {
kenjiArai 0:d17469a618b3 148 * while(1){
kenjiArai 0:d17469a618b3 149 * printf("I=%+6.3f [A]\r\n", current.read_current());
kenjiArai 0:d17469a618b3 150 * wait(1.0):
kenjiArai 0:d17469a618b3 151 * }
kenjiArai 0:d17469a618b3 152 * }
kenjiArai 0:d17469a618b3 153 * //--------- Detail setting -----------------
kenjiArai 0:d17469a618b3 154 * #include "mbed.h"
kenjiArai 0:d17469a618b3 155 * #include "INA226.h"
kenjiArai 0:d17469a618b3 156 *
kenjiArai 0:d17469a618b3 157 * const INA226_TypeDef ina226_my_paramtr = {
kenjiArai 0:d17469a618b3 158 * // I2C Address
kenjiArai 0:d17469a618b3 159 * INA226_ADDR_GG,
kenjiArai 0:d17469a618b3 160 * // CONFIG REG
kenjiArai 0:d17469a618b3 161 * INA226_PAR_R_100MOHM, // 100 milli-ohm
kenjiArai 0:d17469a618b3 162 * INA226_CFG_B16V, // 16V max
kenjiArai 0:d17469a618b3 163 * INA226_PAR_G_40MV, // Gain x1
kenjiArai 0:d17469a618b3 164 * INA226_PAR_M_SHNTBUS_CONT,// Measure continuously
kenjiArai 0:d17469a618b3 165 * // CALBLATION REG
kenjiArai 0:d17469a618b3 166 * 2560 // Calibration data
kenjiArai 0:d17469a618b3 167 * };
kenjiArai 0:d17469a618b3 168 *
kenjiArai 0:d17469a618b3 169 * I2C i2c(dp5,dp27);
kenjiArai 0:d17469a618b3 170 * INA226 current(I2C& p_i2c, &ina226_my_paramtr);
kenjiArai 0:d17469a618b3 171 *
kenjiArai 0:d17469a618b3 172 * int main() {
kenjiArai 0:d17469a618b3 173 * while(1){
kenjiArai 0:d17469a618b3 174 * printf("I=%+6.3f [A]\r\n", current.read_current());
kenjiArai 0:d17469a618b3 175 * wait(1.0):
kenjiArai 0:d17469a618b3 176 * }
kenjiArai 0:d17469a618b3 177 * }
kenjiArai 0:d17469a618b3 178 * @endcode
kenjiArai 0:d17469a618b3 179 */
kenjiArai 0:d17469a618b3 180
kenjiArai 0:d17469a618b3 181 class INA226
kenjiArai 0:d17469a618b3 182 {
kenjiArai 0:d17469a618b3 183 public:
kenjiArai 0:d17469a618b3 184 /** Configure data pin
kenjiArai 0:d17469a618b3 185 * @param data SDA and SCL pins
kenjiArai 0:d17469a618b3 186 * @param parameter address chip (INA226_TypeDef)
kenjiArai 0:d17469a618b3 187 * @param or just set address or just port
kenjiArai 0:d17469a618b3 188 */
kenjiArai 0:d17469a618b3 189 INA226(PinName p_sda, PinName p_scl, const INA226_TypeDef *ina226_parameter);
kenjiArai 0:d17469a618b3 190 INA226(PinName p_sda, PinName p_scl, uint8_t addr);
kenjiArai 0:d17469a618b3 191 INA226(PinName p_sda, PinName p_scl);
kenjiArai 0:d17469a618b3 192
kenjiArai 0:d17469a618b3 193 /** Configure data pin (with other devices on I2C line)
kenjiArai 0:d17469a618b3 194 * @param I2C previous definition
kenjiArai 0:d17469a618b3 195 * @param parameter address chip (INA226_TypeDef)
kenjiArai 0:d17469a618b3 196 * @param or just set address or just port
kenjiArai 0:d17469a618b3 197 */
kenjiArai 0:d17469a618b3 198 INA226(I2C& p_i2c, const INA226_TypeDef *ina226_parameter);
kenjiArai 0:d17469a618b3 199 INA226(I2C& p_i2c, uint8_t addr);
kenjiArai 0:d17469a618b3 200 INA226(I2C& p_i2c);
kenjiArai 0:d17469a618b3 201
kenjiArai 0:d17469a618b3 202 /** Read Current data
kenjiArai 0:d17469a618b3 203 * @param none
kenjiArai 0:d17469a618b3 204 * @return current [mA]
kenjiArai 0:d17469a618b3 205 */
kenjiArai 0:d17469a618b3 206 float read_current(void);
kenjiArai 0:d17469a618b3 207 float read_current_by_shuntvolt(void);
kenjiArai 0:d17469a618b3 208
kenjiArai 0:d17469a618b3 209 /** Read Power data
kenjiArai 0:d17469a618b3 210 * @param none
kenjiArai 0:d17469a618b3 211 * @return power [w]
kenjiArai 0:d17469a618b3 212 */
kenjiArai 0:d17469a618b3 213 float read_power(void);
kenjiArai 0:d17469a618b3 214
kenjiArai 0:d17469a618b3 215 /** Read Bus voltage
kenjiArai 0:d17469a618b3 216 * @param none
kenjiArai 0:d17469a618b3 217 * @return voltage [v]
kenjiArai 0:d17469a618b3 218 */
kenjiArai 0:d17469a618b3 219 float read_bus_voltage(void);
kenjiArai 0:d17469a618b3 220
kenjiArai 0:d17469a618b3 221 /** Read Shunt voltage data
kenjiArai 0:d17469a618b3 222 * @param none
kenjiArai 0:d17469a618b3 223 * @return voltage [v]
kenjiArai 0:d17469a618b3 224 */
kenjiArai 0:d17469a618b3 225 float read_shunt_voltage(void);
kenjiArai 0:d17469a618b3 226
kenjiArai 0:d17469a618b3 227 /** Read configration reg.
kenjiArai 0:d17469a618b3 228 * @param none
kenjiArai 0:d17469a618b3 229 * @return configrartion register value
kenjiArai 0:d17469a618b3 230 */
kenjiArai 0:d17469a618b3 231 uint16_t read_config(void);
kenjiArai 0:d17469a618b3 232
kenjiArai 0:d17469a618b3 233 /** Set configration reg.
kenjiArai 0:d17469a618b3 234 * @param configuration data
kenjiArai 0:d17469a618b3 235 * @return configrartion register value
kenjiArai 0:d17469a618b3 236 */
kenjiArai 0:d17469a618b3 237 uint16_t set_config(uint16_t cfg);
kenjiArai 0:d17469a618b3 238
kenjiArai 0:d17469a618b3 239 /** Read calibration reg.
kenjiArai 0:d17469a618b3 240 * @param none
kenjiArai 0:d17469a618b3 241 * @return calibration register value
kenjiArai 0:d17469a618b3 242 */
kenjiArai 0:d17469a618b3 243 uint16_t read_calb(void);
kenjiArai 0:d17469a618b3 244
kenjiArai 0:d17469a618b3 245 /** Set calibration reg.
kenjiArai 0:d17469a618b3 246 * @param calibration data
kenjiArai 0:d17469a618b3 247 * @return calibration register value
kenjiArai 0:d17469a618b3 248 */
kenjiArai 0:d17469a618b3 249 uint16_t set_calb(uint16_t clb);
kenjiArai 0:d17469a618b3 250
kenjiArai 0:d17469a618b3 251 /** Read Mask/Enable reg.
kenjiArai 0:d17469a618b3 252 * @param none
kenjiArai 0:d17469a618b3 253 * @return calibration register value
kenjiArai 0:d17469a618b3 254 */
kenjiArai 0:d17469a618b3 255 uint16_t read_msk_enbl(void);
kenjiArai 0:d17469a618b3 256
kenjiArai 0:d17469a618b3 257 /** Set Mask/Enable reg.
kenjiArai 0:d17469a618b3 258 * @param mask enable data
kenjiArai 0:d17469a618b3 259 * @return calibration register value
kenjiArai 0:d17469a618b3 260 */
kenjiArai 0:d17469a618b3 261 uint16_t set_msk_enbl(uint16_t clb);
kenjiArai 0:d17469a618b3 262
kenjiArai 0:d17469a618b3 263 /** Read ID
kenjiArai 0:d17469a618b3 264 * @param none
kenjiArai 0:d17469a618b3 265 * @return ID
kenjiArai 0:d17469a618b3 266 */
kenjiArai 0:d17469a618b3 267 uint8_t read_ID();
kenjiArai 0:d17469a618b3 268
kenjiArai 0:d17469a618b3 269 /** Set I2C clock frequency
kenjiArai 0:d17469a618b3 270 * @param freq.
kenjiArai 0:d17469a618b3 271 * @return none
kenjiArai 0:d17469a618b3 272 */
kenjiArai 0:d17469a618b3 273 void frequency(int hz);
kenjiArai 0:d17469a618b3 274
kenjiArai 0:d17469a618b3 275 /** Read register (general purpose)
kenjiArai 0:d17469a618b3 276 * @param register's address
kenjiArai 0:d17469a618b3 277 * @return register data
kenjiArai 0:d17469a618b3 278 */
kenjiArai 0:d17469a618b3 279 uint8_t read_reg(uint8_t addr);
kenjiArai 0:d17469a618b3 280
kenjiArai 0:d17469a618b3 281 /** Write register (general purpose)
kenjiArai 0:d17469a618b3 282 * @param register's address
kenjiArai 0:d17469a618b3 283 * @param data
kenjiArai 0:d17469a618b3 284 * @return register data
kenjiArai 0:d17469a618b3 285 */
kenjiArai 0:d17469a618b3 286 uint8_t write_reg(uint8_t addr, uint8_t data);
kenjiArai 0:d17469a618b3 287
kenjiArai 0:d17469a618b3 288 protected:
kenjiArai 0:d17469a618b3 289 I2C _i2c;
kenjiArai 0:d17469a618b3 290
kenjiArai 0:d17469a618b3 291 void initialize(void);
kenjiArai 0:d17469a618b3 292
kenjiArai 0:d17469a618b3 293 private:
kenjiArai 0:d17469a618b3 294 uint8_t id_number;
kenjiArai 0:d17469a618b3 295 INA226_TypeDef ina226_set_data;
kenjiArai 0:d17469a618b3 296 int32_t scale_factor;
kenjiArai 0:d17469a618b3 297 uint8_t dt[4];
kenjiArai 0:d17469a618b3 298 };
kenjiArai 0:d17469a618b3 299
kenjiArai 0:d17469a618b3 300 #endif // MBED_INA226