Adafruit_INA228/Adafruit_INA228.h
ladyada 2629aa5bc5 Make setShunt() virtual with chip-specific implementations
- Made setShunt() virtual in the base class
- Added INA228-specific implementation using 2^19 divisor
- Added INA237-specific implementation using 2^15 divisor
- Updated documentation to explain the chip-specific differences
- Ensures correct current LSB calculation based on device type
- Fixes current scaling issues for INA237
2025-05-13 16:14:22 -04:00

167 lines
No EOL
6.6 KiB
C++

/*!
* @file Adafruit_INA228.h
*
* I2C Driver for INA228 Current and Power sensor
*
* This is a library for the Adafruit INA228 breakout:
* http://www.adafruit.com/products/5832
*
* Adafruit invests time and resources providing this open source code,
* please support Adafruit and open-source hardware by purchasing products from
* Adafruit!
*
*
* BSD license (see license.txt)
*/
#ifndef _ADAFRUIT_INA228_H
#define _ADAFRUIT_INA228_H
#include "Adafruit_INA2xx.h"
#define INA228_I2CADDR_DEFAULT 0x40 ///< INA228 default i2c address
#define INA228_DEVICE_ID 0x228 ///< INA228 device ID
// INA228 specific registers
#define INA228_REG_ENERGY 0x09 ///< Energy result register
#define INA228_REG_CHARGE 0x0A ///< Charge result register (40-bit)
#define INA228_REG_SHUNTTEMPCO 0x03 ///< Shunt temperature coefficient register
///@{
/**
* @name Legacy compatibility macros
*
* These macros provide backward compatibility with earlier versions of the
* library
*/
#define INA228_MODE_SHUTDOWN \
INA2XX_MODE_SHUTDOWN ///< Alias for INA2XX_MODE_SHUTDOWN
#define INA228_MODE_TRIG_BUS \
INA2XX_MODE_TRIG_BUS ///< Alias for INA2XX_MODE_TRIG_BUS
#define INA228_MODE_TRIG_SHUNT \
INA2XX_MODE_TRIG_SHUNT ///< Alias for INA2XX_MODE_TRIG_SHUNT
#define INA228_MODE_TRIG_BUS_SHUNT \
INA2XX_MODE_TRIG_BUS_SHUNT ///< Alias for INA2XX_MODE_TRIG_BUS_SHUNT
#define INA228_MODE_TRIG_TEMP \
INA2XX_MODE_TRIG_TEMP ///< Alias for INA2XX_MODE_TRIG_TEMP
#define INA228_MODE_TRIG_TEMP_BUS \
INA2XX_MODE_TRIG_TEMP_BUS ///< Alias for INA2XX_MODE_TRIG_TEMP_BUS
#define INA228_MODE_TRIG_TEMP_SHUNT \
INA2XX_MODE_TRIG_TEMP_SHUNT ///< Alias for INA2XX_MODE_TRIG_TEMP_SHUNT
#define INA228_MODE_TRIG_TEMP_BUS_SHUNT \
INA2XX_MODE_TRIG_TEMP_BUS_SHUNT ///< Alias for INA2XX_MODE_TRIG_TEMP_BUS_SHUNT
#define INA228_MODE_SHUTDOWN2 \
INA2XX_MODE_SHUTDOWN2 ///< Alias for INA2XX_MODE_SHUTDOWN2
#define INA228_MODE_CONT_BUS \
INA2XX_MODE_CONT_BUS ///< Alias for INA2XX_MODE_CONT_BUS
#define INA228_MODE_CONT_SHUNT \
INA2XX_MODE_CONT_SHUNT ///< Alias for INA2XX_MODE_CONT_SHUNT
#define INA228_MODE_CONT_BUS_SHUNT \
INA2XX_MODE_CONT_BUS_SHUNT ///< Alias for INA2XX_MODE_CONT_BUS_SHUNT
#define INA228_MODE_CONT_TEMP \
INA2XX_MODE_CONT_TEMP ///< Alias for INA2XX_MODE_CONT_TEMP
#define INA228_MODE_CONT_TEMP_BUS \
INA2XX_MODE_CONT_TEMP_BUS ///< Alias for INA2XX_MODE_CONT_TEMP_BUS
#define INA228_MODE_CONT_TEMP_SHUNT \
INA2XX_MODE_CONT_TEMP_SHUNT ///< Alias for INA2XX_MODE_CONT_TEMP_SHUNT
#define INA228_MODE_CONT_TEMP_BUS_SHUNT \
INA2XX_MODE_CONT_TEMP_BUS_SHUNT ///< Alias for INA2XX_MODE_CONT_TEMP_BUS_SHUNT
#define INA228_MODE_TRIGGERED \
INA2XX_MODE_TRIGGERED ///< Alias for INA2XX_MODE_TRIGGERED
#define INA228_MODE_CONTINUOUS \
INA2XX_MODE_CONTINUOUS ///< Alias for INA2XX_MODE_CONTINUOUS
#define INA228_TIME_50_us INA2XX_TIME_50_us ///< Alias for INA2XX_TIME_50_us
#define INA228_TIME_84_us INA2XX_TIME_84_us ///< Alias for INA2XX_TIME_84_us
#define INA228_TIME_150_us INA2XX_TIME_150_us ///< Alias for INA2XX_TIME_150_us
#define INA228_TIME_280_us INA2XX_TIME_280_us ///< Alias for INA2XX_TIME_280_us
#define INA228_TIME_540_us INA2XX_TIME_540_us ///< Alias for INA2XX_TIME_540_us
#define INA228_TIME_1052_us \
INA2XX_TIME_1052_us ///< Alias for INA2XX_TIME_1052_us
#define INA228_TIME_2074_us \
INA2XX_TIME_2074_us ///< Alias for INA2XX_TIME_2074_us
#define INA228_TIME_4120_us \
INA2XX_TIME_4120_us ///< Alias for INA2XX_TIME_4120_us
#define INA228_COUNT_1 INA2XX_COUNT_1 ///< Alias for INA2XX_COUNT_1
#define INA228_COUNT_4 INA2XX_COUNT_4 ///< Alias for INA2XX_COUNT_4
#define INA228_COUNT_16 INA2XX_COUNT_16 ///< Alias for INA2XX_COUNT_16
#define INA228_COUNT_64 INA2XX_COUNT_64 ///< Alias for INA2XX_COUNT_64
#define INA228_COUNT_128 INA2XX_COUNT_128 ///< Alias for INA2XX_COUNT_128
#define INA228_COUNT_256 INA2XX_COUNT_256 ///< Alias for INA2XX_COUNT_256
#define INA228_COUNT_512 INA2XX_COUNT_512 ///< Alias for INA2XX_COUNT_512
#define INA228_COUNT_1024 INA2XX_COUNT_1024 ///< Alias for INA2XX_COUNT_1024
#define INA228_ALERT_POLARITY_NORMAL \
INA2XX_ALERT_POLARITY_NORMAL ///< Alias for INA2XX_ALERT_POLARITY_NORMAL
#define INA228_ALERT_POLARITY_INVERTED \
INA2XX_ALERT_POLARITY_INVERTED ///< Alias for INA2XX_ALERT_POLARITY_INVERTED
#define INA228_ALERT_LATCH_ENABLED \
INA2XX_ALERT_LATCH_ENABLED ///< Alias for INA2XX_ALERT_LATCH_ENABLED
#define INA228_ALERT_LATCH_TRANSPARENT \
INA2XX_ALERT_LATCH_TRANSPARENT ///< Alias for INA2XX_ALERT_LATCH_TRANSPARENT
///@}
///@{
/**
* @name Legacy type aliases
*
* These typedefs provide backward compatibility with earlier versions of the
* library
*/
typedef INA2XX_MeasurementMode
INA228_MeasurementMode; ///< Alias for INA2XX_MeasurementMode
typedef INA2XX_ConversionTime
INA228_ConversionTime; ///< Alias for INA2XX_ConversionTime
typedef INA2XX_AveragingCount
INA228_AveragingCount; ///< Alias for INA2XX_AveragingCount
typedef INA2XX_AlertPolarity
INA228_AlertPolarity; ///< Alias for INA2XX_AlertPolarity
typedef INA2XX_AlertLatch INA228_AlertLatch; ///< Alias for INA2XX_AlertLatch
///@}
/**
* @brief Alert trigger options specific to INA228.
*
* Allowed values for setAlertType.
*/
typedef enum _alert_type {
INA228_ALERT_CONVERSION_READY = 0x1, ///< Trigger on conversion ready
INA228_ALERT_OVERPOWER = 0x2, ///< Trigger on power over limit
INA228_ALERT_UNDERVOLTAGE = 0x4, ///< Trigger on bus voltage under limit
INA228_ALERT_OVERVOLTAGE = 0x8, ///< Trigger on bus voltage over limit
INA228_ALERT_UNDERCURRENT = 0x10, ///< Trigger on current under limit
INA228_ALERT_OVERCURRENT = 0x20, ///< Trigger on current over limit
INA228_ALERT_NONE = 0x0, ///< Do not trigger alert pin (Default)
} INA228_AlertType;
/*!
* @brief Class that stores state and functions for interacting with
* INA228 Current and Power Sensor
*/
class Adafruit_INA228 : public Adafruit_INA2xx {
public:
Adafruit_INA228();
bool begin(uint8_t i2c_addr = INA228_I2CADDR_DEFAULT,
TwoWire* theWire = &Wire, bool skipReset = false);
void reset(void) override;
// INA228 specific functions
float readEnergy(void);
float readCharge(void);
INA228_AlertType getAlertType(void);
void setAlertType(INA228_AlertType alert);
void resetAccumulators(void);
float readDieTemp(void) override;
float readBusVoltage(void) override;
void setShunt(float shunt_res = 0.1, float max_current = 3.2) override;
// INA228 specific register pointer
Adafruit_I2CRegister* AlertLimit; ///< BusIO Register for AlertLimit
protected:
void _updateShuntCalRegister(void) override;
};
#endif