Source code for adafruit_ina219

# SPDX-FileCopyrightText: 2017 Dean Miller for Adafruit Industries
#
# SPDX-License-Identifier: MIT

"""
`adafruit_ina219`
====================================================

CircuitPython driver for the INA219 current sensor.

* Author(s): Dean Miller

Implementation Notes
--------------------

**Hardware:**

* `Adafruit INA219 High Side DC Current Sensor Breakout <https://www.adafruit.com/product/904>`_

* `Adafruit INA219 FeatherWing <https://www.adafruit.com/product/3650>`_

**Software and Dependencies:**

* Adafruit CircuitPython firmware (2.2.0+) for the ESP8622 and M0-based boards:
  https://github.com/adafruit/circuitpython/releases
* Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice
"""

from adafruit_bus_device.i2c_device import I2CDevice
from adafruit_register.i2c_bit import ROBit
from adafruit_register.i2c_bits import ROBits, RWBits
from adafruit_register.i2c_struct import ROUnaryStruct, UnaryStruct
from micropython import const

try:
    import typing

    from busio import I2C
except ImportError:
    pass

__version__ = "0.0.0+auto.0"
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_INA219.git"

# Bits

# Config Register (R/W)
_REG_CONFIG = const(0x00)


[docs] class BusVoltageRange: """Constants for ``bus_voltage_range``""" RANGE_16V = 0x00 # set bus voltage range to 16V RANGE_32V = 0x01 # set bus voltage range to 32V (default)
[docs] class Gain: """Constants for ``gain``""" DIV_1_40MV = 0x00 # shunt prog. gain set to 1, 40 mV range DIV_2_80MV = 0x01 # shunt prog. gain set to /2, 80 mV range DIV_4_160MV = 0x02 # shunt prog. gain set to /4, 160 mV range DIV_8_320MV = 0x03 # shunt prog. gain set to /8, 320 mV range
[docs] class ADCResolution: """Constants for ``bus_adc_resolution`` or ``shunt_adc_resolution``""" ADCRES_9BIT_1S = 0x00 # 9bit, 1 sample, 84us ADCRES_10BIT_1S = 0x01 # 10bit, 1 sample, 148us ADCRES_11BIT_1S = 0x02 # 11 bit, 1 sample, 276us ADCRES_12BIT_1S = 0x03 # 12 bit, 1 sample, 532us ADCRES_12BIT_2S = 0x09 # 12 bit, 2 samples, 1.06ms ADCRES_12BIT_4S = 0x0A # 12 bit, 4 samples, 2.13ms ADCRES_12BIT_8S = 0x0B # 12bit, 8 samples, 4.26ms ADCRES_12BIT_16S = 0x0C # 12bit, 16 samples, 8.51ms ADCRES_12BIT_32S = 0x0D # 12bit, 32 samples, 17.02ms ADCRES_12BIT_64S = 0x0E # 12bit, 64 samples, 34.05ms ADCRES_12BIT_128S = 0x0F # 12bit, 128 samples, 68.10ms
[docs] class Mode: """Constants for ``mode``""" POWERDOWN = 0x00 # power down SVOLT_TRIGGERED = 0x01 # shunt voltage triggered BVOLT_TRIGGERED = 0x02 # bus voltage triggered SANDBVOLT_TRIGGERED = 0x03 # shunt and bus voltage triggered ADCOFF = 0x04 # ADC off SVOLT_CONTINUOUS = 0x05 # shunt voltage continuous BVOLT_CONTINUOUS = 0x06 # bus voltage continuous SANDBVOLT_CONTINUOUS = 0x07 # shunt and bus voltage continuous
# SHUNT VOLTAGE REGISTER (R) _REG_SHUNTVOLTAGE = const(0x01) # BUS VOLTAGE REGISTER (R) _REG_BUSVOLTAGE = const(0x02) # POWER REGISTER (R) _REG_POWER = const(0x03) # CURRENT REGISTER (R) _REG_CURRENT = const(0x04) # CALIBRATION REGISTER (R/W) _REG_CALIBRATION = const(0x05) def _to_signed(num: int) -> int: if num > 0x7FFF: num -= 0x10000 return num
[docs] class INA219: """Driver for the INA219 current sensor""" # Basic API: # INA219( i2c_bus, addr) Create instance of INA219 sensor # :param i2c_bus The I2C bus the INA219is connected to # :param addr (0x40) Address of the INA219 on the bus (default 0x40) # shunt_voltage RO : shunt voltage scaled to Volts # bus_voltage RO : bus voltage (V- to GND) scaled to volts (==load voltage) # current RO : current through shunt, scaled to mA # power RO : power consumption of the load, scaled to Watt # set_calibration_32V_2A() Initialize chip for 32V max and up to 2A (default) # set_calibration_32V_1A() Initialize chip for 32V max and up to 1A # set_calibration_16V_400mA() Initialize chip for 16V max and up to 400mA # Advanced API: # config register break-up # reset WO : Write Reset.RESET to reset the chip (must recalibrate) # bus_voltage_range RW : Bus Voltage Range field (use BusVoltageRange.XXX constants) # gain RW : Programmable Gain field (use Gain.XXX constants) # bus_adc_resolution RW : Bus ADC resolution and averaging modes (ADCResolution.XXX) # shunt_adc_resolution RW : Shunt ADC resolution and averaging modes (ADCResolution.XXX) # mode RW : operating modes in config register (use Mode.XXX constants) # raw_shunt_voltage RO : Shunt Voltage register (not scaled) # raw_bus_voltage RO : Bus Voltage field in Bus Voltage register (not scaled) # conversion_ready RO : Conversion Ready bit in Bus Voltage register # overflow RO : Math Overflow bit in Bus Voltage register # raw_power RO : Power register (not scaled) # raw_current RO : Current register (not scaled) # calibration RW : calibration register (note: value is cached) def __init__(self, i2c_bus: "I2C", addr: int = 0x40) -> None: self.i2c_device = I2CDevice(i2c_bus, addr) self.i2c_addr = addr # Set chip to known config values to start self._cal_value = 0 self._current_lsb = 0 self._power_lsb = 0 self.set_calibration_32V_2A() # config register break-up reset = RWBits(1, _REG_CONFIG, 15, 2, False) bus_voltage_range = RWBits(1, _REG_CONFIG, 13, 2, False) gain = RWBits(2, _REG_CONFIG, 11, 2, False) bus_adc_resolution = RWBits(4, _REG_CONFIG, 7, 2, False) shunt_adc_resolution = RWBits(4, _REG_CONFIG, 3, 2, False) mode = RWBits(3, _REG_CONFIG, 0, 2, False) # shunt voltage register raw_shunt_voltage = ROUnaryStruct(_REG_SHUNTVOLTAGE, ">h") # bus voltage register raw_bus_voltage = ROBits(13, _REG_BUSVOLTAGE, 3, 2, False) conversion_ready = ROBit(_REG_BUSVOLTAGE, 1, 2, False) overflow = ROBit(_REG_BUSVOLTAGE, 0, 2, False) # power and current registers raw_power = ROUnaryStruct(_REG_POWER, ">H") raw_current = ROUnaryStruct(_REG_CURRENT, ">h") # calibration register _raw_calibration = UnaryStruct(_REG_CALIBRATION, ">H") @property def calibration(self) -> int: """Calibration register (cached value)""" return self._cal_value # return cached value @calibration.setter def calibration(self, cal_value: int) -> None: self._cal_value = cal_value # value is cached for ``current`` and ``power`` properties self._raw_calibration = self._cal_value @property def shunt_voltage(self) -> float: """The shunt voltage (between V+ and V-) in Volts (so +-.327V)""" # The least signficant bit is 10uV which is 0.00001 volts return self.raw_shunt_voltage * 0.00001 @property def bus_voltage(self) -> float: """The bus voltage (between V- and GND) in Volts""" # Shift to the right 3 to drop CNVR and OVF and multiply by LSB # Each least signficant bit is 4mV return self.raw_bus_voltage * 0.004 @property def current(self) -> float: """The current through the shunt resistor in milliamps.""" # Sometimes a sharp load will reset the INA219, which will # reset the cal register, meaning CURRENT and POWER will # not be available ... always setting a cal # value even if it's an unfortunate extra step self._raw_calibration = self._cal_value # Now we can safely read the CURRENT register! return self.raw_current * self._current_lsb @property def power(self) -> float: """The power through the load in Watt.""" # Sometimes a sharp load will reset the INA219, which will # reset the cal register, meaning CURRENT and POWER will # not be available ... always setting a cal # value even if it's an unfortunate extra step self._raw_calibration = self._cal_value # Now we can safely read the CURRENT register! return self.raw_power * self._power_lsb
[docs] def set_calibration_32V_2A(self) -> None: """Configures to INA219 to be able to measure up to 32V and 2A of current. Actual max current: 3.2 A. .. note:: These calculations assume a 0.1 shunt ohm resistor is present """ # 1. Determine max possible bus voltage, 16 or 32 V # self.bus_voltage_range = BusVoltageRange.RANGE_16V self.bus_voltage_range = BusVoltageRange.RANGE_32V # 2. Determine the installed shunt resistor value # By default, a 0.1 Ohm resistor is installed rshunt = 0.1 # (Resistor value in ohms) # 2. Estimate the max expected current # MaxExpected_I = 2 A # 3. Calculate maximum possible current for each gain value # MaxI_gain1_40mV = 0.04 / rshunt = 0.4 A # MaxI_gain2_80mV = 0.08 / rshunt = 0.8 A # MaxI_gain4_160mV = 0.16 / rshunt = 1.6 A # MaxI_gain8_320mV = 0.32 / rshunt = 3.2 A # 4. Evaluate whether to replace the shunt resistor # # If MaxExpected_I << MaxI_gain1_40mV, expect poor resolution. # If a good resolution is important for you, consider de-soldering the 0.1 Ohm shunt # resistor and soldering another one with a higher resistance. # # If MaxExpected_I > MaxI_gain8_320mV, consider soldering a shunt resistor with a smaller # resistance. # Either replacing the one currently in place or soldering another one on top (in parallel) # of the current one. # Remember that the maximum voltage across the shunt resistor that the INA219 chip can # stand is 26 V # 5. Select a gain for which MaxI_gainX_XXmV > MaxExpected_I # self.gain = Gain.DIV_1_40MV # For 0 < MaxExpected_I < MaxI_gain1_40mV # self.gain = Gain.DIV_2_80MV # For MaxI_gain1_40mV < MaxExpected_I < MaxI_gain2_80mV # self.gain = Gain.DIV_4_160MV # For MaxI_gain2_80mV < MaxExpected_I < MaxI_gain4_160mV self.gain = Gain.DIV_8_320MV # For MaxI_gain4_160mV < MaxExpected_I < MaxI_gain8_320mV # 6. Select a calibration value # Values below 4096 will harm the resolution # # Too high values will limit the maximum measurable current without any advantage (causing # an overflow to happen earlier) # (above 32768 for gain 1, above 16384 for gain 2, above 8192 for gain 4, above 4096 for # gain 8) # # Use a value different from 4096 only if you are actually calibrating the board versus a # reliable current measured with a better equipment. self.calibration = 4096 # 7. Calculate the current LSB (least significant bit) value in mA # Current_LSB = 0.04096 / (calibration * rshunt) = 0.04096 / (4096 * 0.1) = 0.0001 A # "1000*" is for having the output in milliAmps self._current_lsb = 1000 * 0.04096 / (self.calibration * rshunt) # 8. Calculate the power LSB in W # Power_LSB = 20 * CurrentLSB in A = 20 * 0.0001 = 0.002 (2 mW per bit) # "/1000" is for converting mA to A self._power_lsb = 20 * self._current_lsb / 1000 # in Watts # 9. Compute the Maximum Power # Multiplying the maximum possible bus voltage (16 or 32 V) by the maximum current for the # chosen gain and resistor: # MaximumPower = 32 V * MaxI_gain8_320mV = 32 V * 3.2 A = 102.4 W # 10. Select the resolution # Increasing the bits will increase the measurement time but will give better resolution # Increasing the samples to be averaged will further increase the measurement time # resulting in less noisy measurements self.bus_adc_resolution = ADCResolution.ADCRES_12BIT_1S self.shunt_adc_resolution = ADCResolution.ADCRES_12BIT_1S # 11. Select the operation mode # With continuous mode, the a new reading will be performed as soon as the previous one # ended self.mode = Mode.SANDBVOLT_CONTINUOUS
# With triggered mode, a new measurement is performed each time the triggered mode is # configured (the following line works both as configuration and as trigger) # self.mode = Mode.SANDBVOLT_TRIGGERED # In order to know if the triggered measurement is complete, the status of # conversion_ready can be checked
[docs] def set_calibration_32V_1A(self) -> None: """Configures to INA219 to be able to measure up to 32V and 1A of current. Actual max current: 1.6 A. .. note:: These calculations assume a 0.1 ohm shunt resistor is present""" # 1. Determine max possible bus voltage, 16 or 32 V # self.bus_voltage_range = BusVoltageRange.RANGE_16V self.bus_voltage_range = BusVoltageRange.RANGE_32V # 2. Determine the installed shunt resistor value # By default, a 0.1 Ohm resistor is installed rshunt = 0.1 # (Resistor value in ohms) # 2. Estimate the max expected current # MaxExpected_I = 1 A # 3. Calculate maximum possible current for each gain value # MaxI_gain1_40mV = 0.04 / rshunt = 0.4 A # MaxI_gain2_80mV = 0.08 / rshunt = 0.8 A # MaxI_gain4_160mV = 0.16 / rshunt = 1.6 A # MaxI_gain8_320mV = 0.32 / rshunt = 3.2 A # 4. Evaluate whether to replace the shunt resistor # # If MaxExpected_I << MaxI_gain1_40mV, expect poor resolution. # If a good resolution is important for you, consider de-soldering the 0.1 Ohm shunt # resistor and soldering another one with a higher resistance. # # If MaxExpected_I > MaxI_gain8_320mV, consider soldering a shunt resistor with a smaller # resistance. # Either replacing the one currently in place or soldering another one on top (in parallel) # of the current one. # Remember that the maximum voltage across the shunt resistor that the INA219 chip can # stand is 26 V # 5. Select a gain for which MaxI_gainX_XXmV > MaxExpected_I # self.gain = Gain.DIV_1_40MV # For 0 < MaxExpected_I < MaxI_gain1_40mV # self.gain = Gain.DIV_2_80MV # For MaxI_gain1_40mV < MaxExpected_I < MaxI_gain2_80mV self.gain = Gain.DIV_4_160MV # For MaxI_gain2_80mV < MaxExpected_I < MaxI_gain4_160mV # self.gain = Gain.DIV_8_320MV # For MaxI_gain4_160mV < MaxExpected_I < MaxI_gain8_320mV # 6. Select a calibration value # Values below 4096 will harm the resolution # # Too high values will limit the maximum measurable current without any advantage (causing # an overflow to happen earlier) # (above 32768 for gain 1, above 16384 for gain 2, above 8192 for gain 4, above 4096 for # gain 8) # # Use a value different from 4096 only if you are actually calibrating the board versus a # reliable current measured with a better equipment. self.calibration = 4096 # 7. Calculate the current LSB (least significant bit) value in mA # Current_LSB = 0.04096 / (calibration * rshunt) = 0.04096 / (4096 * 0.1) = 0.0001 A # "1000*" is for having the output in milliAmps self._current_lsb = 1000 * 0.04096 / (self.calibration * rshunt) # 8. Calculate the power LSB in W # Power_LSB = 20 * CurrentLSB in A = 20 * 0.0001 = 0.002 (2 mW per bit) # "/1000" is for converting mA to A self._power_lsb = 20 * self._current_lsb / 1000 # in Watts # 9. Compute the Maximum Power # Multiplying the maximum possible bus voltage (16 or 32 V) by the maximum current for the # chosen gain and resistor: # MaximumPower = 32 V * MaxI_gain4_160mV = 32 V * 1.6 A = 51.2 W # 10. Select the resolution # Increasing the bits will increase the measurement time but will give better resolution # Increasing the samples to be averaged will further increase the measurement time # resulting in less noisy measurements self.bus_adc_resolution = ADCResolution.ADCRES_12BIT_1S self.shunt_adc_resolution = ADCResolution.ADCRES_12BIT_1S # 11. Select the operation mode # With continuous mode, the a new reading will be performed as soon as the previous one # ended self.mode = Mode.SANDBVOLT_CONTINUOUS
# With triggered mode, a new measurement is performed each time the triggered mode is # configured (the following line works both as configuration and as trigger) # self.mode = Mode.SANDBVOLT_TRIGGERED # In order to know if the triggered measurement is complete, the status of # conversion_ready can be checked
[docs] def set_calibration_16V_400mA(self) -> None: """Configures to INA219 to be able to measure up to 16V and 400mA of current. Counter overflow occurs at 1.6A. .. note:: These calculations assume a 0.1 ohm shunt resistor is present""" # 1. Determine max possible bus voltage, 16 or 32 V self.bus_voltage_range = BusVoltageRange.RANGE_16V # self.bus_voltage_range = BusVoltageRange.RANGE_32V # 2. Determine the installed shunt resistor value # By default, a 0.1 Ohm resistor is installed rshunt = 0.1 # (Resistor value in ohms) # 2. Estimate the max expected current # MaxExpected_I = 0.4 A # 3. Calculate maximum possible current for each gain value # MaxI_gain1_40mV = 0.04 / rshunt = 0.4 A # MaxI_gain2_80mV = 0.08 / rshunt = 0.8 A # MaxI_gain4_160mV = 0.16 / rshunt = 1.6 A # MaxI_gain8_320mV = 0.32 / rshunt = 3.2 A # 4. Evaluate whether to replace the shunt resistor # # If MaxExpected_I << MaxI_gain1_40mV, expect poor resolution. # If a good resolution is important for you, consider de-soldering the 0.1 Ohm shunt # resistor and soldering another one with a higher resistance. # # If MaxExpected_I > MaxI_gain8_320mV, consider soldering a shunt resistor with a smaller # resistance. # Either replacing the one currently in place or soldering another one on top (in parallel) # of the current one. # Remember that the maximum voltage across the shunt resistor that the INA219 chip can # stand is 26 V # 5. Select a gain for which MaxI_gainX_XXmV > MaxExpected_I self.gain = Gain.DIV_1_40MV # For 0 < MaxExpected_I < MaxI_gain1_40mV # self.gain = Gain.DIV_2_80MV # For MaxI_gain1_40mV < MaxExpected_I < MaxI_gain2_80mV # self.gain = Gain.DIV_4_160MV # For MaxI_gain2_80mV < MaxExpected_I < MaxI_gain4_160mV # self.gain = Gain.DIV_8_320MV # For MaxI_gain4_160mV < MaxExpected_I < MaxI_gain8_320mV # 6. Select a calibration value # Values below 4096 will harm the resolution # # Too high values will limit the maximum measurable current without any advantage (causing # an overflow to happen earlier) # (above 32768 for gain 1, above 16384 for gain 2, above 8192 for gain 4, above 4096 for # gain 8) # # Use a value different from 4096 only if you are actually calibrating the board versus a # reliable current measured with a better equipment. self.calibration = 4096 # 7. Calculate the current LSB (least significant bit) value in mA # Current_LSB = 0.04096 / (calibration * rshunt) = 0.04096 / (4096 * 0.1) = 0.0001 A # "1000*" is for having the output in milliAmps self._current_lsb = 1000 * 0.04096 / (self.calibration * rshunt) # 8. Calculate the power LSB in W # Power_LSB = 20 * CurrentLSB in A = 20 * 0.0001 = 0.002 (2 mW per bit) # "/1000" is for converting mA to A self._power_lsb = 20 * self._current_lsb / 1000 # in Watts # 9. Compute the Maximum Power # Multiplying the maximum possible bus voltage (16 or 32 V) by the maximum current for # the chosen gain and resistor: # MaximumPower = 16 V * MaxI_gain1_40mV = 16 V * 0.4 A = 6.4 W # 10. Select the resolution # Increasing the bits will increase the measurement time but will give better resolution # Increasing the samples to be averaged will further increase the measurement time # resulting in less noisy measurements self.bus_adc_resolution = ADCResolution.ADCRES_12BIT_1S self.shunt_adc_resolution = ADCResolution.ADCRES_12BIT_1S # 11. Select the operation mode # With continuous mode, the a new reading will be performed as soon as the previous one # ended self.mode = Mode.SANDBVOLT_CONTINUOUS
# With triggered mode, a new measurement is performed each time the triggered mode is # configured (the following line works both as configuration and as trigger) # self.mode = Mode.SANDBVOLT_TRIGGERED # In order to know if the triggered measurement is complete, the status of # conversion_ready can be checked
[docs] def set_calibration_16V_5A(self) -> None: """Configures to INA219 to be able to measure up to 16V and 5000mA of current. Actual max current: 8.0 A. .. note:: These calculations assume a 0.02 ohm shunt resistor is present""" # 1. Determine max possible bus voltage, 16 or 32 V self.bus_voltage_range = BusVoltageRange.RANGE_16V # self.bus_voltage_range = BusVoltageRange.RANGE_32V # 2. Determine the installed shunt resistor value # By default, a 0.1 Ohm resistor is installed rshunt = 0.02 # (Resistor value in ohms) # 2. Estimate the max expected current # MaxExpected_I = 5 A # 3. Calculate maximum possible current for each gain value # MaxI_gain1_40mV = 0.04 / rshunt = 2 A # MaxI_gain2_80mV = 0.08 / rshunt = 4 A # MaxI_gain4_160mV = 0.16 / rshunt = 8 A # MaxI_gain8_320mV = 0.32 / rshunt = 16 A # 4. Evaluate whether to replace the shunt resistor # # If MaxExpected_I << MaxI_gain1_40mV, expect poor resolution. # If a good resolution is important for you, consider de-soldering the 0.1 Ohm shunt # resistor and soldering another one with a higher resistance. # # If MaxExpected_I > MaxI_gain8_320mV, consider soldering a shunt resistor with a smaller # resistance. # Either replacing the one currently in place or soldering another one on top (in parallel) # of the current one. # Remember that the maximum voltage across the shunt resistor that the INA219 chip can # stand is 26 V # 5. Select a gain for which MaxI_gainX_XXmV > MaxExpected_I # self.gain = Gain.DIV_1_40MV # For 0 < MaxExpected_I < MaxI_gain1_40mV # self.gain = Gain.DIV_2_80MV # For MaxI_gain1_40mV < MaxExpected_I < MaxI_gain2_80mV self.gain = Gain.DIV_4_160MV # For MaxI_gain2_80mV < MaxExpected_I < MaxI_gain4_160mV # self.gain = Gain.DIV_8_320MV # For MaxI_gain4_160mV < MaxExpected_I < MaxI_gain8_320mV # 6. Select a calibration value # Values below 4096 will harm the resolution # # Too high values will limit the maximum measurable current without any advantage (causing # an overflow to happen earlier) # (above 32768 for gain 1, above 16384 for gain 2, above 8192 for gain 4, above 4096 for # gain 8) # # Use a value different from 4096 only if you are actually calibrating the board versus a # reliable current measured with a better equipment. self.calibration = 4096 # 7. Calculate the current LSB (least significant bit) value in mA # Current_LSB = 0.04096 / (calibration * rshunt) = 0.04096 / (4096 * 0.02) = 0.0005 A # "1000*" is for having the output in milliAmps self._current_lsb = 1000 * 0.04096 / (self.calibration * rshunt) # 8. Calculate the power LSB in W # Power_LSB = 20 * CurrentLSB in A = 20 * 0.0005 = 0.01 (10 mW per bit) # "/1000" is for converting mA to A self._power_lsb = 20 * self._current_lsb / 1000 # in Watts # 9. Compute the Maximum Power # Multiplying the maximum possible bus voltage (16 or 32 V) by the maximum current for # the chosen gain and resistor: # MaximumPower = 16 V * MaxI_gain4_160mV = 16 V * 8 A = 128 W # 10. Select the resolution # Increasing the bits will increase the measurement time but will give better resolution # Increasing the samples to be averaged will further increase the measurement time # resulting in less noisy measurements self.bus_adc_resolution = ADCResolution.ADCRES_12BIT_1S self.shunt_adc_resolution = ADCResolution.ADCRES_12BIT_1S # 11. Select the operation mode # With continuous mode, the a new reading will be performed as soon as the previous one # ended self.mode = Mode.SANDBVOLT_CONTINUOUS
# With triggered mode, a new measurement is performed each time the triggered mode is # configured (the following line works both as configuration and as trigger) # self.mode = Mode.SANDBVOLT_TRIGGERED # In order to know if the triggered measurement is complete, the status of # conversion_ready can be checked
[docs] def set_calibration_16V_80mA(self) -> None: """Configures to INA219 to be able to measure up to 16V and 80mA of current. .. note:: These calculations assume a 1 ohm shunt resistor is present""" # 1. Determine max possible bus voltage, 16 or 32 V self.bus_voltage_range = BusVoltageRange.RANGE_16V # self.bus_voltage_range = BusVoltageRange.RANGE_32V # 2. Determine the installed shunt resistor value # By default, a 0.1 Ohm resistor is installed rshunt = 1 # (Resistor value in ohms) # 2. Estimate the max expected current # MaxExpected_I = 0.08 A # 3. Calculate maximum possible current for each gain value # MaxI_gain1_40mV = 0.04 / rshunt = 0.04 A # MaxI_gain2_80mV = 0.08 / rshunt = 0.08 A # MaxI_gain4_160mV = 0.16 / rshunt = 0.16 A # MaxI_gain8_320mV = 0.32 / rshunt = 0.32 A # 4. Evaluate whether to replace the shunt resistor # # If MaxExpected_I << MaxI_gain1_40mV, expect poor resolution. # If a good resolution is important for you, consider de-soldering the 0.1 Ohm shunt # resistor and soldering another one with a higher resistance. # # If MaxExpected_I > MaxI_gain8_320mV, consider soldering a shunt resistor with a smaller # resistance. # Either replacing the one currently in place or soldering another one on top (in parallel) # of the current one. # Remember that the maximum voltage across the shunt resistor that the INA219 chip can # stand is 26 V # 5. Select a gain for which MaxI_gainX_XXmV > MaxExpected_I # self.gain = Gain.DIV_1_40MV # For 0 < MaxExpected_I < MaxI_gain1_40mV self.gain = Gain.DIV_2_80MV # For MaxI_gain1_40mV < MaxExpected_I < MaxI_gain2_80mV # self.gain = Gain.DIV_4_160MV # For MaxI_gain2_80mV < MaxExpected_I < MaxI_gain4_160mV # self.gain = Gain.DIV_8_320MV # For MaxI_gain4_160mV < MaxExpected_I < MaxI_gain8_320mV # 6. Select a calibration value # Values below 4096 will harm the resolution # # Too high values will limit the maximum measurable current without any advantage (causing # an overflow to happen earlier) # (above 32768 for gain 1, above 16384 for gain 2, above 8192 for gain 4, above 4096 for # gain 8) # # Use a value different from 4096 only if you are actually calibrating the board versus a # reliable current measured with a better equipment. self.calibration = 4096 # 7. Calculate the current LSB (least significant bit) value in mA # Current_LSB = 0.04096 / (calibration * rshunt) = 0.04096 / (4096 * 1) = 0.00001 A # "1000*" is for having the output in milliAmps self._current_lsb = 1000 * 0.04096 / (self.calibration * rshunt) # 8. Calculate the power LSB in W # Power_LSB = 20 * Current_LSB in A = 20 * 0.00001 = 0.0002 W (0.2 mW per bit) # "/1000" is for converting mA to A self._power_lsb = 20 * self._current_lsb / 1000 # in Watts # 9. Compute the Maximum Power # Multiplying the maximum possible bus voltage (16 or 32 V) by the maximum current for # the chosen gain and resistor: # MaximumPower = 16 V * MaxI_gain2_80mV = 16 V * 0.08 A = 1.28 W # 10. Select the resolution # Increasing the bits will increase the measurement time but will give better resolution # Increasing the samples to be averaged will further increase the measurement time # resulting in less noisy measurements self.bus_adc_resolution = ADCResolution.ADCRES_12BIT_1S self.shunt_adc_resolution = ADCResolution.ADCRES_12BIT_1S # 11. Select the operation mode # With continuous mode, the a new reading will be performed as soon as the previous one # ended self.mode = Mode.SANDBVOLT_CONTINUOUS
# With triggered mode, a new measurement is performed each time the triggered mode is # configured (the following line works both as configuration and as trigger) # self.mode = Mode.SANDBVOLT_TRIGGERED # In order to know if the triggered measurement is complete, the status of # conversion_ready can be checked
[docs] def set_calibration_16V_4mA(self) -> None: """Configures to INA219 to be able to measure up to 16V and 4mA of current. .. note:: These calculations assume a 10 ohm shunt resistor is present""" # 1. Determine max possible bus voltage, 16 or 32 V self.bus_voltage_range = BusVoltageRange.RANGE_16V # self.bus_voltage_range = BusVoltageRange.RANGE_32V # 2. Determine the installed shunt resistor value # By default, a 0.1 Ohm resistor is installed rshunt = 10 # (Resistor value in ohms) # 2. Estimate the max expected current # MaxExpected_I = 0.004 A # 3. Calculate maximum possible current for each gain value # MaxI_gain1_40mV = 0.04 / rshunt = 0.004 A # MaxI_gain2_80mV = 0.08 / rshunt = 0.008 A # MaxI_gain4_160mV = 0.16 / rshunt = 0.016 A # MaxI_gain8_320mV = 0.32 / rshunt = 0.032 A # 4. Evaluate whether to replace the shunt resistor # # If MaxExpected_I << MaxI_gain1_40mV, expect poor resolution. # If a good resolution is important for you, consider de-soldering the 0.1 Ohm shunt # resistor and soldering another one with a higher resistance. # # If MaxExpected_I > MaxI_gain8_320mV, consider soldering a shunt resistor with a smaller # resistance. # Either replacing the one currently in place or soldering another one on top (in parallel) # of the current one. # Remember that the maximum voltage across the shunt resistor that the INA219 chip can # stand is 26 V # 5. Select a gain for which MaxI_gainX_XXmV > MaxExpected_I self.gain = Gain.DIV_1_40MV # For 0 < MaxExpected_I < MaxI_gain1_40mV # self.gain = Gain.DIV_2_80MV # For MaxI_gain1_40mV < MaxExpected_I < MaxI_gain2_80mV # self.gain = Gain.DIV_4_160MV # For MaxI_gain2_80mV < MaxExpected_I < MaxI_gain4_160mV # self.gain = Gain.DIV_8_320MV # For MaxI_gain4_160mV < MaxExpected_I < MaxI_gain8_320mV # 6. Select a calibration value # Values below 4096 will harm the resolution # # Too high values will limit the maximum measurable current without any advantage (causing # an overflow to happen earlier) # (above 32768 for gain 1, above 16384 for gain 2, above 8192 for gain 4, above 4096 for # gain 8) # # Use a value different from 4096 only if you are actually calibrating the board versus a # reliable current measured with a better equipment. self.calibration = 4096 # 7. Calculate the current LSB (least significant bit) value in mA # Current_LSB = 0.04096 / (calibration * rshunt) = 0.04096 / (4096 * 10) = 0.000001 A # "1000*" is for having the output in milliAmps self._current_lsb = 1000 * 0.04096 / (self.calibration * rshunt) # 8. Calculate the power LSB in W # Power_LSB = 20 * Current_LSB in A = 20 * 0.000001 = 0.00002 W (0.02 mW per bit) # "/1000" is for converting mA to A self._power_lsb = 20 * self._current_lsb / 1000 # in Watts # 9. Compute the Maximum Power # Multiplying the maximum possible bus voltage (16 or 32 V) by the maximum current for # the chosen gain and resistor: # MaximumPower = 16 V * MaxI_gain1_40mV = 16 V * 0.004 A = 0.064 W # 10. Select the resolution # Increasing the bits will increase the measurement time but will give better resolution # Increasing the samples to be averaged will further increase the measurement time # resulting in less noisy measurements self.bus_adc_resolution = ADCResolution.ADCRES_12BIT_1S self.shunt_adc_resolution = ADCResolution.ADCRES_12BIT_1S # 11. Select the operation mode # With continuous mode, the a new reading will be performed as soon as the previous one # ended self.mode = Mode.SANDBVOLT_CONTINUOUS
# With triggered mode, a new measurement is performed each time the triggered mode is # configured (the following line works both as configuration and as trigger) # self.mode = Mode.SANDBVOLT_TRIGGERED # In order to know if the triggered measurement is complete, the status of # conversion_ready can be checked