mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-10-03 18:09:02 -04:00
0.4.0 INA226
This commit is contained in:
parent
7d22ccd45d
commit
459bb84ac2
@ -1,6 +1,6 @@
|
|||||||
// FILE: INA226.cpp
|
// FILE: INA226.cpp
|
||||||
// AUTHOR: Rob Tillaart
|
// AUTHOR: Rob Tillaart
|
||||||
// VERSION: 0.3.0
|
// VERSION: 0.4.0
|
||||||
// DATE: 2021-05-18
|
// DATE: 2021-05-18
|
||||||
// PURPOSE: Arduino library for INA226 power sensor
|
// PURPOSE: Arduino library for INA226 power sensor
|
||||||
// URL: https://github.com/RobTillaart/INA226
|
// URL: https://github.com/RobTillaart/INA226
|
||||||
@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
#include "INA226.h"
|
#include "INA226.h"
|
||||||
|
|
||||||
|
// REGISTERS
|
||||||
#define INA226_CONFIGURATION 0x00
|
#define INA226_CONFIGURATION 0x00
|
||||||
#define INA226_SHUNT_VOLTAGE 0x01
|
#define INA226_SHUNT_VOLTAGE 0x01
|
||||||
#define INA226_BUS_VOLTAGE 0x02
|
#define INA226_BUS_VOLTAGE 0x02
|
||||||
@ -32,13 +33,13 @@
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Constructor
|
// Constructor
|
||||||
//
|
//
|
||||||
INA226::INA226(const uint8_t address, TwoWire *wire)
|
INA226::INA226(const uint8_t address, TwoWire *wire)
|
||||||
{
|
{
|
||||||
_address = address;
|
_address = address;
|
||||||
_wire = wire;
|
_wire = wire;
|
||||||
// not calibrated values by default.
|
// not calibrated values by default.
|
||||||
_current_LSB = 0;
|
_current_LSB = 0;
|
||||||
_maxCurrent = 0;
|
_maxCurrent = 0;
|
||||||
_shunt = 0;
|
_shunt = 0;
|
||||||
@ -79,26 +80,26 @@ uint8_t INA226::getAddress()
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Core functions
|
// Core functions
|
||||||
//
|
//
|
||||||
float INA226::getShuntVoltage()
|
float INA226::getShuntVoltage()
|
||||||
{
|
{
|
||||||
int16_t val = _readRegister(INA226_SHUNT_VOLTAGE);
|
int16_t val = _readRegister(INA226_SHUNT_VOLTAGE);
|
||||||
return val * 2.5e-6; // fixed 2.50 uV
|
return val * 2.5e-6; // fixed 2.50 uV
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
float INA226::getBusVoltage()
|
float INA226::getBusVoltage()
|
||||||
{
|
{
|
||||||
uint16_t val = _readRegister(INA226_BUS_VOLTAGE);
|
uint16_t val = _readRegister(INA226_BUS_VOLTAGE);
|
||||||
return val * 1.25e-3; // fixed 1.25 mV
|
return val * 1.25e-3; // fixed 1.25 mV
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
float INA226::getPower()
|
float INA226::getPower()
|
||||||
{
|
{
|
||||||
uint16_t val = _readRegister(INA226_POWER);
|
uint16_t val = _readRegister(INA226_POWER);
|
||||||
return val * 25 * _current_LSB;
|
return val * 25 * _current_LSB; // fixed 25 Watt
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -111,14 +112,14 @@ float INA226::getCurrent()
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Configuration
|
// Configuration
|
||||||
//
|
//
|
||||||
void INA226::reset()
|
void INA226::reset()
|
||||||
{
|
{
|
||||||
uint16_t mask = _readRegister(INA226_CONFIGURATION);
|
uint16_t mask = _readRegister(INA226_CONFIGURATION);
|
||||||
mask |= INA226_CONF_RESET_MASK;
|
mask |= INA226_CONF_RESET_MASK;
|
||||||
_writeRegister(INA226_CONFIGURATION, mask);
|
_writeRegister(INA226_CONFIGURATION, mask);
|
||||||
// reset calibration
|
// reset calibration
|
||||||
_current_LSB = 0;
|
_current_LSB = 0;
|
||||||
_maxCurrent = 0;
|
_maxCurrent = 0;
|
||||||
_shunt = 0;
|
_shunt = 0;
|
||||||
@ -187,16 +188,18 @@ uint8_t INA226::getShuntVoltageConversionTime()
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Calibration
|
// Calibration
|
||||||
//
|
//
|
||||||
bool INA226::setMaxCurrentShunt(float maxCurrent, float shunt, bool normalize)
|
int INA226::setMaxCurrentShunt(float maxCurrent, float shunt, bool normalize)
|
||||||
{
|
{
|
||||||
// #define printdebug true
|
// #define printdebug true
|
||||||
uint32_t calib = 0;
|
|
||||||
uint32_t factor = 1;
|
|
||||||
|
|
||||||
if ((maxCurrent > 20) || (maxCurrent < 0.001)) return false;
|
// fix #16 - datasheet 6.5 Electrical Characteristics
|
||||||
if (shunt < 0.001) return false;
|
// rounded value to 80 mV
|
||||||
|
float shuntVoltage = abs(maxCurrent * shunt);
|
||||||
|
if (shuntVoltage > 0.080) return INA226_ERR_SHUNTVOLTAGE_HIGH;
|
||||||
|
if (maxCurrent < 0.001) return INA226_ERR_MAXCURRENT_LOW;
|
||||||
|
if (shunt < 0.001) return INA226_ERR_SHUNT_LOW;
|
||||||
|
|
||||||
_current_LSB = maxCurrent * 3.0517578125e-5; // maxCurrent / 32768;
|
_current_LSB = maxCurrent * 3.0517578125e-5; // maxCurrent / 32768;
|
||||||
|
|
||||||
@ -209,8 +212,11 @@ bool INA226::setMaxCurrentShunt(float maxCurrent, float shunt, bool normalize)
|
|||||||
Serial.println(" uA / bit");
|
Serial.println(" uA / bit");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// normalize the LSB to a round number
|
uint32_t calib = 0;
|
||||||
// LSB will increase
|
uint32_t factor = 1;
|
||||||
|
|
||||||
|
// normalize the LSB to a round number
|
||||||
|
// LSB will increase
|
||||||
if (normalize)
|
if (normalize)
|
||||||
{
|
{
|
||||||
calib = round(0.00512 / (_current_LSB * shunt));
|
calib = round(0.00512 / (_current_LSB * shunt));
|
||||||
@ -222,7 +228,7 @@ bool INA226::setMaxCurrentShunt(float maxCurrent, float shunt, bool normalize)
|
|||||||
Serial.println(" uA / bit");
|
Serial.println(" uA / bit");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// auto scale current_LSB
|
// auto scale current_LSB
|
||||||
factor = 1;
|
factor = 1;
|
||||||
while (_current_LSB < 1)
|
while (_current_LSB < 1)
|
||||||
{
|
{
|
||||||
@ -232,7 +238,7 @@ bool INA226::setMaxCurrentShunt(float maxCurrent, float shunt, bool normalize)
|
|||||||
_current_LSB = 1.0 / factor;
|
_current_LSB = 1.0 / factor;
|
||||||
}
|
}
|
||||||
|
|
||||||
// auto scale calibration
|
// auto scale calibration
|
||||||
calib = round(0.00512 / (_current_LSB * shunt));
|
calib = round(0.00512 / (_current_LSB * shunt));
|
||||||
while (calib > 65535)
|
while (calib > 65535)
|
||||||
{
|
{
|
||||||
@ -241,7 +247,7 @@ bool INA226::setMaxCurrentShunt(float maxCurrent, float shunt, bool normalize)
|
|||||||
}
|
}
|
||||||
_writeRegister(INA226_CALIBRATION, calib);
|
_writeRegister(INA226_CALIBRATION, calib);
|
||||||
|
|
||||||
_maxCurrent = _current_LSB * 32768.0;
|
_maxCurrent = _current_LSB * 32768;
|
||||||
_shunt = shunt;
|
_shunt = shunt;
|
||||||
|
|
||||||
#ifdef printdebug
|
#ifdef printdebug
|
||||||
@ -258,15 +264,18 @@ bool INA226::setMaxCurrentShunt(float maxCurrent, float shunt, bool normalize)
|
|||||||
Serial.print("Shunt:\t");
|
Serial.print("Shunt:\t");
|
||||||
Serial.print(_shunt, 8);
|
Serial.print(_shunt, 8);
|
||||||
Serial.println(" ohm");
|
Serial.println(" ohm");
|
||||||
|
Serial.print("ShuntV:\t");
|
||||||
|
Serial.print(shuntVoltage, 4);
|
||||||
|
Serial.println(" Volt");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return true;
|
return INA226_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// operating mode
|
// operating mode
|
||||||
//
|
//
|
||||||
bool INA226::setMode(uint8_t mode)
|
bool INA226::setMode(uint8_t mode)
|
||||||
{
|
{
|
||||||
@ -332,7 +341,7 @@ uint16_t INA226::getDieID()
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// PRIVATE
|
// PRIVATE
|
||||||
//
|
//
|
||||||
uint16_t INA226::_readRegister(uint8_t reg)
|
uint16_t INA226::_readRegister(uint8_t reg)
|
||||||
{
|
{
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
// FILE: INA226.h
|
// FILE: INA226.h
|
||||||
// AUTHOR: Rob Tillaart
|
// AUTHOR: Rob Tillaart
|
||||||
// VERSION: 0.3.0
|
// VERSION: 0.4.0
|
||||||
// DATE: 2021-05-18
|
// DATE: 2021-05-18
|
||||||
// PURPOSE: Arduino library for INA226 power sensor
|
// PURPOSE: Arduino library for INA226 power sensor
|
||||||
// URL: https://github.com/RobTillaart/INA226
|
// URL: https://github.com/RobTillaart/INA226
|
||||||
@ -14,10 +14,10 @@
|
|||||||
#include "Wire.h"
|
#include "Wire.h"
|
||||||
|
|
||||||
|
|
||||||
#define INA226_LIB_VERSION (F("0.3.0"))
|
#define INA226_LIB_VERSION (F("0.4.0"))
|
||||||
|
|
||||||
|
|
||||||
// set by setAlertRegister
|
// set by setAlertRegister
|
||||||
#define INA226_SHUNT_OVER_VOLTAGE 0x8000
|
#define INA226_SHUNT_OVER_VOLTAGE 0x8000
|
||||||
#define INA226_SHUNT_UNDER_VOLTAGE 0x4000
|
#define INA226_SHUNT_UNDER_VOLTAGE 0x4000
|
||||||
#define INA226_BUS_OVER_VOLTAGE 0x2000
|
#define INA226_BUS_OVER_VOLTAGE 0x2000
|
||||||
@ -25,18 +25,25 @@
|
|||||||
#define INA226_POWER_OVER_LIMIT 0x0800
|
#define INA226_POWER_OVER_LIMIT 0x0800
|
||||||
#define INA226_CONVERSION_READY 0x0400
|
#define INA226_CONVERSION_READY 0x0400
|
||||||
|
|
||||||
// returned by getAlertFlag
|
// returned by getAlertFlag
|
||||||
#define INA226_ALERT_FUNCTION_FLAG 0x0010
|
#define INA226_ALERT_FUNCTION_FLAG 0x0010
|
||||||
#define INA226_CONVERSION_READY_FLAG 0x0008
|
#define INA226_CONVERSION_READY_FLAG 0x0008
|
||||||
#define INA226_MATH_OVERFLOW_FLAG 0x0004
|
#define INA226_MATH_OVERFLOW_FLAG 0x0004
|
||||||
#define INA226_ALERT_POLARITY_FLAG 0x0002
|
#define INA226_ALERT_POLARITY_FLAG 0x0002
|
||||||
#define INA226_ALERT_LATCH_ENABLE_FLAG 0x0001
|
#define INA226_ALERT_LATCH_ENABLE_FLAG 0x0001
|
||||||
|
|
||||||
|
// returned by setMaxCurrentShunt
|
||||||
|
#define INA226_ERR_NONE 0x0000
|
||||||
|
#define INA226_ERR_SHUNTVOLTAGE_HIGH 0x8000
|
||||||
|
#define INA226_ERR_MAXCURRENT_LOW 0x8001
|
||||||
|
#define INA226_ERR_SHUNT_LOW 0x8002
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class INA226
|
class INA226
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// address between 0x40 and 0x4F
|
// address between 0x40 and 0x4F
|
||||||
explicit INA226(const uint8_t address, TwoWire *wire = &Wire);
|
explicit INA226(const uint8_t address, TwoWire *wire = &Wire);
|
||||||
|
|
||||||
#if defined (ESP8266) || defined(ESP32)
|
#if defined (ESP8266) || defined(ESP32)
|
||||||
@ -47,14 +54,14 @@ public:
|
|||||||
uint8_t getAddress();
|
uint8_t getAddress();
|
||||||
|
|
||||||
|
|
||||||
// Core functions
|
// Core functions
|
||||||
float getBusVoltage();
|
float getBusVoltage();
|
||||||
float getShuntVoltage();
|
float getShuntVoltage();
|
||||||
float getCurrent();
|
float getCurrent();
|
||||||
float getPower();
|
float getPower();
|
||||||
|
|
||||||
|
|
||||||
// scale helpers
|
// Scale helpers
|
||||||
float getBusVoltage_mV() { return getBusVoltage() * 1e3; };
|
float getBusVoltage_mV() { return getBusVoltage() * 1e3; };
|
||||||
float getShuntVoltage_mV() { return getShuntVoltage() * 1e3; };
|
float getShuntVoltage_mV() { return getShuntVoltage() * 1e3; };
|
||||||
float getCurrent_mA() { return getCurrent() * 1e3; };
|
float getCurrent_mA() { return getCurrent() * 1e3; };
|
||||||
@ -64,7 +71,7 @@ public:
|
|||||||
float getPower_uW() { return getPower() * 1e6; };
|
float getPower_uW() { return getPower() * 1e6; };
|
||||||
|
|
||||||
|
|
||||||
// Configuration
|
// Configuration
|
||||||
void reset();
|
void reset();
|
||||||
bool setAverage(uint8_t avg = 0);
|
bool setAverage(uint8_t avg = 0);
|
||||||
uint8_t getAverage();
|
uint8_t getAverage();
|
||||||
@ -74,16 +81,17 @@ public:
|
|||||||
uint8_t getShuntVoltageConversionTime();
|
uint8_t getShuntVoltageConversionTime();
|
||||||
|
|
||||||
|
|
||||||
// Calibration
|
// Calibration
|
||||||
// mandatory to set these!
|
// mandatory to set these!
|
||||||
// maxCurrent = 0.001 .. 20
|
// shunt * maxCurrent < 81 mV
|
||||||
// shunt >= 0.001
|
// maxCurrent >= 0.001
|
||||||
bool setMaxCurrentShunt(float macCurrent = 20.0,
|
// shunt >= 0.001
|
||||||
|
int setMaxCurrentShunt(float macCurrent = 20.0,
|
||||||
float shunt = 0.002,
|
float shunt = 0.002,
|
||||||
bool normalize = true);
|
bool normalize = true);
|
||||||
bool isCalibrated() { return _current_LSB != 0.0; };
|
bool isCalibrated() { return _current_LSB != 0.0; };
|
||||||
|
|
||||||
// these return zero if not calibrated!
|
// These functions return zero if not calibrated!
|
||||||
float getCurrentLSB() { return _current_LSB; };
|
float getCurrentLSB() { return _current_LSB; };
|
||||||
float getCurrentLSB_mA() { return _current_LSB * 1e3; };
|
float getCurrentLSB_mA() { return _current_LSB * 1e3; };
|
||||||
float getCurrentLSB_uA() { return _current_LSB * 1e6; };
|
float getCurrentLSB_uA() { return _current_LSB * 1e6; };
|
||||||
@ -91,7 +99,7 @@ public:
|
|||||||
float getMaxCurrent() { return _maxCurrent; };
|
float getMaxCurrent() { return _maxCurrent; };
|
||||||
|
|
||||||
|
|
||||||
// Operating mode
|
// Operating mode
|
||||||
bool setMode(uint8_t mode = 7);
|
bool setMode(uint8_t mode = 7);
|
||||||
uint8_t getMode();
|
uint8_t getMode();
|
||||||
bool shutDown() { return setMode(0); };
|
bool shutDown() { return setMode(0); };
|
||||||
@ -103,24 +111,24 @@ public:
|
|||||||
bool setModeShuntBusContinuous() { return setMode(7); }; // default.
|
bool setModeShuntBusContinuous() { return setMode(7); }; // default.
|
||||||
|
|
||||||
|
|
||||||
// Alert
|
// Alert
|
||||||
// - separate functions per flag?
|
// - separate functions per flag?
|
||||||
// - what is a reasonable limit?
|
// - what is a reasonable limit?
|
||||||
// - which units to define a limit per mask ?
|
// - which units to define a limit per mask ?
|
||||||
// same as voltage registers ?
|
// same as voltage registers ?
|
||||||
// - how to test
|
// - how to test
|
||||||
void setAlertRegister(uint16_t mask);
|
void setAlertRegister(uint16_t mask);
|
||||||
uint16_t getAlertFlag();
|
uint16_t getAlertFlag();
|
||||||
void setAlertLimit(uint16_t limit);
|
void setAlertLimit(uint16_t limit);
|
||||||
uint16_t getAlertLimit();
|
uint16_t getAlertLimit();
|
||||||
|
|
||||||
|
|
||||||
// Meta information
|
// Meta information
|
||||||
uint16_t getManufacturerID(); // should return 0x5449
|
uint16_t getManufacturerID(); // should return 0x5449
|
||||||
uint16_t getDieID(); // should return 0x2260
|
uint16_t getDieID(); // should return 0x2260
|
||||||
|
|
||||||
|
|
||||||
// DEBUG
|
// DEBUG
|
||||||
uint16_t getRegister(uint8_t reg) { return _readRegister(reg); };
|
uint16_t getRegister(uint8_t reg) { return _readRegister(reg); };
|
||||||
|
|
||||||
|
|
||||||
|
@ -155,8 +155,10 @@ Note the value returned is not a unit of time.
|
|||||||
| 6 | 4.2 ms |
|
| 6 | 4.2 ms |
|
||||||
| 7 | 8.3 ms |
|
| 7 | 8.3 ms |
|
||||||
|
|
||||||
|
Note: times are typical, check datasheet for operational range.
|
||||||
|
(max is ~10% higher)
|
||||||
|
|
||||||
Note that total conversion time can take up to 1024 \* 8.3 ms ~ 10 seconds.
|
Note: total conversion time can take up to 1024 \* 8.3 ms ~ 10 seconds.
|
||||||
|
|
||||||
|
|
||||||
### Calibration
|
### Calibration
|
||||||
@ -167,10 +169,8 @@ Calibration is mandatory to get **getCurrent()** and **getPower()** to work.
|
|||||||
|
|
||||||
- **bool setMaxCurrentShunt(float ampere = 20.0, float ohm = 0.002, bool normalize = true)**
|
- **bool setMaxCurrentShunt(float ampere = 20.0, float ohm = 0.002, bool normalize = true)**
|
||||||
set the calibration register based upon the shunt and the max ampere.
|
set the calibration register based upon the shunt and the max ampere.
|
||||||
From this the LSB is derived.
|
From this the LSB is derived.
|
||||||
Note the function will round up the LSB to nearest round value by default.
|
The function may force normalization if underflow is 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.
|
|
||||||
- **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.
|
||||||
@ -178,7 +178,26 @@ The user **must** check the return value == true, otherwise the calibration regi
|
|||||||
- **float getShunt()** returns the value set for the shunt.
|
- **float getShunt()** returns the value set for the shunt.
|
||||||
- **float getMaxCurrent()** returns the value for the maxCurrent which can be corrected.
|
- **float getMaxCurrent()** returns the value for the maxCurrent which can be corrected.
|
||||||
|
|
||||||
To print these values one might use https://github.com/RobTillaart/printHelpers
|
To print these values in scientific notation use https://github.com/RobTillaart/printHelpers
|
||||||
|
|
||||||
|
|
||||||
|
#### About normalization
|
||||||
|
|
||||||
|
**setMaxCurrentShunt()** will round the LSB to nearest round value (typical 0.001) by default (normalize == true).
|
||||||
|
- The user **must** check the return value == 0x000, otherwise the calibration register is **not** set.
|
||||||
|
- Normalization typically gives smaller steps => improve precision
|
||||||
|
- Normalization can cause that the maxCurrent passed cannot be reached any more.
|
||||||
|
Solution is not to normalize if this max range is needed.
|
||||||
|
|
||||||
|
|
||||||
|
#### Error codes setMaxCurrentShunt
|
||||||
|
|
||||||
|
| descriptive name error | value | meaning |
|
||||||
|
|:-----------------------------|-------:|:--------|
|
||||||
|
| INA226_ERR_NONE | 0x0000 | OK
|
||||||
|
| INA226_ERR_SHUNTVOLTAGE_HIGH | 0x8000 | maxCurrent \* shunt > 80 mV
|
||||||
|
| INA226_ERR_MAXCURRENT_LOW | 0x8001 | maxCurrent < 0.001
|
||||||
|
| INA226_ERR_SHUNT_LOW | 0x8002 | shunt < 0.001
|
||||||
|
|
||||||
|
|
||||||
### Operating mode
|
### Operating mode
|
||||||
@ -250,25 +269,42 @@ See examples..
|
|||||||
|
|
||||||
## Future
|
## Future
|
||||||
|
|
||||||
- test different loads (low edge)
|
#### Should
|
||||||
- expand unit tests possible?
|
|
||||||
- test examples
|
- test different loads (low edge).
|
||||||
- investigate alert functions / interface
|
- test examples.
|
||||||
- disconnected load,
|
- investigate alert functions / interface.
|
||||||
|
- disconnected load.
|
||||||
- can it be recognized? => current drop?
|
- can it be recognized? => current drop?
|
||||||
- **lastError()** do we need this
|
|
||||||
- if **BVCT SVCT** is set to 6 or 7
|
|
||||||
- does the long timing affects RTOS? ==> yield()
|
#### Could
|
||||||
- cache configuration ? ==> 2 bytes
|
|
||||||
- what is gained? updates are faster.
|
- can the calibration math be optimized?
|
||||||
- 15 times used,
|
|
||||||
- can the calibration math be optimized
|
|
||||||
- integer only?
|
- integer only?
|
||||||
- less iterations?
|
- less iterations?
|
||||||
- local var for current_lsb?
|
|
||||||
- ??
|
- ??
|
||||||
- make defines of "magic" numbers
|
- make defines of "magic" numbers
|
||||||
|
- const floats (most used only once)
|
||||||
|
|
||||||
|
|
||||||
|
#### Won't
|
||||||
|
|
||||||
|
- **lastError()** do we need this?
|
||||||
|
- no
|
||||||
|
- if **BVCT SVCT** is set to 6 or 7
|
||||||
|
- does the long timing affects RTOS? ==> yield()
|
||||||
|
- wait for issue
|
||||||
|
- expand unit tests possible?
|
||||||
|
- need virtual device => too much work
|
||||||
|
- cache configuration ? ==> 2 bytes.
|
||||||
|
- what is gained? updates are faster. footprint code?
|
||||||
|
- how often operational?
|
||||||
|
- 15 times used..
|
||||||
|
|
||||||
|
|
||||||
## Resources
|
## Resources
|
||||||
|
|
||||||
- [TI - INA226 Details](https://www.ti.com/product/INA226#params)
|
- [TI - INA226 Details](https://www.ti.com/product/INA226#params)
|
||||||
- [TI - INA226 datasheet](https://www.ti.com/document-viewer/INA226/datasheet)
|
- [TI - INA226 datasheet](https://www.ti.com/document-viewer/INA226/datasheet)
|
||||||
|
|
||||||
|
@ -0,0 +1,45 @@
|
|||||||
|
//
|
||||||
|
// FILE: INA226_compare_normalize.ino
|
||||||
|
// AUTHOR: Rob Tillaart
|
||||||
|
// PURPOSE: show difference in normalize flag
|
||||||
|
// URL: https://github.com/RobTillaart/INA226
|
||||||
|
|
||||||
|
|
||||||
|
#include "INA226.h"
|
||||||
|
#include "Wire.h"
|
||||||
|
|
||||||
|
INA226 INA(0x40);
|
||||||
|
|
||||||
|
|
||||||
|
void setup()
|
||||||
|
{
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.println(__FILE__);
|
||||||
|
|
||||||
|
Wire.begin();
|
||||||
|
if (!INA.begin() )
|
||||||
|
{
|
||||||
|
Serial.println("could not connect. Fix and Reboot");
|
||||||
|
}
|
||||||
|
INA.setMaxCurrentShunt(79, 0.001, true);
|
||||||
|
Serial.print("\nNormalize = true\n");
|
||||||
|
Serial.print("MaxCurrent:\t");
|
||||||
|
Serial.println(INA.getMaxCurrent(), 3);
|
||||||
|
Serial.print("currentLSB:\t");
|
||||||
|
Serial.println(INA.getCurrentLSB(), 5);
|
||||||
|
|
||||||
|
INA.setMaxCurrentShunt(79, 0.001, false);
|
||||||
|
Serial.print("\nNormalize = false\n");
|
||||||
|
Serial.print("MaxCurrent:\t");
|
||||||
|
Serial.println(INA.getMaxCurrent(), 3);
|
||||||
|
Serial.print("currentLSB:\t");
|
||||||
|
Serial.println(INA.getCurrentLSB(), 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -- END OF FILE --
|
@ -74,3 +74,8 @@ INA226_MATH_OVERFLOW_FLAG LITERAL1
|
|||||||
INA226_ALERT_POLARITY_FLAG LITERAL1
|
INA226_ALERT_POLARITY_FLAG LITERAL1
|
||||||
INA226_ALERT_LATCH_ENABLE_FLAG LITERAL1
|
INA226_ALERT_LATCH_ENABLE_FLAG LITERAL1
|
||||||
|
|
||||||
|
INA226_ERR_NONE LITERAL1
|
||||||
|
INA226_ERR_SHUNTVOLTAGE_HIGH LITERAL1
|
||||||
|
INA226_ERR_MAXCURRENT_LOW LITERAL1
|
||||||
|
INA226_ERR_SHUNT_LOW LITERAL1
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/RobTillaart/INA226.git"
|
"url": "https://github.com/RobTillaart/INA226.git"
|
||||||
},
|
},
|
||||||
"version": "0.3.0",
|
"version": "0.4.0",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"frameworks": "arduino",
|
"frameworks": "arduino",
|
||||||
"platforms": "*",
|
"platforms": "*",
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
name=INA226
|
name=INA226
|
||||||
version=0.3.0
|
version=0.4.0
|
||||||
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 INA226 power sensor
|
sentence=Arduino library for INA226 power sensor
|
||||||
|
@ -3,6 +3,14 @@
|
|||||||
|
|
||||||
## Release notes
|
## Release notes
|
||||||
|
|
||||||
|
## 0.4.0 2022-08-XX
|
||||||
|
- fix #16 - change error to warning for max current
|
||||||
|
setMaxCurrentShunt now returns an int indicating OK == 0
|
||||||
|
otherwise error. See INA226.h for error codes.
|
||||||
|
- updated readme.md
|
||||||
|
- updated unit tests (error codes)
|
||||||
|
|
||||||
|
|
||||||
## 0.3.0 2022-07-01
|
## 0.3.0 2022-07-01
|
||||||
- fix #14 RESET FLAG
|
- fix #14 RESET FLAG
|
||||||
- add getAddress()
|
- add getAddress()
|
||||||
|
@ -73,6 +73,11 @@ unittest(test_constants)
|
|||||||
assertEqual(0x0004, INA226_MATH_OVERFLOW_FLAG);
|
assertEqual(0x0004, INA226_MATH_OVERFLOW_FLAG);
|
||||||
assertEqual(0x0002, INA226_ALERT_POLARITY_FLAG);
|
assertEqual(0x0002, INA226_ALERT_POLARITY_FLAG);
|
||||||
assertEqual(0x0001, INA226_ALERT_LATCH_ENABLE_FLAG);
|
assertEqual(0x0001, INA226_ALERT_LATCH_ENABLE_FLAG);
|
||||||
|
|
||||||
|
assertEqual(0x0000, INA226_ERR_NONE);
|
||||||
|
assertEqual(0x8000, INA226_ERR_SHUNTVOLTAGE_HIGH);
|
||||||
|
assertEqual(0x8001, INA226_ERR_MAXCURRENT_LOW);
|
||||||
|
assertEqual(0x8002, INA226_ERR_SHUNT_LOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -114,14 +119,20 @@ unittest(test_calibration)
|
|||||||
INA226 INA(0x40);
|
INA226 INA(0x40);
|
||||||
// assertTrue(INA.begin());
|
// assertTrue(INA.begin());
|
||||||
|
|
||||||
// only errors can be tested
|
assertEqual(INA226_ERR_NONE, INA.setMaxCurrentShunt(30, 0.002));
|
||||||
assertFalse(INA.setMaxCurrentShunt(30));
|
assertEqual(INA226_ERR_NONE, INA.setMaxCurrentShunt(1, 0.05));
|
||||||
assertFalse(INA.setMaxCurrentShunt(0.0009));
|
assertEqual(INA226_ERR_NONE, INA.setMaxCurrentShunt(1, 0.080));
|
||||||
assertFalse(INA.setMaxCurrentShunt(0));
|
|
||||||
assertFalse(INA.setMaxCurrentShunt(-1));
|
|
||||||
|
|
||||||
assertFalse(INA.setMaxCurrentShunt(10, 0));
|
assertEqual(INA226_ERR_SHUNTVOLTAGE_HIGH, INA.setMaxCurrentShunt(80.1, 0.001));
|
||||||
assertFalse(INA.setMaxCurrentShunt(10, 0.0009));
|
assertEqual(INA226_ERR_SHUNTVOLTAGE_HIGH, INA.setMaxCurrentShunt(40.1, 0.002));
|
||||||
|
assertEqual(INA226_ERR_SHUNTVOLTAGE_HIGH, INA.setMaxCurrentShunt(20.1, 0.004));
|
||||||
|
assertEqual(INA226_ERR_SHUNTVOLTAGE_HIGH, INA.setMaxCurrentShunt(1.1, 0.080));
|
||||||
|
|
||||||
|
assertEqual(INA226_ERR_MAXCURRENT_LOW, INA.setMaxCurrentShunt(0.0009));
|
||||||
|
assertEqual(INA226_ERR_MAXCURRENT_LOW, INA.setMaxCurrentShunt(0));
|
||||||
|
assertEqual(INA226_ERR_MAXCURRENT_LOW, INA.setMaxCurrentShunt(-1));
|
||||||
|
assertEqual(INA226_ERR_SHUNT_LOW, INA.setMaxCurrentShunt(10, 0));
|
||||||
|
assertEqual(INA226_ERR_SHUNT_LOW, INA.setMaxCurrentShunt(10, 0.0009));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user