Skip to content

Commit 6ddd086

Browse files
committed
0.3.0 INA229
1 parent b69e7f6 commit 6ddd086

File tree

9 files changed

+265
-33
lines changed

9 files changed

+265
-33
lines changed

libraries/INA229/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/)
66
and this project adheres to [Semantic Versioning](http://semver.org/).
77

88

9+
## [0.3.0] - 2025-03-05
10+
- fix #8,INA.getCharge => make it signed.
11+
12+
----
13+
914
## [0.2.0] - 2025-02-15
1015
- fix #5, Unable to set parameters, kudos to FoxRunningFromCode
1116

libraries/INA229/INA229.cpp

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// FILE: INA229.cpp
22
// AUTHOR: Rob Tillaart
3-
// VERSION: 0.2.0
3+
// VERSION: 0.3.0
44
// DATE: 2025-01-22
55
// PURPOSE: Arduino library for the INA229, SPI, 20 bit, voltage, current and power sensor.
66
// URL: https://github.com/RobTillaart/INA229
@@ -193,7 +193,7 @@ double INA229::getEnergy()
193193
// read 40 bit unsigned as a double to prevent 64 bit integers
194194
// double might be 8 or 4 byte, depends on platform
195195
// 40 bit ==> O(10^12)
196-
double value = _readRegisterF(INA229_ENERGY, 5);
196+
double value = _readRegisterF(INA229_ENERGY);
197197
// PAGE 31 (8.1.2)
198198
return value * (16 * 3.2) * _current_LSB;
199199
}
@@ -205,7 +205,7 @@ double INA229::getCharge()
205205
// read 40 bit unsigned as a float to prevent 64 bit integers
206206
// double might be 8 or 4 byte, depends on platform
207207
// 40 bit ==> O(10^12)
208-
double value = _readRegisterF(INA229_CHARGE, 5);
208+
double value = _readRegisterF(INA229_CHARGE);
209209
// PAGE 32 (8.1.2)
210210
return value * _current_LSB;
211211
}
@@ -650,32 +650,45 @@ uint32_t INA229::_readRegister(uint8_t reg, uint8_t bytes) // bytes = 2 or 3.
650650
}
651651

652652

