From db324a522525060cd1e84e7f024f27bd28598da8 Mon Sep 17 00:00:00 2001 From: Totoo Date: Thu, 9 Oct 2025 22:29:53 +0200 Subject: [PATCH] PortaRF battery fix (#2809) --- firmware/common/battery.hpp | 1 + firmware/common/i2cdev_max17055.cpp | 23 ++++++++++++----------- firmware/common/i2cdev_max17055.hpp | 4 ++++ 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/firmware/common/battery.hpp b/firmware/common/battery.hpp index a7e32fb5..3f6482fb 100644 --- a/firmware/common/battery.hpp +++ b/firmware/common/battery.hpp @@ -29,6 +29,7 @@ namespace battery { #define BATTERY_MIN_VOLTAGE 3000.0 #define BATTERY_MAX_VOLTAGE 4170.0 #define BATTERY_DESIGN_CAP 2500 +#define BATTERY_DESIGN_CAP_PRF 3000 // this will just hold the config and a calculation. also some defines above for the battery management. could be movet to the classes, but it is a bit more readeable i think. class BatteryManagement { diff --git a/firmware/common/i2cdev_max17055.cpp b/firmware/common/i2cdev_max17055.cpp index 7e6ea605..2e1c93ae 100644 --- a/firmware/common/i2cdev_max17055.cpp +++ b/firmware/common/i2cdev_max17055.cpp @@ -235,18 +235,19 @@ bool I2cDev_MAX17055::soft_reset() { } bool I2cDev_MAX17055::initialize_custom_parameters() { - if (!write_register(0xD0, 0x03E8)) return false; // Unknown register, possibly related to battery profile - if (!write_register(0xDB, 0x0000)) return false; // ModelCfg - if (!write_register(0x05, 0x0000)) return false; // RepCap - if (!write_register(0x18, 0x1388)) return false; // DesignCap - if (!write_register(0x45, 0x009C)) return false; // dQAcc - if (!write_register(0x1E, 0x03C0)) return false; // IChgTerm - if (!write_register(0x3A, 0x9661)) return false; // VEmpty - if (!write_register(0x60, 0x0090)) return false; // Unknown register - if (!write_register(0x46, 0x0561)) return false; // dPAcc - if (!write_register(0xDB, 0x8000)) return false; // ModelCfg + if (!write_register(0xD0, 0x03E8)) return false; // Unknown register, possibly related to battery profile + if (!write_register(0xDB, 0x0000)) return false; // ModelCfg + if (!write_register(0x05, 0x0000)) return false; // RepCap + uint32_t designcap = portapack::device_type == portapack::DEV_PORTARF ? __MAX17055_Design_Capacity_PRF__ * 2 : __MAX17055_Design_Capacity__ * 2; // the original design has a 2x multiplier here, so i keep it + if (!write_register(0x18, designcap)) return false; // DesignCap + if (!write_register(0x45, designcap / 32)) return false; // dQAcc = DesignCap / 32 - if (!write_register(0x40, 0x0001)) return false; // Set user mem to 1 + if (!write_register(0x1E, 0x03C0)) return false; // IChgTerm + if (!write_register(0x3A, 0x9661)) return false; // VEmpty + if (!write_register(0x60, 0x0090)) return false; // Unknown register + if (!write_register(0x46, ((designcap / 32) * 44138) * designcap)) return false; // dPAcc + if (!write_register(0xDB, 0x8000)) return false; // ModelCfg --we should wait till it loads here. While (ReadRegister(0xDB)&0x8000) Wait(10);//do not continue until ModelCFG.Refresh == 0 + if (!write_register(0x40, 0x0001)) return false; // Set user mem to 1 return true; } diff --git a/firmware/common/i2cdev_max17055.hpp b/firmware/common/i2cdev_max17055.hpp index 1b7414b9..538a4244 100644 --- a/firmware/common/i2cdev_max17055.hpp +++ b/firmware/common/i2cdev_max17055.hpp @@ -51,6 +51,10 @@ #define __MAX17055_Design_Capacity__ BATTERY_DESIGN_CAP // Battery Capacity #endif +#ifndef __MAX17055_Design_Capacity_PRF__ +#define __MAX17055_Design_Capacity_PRF__ BATTERY_DESIGN_CAP_PRF // Battery Capacity for PortaRF +#endif + // Define Gauge Resistor #ifndef __MAX17055_Resistor__ #define __MAX17055_Resistor__ 0.01 // Shunt Resistor