mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-10-03 18:09:02 -04:00
0.2.1 INA219
This commit is contained in:
parent
163524c559
commit
d6c3e13bcf
@ -6,6 +6,19 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
|||||||
and this project adheres to [Semantic Versioning](http://semver.org/).
|
and this project adheres to [Semantic Versioning](http://semver.org/).
|
||||||
|
|
||||||
|
|
||||||
|
## [0.2.1] - 2024-01-17
|
||||||
|
- add **bool setBusResolution(bits)**
|
||||||
|
- add **bool setBusSamples(value)**
|
||||||
|
- add **bool setShuntResolution(bits)**
|
||||||
|
- add **bool setShuntSamples(value)**
|
||||||
|
- improve error checking several functions
|
||||||
|
- calls to **writeRegister()** should return 0.
|
||||||
|
- error handling needs improvement, this is a first step.
|
||||||
|
- improve **INA219_get_settings.ino**
|
||||||
|
- update keywords.txt
|
||||||
|
- update readme.md
|
||||||
|
|
||||||
|
|
||||||
## [0.2.0] - 2023-12-04
|
## [0.2.0] - 2023-12-04
|
||||||
- Fix #8, refactor API - support ESP32-S3
|
- Fix #8, refactor API - support ESP32-S3
|
||||||
- update readme.md
|
- update readme.md
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// FILE: INA219.h
|
// FILE: INA219.h
|
||||||
// AUTHOR: Rob Tillaart
|
// AUTHOR: Rob Tillaart
|
||||||
// VERSION: 0.2.0
|
// VERSION: 0.2.1
|
||||||
// DATE: 2021-05-18
|
// DATE: 2021-05-18
|
||||||
// PURPOSE: Arduino library for INA219 voltage, current and power sensor
|
// PURPOSE: Arduino library for INA219 voltage, current and power sensor
|
||||||
// URL: https://github.com/RobTillaart/INA219
|
// URL: https://github.com/RobTillaart/INA219
|
||||||
@ -124,15 +124,16 @@ bool INA219::getConversionFlag()
|
|||||||
//
|
//
|
||||||
// CONFIGURATION
|
// CONFIGURATION
|
||||||
//
|
//
|
||||||
void INA219::reset()
|
bool INA219::reset()
|
||||||
{
|
{
|
||||||
uint16_t config = _readRegister(INA219_CONFIGURATION);
|
uint16_t config = _readRegister(INA219_CONFIGURATION);
|
||||||
config |= 0x8000;
|
config |= 0x8000;
|
||||||
_writeRegister(INA219_CONFIGURATION, config);
|
uint16_t wrrv = _writeRegister(INA219_CONFIGURATION, config);
|
||||||
// reset calibration
|
// reset calibration
|
||||||
_current_LSB = 0;
|
_current_LSB = 0;
|
||||||
_maxCurrent = 0;
|
_maxCurrent = 0;
|
||||||
_shunt = 0;
|
_shunt = 0;
|
||||||
|
return (wrrv == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -144,8 +145,9 @@ bool INA219::setBusVoltageRange(uint8_t voltage)
|
|||||||
uint16_t config = _readRegister(INA219_CONFIGURATION);
|
uint16_t config = _readRegister(INA219_CONFIGURATION);
|
||||||
config &= ~INA219_CONF_BUS_RANGE_VOLTAGE;
|
config &= ~INA219_CONF_BUS_RANGE_VOLTAGE;
|
||||||
if (voltage == 32) config |= INA219_CONF_BUS_RANGE_VOLTAGE;
|
if (voltage == 32) config |= INA219_CONF_BUS_RANGE_VOLTAGE;
|
||||||
_writeRegister(INA219_CONFIGURATION, config);
|
|
||||||
return true;
|
uint16_t wrrv = _writeRegister(INA219_CONFIGURATION, config);
|
||||||
|
return (wrrv == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -168,8 +170,9 @@ bool INA219::setGain(uint8_t factor)
|
|||||||
if (factor == 2) config |= (1 << 11);
|
if (factor == 2) config |= (1 << 11);
|
||||||
else if (factor == 4) config |= (2 << 11);
|
else if (factor == 4) config |= (2 << 11);
|
||||||
else if (factor == 8) config |= (3 << 11);
|
else if (factor == 8) config |= (3 << 11);
|
||||||
_writeRegister(INA219_CONFIGURATION, config);
|
|
||||||
return true;
|
uint16_t wrrv = _writeRegister(INA219_CONFIGURATION, config);
|
||||||
|
return (wrrv == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -184,21 +187,49 @@ uint8_t INA219::getGain()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// BUS
|
||||||
|
//
|
||||||
|
bool INA219::setBusResolution(uint8_t bits)
|
||||||
|
{
|
||||||
|
if ((bits < 9) || (bits > 12)) return false;
|
||||||
|
bits -= 9;
|
||||||
|
|
||||||
|
uint16_t config = _readRegister(INA219_CONFIGURATION);
|
||||||
|
config &= ~INA219_CONF_BUS_ADC;
|
||||||
|
config |= (bits << 7);
|
||||||
|
|
||||||
|
uint16_t wrrv = _writeRegister(INA219_CONFIGURATION, config);
|
||||||
|
return (wrrv == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// value = 0..7, always 12 bit resolution,
|
||||||
|
bool INA219::setBusSamples(uint8_t value)
|
||||||
|
{
|
||||||
|
if (value > 7) return false;
|
||||||
|
value |= 8;
|
||||||
|
|
||||||
|
uint16_t config = _readRegister(INA219_CONFIGURATION);
|
||||||
|
config &= ~INA219_CONF_BUS_ADC;
|
||||||
|
config |= (value << 7);
|
||||||
|
|
||||||
|
uint16_t wrrv = _writeRegister(INA219_CONFIGURATION, config);
|
||||||
|
return (wrrv == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool INA219::setBusADC(uint8_t mask)
|
bool INA219::setBusADC(uint8_t mask)
|
||||||
{
|
{
|
||||||
if (mask > 0x0F) return false;
|
if (mask > 0x0F) return false;
|
||||||
|
|
||||||
// TODO improve this one. datasheet.
|
|
||||||
// two functions
|
|
||||||
// setBusResolution + setBusSamples()
|
|
||||||
uint16_t config = _readRegister(INA219_CONFIGURATION);
|
uint16_t config = _readRegister(INA219_CONFIGURATION);
|
||||||
config &= ~INA219_CONF_BUS_ADC;
|
config &= ~INA219_CONF_BUS_ADC;
|
||||||
config |= (mask << 7);
|
config |= (mask << 7);
|
||||||
// if (bits == 10) config |= (1 << 7);
|
|
||||||
// else if (bits == 11) config |= (2 << 7);
|
uint16_t wrrv = _writeRegister(INA219_CONFIGURATION, config);
|
||||||
// else if (bits == 12) config |= (3 << 7);
|
return (wrrv == 0);
|
||||||
_writeRegister(INA219_CONFIGURATION, config);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -210,18 +241,49 @@ uint8_t INA219::getBusADC()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// SHUNT
|
||||||
|
//
|
||||||
|
bool INA219::setShuntResolution(uint8_t bits)
|
||||||
|
{
|
||||||
|
if ((bits < 9) || (bits > 12)) return false;
|
||||||
|
bits -= 9;
|
||||||
|
|
||||||
|
uint16_t config = _readRegister(INA219_CONFIGURATION);
|
||||||
|
config &= ~INA219_CONF_SHUNT_ADC;
|
||||||
|
config |= (bits << 3);
|
||||||
|
|
||||||
|
uint16_t wrrv = _writeRegister(INA219_CONFIGURATION, config);
|
||||||
|
return (wrrv == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// value = 0..7, always 12 bit resolution,
|
||||||
|
bool INA219::setShuntSamples(uint8_t value)
|
||||||
|
{
|
||||||
|
if (value > 7) return false;
|
||||||
|
value |= 8;
|
||||||
|
|
||||||
|
uint16_t config = _readRegister(INA219_CONFIGURATION);
|
||||||
|
config &= ~INA219_CONF_SHUNT_ADC;
|
||||||
|
config |= (value << 3);
|
||||||
|
|
||||||
|
uint16_t wrrv = _writeRegister(INA219_CONFIGURATION, config);
|
||||||
|
return (wrrv == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool INA219::setShuntADC(uint8_t mask)
|
bool INA219::setShuntADC(uint8_t mask)
|
||||||
{
|
{
|
||||||
if (mask > 0x0F) return false;
|
if (mask > 0x0F) return false;
|
||||||
|
|
||||||
// TODO improve this one. datasheet.
|
|
||||||
// two functions
|
|
||||||
// setShuntResolution + setShuntSamples()
|
|
||||||
uint16_t config = _readRegister(INA219_CONFIGURATION);
|
uint16_t config = _readRegister(INA219_CONFIGURATION);
|
||||||
config &= ~INA219_CONF_SHUNT_ADC;
|
config &= ~INA219_CONF_SHUNT_ADC;
|
||||||
config |= (mask << 3);
|
config |= (mask << 3);
|
||||||
_writeRegister(INA219_CONFIGURATION, config);
|
|
||||||
return true;
|
uint16_t wrrv = _writeRegister(INA219_CONFIGURATION, config);
|
||||||
|
return (wrrv == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -233,14 +295,19 @@ uint8_t INA219::getShuntADC()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// MODE
|
||||||
|
//
|
||||||
bool INA219::setMode(uint8_t mode)
|
bool INA219::setMode(uint8_t mode)
|
||||||
{
|
{
|
||||||
if (mode > 7) return false;
|
if (mode > 7) return false;
|
||||||
uint16_t config = _readRegister(INA219_CONFIGURATION);
|
uint16_t config = _readRegister(INA219_CONFIGURATION);
|
||||||
config &= ~INA219_CONF_MODE;
|
config &= ~INA219_CONF_MODE;
|
||||||
config |= mode;
|
config |= mode;
|
||||||
_writeRegister(INA219_CONFIGURATION, config);
|
|
||||||
return true;
|
uint16_t wrrv = _writeRegister(INA219_CONFIGURATION, config);
|
||||||
|
return (wrrv == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -258,7 +325,7 @@ uint8_t INA219::getMode()
|
|||||||
//
|
//
|
||||||
bool INA219::setMaxCurrentShunt(float maxCurrent, float shunt)
|
bool INA219::setMaxCurrentShunt(float maxCurrent, float shunt)
|
||||||
{
|
{
|
||||||
// #define printdebug
|
// #define PRINTDEBUG
|
||||||
uint16_t calib = 0;
|
uint16_t calib = 0;
|
||||||
|
|
||||||
if (maxCurrent < 0.001) return false;
|
if (maxCurrent < 0.001) return false;
|
||||||
@ -269,10 +336,9 @@ bool INA219::setMaxCurrentShunt(float maxCurrent, float shunt)
|
|||||||
_maxCurrent = maxCurrent;
|
_maxCurrent = maxCurrent;
|
||||||
_shunt = shunt;
|
_shunt = shunt;
|
||||||
calib = round(0.04096 / (_current_LSB * shunt));
|
calib = round(0.04096 / (_current_LSB * shunt));
|
||||||
_writeRegister(INA219_CALIBRATION, calib);
|
uint16_t wrrv = _writeRegister(INA219_CALIBRATION, calib);
|
||||||
|
|
||||||
|
#ifdef PRINTDEBUG
|
||||||
#ifdef printdebug
|
|
||||||
Serial.println();
|
Serial.println();
|
||||||
Serial.print("current_LSB:\t");
|
Serial.print("current_LSB:\t");
|
||||||
Serial.print(_current_LSB, 8);
|
Serial.print(_current_LSB, 8);
|
||||||
@ -288,7 +354,7 @@ bool INA219::setMaxCurrentShunt(float maxCurrent, float shunt)
|
|||||||
Serial.println(" ohm Ω");
|
Serial.println(" ohm Ω");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return true;
|
return (wrrv == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,20 +1,19 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
// FILE: INA219.h
|
// FILE: INA219.h
|
||||||
// AUTHOR: Rob Tillaart
|
// AUTHOR: Rob Tillaart
|
||||||
// VERSION: 0.2.0
|
// VERSION: 0.2.1
|
||||||
// DATE: 2021-05-18
|
// DATE: 2021-05-18
|
||||||
// PURPOSE: Arduino library for INA219 voltage, current and power sensor
|
// PURPOSE: Arduino library for INA219 voltage, current and power sensor
|
||||||
// URL: https://github.com/RobTillaart/INA219
|
// URL: https://github.com/RobTillaart/INA219
|
||||||
//
|
//
|
||||||
// Read the datasheet for the details how to connect!
|
// Read the datasheet for the details how to connect!
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
#include "Arduino.h"
|
#include "Arduino.h"
|
||||||
#include "Wire.h"
|
#include "Wire.h"
|
||||||
|
|
||||||
|
|
||||||
#define INA219_LIB_VERSION (F("0.2.0"))
|
#define INA219_LIB_VERSION (F("0.2.1"))
|
||||||
|
|
||||||
|
|
||||||
class INA219
|
class INA219
|
||||||
@ -52,17 +51,26 @@ public:
|
|||||||
|
|
||||||
// CONFIGURATION
|
// CONFIGURATION
|
||||||
// need improvement API wise.
|
// need improvement API wise.
|
||||||
void reset();
|
bool reset();
|
||||||
// voltage = 16, 32 (values below 32 are rounded to 16 or 32)
|
// voltage = 16, 32 (values below 32 are rounded to 16 or 32)
|
||||||
bool setBusVoltageRange(uint8_t voltage = 16);
|
bool setBusVoltageRange(uint8_t voltage = 16);
|
||||||
uint8_t getBusVoltageRange(); // returns 16 or 32.
|
uint8_t getBusVoltageRange(); // returns 16 or 32.
|
||||||
// factor = 1, 2, 4, 8
|
// factor = 1, 2, 4, 8
|
||||||
bool setGain(uint8_t factor = 1);
|
bool setGain(uint8_t factor = 1);
|
||||||
uint8_t getGain();
|
uint8_t getGain();
|
||||||
// mask
|
|
||||||
bool setBusADC(uint8_t mask = 0x03);
|
// configuration BUS
|
||||||
|
// use one of the next three
|
||||||
|
bool setBusResolution(uint8_t bits); // 9..12, always 1 sample
|
||||||
|
bool setBusSamples(uint8_t value); // 0..7, always 12 bits.
|
||||||
|
bool setBusADC(uint8_t mask = 0x03); // uses a mask, check datasheet
|
||||||
uint8_t getBusADC();
|
uint8_t getBusADC();
|
||||||
bool setShuntADC(uint8_t mask = 0x03);
|
|
||||||
|
// configuration SHUNT
|
||||||
|
// use one of the next three
|
||||||
|
bool setShuntResolution(uint8_t bits); // 9..12, always 1 sample
|
||||||
|
bool setShuntSamples(uint8_t value); // 0..7, always 12 bits.
|
||||||
|
bool setShuntADC(uint8_t mask = 0x03); // uses a mask, check datasheet
|
||||||
uint8_t getShuntADC();
|
uint8_t getShuntADC();
|
||||||
|
|
||||||
// Operating mode = 0..7
|
// Operating mode = 0..7
|
||||||
@ -103,6 +111,7 @@ private:
|
|||||||
|
|
||||||
uint16_t _readRegister(uint8_t reg);
|
uint16_t _readRegister(uint8_t reg);
|
||||||
uint16_t _writeRegister(uint8_t reg, uint16_t value);
|
uint16_t _writeRegister(uint8_t reg, uint16_t value);
|
||||||
|
|
||||||
float _current_LSB;
|
float _current_LSB;
|
||||||
float _shunt;
|
float _shunt;
|
||||||
float _maxCurrent;
|
float _maxCurrent;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2021-2023 Rob Tillaart
|
Copyright (c) 2021-2024 Rob Tillaart
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -32,6 +32,15 @@ Maxima, see datasheet, chapter 7, esp 7.5
|
|||||||
| shunt voltage | 320 | mVolt | depends on PGA setting
|
| shunt voltage | 320 | mVolt | depends on PGA setting
|
||||||
|
|
||||||
|
|
||||||
|
#### Related
|
||||||
|
|
||||||
|
- https://www.ti.com/product/INA219#tech-docs
|
||||||
|
- https://www.ti.com/product/INA219#params
|
||||||
|
- https://www.ti.com/document-viewer/INA219/datasheet
|
||||||
|
- https://github.com/RobTillaart/INA219
|
||||||
|
- https://github.com/RobTillaart/INA226
|
||||||
|
|
||||||
|
|
||||||
#### 0.2.0 Breaking change
|
#### 0.2.0 Breaking change
|
||||||
|
|
||||||
Version 0.2.0 introduced a breaking change.
|
Version 0.2.0 introduced a breaking change.
|
||||||
@ -67,12 +76,12 @@ The address depends on how the A0 and A1 address lines are connected to the SCL,
|
|||||||
#### Performance
|
#### Performance
|
||||||
|
|
||||||
Datasheet states it supports 1 KHz .. 2.56 MHz.
|
Datasheet states it supports 1 KHz .. 2.56 MHz.
|
||||||
Note: higher speeds need smaller pull up resistors.
|
Note: higher speeds and longer wires need smaller pull up resistors.
|
||||||
|
|
||||||
Some timings in micros for **INA.getMode()** on an Arduino UNO.
|
Some timings in micros for **INA.getMode()** on an Arduino UNO.
|
||||||
This is just one readRegister call, similar to most functions.
|
This is just one readRegister call, similar to most functions.
|
||||||
|
|
||||||
Above 600 KHz there is little performance gain.
|
Above 600 KHz there is little performance gain.
|
||||||
|
|
||||||
| speed | time | speed | time | speed | time | speed | time |
|
| speed | time | speed | time | speed | time | speed | time |
|
||||||
|:-------:|:------:|:-------:|:------:|:-------:|:------:|:-------:|:------:|
|
|:-------:|:------:|:-------:|:------:|:-------:|:------:|:-------:|:------:|
|
||||||
@ -97,6 +106,7 @@ use **INA219_test_I2C.ino**
|
|||||||
- **bool begin()** UNO ea. initializes the class.
|
- **bool begin()** UNO ea. initializes the class.
|
||||||
Returns true if the INA219 address (set in the constructor) is on the I2C bus.
|
Returns true if the INA219 address (set in the constructor) is on the I2C bus.
|
||||||
- **bool isConnected()** Returns true if the INA219 address (set in the constructor) is on the I2C bus.
|
- **bool isConnected()** Returns true if the INA219 address (set in the constructor) is on the I2C bus.
|
||||||
|
- **uint8_t getAddress()** Returns the INA219 address set in the constructor.
|
||||||
|
|
||||||
|
|
||||||
#### Core Functions
|
#### Core Functions
|
||||||
@ -111,7 +121,7 @@ Also the value is not meaningful if there is no shunt connected.
|
|||||||
|
|
||||||
The library has helper functions to convert above output to a more appropriate scale of units.
|
The library has helper functions to convert above output to a more appropriate scale of units.
|
||||||
|
|
||||||
Helper functions for the milli scale.
|
Helper functions for the milli-scale.
|
||||||
|
|
||||||
- **float getBusVoltage_mV()** idem, returns millivolts.
|
- **float getBusVoltage_mV()** idem, returns millivolts.
|
||||||
Note: returns -100 if the math overflow bit is set.
|
Note: returns -100 if the math overflow bit is set.
|
||||||
@ -119,7 +129,7 @@ Note: returns -100 if the math overflow bit is set.
|
|||||||
- **float getCurrent_mA()** idem in milliAmpere.
|
- **float getCurrent_mA()** idem in milliAmpere.
|
||||||
- **float getPower_mW()** idem in milliWatt.
|
- **float getPower_mW()** idem in milliWatt.
|
||||||
|
|
||||||
Helper functions for the micro scale.
|
Helper functions for the micro-scale.
|
||||||
|
|
||||||
- **float getBusVoltage_uV()** idem microVolt.
|
- **float getBusVoltage_uV()** idem microVolt.
|
||||||
- **float getShuntVoltage_uV()** idem microVolt.
|
- **float getShuntVoltage_uV()** idem microVolt.
|
||||||
@ -136,48 +146,99 @@ Especially useful in non-continuous modi.
|
|||||||
|
|
||||||
#### Configuration
|
#### Configuration
|
||||||
|
|
||||||
Note: the conversion runs in the background and if done the value is stored in a register.
|
- **bool reset()** software power on reset.
|
||||||
The core functions can always be read from the registers, so they will not block.
|
|
||||||
Result can be that you get the very same value if no new value is ready.
|
|
||||||
|
|
||||||
- **void reset()** software power on reset.
|
|
||||||
This implies that calibration with **setMaxCurrentShunt()** needs to be redone.
|
This implies that calibration with **setMaxCurrentShunt()** needs to be redone.
|
||||||
See section below.
|
See section below.
|
||||||
|
Returns false if it could not write settings to device.
|
||||||
- **bool setBusVoltageRange(uint8_t voltage = 16)** set to 16 or 32.
|
- **bool setBusVoltageRange(uint8_t voltage = 16)** set to 16 or 32.
|
||||||
Values < 16 map to 16 and values between 16 and 32 map to 32.
|
Values <= 16 map to 16 and values between 16 and 32 map to 32.
|
||||||
Values above 32 return false.
|
Returns false if voltage is above 32..
|
||||||
|
Returns false if it could not write settings to device.
|
||||||
- **uint8_t getBusVoltageRange()** returns 16 or 32. (Volts)
|
- **uint8_t getBusVoltageRange()** returns 16 or 32. (Volts)
|
||||||
- **bool setGain(uint8_t factor = 1)** factor = 1, 2, 4, 8.
|
- **bool setGain(uint8_t factor = 1)** factor = 1, 2, 4, 8.
|
||||||
Determines the shunt voltage range. 40, 80, 160 or 320 mV.
|
Determines the shunt voltage range. 40, 80, 160 or 320 mV.
|
||||||
Returns false if factor is not a valid value.
|
Returns false if factor is not a valid value.
|
||||||
|
Returns false if it could not write settings to device.
|
||||||
- **uint8_t getGain()** returns set factor.
|
- **uint8_t getGain()** returns set factor.
|
||||||
- **bool setBusADC(uint8_t mask = 0x03)** check datasheet for meaning of mask.
|
|
||||||
Returns false if mask > 0x0F.
|
|
||||||
- **uint8_t getBusADC()** returns mask.
|
#### Configuration BUS and SHUNT
|
||||||
- **bool setShuntADC(uint8_t mask = 0x03)** check datasheet for meaning of mask.
|
|
||||||
Returns false if mask > 0x0F.
|
**Note:**
|
||||||
- **uint8_t getShuntADC()** returns mask.
|
The internal conversions runs in the background in the INA219.
|
||||||
|
If a conversion is finished the measured value is stored in the appropriate register.
|
||||||
|
The last obtained values can always be read from the registers, so they will not block.
|
||||||
|
Result can be that you get the very same value if no new data is available yet.
|
||||||
|
This is especially true if you increase the number of samples.
|
||||||
|
(See also discussion in #11).
|
||||||
|
|
||||||
|
Using more samples reduces the noise level, but one will miss the faster
|
||||||
|
changes in voltage or current.
|
||||||
|
Depending on your project needs you can choose one over the other.
|
||||||
|
|
||||||
|
As a rule of thumb one could take the time between two I2C reads of
|
||||||
|
a register as an upper limit.
|
||||||
|
This would result in a fresh measurement every time one reads the register.
|
||||||
|
NB it is always possible to average readings fetched from the device
|
||||||
|
in your own code.
|
||||||
|
|
||||||
|
Use one of these three so set **bus** resolution and sampling.
|
||||||
|
|
||||||
|
- **bool setBusResolution(uint8_t bits)** bits = 9..12, always 1 sample.
|
||||||
|
Returns false if parameter out of range.
|
||||||
|
Returns false if it could not write settings to device.
|
||||||
|
- **bool setBusSamples(uint8_t value)** value = 0..7 => maps to 2^value samples.
|
||||||
|
Always 12 bits.
|
||||||
|
Returns false if parameter out of range.
|
||||||
|
Returns false if it could not write settings to device.
|
||||||
|
- **bool setBusADC(uint8_t mask = 0x03)** see table below.
|
||||||
|
Check datasheet for all details.
|
||||||
|
Returns false if parameter out of range (mask > 0x0F).
|
||||||
|
Returns false if it could not write settings to device.
|
||||||
|
- **uint8_t getBusADC()** returns mask, see table below.
|
||||||
|
|
||||||
|
|
||||||
|
Use one of these three so set **shunt** resolution and sampling.
|
||||||
|
|
||||||
|
- **bool setShuntResolution(uint8_t bits)** bits = 9..12, always 1 sample.
|
||||||
|
Returns false if parameter out of range.
|
||||||
|
Returns false if it could not write settings to device.
|
||||||
|
- **bool setShuntSamples(uint8_t value)** value = 0..7 => maps to 2^value samples.
|
||||||
|
Always 12 bits.
|
||||||
|
Returns false if parameter out of range.
|
||||||
|
Returns false if it could not write settings to device.
|
||||||
|
- **bool setShuntADC(uint8_t mask = 0x03)** see table below.
|
||||||
|
Check datasheet for all details.
|
||||||
|
Returns false if parameter out of range (mask > 0x0F).
|
||||||
|
Returns false if it could not write settings to device.
|
||||||
|
- **uint8_t getShuntADC()** returns mask, see table below.
|
||||||
|
|
||||||
|
|
||||||
|
#### Resolution samples table
|
||||||
|
|
||||||
mask = both resolution + averaging multiple samples.
|
mask = both resolution + averaging multiple samples.
|
||||||
minus - == don't care
|
minus - == don't care
|
||||||
|
|
||||||
| bit mask | value | description | conversion time |
|
|
||||||
|:----------:|:-------:|:------------------|:---------------:|
|
|
||||||
| 0-00 | 0 / 4 | 9 bit resolution | 84 μs |
|
|
||||||
| 0-01 | 1 / 5 | 10 bit resolution | 148 μs |
|
|
||||||
| 0-10 | 2 / 6 | 11 bit resolution | 276 μs |
|
|
||||||
| 0-11 | 3 / 7 | 12 bit resolution | 532 μs |
|
|
||||||
| 1000 | 8 | 12 bit 1 sample | 532 μs |
|
|
||||||
| 1001 | 9 | 2 samples | 1.06 ms |
|
|
||||||
| 1010 | 10 | 4 samples | 2.13 ms |
|
|
||||||
| 1011 | 11 | 8 samples | 4.26 ms |
|
|
||||||
| 1100 | 12 | 16 samples | 8.51 ms |
|
|
||||||
| 1101 | 13 | 32 samples | 17.02 ms |
|
|
||||||
| 1110 | 14 | 64 samples | 34.05 ms |
|
|
||||||
| 1111 | 15 | 128 samples | 68.10 ms |
|
|
||||||
|
|
||||||
- note that a new value can take a while depending on value set.
|
| bit mask | value | resolution | samples | conversion time |
|
||||||
|
|:----------:|:-------:|:-------------|:--------------|:---------------:|
|
||||||
|
| 0-00 | 0 / 4 | 9 bit | 1 sample | 84 μs |
|
||||||
|
| 0-01 | 1 / 5 | 10 bit | 1 sample | 148 μs |
|
||||||
|
| 0-10 | 2 / 6 | 11 bit | 1 sample | 276 μs |
|
||||||
|
| 0-11 | 3 / 7 | 12 bit | 1 sample | 532 μs |
|
||||||
|
| | | | | |
|
||||||
|
| 1000 | 8 | 12 bit | 1 sample | 532 μs |
|
||||||
|
| 1001 | 9 | 12 bit | 2 samples | 1.06 ms |
|
||||||
|
| 1010 | 10 | 12 bit | 4 samples | 2.13 ms |
|
||||||
|
| 1011 | 11 | 12 bit | 8 samples | 4.26 ms |
|
||||||
|
| 1100 | 12 | 12 bit | 16 samples | 8.51 ms |
|
||||||
|
| 1101 | 13 | 12 bit | 32 samples | 17.02 ms |
|
||||||
|
| 1110 | 14 | 12 bit | 64 samples | 34.05 ms |
|
||||||
|
| 1111 | 15 | 12 bit | 128 samples | 68.10 ms |
|
||||||
|
|
||||||
|
- note that a new value set can substantially increase the conversion time.
|
||||||
- note that you cannot set e.g. 9 bits and 16 samples.
|
- note that you cannot set e.g. 9 bits and 16 samples.
|
||||||
|
- note that there are 3 ways to set 12 bits 1 sample.
|
||||||
|
|
||||||
|
|
||||||
#### Operating mode
|
#### Operating mode
|
||||||
@ -185,10 +246,12 @@ minus - == don't care
|
|||||||
See details datasheet,
|
See details datasheet,
|
||||||
|
|
||||||
- **bool setMode(uint8_t mode = 7)** mode = 0..7.
|
- **bool setMode(uint8_t mode = 7)** mode = 0..7.
|
||||||
The value 7 == ShuntBusContinuous mode.
|
The default value 7 == ShuntBusContinuous mode.
|
||||||
|
Returns false if parameter out of range (mode > 7).
|
||||||
|
Returns false if it could not write settings to device.
|
||||||
- **uint8_t getMode()** returns the mode (0..7) set.
|
- **uint8_t getMode()** returns the mode (0..7) set.
|
||||||
|
|
||||||
Descriptive mode functions (convenience wrappers).
|
Descriptive mode functions (convenience wrappers around **setMode()**).
|
||||||
|
|
||||||
- **bool shutDown()** mode 0
|
- **bool shutDown()** mode 0
|
||||||
- **bool setModeShuntTrigger()** mode 1 - how to trigger to be investigated.
|
- **bool setModeShuntTrigger()** mode 1 - how to trigger to be investigated.
|
||||||
@ -212,6 +275,8 @@ From this the LSB is derived.
|
|||||||
Note the function will round up the LSB to nearest round value by default.
|
Note the function will round up the LSB to nearest round value by default.
|
||||||
This may cause loss of precision. The function may force normalization if underflow detected.
|
This may cause loss of precision. The function may force normalization if underflow detected.
|
||||||
The user **must** check the return value == true, otherwise the calibration register is **not** set.
|
The user **must** check the return value == true, otherwise the calibration register is **not** set.
|
||||||
|
Returns false if parameter out of range.
|
||||||
|
Returns false if it could not write settings to device.
|
||||||
- **bool isCalibrated()** returns true if CurrentLSB has been calculated by **setMaxCurrentShunt()**.
|
- **bool isCalibrated()** returns true if CurrentLSB has been calculated by **setMaxCurrentShunt()**.
|
||||||
- **float getCurrentLSB()** returns the LSB in Ampere == precision of the calibration.
|
- **float getCurrentLSB()** returns the LSB in Ampere == precision of the calibration.
|
||||||
- **float getCurrentLSB_mA()** returns the LSB in milliampere.
|
- **float getCurrentLSB_mA()** returns the LSB in milliampere.
|
||||||
@ -223,9 +288,19 @@ To print these values one might use https://github.com/RobTillaart/printHelpers
|
|||||||
to get the values in scientific notation like "3.5e-6"
|
to get the values in scientific notation like "3.5e-6"
|
||||||
|
|
||||||
|
|
||||||
#### debugging
|
#### Debugging
|
||||||
|
|
||||||
- **uint16_t getRegister(uint8_t reg)** fetch registers directly, meant for debugging only. Check datasheet.
|
- **uint16_t getRegister(uint8_t reg)** fetch values from registers directly.
|
||||||
|
Meant for debugging only, reg = 0..5. Check datasheet for the details.
|
||||||
|
|
||||||
|
| reg | description | RW |
|
||||||
|
|:-----:|:----------------|:----:|
|
||||||
|
| 0 | configuration | RW |
|
||||||
|
| 1 | shunt voltage | R |
|
||||||
|
| 2 | bus voltage | R |
|
||||||
|
| 3 | power | R |
|
||||||
|
| 4 | current | R |
|
||||||
|
| 5 | calibration | RW |
|
||||||
|
|
||||||
|
|
||||||
## Future
|
## Future
|
||||||
@ -240,6 +315,10 @@ to get the values in scientific notation like "3.5e-6"
|
|||||||
|
|
||||||
#### Should
|
#### Should
|
||||||
|
|
||||||
|
- sync INA226 where meaningful
|
||||||
|
- improve error handling
|
||||||
|
- low level I2C, readRegister() + writeRegister()
|
||||||
|
- other? parameters
|
||||||
- create unit tests
|
- create unit tests
|
||||||
- test performance
|
- test performance
|
||||||
- verify conversion time
|
- verify conversion time
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "INA219.h"
|
#include "INA219.h"
|
||||||
#include "Wire.h"
|
|
||||||
|
|
||||||
INA219 INA(0x40);
|
INA219 INA(0x40);
|
||||||
|
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "INA219.h"
|
#include "INA219.h"
|
||||||
#include "Wire.h"
|
|
||||||
|
|
||||||
INA219 INA(0x40);
|
INA219 INA(0x40);
|
||||||
|
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "INA219.h"
|
#include "INA219.h"
|
||||||
#include "Wire.h"
|
|
||||||
|
|
||||||
INA219 INA(0x40);
|
INA219 INA(0x40);
|
||||||
|
|
||||||
@ -87,7 +86,7 @@ void setup()
|
|||||||
///////////////////////////////////////////////
|
///////////////////////////////////////////////
|
||||||
|
|
||||||
Serial.print("BADC:\t");
|
Serial.print("BADC:\t");
|
||||||
for (uint8_t b = 0; b < 8; b++)
|
for (uint8_t b = 0; b < 16; b++)
|
||||||
{
|
{
|
||||||
INA.setBusADC(b);
|
INA.setBusADC(b);
|
||||||
Serial.print(INA.getBusADC());
|
Serial.print(INA.getBusADC());
|
||||||
@ -99,7 +98,7 @@ void setup()
|
|||||||
///////////////////////////////////////////////
|
///////////////////////////////////////////////
|
||||||
|
|
||||||
Serial.print("SADC:\t");
|
Serial.print("SADC:\t");
|
||||||
for (uint8_t s = 0; s < 8; s++)
|
for (uint8_t s = 0; s < 16; s++)
|
||||||
{
|
{
|
||||||
INA.setShuntADC(s);
|
INA.setShuntADC(s);
|
||||||
Serial.print(INA.getShuntADC());
|
Serial.print(INA.getShuntADC());
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "INA219.h"
|
#include "INA219.h"
|
||||||
#include "Wire.h"
|
|
||||||
|
|
||||||
INA219 INA(0x40);
|
INA219 INA(0x40);
|
||||||
|
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "INA219.h"
|
#include "INA219.h"
|
||||||
#include "Wire.h"
|
|
||||||
|
|
||||||
INA219 INA(0x40);
|
INA219 INA(0x40);
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ INA219 KEYWORD1
|
|||||||
# Methods and Functions (KEYWORD2)
|
# Methods and Functions (KEYWORD2)
|
||||||
begin KEYWORD2
|
begin KEYWORD2
|
||||||
isConnected KEYWORD2
|
isConnected KEYWORD2
|
||||||
|
getAddress KEYWORD2
|
||||||
|
|
||||||
getShuntVoltage KEYWORD2
|
getShuntVoltage KEYWORD2
|
||||||
getBusVoltage KEYWORD2
|
getBusVoltage KEYWORD2
|
||||||
@ -17,9 +18,11 @@ getMathOverflowFlag KEYWORD2
|
|||||||
getConversionFlag KEYWORD2
|
getConversionFlag KEYWORD2
|
||||||
|
|
||||||
getBusVoltage_mV KEYWORD2
|
getBusVoltage_mV KEYWORD2
|
||||||
getShuntVoltage_uV KEYWORD2
|
getShuntVoltage_mV KEYWORD2
|
||||||
getCurrent_mA KEYWORD2
|
getCurrent_mA KEYWORD2
|
||||||
getPower_mW KEYWORD2
|
getPower_mW KEYWORD2
|
||||||
|
|
||||||
|
getBusVoltage_uV KEYWORD2
|
||||||
getShuntVoltage_uV KEYWORD2
|
getShuntVoltage_uV KEYWORD2
|
||||||
getCurrent_uA KEYWORD2
|
getCurrent_uA KEYWORD2
|
||||||
getPower_uW KEYWORD2
|
getPower_uW KEYWORD2
|
||||||
@ -29,8 +32,14 @@ setBusVoltageRange KEYWORD2
|
|||||||
getBusVoltageRange KEYWORD2
|
getBusVoltageRange KEYWORD2
|
||||||
setGain KEYWORD2
|
setGain KEYWORD2
|
||||||
getGain KEYWORD2
|
getGain KEYWORD2
|
||||||
|
|
||||||
|
setBusResolution KEYWORD2
|
||||||
|
setBusSamples KEYWORD2
|
||||||
setBusADC KEYWORD2
|
setBusADC KEYWORD2
|
||||||
getBusADC KEYWORD2
|
getBusADC KEYWORD2
|
||||||
|
|
||||||
|
setShuntResolution KEYWORD2
|
||||||
|
setShuntSamples KEYWORD2
|
||||||
setShuntADC KEYWORD2
|
setShuntADC KEYWORD2
|
||||||
getShuntADC KEYWORD2
|
getShuntADC KEYWORD2
|
||||||
|
|
||||||
@ -46,6 +55,16 @@ setModeShuntContinuous KEYWORD2
|
|||||||
setModeBusContinuous KEYWORD2
|
setModeBusContinuous KEYWORD2
|
||||||
setModeShuntBusContinuous KEYWORD2
|
setModeShuntBusContinuous KEYWORD2
|
||||||
|
|
||||||
|
setMaxCurrentShunt KEYWORD2
|
||||||
|
isCalibrated KEYWORD2
|
||||||
|
|
||||||
|
getCurrentLSB KEYWORD2
|
||||||
|
getCurrentLSB_mA KEYWORD2
|
||||||
|
getCurrentLSB_uA KEYWORD2
|
||||||
|
getShunt KEYWORD2
|
||||||
|
getMaxCurrent KEYWORD2
|
||||||
|
|
||||||
|
getRegister KEYWORD2
|
||||||
|
|
||||||
# Constants (LITERAL1)
|
# Constants (LITERAL1)
|
||||||
INA219_LIB_VERSION LITERAL1
|
INA219_LIB_VERSION LITERAL1
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/RobTillaart/INA219.git"
|
"url": "https://github.com/RobTillaart/INA219.git"
|
||||||
},
|
},
|
||||||
"version": "0.2.0",
|
"version": "0.2.1",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"frameworks": "*",
|
"frameworks": "*",
|
||||||
"platforms": "*",
|
"platforms": "*",
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
name=INA219
|
name=INA219
|
||||||
version=0.2.0
|
version=0.2.1
|
||||||
author=Rob Tillaart <rob.tillaart@gmail.com>
|
author=Rob Tillaart <rob.tillaart@gmail.com>
|
||||||
maintainer=Rob Tillaart <rob.tillaart@gmail.com>
|
maintainer=Rob Tillaart <rob.tillaart@gmail.com>
|
||||||
sentence=Arduino library for INA219 voltage, current and power sensor.
|
sentence=Arduino library for INA219 voltage, current and power sensor.
|
||||||
|
Loading…
Reference in New Issue
Block a user