M5Unit-METER 0.3.0 git rev:2c09d95
Loading...
Searching...
No Matches
unit_INA226.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_METER_UNIT_INA226_HPP
11#define M5_UNIT_METER_UNIT_INA226_HPP
12
13#include <M5UnitComponent.hpp>
14#include <limits> // NaN
15
16namespace m5 {
17namespace unit {
18
19namespace ina226 {
20
25enum class Sampling : uint8_t {
26 Rate1,
27 Rate4,
28 Rate16,
29 Rate64,
30 Rate128,
31 Rate256,
32 Rate512,
33 Rate1024,
34};
35
40enum class ConversionTime : uint8_t {
41 US_140,
42 US_204,
43 US_332,
44 US_588,
45 US_1100,
46 US_2116,
47 US_4156,
48 US_8244,
49};
50
55enum class Mode : uint8_t {
56 PowerDown,
60 // 0x04 Same as PowerDown
61 ShuntVoltage = 0x05,
64};
65
70enum class Alert : int8_t {
71 Unknown = -1,
72 None,
73 ShuntOver,
75 BusOver,
76 BusUnder,
77 PowerOver,
79};
80
85struct Data {
86 std::array<uint16_t, 4> raw{};
87 float currentLSB{};
88 uint8_t measureBits{};
89
91 inline float shuntVoltage() const
92 {
93 return (measureBits & 0x01) ? static_cast<int16_t>(raw[0]) * 0.0025f : std::numeric_limits<float>::quiet_NaN();
94 }
96 inline float voltage() const
97 {
98 return (measureBits & 0x02) ? raw[1] * 1.25f : std::numeric_limits<float>::quiet_NaN();
99 }
101 inline float power() const
102 {
103 return (measureBits & 0x04) ? raw[2] * currentLSB * 25.f * 1000.f : std::numeric_limits<float>::quiet_NaN();
104 }
106 inline float current() const
107 {
108 return (measureBits & 0x08) ? static_cast<int16_t>(raw[3]) * currentLSB * 1000.f
109 : std::numeric_limits<float>::quiet_NaN();
110 }
111};
112
113} // namespace ina226
114
119class UnitINA226 : public Component, public PeriodicMeasurementAdapter<UnitINA226, ina226::Data> {
120 M5_UNIT_COMPONENT_HPP_BUILDER(UnitINA226, 0x00);
121
122public:
127 struct config_t {
129 bool start_periodic{true};
131 bool current{true};
133 bool voltage{true};
135 bool power{true};
137 ina226::Sampling sampling_rate{ina226::Sampling::Rate16};
139 ina226::ConversionTime shunt_conversion_time{ina226::ConversionTime::US_1100};
141 ina226::ConversionTime bus_conversion_time{ina226::ConversionTime::US_1100};
142 };
143
144protected:
151 UnitINA226(const float shuntRes, const float maxCurA, const float curLSB, const uint8_t addr = DEFAULT_ADDRESS);
152
153public:
154 virtual ~UnitINA226()
155 {
156 }
157
158 virtual bool begin() override;
159 virtual void update(const bool force = false) override;
160
163
165 {
166 return _cfg;
167 }
169 inline void config(const config_t& cfg)
170 {
171 _cfg = cfg;
172 }
174
178 inline float shuntResistor() const
179 {
180 return _shuntRes;
181 }
183 inline float maximumCurrent() const
184 {
185 return _maxCurrentA;
186 }
188 inline float currentLSB() const
189 {
190 return _currentLSB;
191 }
193
197 inline float shuntVoltage() const
198 {
199 return !empty() ? oldest().shuntVoltage() : std::numeric_limits<float>::quiet_NaN();
200 }
202 inline float voltage() const
203 {
204 return !empty() ? oldest().voltage() : std::numeric_limits<float>::quiet_NaN();
205 }
207 inline float power() const
208 {
209 return !empty() ? oldest().power() : std::numeric_limits<float>::quiet_NaN();
210 }
212 inline float current() const
213 {
214 return !empty() ? oldest().current() : std::numeric_limits<float>::quiet_NaN();
215 }
217
220
227 inline bool startPeriodicMeasurement(const bool current = true, const bool voltage = true, const bool power = true)
228 {
229 return PeriodicMeasurementAdapter<UnitINA226, ina226::Data>::startPeriodicMeasurement(current, voltage, power);
230 }
242 const ina226::ConversionTime bct, const bool current = true,
243 const bool voltage = true, const bool power = true)
244 {
245 return PeriodicMeasurementAdapter<UnitINA226, ina226::Data>::startPeriodicMeasurement(rate, sct, bct, current,
246 voltage, power);
247 }
253 {
254 return PeriodicMeasurementAdapter<UnitINA226, ina226::Data>::stopPeriodicMeasurement();
255 }
257
260
271 bool measureSingleshot(ina226::Data& data, const bool current = true, const bool voltage = true,
272 const bool power = true);
288 const ina226::ConversionTime bct, const bool current = true, const bool voltage = true,
289 const bool power = true);
290
292
295
300 bool readMode(ina226::Mode& mode);
313 bool writeSamplingRate(const ina226::Sampling rate);
345 bool readCalibration(uint16_t& cal);
351 bool writeCalibration(const uint16_t cal);
357 bool readAlert(ina226::Alert& type);
373 bool writeAlert(const ina226::Alert type, const uint16_t limit, const bool latch = true);
380 bool readAlertLimit(uint16_t& limit);
388 bool writeAlertLimit(const uint16_t limit);
390
391 // ============================================================
392 // M5Unified M5.Power.Ina226 compatible API
393#if defined(__M5UNIFIED_HPP__)
394
398
400 inline float getBusVoltage()
401 {
402 return voltage() / 1000.0f;
403 }
405 inline float getShuntVoltage()
406 {
407 return shuntVoltage() / 1000.0f;
408 }
410 inline float getShuntCurrent()
411 {
412 return current() / 1000.0f;
413 }
415 inline float getPower()
416 {
417 return power() / 1000.0f;
418 }
419
421#endif
422
428 bool readAlertOccurred(bool& alert);
433 bool powerDown();
440 bool softReset(const bool all = false);
441
442protected:
443 bool start_periodic_measurement(const bool current, const bool voltage, const bool power);
444 bool start_periodic_measurement(const ina226::Sampling rate, const ina226::ConversionTime sct,
445 const ina226::ConversionTime bct, const bool current, const bool voltage,
446 const bool power);
447 bool stop_periodic_measurement();
448
449 bool write_mode(const ina226::Mode mode);
450 bool read_configuration(uint16_t& v);
451 bool write_configuration(const uint16_t v);
452 bool read_mask(uint16_t& m);
453 bool write_mask(const uint16_t m);
454
455 bool is_data_ready();
456 bool read_measurement(ina226::Data& d);
457
458 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitINA226, ina226::Data);
459
460private:
461 std::unique_ptr<m5::container::CircularBuffer<ina226::Data>> _data{};
462 config_t _cfg{};
463 float _shuntRes{}, _maxCurrentA{}, _currentLSB{};
464 uint8_t _measureBits{}; // LSB 0:Shunt 1:Bus 2:Power 3:Current MSB
465};
466
472 M5_UNIT_COMPONENT_HPP_BUILDER(UnitINA226_10A, 0x41);
473
474public:
479 explicit UnitINA226_10A(const float curLSB = 0.0f)
480 : UnitINA226(0.005f /* 5mR */, 10.0f /* 10A */, curLSB, DEFAULT_ADDRESS)
481 {
482 }
483 virtual ~UnitINA226_10A()
484 {
485 }
486};
487
492class UnitINA226_1A : public UnitINA226 {
493 M5_UNIT_COMPONENT_HPP_BUILDER(UnitINA226_1A, 0x41);
494
495public:
500 explicit UnitINA226_1A(const float curLSB = 0.0f)
501 : UnitINA226(0.080f /* 80mR */, 1.0f /* 1A */, curLSB, DEFAULT_ADDRESS)
502 {
503 }
504 virtual ~UnitINA226_1A()
505 {
506 }
507};
508
509namespace ina226 {
511namespace command {
512constexpr uint8_t CONFIGURATION_REG{0x00};
513
514constexpr uint8_t SHUNT_VOLTAGE_REG{0x01};
515constexpr uint8_t BUS_VOLTAGE_REG{0x02};
516constexpr uint8_t POWER_REG{0x03};
517constexpr uint8_t CURRENT_REG{0x04};
518
519constexpr uint8_t CALIBRATION_REG{0x05};
520constexpr uint8_t MASK_REG{0x06};
521constexpr uint8_t ALERT_LIMIT_REG{0x07};
522
523constexpr uint8_t MANUFACTURER_ID_REG{0xFE};
524constexpr uint8_t DIE_ID_REG{0xff};
525} // namespace command
527} // namespace ina226
528
529} // namespace unit
530} // namespace m5
531#endif
UnitINA226_10A unit.
Definition unit_INA226.hpp:471
UnitINA226_10A(const float curLSB=0.0f)
Constructor for UnitINA226_10A.
Definition unit_INA226.hpp:479
UnitINA226_1A unit.
Definition unit_INA226.hpp:492
UnitINA226_1A(const float curLSB=0.0f)
Constructor for UnitINA226_1A.
Definition unit_INA226.hpp:500
Base class for INA226 unit.
Definition unit_INA226.hpp:119
bool writeShuntVoltageConversionTime(const ina226::ConversionTime ct)
Write the conversion time of Shunt voltage.
Definition unit_INA226.cpp:536
bool writeCalibration(const uint16_t cal)
Write the calibration value.
Definition unit_INA226.cpp:578
float power() const
Oldest power (mW)
Definition unit_INA226.hpp:207
bool writeBusVoltageConversionTime(const ina226::ConversionTime ct)
Write the conversion time of Bus voltage.
Definition unit_INA226.cpp:510
float shuntVoltage() const
Oldest shunt voltage (mV)
Definition unit_INA226.hpp:197
void config(const config_t &cfg)
Set the configuration.
Definition unit_INA226.hpp:169
float maximumCurrent() const
Gets the maximum current (A)
Definition unit_INA226.hpp:183
float shuntResistor() const
Gets the shunt Resistor (Ohm)
Definition unit_INA226.hpp:178
bool readAlertOccurred(bool &alert)
Read the alert occurred?
Definition unit_INA226.cpp:626
float current() const
Oldest current (mA)
Definition unit_INA226.hpp:212
bool powerDown()
Power down.
Definition unit_INA226.cpp:583
config_t config()
Gets the configuration.
Definition unit_INA226.hpp:164
bool readBusVoltageConversionTime(ina226::ConversionTime &ct)
Read the conversion time of Bus voltage.
Definition unit_INA226.cpp:499
bool writeAlert(const ina226::Alert type, const uint16_t limit, const bool latch=true)
Write the alert type and limit value.
Definition unit_INA226.cpp:670
bool measureSingleshot(ina226::Data &data, const bool current=true, const bool voltage=true, const bool power=true)
Measurement single shot.
Definition unit_INA226.cpp:407
bool readAlertLimit(uint16_t &limit)
Read the alert limit value.
Definition unit_INA226.cpp:612
bool readCalibration(uint16_t &cal)
Read the calibration value.
Definition unit_INA226.cpp:572
float voltage() const
Oldest Bus voltage (mV)
Definition unit_INA226.hpp:202
bool writeAlertLimit(const uint16_t limit)
Write the alert limit value.
Definition unit_INA226.cpp:617
bool softReset(const bool all=false)
Software reset.
Definition unit_INA226.cpp:592
bool startPeriodicMeasurement(const bool current=true, const bool voltage=true, const bool power=true)
Start periodic measurement in the current settings.
Definition unit_INA226.hpp:227
bool readSamplingRate(ina226::Sampling &rate)
Read the sampling rate.
Definition unit_INA226.cpp:473
float currentLSB() const
Gets the current LSB.
Definition unit_INA226.hpp:188
bool startPeriodicMeasurement(const ina226::Sampling rate, const ina226::ConversionTime sct, const ina226::ConversionTime bct, const bool current=true, const bool voltage=true, const bool power=true)
Start periodic measurement.
Definition unit_INA226.hpp:241
bool writeSamplingRate(const ina226::Sampling rate)
Write the sampling rate.
Definition unit_INA226.cpp:484
bool readMode(ina226::Mode &mode)
Read the operation mode.
Definition unit_INA226.cpp:452
bool readAlert(ina226::Alert &type)
Read the alert type.
Definition unit_INA226.cpp:638
UnitINA226(const float shuntRes, const float maxCurA, const float curLSB, const uint8_t addr=DEFAULT_ADDRESS)
Constructor.
Definition unit_INA226.cpp:275
bool readShuntVoltageConversionTime(ina226::ConversionTime &ct)
Read the conversion time of Shunt voltage.
Definition unit_INA226.cpp:525
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_INA226.hpp:252
Top level namespace of M5stack.
Unit-related namespace.
Settings for begin.
Definition unit_INA226.hpp:127
bool current
Measure current?
Definition unit_INA226.hpp:131
bool voltage
Measure bus voltage?
Definition unit_INA226.hpp:133
ina226::Sampling sampling_rate
Sampling rate.
Definition unit_INA226.hpp:137
ina226::ConversionTime bus_conversion_time
Bus conversion time.
Definition unit_INA226.hpp:141
ina226::ConversionTime shunt_conversion_time
Shunt conversion time.
Definition unit_INA226.hpp:139
bool start_periodic
Start periodic measurement on begin?
Definition unit_INA226.hpp:129
bool power
Measure power?
Definition unit_INA226.hpp:135
Measurement data group.
Definition unit_INA226.hpp:85
uint8_t measureBits
Measured channels bitmask (0:Shunt 1:Bus 2:Power 3:Current)
Definition unit_INA226.hpp:88
std::array< uint16_t, 4 > raw
Raw data 0:Shunt 1:Bus 2:Power 3:Current.
Definition unit_INA226.hpp:86
float current() const
Current (mA) Returns NaN if not measured.
Definition unit_INA226.hpp:106
float power() const
Power (mW) Returns NaN if not measured.
Definition unit_INA226.hpp:101
float currentLSB
currentLSB
Definition unit_INA226.hpp:87
float shuntVoltage() const
Shunt voltage (mV) Returns NaN if not measured.
Definition unit_INA226.hpp:91
float voltage() const
Bus voltage (mV) Returns NaN if not measured.
Definition unit_INA226.hpp:96
@ Rate128
128 sps as default
Mode
Operation mode.
Definition unit_INA226.hpp:55
@ BusVoltageSingle
Bus Voltage, Triggered.
@ BusVoltage
Bus Voltage, Continuous.
@ ShuntAndBusSingle
Shunt and Bus, Triggered.
@ ShuntAndBus
Shunt and Bus, Continuous (as default)
@ ShuntVoltage
Shunt Voltage, Continuous.
@ PowerDown
Power-Down (or Shutdown)
@ ShuntVoltageSingle
Shunt Voltage, Triggered.
Sampling
The number of samples that are collected and averaged.
Definition unit_INA226.hpp:25
@ Rate1
1 sps (as default)
ConversionTime
The conversion time for the bus voltage measurement.
Definition unit_INA226.hpp:40
@ US_1100
1.1 ms (as default)
Alert
Alert type.
Definition unit_INA226.hpp:70
@ ShuntOver
Shunt Voltage Over-Voltage.
@ ShuntUnder
Shunt Voltage Under-Voltage.
@ PowerOver
Power Over-limit.
@ ConversionReady
Conversion Ready.
@ BusOver
Bus Voltage Over-Voltage.
@ BusUnder
Bus Voltage Under-Voltage.