update calibration

This commit is contained in:
Ryan Densmore 2025-12-14 18:16:48 -05:00
parent 47db59640b
commit 626bf43c41
3 changed files with 13 additions and 13 deletions

View file

@ -3,8 +3,8 @@ import powermon as pm
from time import sleep from time import sleep
sensors = [ sensors = [
[0x40, 0x08B6], # pink/blue: Pi [0x40, 0.005, 0.00032, 0.696875], # pink/blue: Pi; 5 mOhm; 0.32 mA/bit; 0.696875 mult
[0x44, 0x0B60] # pink/pink: Solar panel [0x44, 0.005, 0.00032, 0.91] # pink/pink: Solar panel; 5 mOhm; 0.32 mA/bit; 0.91 mult
] ]
solarmon = pm.PowerMon(sensors) solarmon = pm.PowerMon(sensors)

View file

@ -6,7 +6,6 @@ POWER_REG_ADDR = 0x03
CURRENT_REG_ADDR = 0x04 CURRENT_REG_ADDR = 0x04
CAL_REG_ADDR = 0x05 CAL_REG_ADDR = 0x05
CURRENT_LSB = 0.00032
VOLTAGE_LSB = 0.00125 VOLTAGE_LSB = 0.00125
SHUNT_LSB = 0.0000025 SHUNT_LSB = 0.0000025
@ -16,14 +15,17 @@ class PowerData:
current = 0.0 current = 0.0
class INA226: class INA226:
def __init__(self, bus: smbus2.SMBus, addr: int, cal: int = 0): # I2C Address, Shunt Resistor, Current LSB, Calibration Multiplier
def __init__(self, bus: smbus2.SMBus, addr: int, rshunt: int, clsb: float, cal: float = 1):
self.addr = addr self.addr = addr
self.rshunt = rshunt,
self.clsb = clsb,
self.cal = cal self.cal = cal
self.bus = bus self.bus = bus
self.data = PowerData() self.data = PowerData()
# Initial calibration # Initial calibration
self.calibrate(cal) self.calibrate()
def __readRegWord(self, reg: int) -> int: def __readRegWord(self, reg: int) -> int:
regWord = self.bus.read_word_data(self.addr, reg) & 0xFFFF regWord = self.bus.read_word_data(self.addr, reg) & 0xFFFF
@ -35,14 +37,15 @@ class INA226:
self.bus.write_i2c_block_data(self.addr, reg, regBytes) self.bus.write_i2c_block_data(self.addr, reg, regBytes)
# Calibrate current sensor # Calibrate current sensor
def calibrate(self, cal: int) -> None: def calibrate(self) -> None:
self.__writeRegWord(CAL_REG_ADDR, cal) calReg = int((0.00512 / (self.clsb * self.rshunt)) * self.cal)
self.__writeRegWord(CAL_REG_ADDR, calReg)
# Retrieve power data from sensor # Retrieve power data from sensor
def getData(self) -> PowerData: def getData(self) -> PowerData:
self.data.voltage = float(self.__readRegWord(VOLTAGE_REG_ADDR)) * VOLTAGE_LSB self.data.voltage = float(self.__readRegWord(VOLTAGE_REG_ADDR)) * VOLTAGE_LSB
self.data.power = float(self.__readRegWord(POWER_REG_ADDR)) * CURRENT_LSB * 25.0 self.data.power = float(self.__readRegWord(POWER_REG_ADDR)) * self.clsb * 25.0
self.data.current = float(self.__readRegWord(CURRENT_REG_ADDR)) * CURRENT_LSB self.data.current = float(self.__readRegWord(CURRENT_REG_ADDR)) * self.clsb
if (self.data.current > 20.96): if (self.data.current > 20.96):
self.data.current = 0.0 self.data.current = 0.0
return self.data return self.data

View file

@ -11,10 +11,7 @@ class PowerMon:
try: try:
ina = None ina = None
for i in range(len(sensors)): for i in range(len(sensors)):
if type(list[i]) is int: ina = INA226(self.bus, sensors[i][0], sensors[i][1], sensors[i][2], sensors[i][3])
ina = INA226(self.bus, sensors[i])
else:
ina = INA226(self.bus, sensors[i][0], sensors[i][1])
self.chipObjs.append(ina) self.chipObjs.append(ina)
except Exception as e: except Exception as e:
e.add_note("Initiating sensors failed") e.add_note("Initiating sensors failed")