11// FILE: INA228.cpp
22// AUTHOR: Rob Tillaart
3- // VERSION: 0.1.4
3+ // VERSION: 0.1.5
44// DATE: 2024-05-09
5- // PURPOSE: Arduino library for INA228 voltage, current and power sensor.
5+ // PURPOSE: Arduino library for the INA228, I2C, 20 bit, voltage, current and power sensor.
66// URL: https://github.com/RobTillaart/INA228
77// https://www.adafruit.com/product/5832 ( 10 A version)
88// https://www.mateksys.com/?portfolio=i2c-ina-bm (200 A version))
4242#define INA228_CFG_CONVDLY 0x3FC0
4343#define INA228_CFG_TEMPCOMP 0x0020
4444#define INA228_CFG_ADCRANGE 0x0010
45- #define INA228_CFG_RESERVED 0x000F
45+ #define INA228_CFG_RESERVED 0x000F // all unused bits
4646
4747
4848// ADC MASKS (register 1)
@@ -71,6 +71,8 @@ INA228::INA228(const uint8_t address, TwoWire *wire)
7171bool INA228::begin ()
7272{
7373 if (! isConnected ()) return false ;
74+
75+ getADCRange ();
7476 return true ;
7577}
7678
@@ -107,7 +109,7 @@ float INA228::getShuntVoltage()
107109{
108110 // shunt_LSB depends on ADCRANGE in INA228_CONFIG register.
109111 float shunt_LSB = 312.5e-9 ; // 312.5 nV
110- if (getADCRange () == 1 )
112+ if (_ADCRange == true )
111113 {
112114 shunt_LSB = 78.125e-9 ; // 78.125 nV
113115 }
@@ -140,7 +142,7 @@ float INA228::getCurrent()
140142// PAGE 26 + 8.1.2
141143float INA228::getPower ()
142144{
143- uint32_t value = _readRegister (INA228_POWER, 3 ) ;
145+ uint32_t value = _readRegister (INA228_POWER, 3 );
144146 // PAGE 31 (8.1.2)
145147 return value * 3.2 * _current_LSB;
146148}
@@ -192,8 +194,8 @@ bool INA228::setAccumulation(uint8_t value)
192194{
193195 if (value > 1 ) return false ;
194196 uint16_t reg = _readRegister (INA228_CONFIG, 2 );
195- reg &= ~INA228_CFG_RSTACC;
196197 if (value == 1 ) reg |= INA228_CFG_RSTACC;
198+ else reg &= ~INA228_CFG_RSTACC;
197199 _writeRegister (INA228_CONFIG, reg);
198200 return true ;
199201}
@@ -221,8 +223,8 @@ uint8_t INA228::getConversionDelay()
221223void INA228::setTemperatureCompensation (bool on)
222224{
223225 uint16_t value = _readRegister (INA228_CONFIG, 2 );
224- value &= ~INA228_CFG_TEMPCOMP;
225226 if (on) value |= INA228_CFG_TEMPCOMP;
227+ else value &= ~INA228_CFG_TEMPCOMP;
226228 _writeRegister (INA228_CONFIG, value);
227229}
228230
@@ -234,16 +236,20 @@ bool INA228::getTemperatureCompensation()
234236
235237void INA228::setADCRange (bool flag)
236238{
239+ // if (flag == _ADCRange) return;
240+ _ADCRange = flag;
237241 uint16_t value = _readRegister (INA228_CONFIG, 2 );
238- value &= ~INA228_CFG_ADCRANGE;
239242 if (flag) value |= INA228_CFG_ADCRANGE;
243+ else value &= ~INA228_CFG_ADCRANGE;
244+ // if value has not changed we do not need to write it back.
240245 _writeRegister (INA228_CONFIG, value);
241246}
242247
243248bool INA228::getADCRange ()
244249{
245250 uint16_t value = _readRegister (INA228_CONFIG, 2 );
246- return (value & INA228_CFG_ADCRANGE) > 0 ;
251+ _ADCRange = (value & INA228_CFG_ADCRANGE) > 0 ;
252+ return _ADCRange;
247253}
248254
249255
@@ -347,7 +353,7 @@ int INA228::setMaxCurrentShunt(float maxCurrent, float shunt)
347353 // PAGE 31 (8.1.2)
348354 float shunt_cal = 13107.2e6 * _current_LSB * _shunt;
349355 // depends on ADCRANGE in INA228_CONFIG register.
350- if (getADCRange () == 1 )
356+ if (_ADCRange == true )
351357 {
352358 shunt_cal *= 4 ;
353359 }
@@ -373,6 +379,7 @@ float INA228::getCurrentLSB()
373379 return _current_LSB;
374380}
375381
382+
376383// //////////////////////////////////////////////////////
377384//
378385// SHUNT TEMPERATURE COEFFICIENT REGISTER 3
@@ -391,7 +398,6 @@ uint16_t INA228::getShuntTemperatureCoefficent()
391398}
392399
393400
394-
395401// //////////////////////////////////////////////////////
396402//
397403// DIAGNOSE ALERT REGISTER 11
@@ -411,7 +417,7 @@ void INA228::setDiagnoseAlertBit(uint8_t bit)
411417{
412418 uint16_t value = _readRegister (INA228_DIAG_ALERT, 2 );
413419 uint16_t mask = (1 << bit);
414- // only write new value if needed.
420+ // only write new value if bit not set
415421 if ((value & mask) == 0 )
416422 {
417423 value |= mask;
@@ -423,7 +429,7 @@ void INA228::clearDiagnoseAlertBit(uint8_t bit)
423429{
424430 uint16_t value = _readRegister (INA228_DIAG_ALERT, 2 );
425431 uint16_t mask = (1 << bit);
426- // only write new value if needed .
432+ // only write new value if bit not set .
427433 if ((value & mask ) != 0 )
428434 {
429435 value &= ~mask;
@@ -471,26 +477,26 @@ uint16_t INA228::getShuntUndervoltageTH()
471477void INA228::setBusOvervoltageTH (uint16_t threshold)
472478{
473479 if (threshold > 0x7FFF ) return ;
474- // float LSB = 3.125e-3;
480+ // float LSB = 3.125e-3; // 3.125 mV/LSB.
475481 _writeRegister (INA228_BOVL, threshold);
476482}
477483
478484uint16_t INA228::getBusOvervoltageTH ()
479485{
480- // float LSB = 3.125e-3;
486+ // float LSB = 3.125e-3; // 3.125 mV/LSB.
481487 return _readRegister (INA228_BOVL, 2 );
482488}
483489
484490void INA228::setBusUndervoltageTH (uint16_t threshold)
485491{
486492 if (threshold > 0x7FFF ) return ;
487- // float LSB = 3.125e-3;
493+ // float LSB = 3.125e-3; // 3.125 mV/LSB.
488494 _writeRegister (INA228_BUVL, threshold);
489495}
490496
491497uint16_t INA228::getBusUndervoltageTH ()
492498{
493- // float LSB = 3.125e-3;
499+ // float LSB = 3.125e-3; // 3.125 mV/LSB.
494500 return _readRegister (INA228_BUVL, 2 );
495501}
496502
0 commit comments