M5Unit-METER 0.2.1 git rev:6a6ea23
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
89 //@brirf Sunt voltage (mV)
90 inline float shuntVoltage() const
91 {
92 return raw[0] * 0.0025f;
93 }
94 // @brief Bus voltage (mV)
95 inline float voltage() const
96 {
97 return raw[1] * 1.25f;
98 }
99 // @brief Power (mW)
100 inline float power() const
101 {
102 return raw[2] * currentLSB * 25.f * 1000.f;
103 }
104 // @brief Current (mA)
105 inline float current() const
106 {
107 return (int16_t)raw[3] * currentLSB * 1000.f;
108 }
109};
110
111} // namespace ina226
112
117class UnitINA226 : public Component, public PeriodicMeasurementAdapter<UnitINA226, ina226::Data> {
118 M5_UNIT_COMPONENT_HPP_BUILDER(UnitINA226, 0x00);
119
120public:
125 struct config_t {
127 bool start_periodic{true};
129 bool current{true};
131 bool voltage{true};
133 bool power{true};
135 ina226::Sampling sampling_rate{ina226::Sampling::Rate16};
137 ina226::ConversionTime shunt_conversion_time{ina226::ConversionTime::US_1100};
139 ina226::ConversionTime bus_conversion_time{ina226::ConversionTime::US_1100};
140 };
141
142protected:
149 UnitINA226(const float shuntRes, const float maxCurA, const float curLSB, const uint8_t addr = DEFAULT_ADDRESS);
150
151public:
152 virtual ~UnitINA226()
153 {
154 }
155
156 virtual bool begin() override;
157 virtual void update(const bool force = false) override;
158
161
163 {
164 return _cfg;
165 }
167 inline void config(const config_t& cfg)
168 {
169 _cfg = cfg;
170 }
172
175 //@brief Gets the shunt Resistor (O)
176 inline float shuntResistor() const
177 {
178 return _shuntRes;
179 }
181 inline float maximumCurrent() const
182 {
183 return _maxCurrentA;
184 }
186 inline float currentLSB() const
187 {
188 return _currentLSB;
189 }
191
195 inline float shuntVoltage() const
196 {
197 return !empty() ? oldest().shuntVoltage() : std::numeric_limits<float>::quiet_NaN();
198 }
200 inline float voltage() const
201 {
202 return !empty() ? oldest().voltage() : std::numeric_limits<float>::quiet_NaN();
203 }
205 inline float power() const
206 {
207 return !empty() ? oldest().power() : std::numeric_limits<float>::quiet_NaN();
208 }
210 inline float current() const
211 {
212 return !empty() ? oldest().current() : std::numeric_limits<float>::quiet_NaN();
213 }
215
218
225 inline bool startPeriodicMeasurement(const bool current = true, const bool voltage = true, const bool power = true)
226 {
227 return PeriodicMeasurementAdapter<UnitINA226, ina226::Data>::startPeriodicMeasurement(current, voltage, power);
228 }
240 const ina226::ConversionTime bct, const bool current = true,
241 const bool voltage = true, const bool power = true)
242 {
243 return PeriodicMeasurementAdapter<UnitINA226, ina226::Data>::startPeriodicMeasurement(rate, sct, bct, current,
244 voltage, power);
245 }
251 {
252 return PeriodicMeasurementAdapter<UnitINA226, ina226::Data>::stopPeriodicMeasurement();
253 }
255
258
269 bool measureSingleshot(ina226::Data& data, const bool current = true, const bool voltage = true,
270 const bool power = true);
286 const ina226::ConversionTime bct, const bool current = true, const bool voltage = true,
287 const bool power = true);
288
290
293
298 bool readMode(ina226::Mode& mode);
311 bool writeSamplingRate(const ina226::Sampling rate);
343 bool readCalibration(uint16_t& cal);
349 bool writeCalibration(const uint16_t cal);
355 bool readAlert(ina226::Alert& type);
371 bool writeAlert(const ina226::Alert type, const uint16_t limit, const bool latch = true);
378 bool readAlertLimit(uint16_t& limit);
386 bool writeAlertLimit(const uint16_t limit);
388
394 bool readAlertOccurred(bool& alert);
399 bool powerDown();
406 bool softReset(const bool all = false);
407
408protected:
409 bool start_periodic_measurement(const bool current, const bool voltage, const bool power);
410 bool start_periodic_measurement(const ina226::Sampling rate, const ina226::ConversionTime sct,
411 const ina226::ConversionTime bct, const bool current, const bool voltage,
412 const bool power);
413 bool stop_periodic_measurement();
414
415 bool write_mode(const ina226::Mode mode);
416 bool read_configuration(uint16_t& v);
417 bool write_configuration(const uint16_t v);
418 bool read_mask(uint16_t& m);
419 bool write_mask(const uint16_t m);
420
421 bool is_data_ready();
422 bool read_measurement(ina226::Data& d);
423
424 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitINA226, ina226::Data);
425
426private:
427 std::unique_ptr<m5::container::CircularBuffer<ina226::Data>> _data{};
428 config_t _cfg{};
429 float _shuntRes{}, _maxCurrentA{}, _currentLSB{};
430 uint8_t _measureBits{}; // LSB 0:Shunt 1:Bus 2:Power 3:Current MSB
431};
432
438 M5_UNIT_COMPONENT_HPP_BUILDER(UnitINA226_10A, 0x41);
439
440public:
444 explicit UnitINA226_10A(const float curLSB = 0.0f)
445 : UnitINA226(0.005f /* 5mR */, 10.0f /* 10A */, curLSB, DEFAULT_ADDRESS)
446 {
447 }
448 virtual ~UnitINA226_10A()
449 {
450 }
451};
452
457class UnitINA226_1A : public UnitINA226 {
458 M5_UNIT_COMPONENT_HPP_BUILDER(UnitINA226_1A, 0x41);
459
460public:
464 explicit UnitINA226_1A(const float curLSB = 0.0f)
465 : UnitINA226(0.080f /* 80mR */, 1.0f /* 1A */, curLSB, DEFAULT_ADDRESS)
466 {
467 }
468 virtual ~UnitINA226_1A()
469 {
470 }
471};
472
473namespace ina226 {
475namespace command {
476constexpr uint8_t CONFIGURATION_REG{0x00};
477
478constexpr uint8_t SHUNT_VOLTAGE_REG{0x01};
479constexpr uint8_t BUS_VOLTAGE_REG{0x02};
480constexpr uint8_t POWER_REG{0x03};
481constexpr uint8_t CURRENT_REG{0x04};
482
483constexpr uint8_t CALIBRATION_REG{0X05};
484constexpr uint8_t MASK_REG{0x06};
485constexpr uint8_t ALERT_LIMIT_REG{0x07};
486
487constexpr uint8_t MANUFACTURER_ID_REG{0xFE};
488constexpr uint8_t DIE_ID_REG{0XFF};
489} // namespace command
491} // namespace ina226
492
493} // namespace unit
494} // namespace m5
495#endif
UnitINA226_10A unit.
Definition unit_INA226.hpp:437
UnitINA226_10A(const float curLSB=0.0f)
Definition unit_INA226.hpp:444
UnitINA226_1A unit.
Definition unit_INA226.hpp:457
UnitINA226_1A(const float curLSB=0.0f)
Definition unit_INA226.hpp:464
Base class for INA226 unit.
Definition unit_INA226.hpp:117
bool writeShuntVoltageConversionTime(const ina226::ConversionTime ct)
Write the convsrsion time of Shunt voltage @paramct Conversion time.
Definition unit_INA226.cpp:537
bool writeCalibration(const uint16_t cal)
Write the calibration value.
Definition unit_INA226.cpp:579
float power() const
Oldest power (mW)
Definition unit_INA226.hpp:205
bool writeBusVoltageConversionTime(const ina226::ConversionTime ct)
Write the convsrsion time of Bus voltage @paramct Conversion time.
Definition unit_INA226.cpp:511
float shuntVoltage() const
Oldest shunt voltage (mV)
Definition unit_INA226.hpp:195
void config(const config_t &cfg)
Set the configration.
Definition unit_INA226.hpp:167
float maximumCurrent() const
Gets the maximum current (A)
Definition unit_INA226.hpp:181
float shuntResistor() const
Gets the maximum current (A)
Definition unit_INA226.hpp:176
bool readAlertOccurred(bool &alert)
Read the alert occurred?
Definition unit_INA226.cpp:626
float current() const
Oldest current (mA)
Definition unit_INA226.hpp:210
bool powerDown()
Power down.
Definition unit_INA226.cpp:584
config_t config()
Gets the configration.
Definition unit_INA226.hpp:162
bool readBusVoltageConversionTime(ina226::ConversionTime &ct)
Read the convsrsion time of Bus voltage.
Definition unit_INA226.cpp:500
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:408
bool readAlertLimit(uint16_t &limit)
Read the alerm limit value.
Definition unit_INA226.cpp:612
bool readCalibration(uint16_t &cal)
Read the calibration value.
Definition unit_INA226.cpp:573
float voltage() const
Oldest Bus voltage (mV)
Definition unit_INA226.hpp:200
bool writeAlertLimit(const uint16_t limit)
Write the alerm limit value.
Definition unit_INA226.cpp:617
bool softReset(const bool all=false)
Software reset.
Definition unit_INA226.cpp:593
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:225
bool readSamplingRate(ina226::Sampling &rate)
Read the sampling rate.
Definition unit_INA226.cpp:474
float currentLSB() const
Gets the current LSB.
Definition unit_INA226.hpp:186
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:239
bool writeSamplingRate(const ina226::Sampling rate)
Write the sampling rate.
Definition unit_INA226.cpp:485
bool readMode(ina226::Mode &mode)
Read the operation mode.
Definition unit_INA226.cpp:453
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:276
bool readShuntVoltageConversionTime(ina226::ConversionTime &ct)
Read the convsrsion time of Shunt voltage.
Definition unit_INA226.cpp:526
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_INA226.hpp:250
Top level namespace of M5stack.
Unit-related namespace.
Settings for begin.
Definition unit_INA226.hpp:125
bool current
Measure current?
Definition unit_INA226.hpp:129
bool voltage
Measure bus voltage?
Definition unit_INA226.hpp:131
ina226::Sampling sampling_rate
Sampling rate.
Definition unit_INA226.hpp:135
ina226::ConversionTime bus_conversion_time
Bus conversion time.
Definition unit_INA226.hpp:139
ina226::ConversionTime shunt_conversion_time
Shunt conversion time.
Definition unit_INA226.hpp:137
bool start_periodic
Start periodic measurement on begin?
Definition unit_INA226.hpp:127
bool power
Measure power?
Definition unit_INA226.hpp:133
Measurement data group.
Definition unit_INA226.hpp:85
std::array< uint16_t, 4 > raw
Raw data 0:Shunt 1:Bus 2:Power 3:Current.
Definition unit_INA226.hpp:86
float currentLSB
currentLSB
Definition unit_INA226.hpp:87
@ 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.