11// FILE: INA236.cpp
22// AUTHOR: Rob Tillaart
33// ported from INA226 to INA236 by Josef Tremmel
4- // VERSION: 0.1.0
4+ // VERSION: 0.1.1
55// DATE: 2024-05-27
6- // PURPOSE: Arduino library for INA236 power sensor
6+ // PURPOSE: Arduino library for the INA236, I2C, 16 bit, voltage, current and power sensor.
77// URL: https://github.com/RobTillaart/INA236
88//
99// Read the datasheet for the details
@@ -46,13 +46,14 @@ INA236::INA236(const uint8_t address, TwoWire *wire)
4646 _current_LSB = 0 ;
4747 _maxCurrent = 0 ;
4848 _shunt = 0 ;
49- _voltage_LSB = 2.5e-6 ; // default value of ADC range (80 mV)
5049}
5150
5251
5352bool INA236::begin ()
5453{
5554 if (! isConnected ()) return false ;
55+
56+ getADCRange ();
5657 return true ;
5758}
5859
@@ -76,15 +77,24 @@ uint8_t INA236::getAddress()
7677//
7778float INA236::getBusVoltage ()
7879{
79- uint16_t val = _readRegister (INA236_BUS_VOLTAGE);
80- return val * 1.6e-3 ; // 1.6 mV/LSB fixed
80+ uint16_t value = _readRegister (INA236_BUS_VOLTAGE);
81+ float bus_LSB = 1.6e-3 ; // 1.6 mV/LSB fixed
82+ float voltage = value * bus_LSB;
83+ return voltage;
8184}
8285
8386
8487float INA236::getShuntVoltage ()
8588{
86- int16_t val = _readRegister (INA236_SHUNT_VOLTAGE);
87- return val * _voltage_LSB; // voltage LSB depends on range
89+ // shunt_LSB depends on ADCRANGE in INA236_CONFIG register.
90+ float shunt_LSB = 2.5e-6 ; // 2.5 mV
91+ if (_ADCRange == true )
92+ {
93+ shunt_LSB = 0.625e-6 ; // 625 nV
94+ }
95+ int16_t value = _readRegister (INA236_SHUNT_VOLTAGE);
96+ float voltage = value * shunt_LSB;
97+ return voltage;
8898}
8999
90100
@@ -135,37 +145,27 @@ bool INA236::reset()
135145 _current_LSB = 0 ;
136146 _maxCurrent = 0 ;
137147 _shunt = 0 ;
138- _voltage_LSB = 2.5e-6 ;
139148 return true ;
140149}
141150
142151
143- bool INA236::setADCRange (uint8_t adcRange )
152+ bool INA236::setADCRange (bool flag )
144153{
145- if (adcRange > 1 ) return false ;
154+ _ADCRange = flag ;
146155 uint16_t mask = _readRegister (INA236_CONFIGURATION);
147- mask &= ~INA236_CONF_ADCRANGE_MASK;
148- mask |= (adcRange << 12 );
156+ if (flag) mask |= INA236_CONF_ADCRANGE_MASK;
157+ else mask &= ~INA236_CONF_ADCRANGE_MASK;
158+ // if mask has not changed we do not need to write it back.
149159 _writeRegister (INA236_CONFIGURATION, mask);
150- // adjust voltage / LSB
151- if (adcRange == 1 ) // 20 mV
152- {
153- _voltage_LSB = 0.625e-6 ; // factor 4 smaller
154- }
155- else // 80 mV
156- {
157- _voltage_LSB = 2.5e-6 ;
158- }
159160 return true ;
160161}
161162
162163
163164uint8_t INA236::getADCRange ()
164165{
165166 uint16_t mask = _readRegister (INA236_CONFIGURATION);
166- mask &= INA236_CONF_ADCRANGE_MASK;
167- mask >>= 12 ;
168- return mask;
167+ _ADCRange = (mask & INA236_CONF_ADCRANGE_MASK) > 0 ;
168+ return _ADCRange;
169169}
170170
171171
@@ -269,16 +269,16 @@ int INA236::setMaxCurrentShunt(float maxCurrent, float shunt, bool normalize)
269269 return INA236_ERR_SHUNT_LOW;
270270 }
271271
272- int adcRange;
272+ bool adcRange = false ;
273273 int adcRangeFactor;
274274 if (shuntVoltage <= 0.020 ) // 20 mV
275275 {
276- adcRange = 1 ;
276+ adcRange = true ;
277277 adcRangeFactor = 4 ;
278278 }
279279 else if (shuntVoltage <= 0.080 ) // 80 mV
280280 {
281- adcRange = 0 ;
281+ adcRange = false ;
282282 adcRangeFactor = 1 ;
283283 }
284284 setADCRange (adcRange);
0 commit comments