1
1
// FILE: INA229.cpp
2
2
// AUTHOR: Rob Tillaart
3
- // VERSION: 0.1.0
3
+ // VERSION: 0.1.1
4
4
// DATE: 2025-01-22
5
5
// PURPOSE: Arduino library for the INA229, SPI, 20 bit, voltage, current and power sensor.
6
6
// URL: https://github.com/RobTillaart/INA229
@@ -104,6 +104,8 @@ bool INA229::begin()
104
104
digitalWrite (_dataOut, LOW);
105
105
digitalWrite (_clock, LOW);
106
106
}
107
+
108
+ getADCRange ();
107
109
return true ;
108
110
}
109
111
@@ -127,7 +129,7 @@ float INA229::getShuntVoltage()
127
129
{
128
130
// shunt_LSB depends on ADCRANGE in INA229_CONFIG register.
129
131
float shunt_LSB = 312.5e-9 ; // 312.5 nV
130
- if (getADCRange () == 1 )
132
+ if (_ADCRange == true )
131
133
{
132
134
shunt_LSB = 78.125e-9 ; // 78.125 nV
133
135
}
@@ -143,6 +145,18 @@ float INA229::getShuntVoltage()
143
145
return voltage;
144
146
}
145
147
148
+ int32_t INA229::getShuntVoltageRAW ()
149
+ {
150
+ // remove reserved bits.
151
+ uint32_t value = _readRegister (INA229_SHUNT_VOLTAGE, 3 ) >> 4 ;
152
+ // handle negative values (20 bit)
153
+ if (value & 0x00080000 )
154
+ {
155
+ value |= 0xFFF00000 ;
156
+ }
157
+ return (int32_t )value;
158
+ }
159
+
146
160
// PAGE 24 + 8.1.2
147
161
float INA229::getCurrent ()
148
162
{
@@ -176,7 +190,7 @@ float INA229::getTemperature()
176
190
// PAGE 24 + 8.1.2
177
191
double INA229::getEnergy ()
178
192
{
179
- // read 40 bit unsigned as a double to prevent 64 bit ints
193
+ // read 40 bit unsigned as a double to prevent 64 bit integers
180
194
// double might be 8 or 4 byte, depends on platform
181
195
// 40 bit ==> O(10^12)
182
196
double value = _readRegisterF (INA229_ENERGY, 5 );
@@ -188,7 +202,7 @@ double INA229::getEnergy()
188
202
// PAGE 24 + 8.1.2
189
203
double INA229::getCharge ()
190
204
{
191
- // read 40 bit unsigned as a float to prevent 64 bit ints
205
+ // read 40 bit unsigned as a float to prevent 64 bit integers
192
206
// double might be 8 or 4 byte, depends on platform
193
207
// 40 bit ==> O(10^12)
194
208
double value = _readRegisterF (INA229_CHARGE, 5 );
@@ -213,8 +227,8 @@ bool INA229::setAccumulation(uint8_t value)
213
227
{
214
228
if (value > 1 ) return false ;
215
229
uint16_t reg = _readRegister (INA229_CONFIG, 2 );
216
- reg &= ~INA229_CFG_RSTACC;
217
230
if (value == 1 ) reg |= INA229_CFG_RSTACC;
231
+ else reg &= ~INA229_CFG_RSTACC;
218
232
_writeRegister (INA229_CONFIG, reg);
219
233
return true ;
220
234
}
@@ -243,8 +257,8 @@ uint8_t INA229::getConversionDelay()
243
257
void INA229::setTemperatureCompensation (bool on)
244
258
{
245
259
uint16_t value = _readRegister (INA229_CONFIG, 2 );
246
- value &= ~INA229_CFG_TEMPCOMP;
247
260
if (on) value |= INA229_CFG_TEMPCOMP;
261
+ else value &= ~INA229_CFG_TEMPCOMP;
248
262
_writeRegister (INA229_CONFIG, value);
249
263
}
250
264
@@ -257,16 +271,20 @@ bool INA229::getTemperatureCompensation()
257
271
// PAGE 20
258
272
void INA229::setADCRange (bool flag)
259
273
{
274
+ // if (flag == _ADCRange) return;
275
+ _ADCRange = flag;
260
276
uint16_t value = _readRegister (INA229_CONFIG, 2 );
261
- value &= ~INA229_CFG_ADCRANGE;
262
277
if (flag) value |= INA229_CFG_ADCRANGE;
278
+ else value &= ~INA229_CFG_ADCRANGE;
279
+ // if value has not changed we do not need to write it back.
263
280
_writeRegister (INA229_CONFIG, value);
264
281
}
265
282
266
283
bool INA229::getADCRange ()
267
284
{
268
285
uint16_t value = _readRegister (INA229_CONFIG, 2 );
269
- return (value & INA229_CFG_ADCRANGE) > 0 ;
286
+ _ADCRange = (value & INA229_CFG_ADCRANGE) > 0 ;
287
+ return _ADCRange;
270
288
}
271
289
272
290
@@ -372,7 +390,7 @@ int INA229::setMaxCurrentShunt(float maxCurrent, float shunt)
372
390
// PAGE 31 (8.1.2)
373
391
float shunt_cal = 13107.2e6 * _current_LSB * _shunt;
374
392
// depends on ADCRANGE in INA229_CONFIG register.
375
- if (getADCRange () == 1 )
393
+ if (_ADCRange == true )
376
394
{
377
395
shunt_cal *= 4 ;
378
396
}
@@ -598,7 +616,7 @@ bool INA229::usesHWSPI()
598
616
599
617
// //////////////////////////////////////////////////////
600
618
//
601
- // SHOULD BE PROTECTED
619
+ // PRIVATE
602
620
//
603
621
uint32_t INA229::_readRegister (uint8_t reg, uint8_t bytes) // bytes = 2 or 3.
604
622
{
@@ -692,11 +710,6 @@ uint16_t INA229::_writeRegister(uint8_t reg, uint16_t value)
692
710
}
693
711
694
712
695
- // ///////////////////////////////////////////////////////////////////////////
696
- //
697
- // PROTECTED
698
- //
699
-
700
713
uint8_t INA229::swSPI_transfer (uint8_t value)
701
714
{
702
715
uint8_t rv = 0 ;
0 commit comments