653-
double INA229::_readRegisterF(uint8_t reg, uint8_t bytes)
653+
double INA229::_readRegisterF(uint8_t reg)
654654
{
655655
// Dedicated SPI code
656656
double value = 0;
657+
int32_t ival = 0;
657658
uint8_t addr = (reg << 2) + 1; // 1 = Read flag. P18 datasheet
658-
uint8_t count = bytes;
659+
659660
digitalWrite(_select, LOW);
660661
if (_hwSPI)
661662
{
662663
_mySPI->beginTransaction(_spi_settings);
663-
value += _mySPI->transfer(addr);
664-
while (count--)
664+
ival = _mySPI->transfer(addr);
665+
// fetch 4 MSB bytes
666+
for (int i = 0; i < 4; i++)
665667
{
666-
value *= 256;
667-
value += _mySPI->transfer(0x00);
668+
ival <<= 8;
669+
ival |= _mySPI->transfer(0x00);
668670
}
671+
value = ival;
672+
value *= 256;
673+
// fetch last LSB byte
674+
uint8_t n = _mySPI->transfer(0x00);
675+
value += n;
669676
_mySPI->endTransaction();
670677
}
671678
else // Software SPI
672679
{
673-
value += swSPI_transfer(addr);
674-
while (count--)
680+
ival = swSPI_transfer(addr);
681+
// fetch 4 MSB bytes
682+
for (int i = 0; i < 4; i++)
675683
{
676-
value *= 256;
677-
value += swSPI_transfer(0x00);
684+
ival <<= 8;
685+
ival |= swSPI_transfer(0x00);
678686
}
687+
value = ival;
688+
value *= 256;
689+
// fetch last LSB byte
690+
uint8_t n = swSPI_transfer(0x00);
691+
value += n;
679692
}
680693
digitalWrite(_select, HIGH);
681694
return value;

libraries/INA229/INA229.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#pragma once
22
// FILE: INA229.h
33
// AUTHOR: Rob Tillaart
4-
// VERSION: 0.2.0
4+
// VERSION: 0.3.0
55
// DATE: 2025-01-22
66
// PURPOSE: Arduino library for the INA229, SPI, 20 bit, voltage, current and power sensor.
77
// URL: https://github.com/RobTillaart/INA229
@@ -13,7 +13,7 @@
1313
#include "SPI.h"
1414

1515

16-
#define INA229_LIB_VERSION (F("0.2.0"))
16+
#define INA229_LIB_VERSION (F("0.3.0"))
1717

1818

1919
#ifndef __SPI_CLASS__
@@ -266,7 +266,7 @@ class INA229
266266
// max 4 bytes
267267
uint32_t _readRegister(uint8_t reg, uint8_t bytes);
268268
// 5 bytes or more
269-
double _readRegisterF(uint8_t reg, uint8_t bytes);
269+
double _readRegisterF(uint8_t reg);
270270
uint16_t _writeRegister(uint8_t reg, uint16_t value);
271271

272272
float _current_LSB;

libraries/INA229/INA_comparison_table.md

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,21 @@
44
Comparison of my INA2xx libraries
55

66

7-
| | 219 | 226 | 228 | 229 | 236 | 239 | 3221 |
8-
|:------------------|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|
9-
| bits | 12 | 16 | 20 | 20 | 16 | 16 | 13 |
10-
| Max Voltage | 26 | 36 | 85 | 85 | 48 | 85 | 26 |
11-
| Communication | I2C | I2C | I2C | SPI | I2C | SPI | I2C |
12-
| Channels | 1 | 1 | 1 | 1 | 1 | 1 | 3 |
13-
| | | | | | | | |
14-
| getBusVoltage | Y | Y | Y | Y | Y | Y | Y |
15-
| getShuntVoltage | Y | Y | Y | Y | Y | Y | Y |
16-
| getCurrent | Y | Y | Y | Y | Y | Y | Y |
17-
| getPower | Y | Y | Y | Y | Y | Y | Y |
18-
| getTemperature | - | - | Y | Y | - | Y | - |
19-
| getEnergy | - | - | Y | Y | - | - | - |
20-
| getCharge | - | - | Y | Y | - | - | - |
7+
| | 219 | 226 | 228 | 229 | 236 | 239 | 260 | 3221 |
8+
|:------------------|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|
9+
| bits | 12 | 16 | 20 | 20 | 16 | 16 | 16 | 13 |
10+
| Max Voltage | 26 | 36 | 85 | 85 | 48 | 85 | 36 | 26 |
11+
| Communication | I2C | I2C | I2C | SPI | I2C | SPI | I2C | I2C |
12+
| Channels | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 3 |
13+
| | | | | | | | | |
14+
| getBusVoltage | Y | Y | Y | Y | Y | Y | Y | Y |
15+
| getShuntVoltage | Y | Y | Y | Y | Y | Y | Y | Y |
16+
| getCurrent | Y | Y | Y | Y | Y | Y | Y | Y |
17+
| getPower | Y | Y | Y | Y | Y | Y | Y | Y |
18+
| getTemperature | - | - | Y | Y | - | Y | - | - |
19+
| getEnergy | - | - | Y | Y | - | - | - | - |
20+
| getCharge | - | - | Y | Y | - | - | - | - |
2121

2222

23+
https://www.ti.com/amplifier-circuit/current-sense/digital-power-monitors/products.html
24+

libraries/INA229/README.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ Arduino library for the INA229, SPI, 20 bit, voltage, current and power sensor.
2121
This library controls the INA229, a device that measures voltage,
2222
current, power, temperature and more.
2323

24-
The library is not tested with hardware yet, feedback is welcome.
24+
The library is confirmed to work, still feedback is welcome.
2525

2626
The library is written to be able to use the faster SPI interface which
2727
might be needed (faster than I2C which is used by many other INA devices.).
@@ -48,6 +48,13 @@ ends in the code, please report them.
4848
Feedback as always is welcome.
4949

5050

51+
### Breaking change 0.3.0
52+
53+
The function **getCharge()** is updated as the value can be negative too.
54+
The previous versions assumed it could only be positive. See #22.
55+
These are obsolete now.
56+
57+
5158
### Update 0.2.0
5259

5360
In 0.2.0 a bug was fixed in software SPI, so all 0.1.x versions
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
BOARD: Arduino UNO
2+
IDE: 1.8.19
3+
4+
(Hardware SPI)
5+
6+
INA229_LIB_VERSION: 0.3.0
7+
8+
9+
========================================================
10+
Speed: 1000000
11+
12+
test_core
13+
getBusVoltage: 68
14+
getShuntVoltage: 72
15+
getCurrent: 68
16+
getPower: 80
17+
getTemperature: 60
18+
getEnergy: 100
19+
getCharge: 92
20+
21+
test_config
22+
getAccumulation: 44
23+
getConversionDelay: 52
24+
getTemperatureCompensation: 48
25+
getADCRange: 52
26+
27+
test_adc_config
28+
getMode: 48
29+
getBusVoltageConversionTime: 48
30+
getShuntVoltageConversionTime: 52
31+
getTemperatureConversionTime: 48
32+
getAverage: 48
33+
34+
test_others
35+
getShuntTemperatureCoefficent: 48
36+
getDiagnoseAlert: 48
37+
38+
test_thresholds
39+
getShuntOvervoltageTH: 48
40+
getShuntUndervoltageTH: 44
41+
getBusOvervoltageTH: 44
42+
getBusUndervoltageTH: 48
43+
getTemperatureOverLimitTH: 48
44+
getPowerOverLimitTH: 48
45+
46+
========================================================
47+
Speed: 2000000
48+
49+
test_core
50+
getBusVoltage: 52
51+
getShuntVoltage: 52
52+
getCurrent: 56
53+
getPower: 64
54+
getTemperature: 48
55+
getEnergy: 76
56+
getCharge: 68
57+
58+
test_config
59+
getAccumulation: 36
60+
getConversionDelay: 36
61+
getTemperatureCompensation: 44
62+
getADCRange: 36
63+
64+
test_adc_config
65+
getMode: 32
66+
getBusVoltageConversionTime: 36
67+
getShuntVoltageConversionTime: 36
68+
getTemperatureConversionTime: 36
69+
getAverage: 36
70+
71+
test_others
72+
getShuntTemperatureCoefficent: 36
73+
getDiagnoseAlert: 36
74+
75+
test_thresholds
76+
getShuntOvervoltageTH: 36
77+
getShuntUndervoltageTH: 36
78+
getBusOvervoltageTH: 36
79+
getBusUndervoltageTH: 32
80+
getTemperatureOverLimitTH: 32
81+
getPowerOverLimitTH: 32
82+
83+
========================================================
84+
Speed: 4000000
85+
86+
test_core
87+
getBusVoltage: 40
88+
getShuntVoltage: 40
89+
getCurrent: 40
90+
getPower: 44
91+
getTemperature: 32
92+
getEnergy: 64
93+
getCharge: 60
94+
95+
test_config
96+
getAccumulation: 36
97+
getConversionDelay: 32
98+
getTemperatureCompensation: 28
99+
getADCRange: 32
100+
101+
test_adc_config
102+
getMode: 28
103+
getBusVoltageConversionTime: 28
104+
getShuntVoltageConversionTime: 32
105+
getTemperatureConversionTime: 32
106+
getAverage: 32
107+
108+
test_others
109+
getShuntTemperatureCoefficent: 28
110+
getDiagnoseAlert: 28
111+
112+
test_thresholds
113+
getShuntOvervoltageTH: 28
114+
getShuntUndervoltageTH: 32
115+
getBusOvervoltageTH: 28
116+
getBusUndervoltageTH: 28
117+
getTemperatureOverLimitTH: 32
118+
getPowerOverLimitTH: 28
119+
120+
========================================================
121+
Speed: 8000000
122+
123+
test_core
124+
getBusVoltage: 40
125+
getShuntVoltage: 40
126+
getCurrent: 44
127+
getPower: 52
128+
getTemperature: 36
129+
getEnergy: 56
130+
getCharge: 52
131+
132+
test_config
133+
getAccumulation: 24
134+
getConversionDelay: 28
135+
getTemperatureCompensation: 28
136+
getADCRange: 28
137+
138+
test_adc_config
139+
getMode: 28
140+
getBusVoltageConversionTime: 28
141+
getShuntVoltageConversionTime: 28
142+
getTemperatureConversionTime: 24
143+
getAverage: 28
144+
145+
test_others
146+
getShuntTemperatureCoefficent: 28
147+
getDiagnoseAlert: 24
148+
149+
test_thresholds
150+
getShuntOvervoltageTH: 32
151+
getShuntUndervoltageTH: 32
152+
getBusOvervoltageTH: 32
153+
getBusUndervoltageTH: 28
154+
getTemperatureOverLimitTH: 28
155+
getPowerOverLimitTH: 32
156+
157+
Done
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
BOARD: Arduino UNO
2+
IDE: 1.8.19
3+
4+
(SoftWare SPI, SPI settings have no effect).
5+
6+
INA229_performance.ino
7+
8+
INA229_LIB_VERSION: 0.3.0
9+
10+
11+
========================================================
12+
Speed: 1000000
13+
14+
test_core
15+
getBusVoltage: 592
16+
getShuntVoltage: 600
17+
getCurrent: 596
18+
getPower: 604
19+
getTemperature: 452
20+
getEnergy: 896
21+
getCharge: 896
22+
23+
test_config
24+
getAccumulation: 444
25+
getConversionDelay: 444
26+
getTemperatureCompensation: 452
27+
getADCRange: 444
28+
29+
test_adc_config
30+
getMode: 448
31+
getBusVoltageConversionTime: 444
32+
getShuntVoltageConversionTime: 448
33+
getTemperatureConversionTime: 444
34+
getAverage: 444
35+
36+
test_others
37+
getShuntTemperatureCoefficent: 448
38+
getDiagnoseAlert: 444
39+
40+
test_thresholds
41+
getShuntOvervoltageTH: 444
42+
getShuntUndervoltageTH: 448
43+
getBusOvervoltageTH: 444
44+
getBusUndervoltageTH: 452
45+
getTemperatureOverLimitTH: 444
46+
getPowerOverLimitTH: 452
47+
48+
========================================================

libraries/INA229/library.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"type": "git",
1616
"url": "https://github.com/RobTillaart/INA229.git"
1717
},
18-
"version": "0.2.0",
18+
"version": "0.3.0",
1919
"license": "MIT",
2020
"frameworks": "*",
2121
"platforms": "*",

0 commit comments

Comments
 (0)