diff --git a/source/Core/Threads/PIDThread.cpp b/source/Core/Threads/PIDThread.cpp index 3c27fc89..e7183248 100644 --- a/source/Core/Threads/PIDThread.cpp +++ b/source/Core/Threads/PIDThread.cpp @@ -22,12 +22,12 @@ #endif #endif -static TickType_t powerPulseWaitUnit = 25 * TICKS_100MS; // 2.5 s -static TickType_t powerPulseDurationUnit = (5 * TICKS_100MS) / 2; // 250 ms -TaskHandle_t pidTaskNotification = NULL; -volatile TemperatureType_t currentTempTargetDegC = 0; // Current temperature target in C -int32_t powerSupplyWattageLimit = 0; -bool heaterThermalRunaway = false; +static TickType_t powerPulseWaitUnit = 25 * TICKS_100MS; // 2.5 s +static TickType_t powerPulseDurationUnit = (5 * TICKS_100MS) / 2; // 250 ms +TaskHandle_t pidTaskNotification = NULL; +volatile TemperatureType_t currentTempTargetDegC = 0; // Current temperature target in C +int32_t powerSupplyWattageLimit = 0; +uint8_t heaterThermalRunawayCounter = 0; static int32_t getPIDResultX10Watts(TemperatureType_t set_point, TemperatureType_t current_value); static void detectThermalRunaway(const TemperatureType_t currentTipTempInC, const uint32_t x10WattsOut); @@ -71,7 +71,8 @@ void startPIDTask(void const *argument __unused) { #endif #endif - int32_t x10WattsOut = 0; + int32_t x10WattsOut = 0; + TickType_t lastThermalRunawayDecay = xTaskGetTickCount(); for (;;) { x10WattsOut = 0; @@ -105,6 +106,12 @@ void startPIDTask(void const *argument __unused) { #ifdef DEBUG_UART_OUTPUT log_system_state(x10WattsOut); #endif + if (xTaskGetTickCount() - lastThermalRunawayDecay > TICKS_SECOND) { + lastThermalRunawayDecay = xTaskGetTickCount(); + if (heaterThermalRunawayCounter > 0) { + heaterThermalRunawayCounter--; + } + } } } @@ -249,8 +256,8 @@ void detectThermalRunaway(const TemperatureType_t currentTipTempInC, const uint3 static bool haveSeenDelta = false; // Check for readings being pegged at the top of the ADC while the heater is off - if (!thisCycleIsHeating && (getTipRawTemp(0) > (ADC_MAX_READING - 8))) { - heaterThermalRunaway = true; + if (!thisCycleIsHeating && (getTipRawTemp(0) > (ADC_MAX_READING - 8)) && heaterThermalRunawayCounter < 255) { + heaterThermalRunawayCounter++; } if (haveSeenDelta) { @@ -277,8 +284,8 @@ void detectThermalRunaway(const TemperatureType_t currentTipTempInC, const uint3 TemperatureType_t delta = tipTempMax - tiptempMin; haveSeenDelta = true; - if (delta < THERMAL_RUNAWAY_TEMP_C) { - heaterThermalRunaway = true; + if (delta < THERMAL_RUNAWAY_TEMP_C && heaterThermalRunawayCounter < 255) { + heaterThermalRunawayCounter++; } } } @@ -322,7 +329,7 @@ void setOutputx10WattsViaFilters(int32_t x10WattsOut) { if (getTipRawTemp(0) > (0x7FFF - 32)) { x10WattsOut = 0; } - if (heaterThermalRunaway) { + if (heaterThermalRunawayCounter > 8) { x10WattsOut = 0; } #ifdef SLEW_LIMIT diff --git a/source/Core/Threads/UI/logic/OperatingModes.h b/source/Core/Threads/UI/logic/OperatingModes.h index 379094e4..3b38bb92 100644 --- a/source/Core/Threads/UI/logic/OperatingModes.h +++ b/source/Core/Threads/UI/logic/OperatingModes.h @@ -83,5 +83,5 @@ OperatingMode showWarnings(const ButtonState buttons, guiContext *cxt); // Common helpers int8_t getPowerSourceNumber(void); // Returns number ID of power source -extern bool heaterThermalRunaway; +extern uint8_t heaterThermalRunawayCounter; #endif diff --git a/source/Core/Threads/UI/logic/Soldering.cpp b/source/Core/Threads/UI/logic/Soldering.cpp index 45483d15..587308a9 100644 --- a/source/Core/Threads/UI/logic/Soldering.cpp +++ b/source/Core/Threads/UI/logic/Soldering.cpp @@ -161,10 +161,10 @@ OperatingMode gui_solderingMode(const ButtonState buttons, guiContext *cxt) { return OperatingMode::Sleeping; } - if (heaterThermalRunaway) { - currentTempTargetDegC = 0; // heater control off - heaterThermalRunaway = false; - cxt->transitionMode = TransitionAnimation::Right; + if (heaterThermalRunawayCounter > 8) { + currentTempTargetDegC = 0; // heater control off + heaterThermalRunawayCounter = 0; + cxt->transitionMode = TransitionAnimation::Right; return OperatingMode::ThermalRunaway; } return handleSolderingButtons(buttons, cxt); diff --git a/source/Core/Threads/UI/logic/SolderingProfile.cpp b/source/Core/Threads/UI/logic/SolderingProfile.cpp index 01ca7ced..606175cf 100644 --- a/source/Core/Threads/UI/logic/SolderingProfile.cpp +++ b/source/Core/Threads/UI/logic/SolderingProfile.cpp @@ -159,9 +159,9 @@ OperatingMode gui_solderingProfileMode(const ButtonState buttons, guiContext *cx setBuzzer(false); return OperatingMode::HomeScreen; } - if (heaterThermalRunaway) { - currentTempTargetDegC = 0; // heater control off - heaterThermalRunaway = false; + if (heaterThermalRunawayCounter > 8) { + currentTempTargetDegC = 0; // heater control off + heaterThermalRunawayCounter = 0; return OperatingMode::ThermalRunaway; } diff --git a/source/Core/Threads/UI/logic/utils/SolderingCommon.cpp b/source/Core/Threads/UI/logic/utils/SolderingCommon.cpp index 9425c90f..e10df25c 100644 --- a/source/Core/Threads/UI/logic/utils/SolderingCommon.cpp +++ b/source/Core/Threads/UI/logic/utils/SolderingCommon.cpp @@ -9,7 +9,7 @@ #include "history.hpp" #include "ui_drawing.hpp" -extern bool heaterThermalRunaway; +extern uint8_t heaterThermalRunawayCounter; bool checkExitSoldering(void) { #ifdef POW_DC