INA2xx  v1.1.0
Arduino Library to read current, voltage and power data from one or more INA2xx device(s)
INA.h
Go to the documentation of this file.
1 // clang-format off
154 #ifndef ARDUINO
155 
156 #define ARDUINO 0
157 #endif
158 #if ARDUINO >= 100 /* Use old library if IDE is prior to V1.0 */
159  #include "Arduino.h"
160 #else
161  #include "WProgram.h"
162 #endif
163 
164 #ifndef INA__Class_h
165 
166 #define INA__Class_h
167 
168 typedef struct {
169  uint8_t type : 4;
170  uint8_t operatingMode : 4;
171  uint32_t address : 7;
172  uint32_t maxBusAmps : 10;
173  uint32_t microOhmR : 20;
174 } inaEEPROM; // of structure
176 typedef struct inaDet : inaEEPROM {
177  uint8_t busVoltageRegister : 3;
178  uint8_t shuntVoltageRegister : 3;
179  uint8_t currentRegister : 3;
180  uint16_t shuntVoltage_LSB;
181  uint16_t busVoltage_LSB;
182  uint32_t current_LSB;
183  uint32_t power_LSB;
184  inaDet();
185  inaDet(inaEEPROM& inaEE);
186 } inaDet; // of structure
189 enum ina_Type {
190  INA219,
191  INA226,
192  INA228,
193  INA230,
194  INA231,
195  INA260,
196  INA3221_0,
197  INA3221_1,
198  INA3221_2,
199  INA_UNKNOWN
200 };
202 enum ina_Mode {
211 }; // of enumerated type
212 /************************************************************************************************
213 ** Declare constants used in the class **
214 ************************************************************************************************/
215 #ifndef INA_I2C_MODES // I2C related constants
216 #define INA_I2C_MODES
217 const uint32_t INA_I2C_STANDARD_MODE{100000};
218 const uint32_t INA_I2C_FAST_MODE{400000};
219 const uint32_t INA_I2C_FAST_MODE_PLUS{1000000};
220 const uint32_t INA_I2C_HIGH_SPEED_MODE{3400000};
221 #endif
222 const uint8_t INA_CONFIGURATION_REGISTER{0};
223 const uint8_t INA_BUS_VOLTAGE_REGISTER{2};
224 const uint8_t INA_POWER_REGISTER{3};
225 const uint8_t INA_CALIBRATION_REGISTER{5};
226 const uint8_t INA_MASK_ENABLE_REGISTER{6};
227 const uint8_t INA_ALERT_LIMIT_REGISTER{7};
228 const uint8_t INA_MANUFACTURER_ID_REGISTER{0xFE};
229 const uint8_t INA_DIE_ID_REGISTER{0xFF};
230 const uint16_t INA_RESET_DEVICE{0x8000};
231 const uint16_t INA_CONVERSION_READY_MASK{0x0080};
232 const uint16_t INA_CONFIG_MODE_MASK{0x0007};
233 const uint16_t INA_ALERT_MASK{0x03FF};
234 const uint8_t INA_ALERT_SHUNT_OVER_VOLT_BIT{15};
236 const uint8_t INA_ALERT_BUS_OVER_VOLT_BIT{13};
237 const uint8_t INA_ALERT_BUS_UNDER_VOLT_BIT{12};
238 const uint8_t INA_ALERT_POWER_OVER_WATT_BIT{11};
239 const uint8_t INA_ALERT_CONVERSION_RDY_BIT{10};
240 const uint8_t INA_DEFAULT_OPERATING_MODE{B111};
242 const uint8_t INA219_CURRENT_REGISTER{4};
243 const uint16_t INA219_BUS_VOLTAGE_LSB{400};
244 const uint16_t INA219_SHUNT_VOLTAGE_LSB{100};
245 const uint16_t INA219_CONFIG_AVG_MASK{0x07F8};
246 const uint16_t INA219_CONFIG_PG_MASK{0xE7FF};
247 const uint16_t INA219_CONFIG_BADC_MASK{0x0780};
248 const uint16_t INA219_CONFIG_SADC_MASK{0x0038};
249 const uint8_t INA219_BRNG_BIT{13};
250 const uint8_t INA219_PG_FIRST_BIT{11};
252 const uint8_t INA226_CURRENT_REGISTER{4};
253 const uint16_t INA226_BUS_VOLTAGE_LSB{125};
254 const uint16_t INA226_SHUNT_VOLTAGE_LSB{25};
255 const uint16_t INA226_CONFIG_AVG_MASK{0x0E00};
256 const uint16_t INA226_DIE_ID_VALUE{0x2260};
257 const uint16_t INA226_CONFIG_BADC_MASK{0x01C0};
258 const uint16_t INA226_CONFIG_SADC_MASK{0x0038};
259 
260 const uint8_t INA228_DIE_ID_REGISTER{0x3F};
261 const uint16_t INA228_DIE_ID_VALUE{0x2280};
262 const uint8_t INA228_BUS_VOLTAGE_REGISTER{0x5};
263 const uint16_t INA228_BUS_VOLTAGE_LSB{195};
265 const uint8_t xINA228_CURRENT_REGISTER{4};
266 const uint16_t xINA228_CONFIG_AVG_MASK{0x0E00};
267 const uint16_t xINA228_CONFIG_BADC_MASK{0x01C0};
268 const uint16_t xINA228_CONFIG_SADC_MASK{0x0038};
269 
271 const uint8_t INA260_CURRENT_REGISTER{1};
272 const uint16_t INA260_BUS_VOLTAGE_LSB{125};
273 const uint16_t INA260_CONFIG_BADC_MASK{0x01C0};
274 const uint16_t INA260_CONFIG_SADC_MASK{0x0038};
276 const uint16_t INA3221_BUS_VOLTAGE_LSB{800};
277 const uint16_t INA3221_SHUNT_VOLTAGE_LSB{400};
278 const uint16_t INA3221_CONFIG_BADC_MASK{0x01C0};
279 const uint8_t INA3221_MASK_REGISTER{0xF};
280 const uint8_t I2C_DELAY{10};
281 // clang-format on
282 
283 class INA_Class {
288  public:
289  INA_Class(uint8_t expectedDevices = 0);
290  ~INA_Class();
291  uint8_t begin(const uint16_t maxBusAmps, const uint32_t microOhmR,
292  const uint8_t deviceNumber = UINT8_MAX);
293  void setI2CSpeed(const uint32_t i2cSpeed = INA_I2C_STANDARD_MODE) const;
294  void setMode(const uint8_t mode, const uint8_t deviceNumber = UINT8_MAX);
295  void setAveraging(const uint16_t averages, const uint8_t deviceNumber = UINT8_MAX);
296  void setBusConversion(const uint32_t convTime, const uint8_t deviceNumber = UINT8_MAX);
297  void setShuntConversion(const uint32_t convTime, const uint8_t deviceNumber = UINT8_MAX);
298  uint16_t getBusMilliVolts(const uint8_t deviceNumber = 0);
299  uint32_t getBusRaw(const uint8_t deviceNumber = 0);
300  int32_t getShuntMicroVolts(const uint8_t deviceNumber = 0);
301  int32_t getShuntRaw(const uint8_t deviceNumber = 0);
302  int32_t getBusMicroAmps(const uint8_t deviceNumber = 0);
303  int64_t getBusMicroWatts(const uint8_t deviceNumber = 0);
304  const char* getDeviceName(const uint8_t deviceNumber = 0);
305  uint8_t getDeviceAddress(const uint8_t deviceNumber = 0);
306  void reset(const uint8_t deviceNumber = 0);
307  bool conversionFinished(const uint8_t deviceNumber = 0);
308  void waitForConversion(const uint8_t deviceNumber = UINT8_MAX);
309  bool alertOnConversion(const bool alertState, const uint8_t deviceNumber = UINT8_MAX);
310  bool alertOnShuntOverVoltage(const bool alertState, const int32_t milliVolts,
311  const uint8_t deviceNumber = UINT8_MAX);
312  bool alertOnShuntUnderVoltage(const bool alertState, const int32_t milliVolts,
313  const uint8_t deviceNumber = UINT8_MAX);
314  bool alertOnBusOverVoltage(const bool alertState, const int32_t milliVolts,
315  const uint8_t deviceNumber = UINT8_MAX);
316  bool alertOnBusUnderVoltage(const bool alertState, const int32_t milliVolts,
317  const uint8_t deviceNumber = UINT8_MAX);
318  bool alertOnPowerOverLimit(const bool alertState, const int32_t milliAmps,
319  const uint8_t deviceNumber = UINT8_MAX);
320  uint16_t _EEPROM_offset = 0;
321  #if defined(ESP32) || defined(ESP8266)
322  uint16_t _EEPROM_size = 512;
323  #endif
324  private:
325  int16_t readWord(const uint8_t addr, const uint8_t deviceAddress) const;
326  int32_t read3Bytes(const uint8_t addr, const uint8_t deviceAddress) const;
327  void writeWord(const uint8_t addr, const uint16_t data, const uint8_t deviceAddress) const;
328  void readInafromEEPROM(const uint8_t deviceNumber);
329  void writeInatoEEPROM(const uint8_t deviceNumber);
330  void initDevice(const uint8_t deviceNumber);
331  uint8_t _DeviceCount{0};
332  uint8_t _currentINA{UINT8_MAX};
333  uint8_t _expectedDevices{0};
334  inaEEPROM* _DeviceArray;
335  inaEEPROM inaEE;
336  inaDet ina;
337  #if defined(__AVR__) || defined(CORE_TEENSY) || defined(ESP32) || defined(ESP8266) || \
338  defined(__STM32F1__)
339  #else
340  inaEEPROM _EEPROMEmulation[32];
341  #endif
342 }; // of INA_Class definition
343 #endif
const uint16_t INA226_CONFIG_BADC_MASK
INA226 Bits 6-8 masked.
Definition: INA.h:257
uint8_t type
0-15 see enumerated "ina_Type" for details
Definition: INA.h:169
uint32_t maxBusAmps
0-1023 Store initialization value
Definition: INA.h:172
const uint16_t INA_RESET_DEVICE
Write to config to reset device.
Definition: INA.h:230
const uint8_t INA_ALERT_CONVERSION_RDY_BIT
Register bit.
Definition: INA.h:239
const uint8_t INA_ALERT_BUS_UNDER_VOLT_BIT
Register bit.
Definition: INA.h:237
const uint16_t INA260_CONFIG_SADC_MASK
INA260 Bits 3-5 masked.
Definition: INA.h:274
const uint16_t xINA228_CONFIG_SADC_MASK
INA228 Bits 3-4.
Definition: INA.h:268
Continuous shunt, no bus.
Definition: INA.h:208
const uint16_t INA228_BUS_VOLTAGE_LSB
INA228 LSB in uV *100 1953125uV, extra code.
Definition: INA.h:263
uint8_t operatingMode
0-15 Default to continuous mode
Definition: INA.h:170
const uint16_t INA226_SHUNT_VOLTAGE_LSB
INA226 LSB in uV *10 2.5uV.
Definition: INA.h:254
const uint16_t INA260_BUS_VOLTAGE_LSB
INA260 LSB in uV *100 1.25mV.
Definition: INA.h:272
const uint8_t INA_MASK_ENABLE_REGISTER
Mask enable Register (some devices)
Definition: INA.h:226
const uint8_t INA_MANUFACTURER_ID_REGISTER
Mfgr ID Register (some devices)
Definition: INA.h:228
Device powered down.
Definition: INA.h:203
const uint8_t INA228_SHUNT_VOLTAGE_REGISTER
INA228 Shunt Voltage Register.
Definition: INA.h:264
const uint8_t INA228_DIE_ID_REGISTER
INA228 Device_ID Register.
Definition: INA.h:260
const uint16_t INA226_CONFIG_AVG_MASK
INA226 Bits 9-11.
Definition: INA.h:255
const uint8_t INA219_BRNG_BIT
INA219 Bit for BRNG in config reg.
Definition: INA.h:249
uint8_t busVoltageRegister
0- 7, Bus Voltage Register
Definition: INA.h:177
uint32_t microOhmR
0-1,048,575 Store initialization value
Definition: INA.h:173
const uint8_t INA228_BUS_VOLTAGE_REGISTER
INA228 Bus Voltage Register.
Definition: INA.h:262
const uint16_t INA3221_SHUNT_VOLTAGE_LSB
INA3221 LSB in uV *10 40uV.
Definition: INA.h:277
uint8_t currentRegister
0- 7, Current Register
Definition: INA.h:179
inaDet()
struct constructor
Definition: INA.cpp:16
Continuous bus, no shunt.
Definition: INA.h:209
Both continuous, default value.
Definition: INA.h:210
const uint16_t INA226_DIE_ID_VALUE
INA226 Hard-coded Die ID for INA226.
Definition: INA.h:256
const uint16_t INA_ALERT_MASK
Mask off bits 0-9.
Definition: INA.h:233
const uint16_t INA219_CONFIG_BADC_MASK
INA219 Bits 7-10 masked.
Definition: INA.h:247
const uint16_t INA226_BUS_VOLTAGE_LSB
INA226 LSB in uV *100 1.25mV.
Definition: INA.h:253
const uint8_t INA_ALERT_POWER_OVER_WATT_BIT
Register bit.
Definition: INA.h:238
Triggered bus and shunt.
Definition: INA.h:206
const uint16_t INA219_CONFIG_SADC_MASK
INA219 Bits 3-5.
Definition: INA.h:248
Definition: INA.h:176
const uint16_t INA3221_CONFIG_BADC_MASK
INA3221 Bits 7-10 masked.
Definition: INA.h:278
const uint8_t INA226_SHUNT_VOLTAGE_REGISTER
INA226 Shunt Voltage Register.
Definition: INA.h:251
const uint8_t INA_ALERT_SHUNT_UNDER_VOLT_BIT
Register bit.
Definition: INA.h:235
ina_Mode
Definition: INA.h:202
const uint8_t INA_POWER_REGISTER
Power Register address.
Definition: INA.h:224
Triggered shunt, no bus.
Definition: INA.h:204
const uint16_t INA219_CONFIG_PG_MASK
INA219 Bits 11-12 masked.
Definition: INA.h:246
const uint8_t INA260_CURRENT_REGISTER
INA260 Current Register.
Definition: INA.h:271
const uint16_t xINA228_CONFIG_BADC_MASK
INA228 Bits 6-8 masked.
Definition: INA.h:267
uint32_t address
0-127 I2C Address of device
Definition: INA.h:171
const uint8_t INA219_PG_FIRST_BIT
INA219 1st bit of Programmable Gain.
Definition: INA.h:250
const uint8_t INA_DIE_ID_REGISTER
Die ID Register (some devices)
Definition: INA.h:229
Forward definitions for the INA_Class.
Definition: INA.h:283
const uint8_t INA219_CURRENT_REGISTER
INA219 Current Register.
Definition: INA.h:242
uint16_t shuntVoltage_LSB
Device dependent LSB factor.
Definition: INA.h:180
const uint16_t INA226_CONFIG_SADC_MASK
INA226 Bits 3-4.
Definition: INA.h:258
volatile uint8_t deviceNumber
Device Number to use in example.
Definition: BackgroundRead.ino:94
const uint8_t INA_CONFIGURATION_REGISTER
Configuration Register address.
Definition: INA.h:222
const uint8_t INA_BUS_VOLTAGE_REGISTER
Bus Voltage Register address.
Definition: INA.h:223
const uint8_t INA3221_MASK_REGISTER
INA32219 Mask register.
Definition: INA.h:279
Triggered bus, no shunt.
Definition: INA.h:205
uint32_t power_LSB
Wattage LSB.
Definition: INA.h:183
const uint16_t xINA228_CONFIG_AVG_MASK
INA228 Bits 9-11.
Definition: INA.h:266
const uint8_t INA219_SHUNT_VOLTAGE_REGISTER
INA219 Shunt Voltage Register.
Definition: INA.h:241
const uint8_t INA260_SHUNT_VOLTAGE_REGISTER
INA260 Register doesn't exist.
Definition: INA.h:270
const uint8_t INA_DEFAULT_OPERATING_MODE
Default continuous mode.
Definition: INA.h:240
Definition: INA.h:168
ina_Type
Definition: INA.h:189
const uint16_t INA219_BUS_VOLTAGE_LSB
INA219 LSB in uV *100 4.00mV.
Definition: INA.h:243
const uint8_t I2C_DELAY
Microsecond delay on I2C writes.
Definition: INA.h:280
const uint16_t INA219_SHUNT_VOLTAGE_LSB
INA219 LSB in uV *10 10.0uV.
Definition: INA.h:244
const uint8_t xINA228_CURRENT_REGISTER
INA228 Current Register.
Definition: INA.h:265
const uint8_t INA_ALERT_LIMIT_REGISTER
Alert Limit Register (some devices)
Definition: INA.h:227
const uint16_t INA_CONVERSION_READY_MASK
Bit 4.
Definition: INA.h:231
const uint16_t INA228_DIE_ID_VALUE
INA228 Hard-coded Die ID for INA228.
Definition: INA.h:261
const uint8_t INA_ALERT_SHUNT_OVER_VOLT_BIT
Register bit.
Definition: INA.h:234
uint8_t shuntVoltageRegister
0- 7, Shunt Voltage Register
Definition: INA.h:178
const uint8_t INA_ALERT_BUS_OVER_VOLT_BIT
Register bit.
Definition: INA.h:236
uint32_t current_LSB
Amperage LSB.
Definition: INA.h:182
const uint8_t INA_CALIBRATION_REGISTER
Calibration Register address.
Definition: INA.h:225
const uint8_t INA226_CURRENT_REGISTER
INA226 Current Register.
Definition: INA.h:252
const uint16_t INA260_CONFIG_BADC_MASK
INA260 Bits 6-8 masked.
Definition: INA.h:273
shutdown or power-down
Definition: INA.h:207
const uint32_t INA_I2C_STANDARD_MODE
Default normal I2C 100KHz speed.
Definition: INA.h:217
uint16_t busVoltage_LSB
Device dependent LSB factor.
Definition: INA.h:181
const uint16_t INA_CONFIG_MODE_MASK
Bits 0-3.
Definition: INA.h:232
const uint16_t INA219_CONFIG_AVG_MASK
INA219 Bits 3-6, 7-10.
Definition: INA.h:245
const uint8_t INA3221_SHUNT_VOLTAGE_REGISTER
INA3221 Register number 1.
Definition: INA.h:275
const uint16_t INA3221_BUS_VOLTAGE_LSB
INA3221 LSB in uV *100 8mV.
Definition: INA.h:276