From 018b984665dcdd6b2f6b2a257bf3edf74a1f03cd Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sun, 2 May 2021 14:34:36 +1000 Subject: [PATCH] Importing Miniware's alg for tip temperature for the MHP Love to @g3gg0 --- source/Core/BSP/MHP30/ThermoModel.cpp | 59 ++++++--------------------- source/Core/Inc/configuration.h | 21 +++++----- 2 files changed, 22 insertions(+), 58 deletions(-) diff --git a/source/Core/BSP/MHP30/ThermoModel.cpp b/source/Core/BSP/MHP30/ThermoModel.cpp index d7f5b643..19c0e499 100644 --- a/source/Core/BSP/MHP30/ThermoModel.cpp +++ b/source/Core/BSP/MHP30/ThermoModel.cpp @@ -4,54 +4,19 @@ * Created on: 1 May 2021 * Author: Ralim */ +#include "Setup.h" #include "TipThermoModel.h" #include "Utils.h" #include "configuration.h" - -#ifdef TEMP_uV_LOOKUP_MHP30 -const uint16_t uVtoDegC[] = { - // - // - 0, 0, // - 397, 10, // - 798, 20, /// - 1203, 30, // - 1612, 40, // - 2023, 50, // - 2436, 60, // - 3225, 79, // - 4013, 98, // - 4756, 116, // - 5491, 134, // - 5694, 139, // - 6339, 155, // - 7021, 172, // - 7859, 193, // - 8619, 212, // - 9383, 231, // - 10153, 250, // - 10930, 269, // - 11712, 288, // - 12499, 307, // - 13290, 326, // - 14084, 345, // - 14881, 364, // - 15680, 383, // - 16482, 402, // - 17285, 421, // - 18091, 440, // - 18898, 459, // - -}; -#endif - -const int uVtoDegCItems = sizeof(uVtoDegC) / (2 * sizeof(uint16_t)); - -uint32_t TipThermoModel::convertuVToDegC(uint32_t tipuVDelta) { - // For the MHP30, we are mimicing the original code and using the resistor fitted to the base of the heater head - // As such, we need to use the ADC and some pin toggling to measure this resistor - // We want to cache the value as it takes time to measure, but we also need to re-measure when the tip is inserted / removed - // We can detect the tip being inserted / removed by using the reading of that channel, as if its reporting max (0xFFFF) then the heater is not connected - - return Utils::InterpolateLookupTable(uVtoDegC, uVtoDegCItems, tipuVDelta); +extern uint16_t tipSenseResistancex10Ohms; +uint32_t TipThermoModel::convertuVToDegC(uint32_t tipuVDelta) { + // For the MHP30, we are mimicing the original code and using the resistor fitted to the base of the heater head, this is measured in the isTipDisconnected() function + if (tipSenseResistancex10Ohms > 900 && tipSenseResistancex10Ohms <= 1100) { + int32_t a = ((tipSenseResistancex10Ohms / 10) + 300) * (3300000 - tipuVDelta); + int32_t b = a / 1000000; + int32_t c = tipuVDelta - b; + int32_t d = c * 243 / 1000; + return d / 10; + } + return 0xFFFF; } diff --git a/source/Core/Inc/configuration.h b/source/Core/Inc/configuration.h index 9524c57c..e48e0671 100644 --- a/source/Core/Inc/configuration.h +++ b/source/Core/Inc/configuration.h @@ -168,15 +168,14 @@ #endif #ifdef MODEL_MHP30 -#define VOLTAGE_DIV 355 // Default for MHP30 -#define PID_POWER_LIMIT 65 // Sets the max pwm power limit -#define CALIBRATION_OFFSET 700 // the adc offset in uV -#define POWER_LIMIT 65 // 65 watts default power limit -#define MAX_POWER_LIMIT 65 // -#define POWER_LIMIT_STEPS 2 // -#define OP_AMP_GAIN_STAGE OP_AMP_GAIN_STAGE_MHP30 // -#define TEMP_uV_LOOKUP_MHP30 // -#define USB_PD_VMAX 20 // Maximum voltage for PD to negotiate +#define VOLTAGE_DIV 355 // Default for MHP30 +#define PID_POWER_LIMIT 65 // Sets the max pwm power limit +#define CALIBRATION_OFFSET 0 // the adc offset in uV - MHP compensates automagically +#define POWER_LIMIT 65 // 65 watts default power limit +#define MAX_POWER_LIMIT 65 // +#define POWER_LIMIT_STEPS 2 // +#define OP_AMP_GAIN_STAGE OP_AMP_GAIN_STAGE_MHP30 // +#define USB_PD_VMAX 20 // Maximum voltage for PD to negotiate #endif #ifdef MODEL_TS100 @@ -200,6 +199,6 @@ const uint8_t tipResistance = 45; // x10 ohms, 4.5 typical for ts80 tips #endif #ifdef MODEL_MHP30 -const uint32_t tipMass = 100; // TODO -const uint8_t tipResistance = 75; // x10 ohms, ~6 typical +const uint32_t tipMass = 45; // TODO +const uint8_t tipResistance = 75; // x10 ohms, ~6 typical #endif