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

67 lines
1.9 KiB
Python
Executable file

#!/usr/bin/env python3
from smbus2 import SMBus
from time import sleep
ADDRESS = 0x40
CURRENT_LSB = 0.00032
VBUS_LSB = 0.00125
SHUNT_LSB = 0.0000025
class Data:
current = 0.0
voltage = 0.0
voltageCorrected = 0.0
power = 0.0
powerCorrected = 0.0
def readReg(bus, reg):
regWord = bus.read_word_data(ADDRESS, reg) & 0xFFFF
regValue = ((regWord << 8) & 0xFF00) + (regWord >> 8)
#print(f'{bin(regWord)}\t{bin(regValue)}')
return regValue
def writeReg(bus, reg, val):
regBytes = [(val >> 8) & 0xFF,val & 0xFF]
print(regBytes)
bus.write_i2c_block_data(ADDRESS, reg, regBytes)
def getData(bus):
powerData.current = float(readReg(bus, 0x04)) * CURRENT_LSB
powerData.voltage = float(readReg(bus, 0x02)) * VBUS_LSB
powerData.voltageCorrected = powerData.voltage / 1.04982
powerData.power = float(readReg(bus, 0x03)) * CURRENT_LSB * 25.0
powerData.powerCorrected = powerData.current * powerData.voltageCorrected
with SMBus(1) as bus:
powerData = Data()
# program calibration register
# calibration for double pink: 0x0b60
# cal for pink/blue: 0x08b6
writeReg(bus, 0x05, 0x08b6)
sleep(2)
while True:
print("\033c")
getData(bus)
#print(f"Vshunt:\t\t{float(readReg(bus, 0x01))*SHUNT_LSB} V")
print(f"Vbus:\t\t{powerData.voltage} V")
#print(f"VbusC:\t\t{powerData.voltageCorrected} V")
print(f"Current:\t{powerData.current} A")
print(f"Power:\t\t{powerData.power} W")
#print(f"PowerC:\t\t{powerData.powerCorrected} W")
#print(hex(readReg(bus, 0x05)))
print()
sleep(1)
# Calibration Calculations
# Max of 10A (for solar panel out)
# Current_LSB = 10A / 2^15 = 3.0517... uA/bit
# go with 320 uA/bit = 0.32 mA/bit
#
# Shunt resistor value
# R_shunt = 5 mOhms = 0.005 Ohms
#
# Calibration Register
# CAL = 0.00512 / (Current_LSB * R_shunt) = 0.00512 / (.00032 * .005) = 3200
# CAL = 0x0C80