capstone/inachip.py
2025-12-12 19:10:27 +00:00

50 lines
1.4 KiB
Python

#!/usr/bin/env python3
import smbus2
VOLTAGE_REG_ADDR = 0x02
POWER_REG_ADDR = 0x03
CURRENT_REG_ADDR = 0x04
CAL_REG_ADDR = 0x05
CURRENT_LSB = 0.00032
VOLTAGE_LSB = 0.00125
SHUNT_LSB = 0.0000025
class PowerData:
voltage = 0.0
power = 0.0
current = 0.0
class INA226:
def __init__(self, bus: smbus2.SMBus, addr: int, cal: int = 0):
self.addr = addr
self.cal = cal
self.bus = bus
self.data = PowerData()
# Initial calibration
self.calibrate(cal)
def __readRegWord(self, reg: int) -> int:
regWord = self.bus.read_word_data(self.addr, reg) & 0xFFFF
regValue = ((regWord << 8) & 0xFF00) + (regWord >> 8)
return regValue
def __writeRegWord(self, reg: int, val: int) -> None:
regBytes = [(val >> 8) & 0xFF,val & 0xFF]
self.bus.write_i2c_block_data(self.addr, reg, regBytes)
# Calibrate current sensor
def calibrate(self, cal: int) -> None:
self.__writeRegWord(CAL_REG_ADDR, cal)
# Retrieve power data from sensor
def getData(self) -> PowerData:
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.current = float(self.__readRegWord(CURRENT_REG_ADDR)) * CURRENT_LSB
if (self.data.current > 20.96):
self.data.current = 0.0
return self.data