aboutsummaryrefslogtreecommitdiffhomepage
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/Core/BSP/MHP30/configuration.h4
-rw-r--r--source/Core/BSP/Miniware/configuration.h2
-rw-r--r--source/Core/BSP/Pinecil/configuration.h2
-rw-r--r--source/Core/BSP/Pinecilv2/configuration.h2
-rw-r--r--source/Core/BSP/Sequre/configuration.h8
-rw-r--r--source/Core/Threads/PIDThread.cpp72
-rw-r--r--source/Core/Threads/UI/logic/Soldering.cpp2
7 files changed, 59 insertions, 33 deletions
diff --git a/source/Core/BSP/MHP30/configuration.h b/source/Core/BSP/MHP30/configuration.h
index a2d5910b..8698a857 100644
--- a/source/Core/BSP/MHP30/configuration.h
+++ b/source/Core/BSP/MHP30/configuration.h
@@ -103,8 +103,8 @@
#define DETAILED_IDLE 0 // 0: Disable 1: Enable - Default 0
// Due to large thermal mass of the PCB being heated we need to pull this back a bit
-#define THERMAL_RUNAWAY_TIME_SEC 45
-#define THERMAL_RUNAWAY_TEMP_C 3
+#define THERMAL_RUNAWAY_TIME_SEC 20
+#define THERMAL_RUNAWAY_TEMP_C 2
#define CUT_OUT_SETTING 0 // default to no cut-off voltage
#define RECOM_VOL_CELL 33 // Minimum voltage per cell (Recommended 3.3V (33))
diff --git a/source/Core/BSP/Miniware/configuration.h b/source/Core/BSP/Miniware/configuration.h
index a873bcc4..44ef5d66 100644
--- a/source/Core/BSP/Miniware/configuration.h
+++ b/source/Core/BSP/Miniware/configuration.h
@@ -109,7 +109,7 @@
#define DETAILED_IDLE 0 // 0: Disable 1: Enable - Default 0
#define THERMAL_RUNAWAY_TIME_SEC 20
-#define THERMAL_RUNAWAY_TEMP_C 10
+#define THERMAL_RUNAWAY_TEMP_C 3
#define CUT_OUT_SETTING 0 // default to no cut-off voltage
#define RECOM_VOL_CELL 33 // Minimum voltage per cell (Recommended 3.3V (33))
diff --git a/source/Core/BSP/Pinecil/configuration.h b/source/Core/BSP/Pinecil/configuration.h
index fe04595b..bef59a93 100644
--- a/source/Core/BSP/Pinecil/configuration.h
+++ b/source/Core/BSP/Pinecil/configuration.h
@@ -104,7 +104,7 @@
#define DETAILED_IDLE 0 // 0: Disable 1: Enable - Default 0
#define THERMAL_RUNAWAY_TIME_SEC 20
-#define THERMAL_RUNAWAY_TEMP_C 20
+#define THERMAL_RUNAWAY_TEMP_C 3
#define CUT_OUT_SETTING 0 // default to no cut-off voltage
#define RECOM_VOL_CELL 33 // Minimum voltage per cell (Recommended 3.3V (33))
diff --git a/source/Core/BSP/Pinecilv2/configuration.h b/source/Core/BSP/Pinecilv2/configuration.h
index 8ca4ff40..3f7aa52e 100644
--- a/source/Core/BSP/Pinecilv2/configuration.h
+++ b/source/Core/BSP/Pinecilv2/configuration.h
@@ -105,7 +105,7 @@
#define DETAILED_IDLE 0 // 0: Disable 1: Enable - Default 0
#define THERMAL_RUNAWAY_TIME_SEC 20
-#define THERMAL_RUNAWAY_TEMP_C 20
+#define THERMAL_RUNAWAY_TEMP_C 3
#define CUT_OUT_SETTING 0 // default to no cut-off voltage
#define RECOM_VOL_CELL 33 // Minimum voltage per cell (Recommended 3.3V (33))
diff --git a/source/Core/BSP/Sequre/configuration.h b/source/Core/BSP/Sequre/configuration.h
index be3c9f6b..df06f68e 100644
--- a/source/Core/BSP/Sequre/configuration.h
+++ b/source/Core/BSP/Sequre/configuration.h
@@ -133,7 +133,7 @@
#define TEMP_uV_LOOKUP_S60
#define USB_PD_VMAX 12 // Maximum voltage for PD to negotiate
#define THERMAL_RUNAWAY_TIME_SEC 20
-#define THERMAL_RUNAWAY_TEMP_C 10
+#define THERMAL_RUNAWAY_TEMP_C 3
#define HARDWARE_MAX_WATTAGE_X10 600
@@ -167,7 +167,7 @@
#define TEMP_uV_LOOKUP_S60
#define USB_PD_VMAX 20 // Maximum voltage for PD to negotiate
#define THERMAL_RUNAWAY_TIME_SEC 20
-#define THERMAL_RUNAWAY_TEMP_C 10
+#define THERMAL_RUNAWAY_TEMP_C 3
#define HARDWARE_MAX_WATTAGE_X10 600
@@ -218,8 +218,8 @@
#define TIP_THERMAL_MASS 30 // X10 watts to raise 1 deg C in 1 second
#define TIP_THERMAL_INERTIA 10 // We use a large inertia value to smooth out the drive to the tip since its stupidly sensitive
-#define THERMAL_RUNAWAY_TIME_SEC 60
-#define THERMAL_RUNAWAY_TEMP_C 3
+#define THERMAL_RUNAWAY_TIME_SEC 30
+#define THERMAL_RUNAWAY_TEMP_C 2
#define COPPER_HEATER_COIL 1 // Have a heater coil that changes resistance on us
#define TIP_RESISTANCE 52 // PCB heater, measured at ~19C. Will shift by temp a decent amount
diff --git a/source/Core/Threads/PIDThread.cpp b/source/Core/Threads/PIDThread.cpp
index 83c53efd..c7b27118 100644
--- a/source/Core/Threads/PIDThread.cpp
+++ b/source/Core/Threads/PIDThread.cpp
@@ -30,7 +30,7 @@ int32_t powerSupplyWattageLimit = 0;
bool heaterThermalRunaway = false;
static int32_t getPIDResultX10Watts(TemperatureType_t set_point, TemperatureType_t current_value);
-static void detectThermalRunaway(const TemperatureType_t currentTipTempInC, const TemperatureType_t tError);
+static void detectThermalRunaway(const TemperatureType_t currentTipTempInC, const uint32_t x10WattsOut);
static void setOutputx10WattsViaFilters(int32_t x10Watts);
static int32_t getX10WattageLimits();
@@ -92,8 +92,8 @@ void startPIDTask(void const *argument __unused) {
PIDTempTarget = TipThermoModel::getTipMaxInC();
}
- detectThermalRunaway(currentTipTempInC, PIDTempTarget - currentTipTempInC);
x10WattsOut = getPIDResultX10Watts(PIDTempTarget, currentTipTempInC);
+ detectThermalRunaway(currentTipTempInC, x10WattsOut);
} else {
detectThermalRunaway(currentTipTempInC, 0);
}
@@ -228,31 +228,59 @@ int32_t getPIDResultX10Watts(TemperatureType_t set_point, TemperatureType_t curr
#endif
}
-void detectThermalRunaway(const TemperatureType_t currentTipTempInC, const TemperatureType_t tError) {
- static TemperatureType_t tipTempCRunawayTemp = 0;
- static TickType_t runawaylastChangeTime = 0;
+/*
+ * Detection of thermal runaway
+ * The goal of this is to handle cases where something has gone wrong
+ * 1. The tip MOSFET is broken, so power is being constantly applied to the tip
+ * a. This can show as temp being stuck at max
+ * b. Or temp rising when the heater is off
+ * 2. Broken temperature sense
+ * a. Temp is stuck at a value
+ * These boil down to either a constantly rising temperature or a temperature that is stuck at a value
+ * These are both covered; but looking at the eye/delta between min and max temp seen
+ */
+void detectThermalRunaway(const TemperatureType_t currentTipTempInC, const uint32_t x10WattsOut) {
- // Check for thermal runaway, where it has been x seconds with negligible (y) temp rise
- // While trying to actively heat
+ static TemperatureType_t tiptempMin = 0xFFFF; // Min tip temp seen
+ static TemperatureType_t tipTempMax = 0; // Max tip temp seen while heater is on
+ bool thisCycleIsHeating = x10WattsOut > 0;
+ static TickType_t heatCycleStart = 0;
- // If we are more than 20C below the setpoint
- if ((tError > THERMAL_RUNAWAY_TEMP_C)) {
+ static bool haveSeenDelta = false;
- // If we have heated up by more than 20C since last sample point, snapshot time and tip temp
- TemperatureType_t delta = currentTipTempInC - tipTempCRunawayTemp;
- if (delta > THERMAL_RUNAWAY_TEMP_C) {
- // We have heated up more than the threshold, reset the timer
- tipTempCRunawayTemp = currentTipTempInC;
- runawaylastChangeTime = xTaskGetTickCount();
- } else {
- if ((xTaskGetTickCount() - runawaylastChangeTime) > (THERMAL_RUNAWAY_TIME_SEC * TICKS_SECOND)) {
- // It has taken too long to rise
+ // Check for readings being pegged at the top of the ADC while the heater is off
+ if (!thisCycleIsHeating && (getTipRawTemp(0) > (0x7FFF - 16))) {
+ heaterThermalRunaway = true;
+ }
+
+ if (haveSeenDelta) {
+ return;
+ }
+
+ if (currentTipTempInC < tiptempMin) {
+ tiptempMin = currentTipTempInC;
+ }
+ if (thisCycleIsHeating && currentTipTempInC > tipTempMax) {
+ tipTempMax = currentTipTempInC;
+ }
+ if (thisCycleIsHeating) {
+ if (heatCycleStart == 0) {
+ heatCycleStart = xTaskGetTickCount();
+ }
+ } else {
+ heatCycleStart = 0;
+ }
+
+ if ((xTaskGetTickCount() - heatCycleStart) > (THERMAL_RUNAWAY_TIME_SEC * TICKS_SECOND)) {
+ if (tipTempMax > tiptempMin) {
+ // Have been heating for min seconds, check if the delta is large enough
+ TemperatureType_t delta = tipTempMax - tiptempMin;
+ haveSeenDelta = true;
+
+ if (delta < THERMAL_RUNAWAY_TEMP_C) {
heaterThermalRunaway = true;
}
}
- } else {
- tipTempCRunawayTemp = currentTipTempInC;
- runawaylastChangeTime = xTaskGetTickCount();
}
}
@@ -308,4 +336,4 @@ void setOutputx10WattsViaFilters(int32_t x10WattsOut) {
#endif
setTipX10Watts(x10WattsOut);
resetWatchdog();
-} \ No newline at end of file
+}
diff --git a/source/Core/Threads/UI/logic/Soldering.cpp b/source/Core/Threads/UI/logic/Soldering.cpp
index 50508025..45483d15 100644
--- a/source/Core/Threads/UI/logic/Soldering.cpp
+++ b/source/Core/Threads/UI/logic/Soldering.cpp
@@ -138,9 +138,7 @@ OperatingMode gui_solderingMode(const ButtonState buttons, guiContext *cxt) {
// Draw in the screen details
if (getSettingValue(SettingsOptions::DetailedSoldering)) {
-
ui_draw_soldering_power_status(cxt->scratch_state.state2);
-
} else {
ui_draw_soldering_basic_status(cxt->scratch_state.state2);
}