From 5d284e542b3dc5670c752662133200c70afb67af Mon Sep 17 00:00:00 2001 From: snedmore Date: Wed, 19 Nov 2025 14:56:37 -0500 Subject: [PATCH] powertest --- powertest.py | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 powertest.py diff --git a/powertest.py b/powertest.py new file mode 100644 index 0000000..44c6da6 --- /dev/null +++ b/powertest.py @@ -0,0 +1,67 @@ +#!/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(bus.read_word_data(ADDRESS, 0x00)) + 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 +