1
0
forked from me/IronOS

Merge pull request #993 from Ralim/ralim/const-temp-catch

Thermal Runaway alert
This commit is contained in:
Ben V. Brown
2021-06-24 21:15:55 +10:00
committed by GitHub
34 changed files with 112 additions and 33 deletions

View File

@@ -42,7 +42,8 @@
], ],
"LockingKeysString": " LOCKED", "LockingKeysString": " LOCKED",
"UnlockingKeysString": "UNLOCKED", "UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!" "WarningKeysLockedString": "!LOCKED!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "R", "SettingRightChar": "R",

View File

@@ -42,7 +42,8 @@
], ],
"LockingKeysString": " LOCKED", "LockingKeysString": " LOCKED",
"UnlockingKeysString": "UNLOCKED", "UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!" "WarningKeysLockedString": "!LOCKED!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "P", "SettingRightChar": "P",

View File

@@ -42,7 +42,8 @@
], ],
"LockingKeysString": " LOCKED", "LockingKeysString": " LOCKED",
"UnlockingKeysString": "UNLOCKED", "UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!" "WarningKeysLockedString": "!LOCKED!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "H", "SettingRightChar": "H",

View File

@@ -43,7 +43,8 @@
], ],
"LockingKeysString": "GESPERRT", "LockingKeysString": "GESPERRT",
"UnlockingKeysString": "ENTSPERRT", "UnlockingKeysString": "ENTSPERRT",
"WarningKeysLockedString": "!GESPERRT!" "WarningKeysLockedString": "!GESPERRT!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "R", "SettingRightChar": "R",

View File

@@ -42,7 +42,8 @@
], ],
"LockingKeysString": "LOCKED", "LockingKeysString": "LOCKED",
"UnlockingKeysString": "UNLOCKED", "UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!" "WarningKeysLockedString": "!LOCKED!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "R", "SettingRightChar": "R",

View File

@@ -43,7 +43,8 @@
], ],
"LockingKeysString": " BLOQUEADO", "LockingKeysString": " BLOQUEADO",
"UnlockingKeysString": "DESBLOQUEADO", "UnlockingKeysString": "DESBLOQUEADO",
"WarningKeysLockedString": "¡BLOQUEADO!" "WarningKeysLockedString": "¡BLOQUEADO!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "D", "SettingRightChar": "D",

View File

@@ -41,7 +41,8 @@
], ],
"LockingKeysString": " LUKITTU", "LockingKeysString": " LUKITTU",
"UnlockingKeysString": "AUKI", "UnlockingKeysString": "AUKI",
"WarningKeysLockedString": "!LUKKO!" "WarningKeysLockedString": "!LUKKO!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "O", "SettingRightChar": "O",

View File

@@ -42,7 +42,8 @@
], ],
"LockingKeysString": "VERROUIL", "LockingKeysString": "VERROUIL",
"UnlockingKeysString": "DEVERROU", "UnlockingKeysString": "DEVERROU",
"WarningKeysLockedString": "! VERR. !" "WarningKeysLockedString": "! VERR. !",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "D", "SettingRightChar": "D",

View File

@@ -42,7 +42,8 @@
], ],
"LockingKeysString": " LOCKED", "LockingKeysString": " LOCKED",
"UnlockingKeysString": "UNLOCKED", "UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!" "WarningKeysLockedString": "!LOCKED!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "D", "SettingRightChar": "D",

View File

@@ -45,7 +45,8 @@
], ],
"LockingKeysString": "LEZÁRVA", "LockingKeysString": "LEZÁRVA",
"UnlockingKeysString": "FELOLDVA", "UnlockingKeysString": "FELOLDVA",
"WarningKeysLockedString": "!LEZÁRVA!" "WarningKeysLockedString": "!LEZÁRVA!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "J", "SettingRightChar": "J",

View File

@@ -42,7 +42,8 @@
], ],
"LockingKeysString": "Blocc.", "LockingKeysString": "Blocc.",
"UnlockingKeysString": "Sblocc.", "UnlockingKeysString": "Sblocc.",
"WarningKeysLockedString": "BLOCCATO" "WarningKeysLockedString": "BLOCCATO",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "D", "SettingRightChar": "D",

View File

@@ -40,7 +40,8 @@
], ],
"LockingKeysString": "ボタンロック", "LockingKeysString": "ボタンロック",
"UnlockingKeysString": "ロックを解除", "UnlockingKeysString": "ロックを解除",
"WarningKeysLockedString": "!入力ロック中!" "WarningKeysLockedString": "!入力ロック中!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "右", "SettingRightChar": "右",

View File

@@ -42,7 +42,8 @@
], ],
"LockingKeysString": " UŽRAKIN", "LockingKeysString": " UŽRAKIN",
"UnlockingKeysString": "ATRAKIN", "UnlockingKeysString": "ATRAKIN",
"WarningKeysLockedString": "!UŽRAK!" "WarningKeysLockedString": "!UŽRAK!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "D", "SettingRightChar": "D",

View File

@@ -42,7 +42,8 @@
], ],
"LockingKeysString": " GEBLOKKEERD", "LockingKeysString": " GEBLOKKEERD",
"UnlockingKeysString": "GEDEBLOKKEERD", "UnlockingKeysString": "GEDEBLOKKEERD",
"WarningKeysLockedString": "!GEBLOKKEERD!" "WarningKeysLockedString": "!GEBLOKKEERD!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "R", "SettingRightChar": "R",

View File

@@ -42,7 +42,8 @@
], ],
"LockingKeysString": " LOCKED", "LockingKeysString": " LOCKED",
"UnlockingKeysString": "UNLOCKED", "UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!" "WarningKeysLockedString": "!LOCKED!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "R", "SettingRightChar": "R",

View File

@@ -42,7 +42,8 @@
], ],
"LockingKeysString": " LOCKED", "LockingKeysString": " LOCKED",
"UnlockingKeysString": "UNLOCKED", "UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!" "WarningKeysLockedString": "!LOCKED!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "H", "SettingRightChar": "H",

View File

@@ -43,7 +43,8 @@
], ],
"LockingKeysString": " ZABLOK.", "LockingKeysString": " ZABLOK.",
"UnlockingKeysString": "ODBLOK.", "UnlockingKeysString": "ODBLOK.",
"WarningKeysLockedString": "!ZABLOK!" "WarningKeysLockedString": "!ZABLOK!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "P", "SettingRightChar": "P",

View File

@@ -42,7 +42,8 @@
], ],
"LockingKeysString": "LOCKED", "LockingKeysString": "LOCKED",
"UnlockingKeysString": "UNLOCKED", "UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!" "WarningKeysLockedString": "!LOCKED!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "D", "SettingRightChar": "D",

View File

@@ -43,7 +43,8 @@
], ],
"LockingKeysString": "LOCKED", "LockingKeysString": "LOCKED",
"UnlockingKeysString": "UNLOCKED", "UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!" "WarningKeysLockedString": "!LOCKED!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "П", "SettingRightChar": "П",

View File

@@ -42,7 +42,8 @@
], ],
"LockingKeysString": "ZABLOK.", "LockingKeysString": "ZABLOK.",
"UnlockingKeysString": "ODBLOK.", "UnlockingKeysString": "ODBLOK.",
"WarningKeysLockedString": "!ZABLOK!" "WarningKeysLockedString": "!ZABLOK!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "P", "SettingRightChar": "P",

View File

@@ -42,7 +42,8 @@
], ],
"LockingKeysString": "ZAKLENJ.", "LockingKeysString": "ZAKLENJ.",
"UnlockingKeysString": "ODKLENJ.", "UnlockingKeysString": "ODKLENJ.",
"WarningKeysLockedString": "ZAKLENJ." "WarningKeysLockedString": "ZAKLENJ.",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "D", "SettingRightChar": "D",

View File

@@ -42,7 +42,8 @@
], ],
"LockingKeysString": "LOCKED", "LockingKeysString": "LOCKED",
"UnlockingKeysString": "UNLOCKED", "UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!" "WarningKeysLockedString": "!LOCKED!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "Д", "SettingRightChar": "Д",

View File

@@ -42,7 +42,8 @@
], ],
"LockingKeysString": "LOCKED", "LockingKeysString": "LOCKED",
"UnlockingKeysString": "UNLOCKED", "UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!" "WarningKeysLockedString": "!LOCKED!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "D", "SettingRightChar": "D",

View File

@@ -36,7 +36,8 @@
], ],
"LockingKeysString": "LÅST", "LockingKeysString": "LÅST",
"UnlockingKeysString": "UPPLÅST", "UnlockingKeysString": "UPPLÅST",
"WarningKeysLockedString": "!LÅST!" "WarningKeysLockedString": "!LÅST!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "H", "SettingRightChar": "H",

View File

@@ -45,7 +45,8 @@
], ],
"LockingKeysString": "LOCKED", "LockingKeysString": "LOCKED",
"UnlockingKeysString": "UNLOCKED", "UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!" "WarningKeysLockedString": "!LOCKED!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "R", "SettingRightChar": "R",

View File

@@ -43,7 +43,8 @@
], ],
"LockingKeysString": "ЗАБЛОК.", "LockingKeysString": "ЗАБЛОК.",
"UnlockingKeysString": "РОЗБЛОК.", "UnlockingKeysString": "РОЗБЛОК.",
"WarningKeysLockedString": "!ЗАБЛОК!" "WarningKeysLockedString": "!ЗАБЛОК!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "П", "SettingRightChar": "П",

View File

@@ -40,7 +40,8 @@
], ],
"LockingKeysString": "已鎖定", "LockingKeysString": "已鎖定",
"UnlockingKeysString": "已解除鎖定", "UnlockingKeysString": "已解除鎖定",
"WarningKeysLockedString": "!撳掣鎖定!" "WarningKeysLockedString": "!撳掣鎖定!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "右", "SettingRightChar": "右",

View File

@@ -40,7 +40,8 @@
], ],
"LockingKeysString": "已锁定", "LockingKeysString": "已锁定",
"UnlockingKeysString": "已解除锁定", "UnlockingKeysString": "已解除锁定",
"WarningKeysLockedString": "!按键锁定!" "WarningKeysLockedString": "!按键锁定!",
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "右", "SettingRightChar": "右",

View File

@@ -40,7 +40,9 @@
], ],
"LockingKeysString": "已鎖定", "LockingKeysString": "已鎖定",
"UnlockingKeysString": "已解除鎖定", "UnlockingKeysString": "已解除鎖定",
"WarningKeysLockedString": "!按鍵鎖定!" "WarningKeysLockedString": "!按鍵鎖定!",
"WarningThermalRunaway":["Thermal","Runaway"],
"WarningThermalRunaway":["Thermal","Runaway"]
}, },
"characters": { "characters": {
"SettingRightChar": "右", "SettingRightChar": "右",

View File

@@ -83,6 +83,9 @@ var def =
}, },
{ {
"id": "WarningKeysLockedString" "id": "WarningKeysLockedString"
},
{
"id": "WarningThermalRunaway"
} }
], ],
"characters": [ "characters": [

View File

@@ -85,6 +85,7 @@ struct TranslationIndexTable {
uint16_t LockingKeysString; uint16_t LockingKeysString;
uint16_t UnlockingKeysString; uint16_t UnlockingKeysString;
uint16_t WarningKeysLockedString; uint16_t WarningKeysLockedString;
uint16_t WarningThermalRunaway;
uint16_t SettingRightChar; uint16_t SettingRightChar;
uint16_t SettingLeftChar; uint16_t SettingLeftChar;

View File

@@ -94,6 +94,9 @@
#define DETAILED_SOLDERING 0 // 0: Disable 1: Enable - Default 0 #define DETAILED_SOLDERING 0 // 0: Disable 1: Enable - Default 0
#define DETAILED_IDLE 0 // 0: Disable 1: Enable - Default 0 #define DETAILED_IDLE 0 // 0: Disable 1: Enable - Default 0
#define THERMAL_RUNAWAY_TIME_SEC 20
#define THERMAL_RUNAWAY_TEMP_C 20
#define CUT_OUT_SETTING 0 // default to no cut-off voltage #define CUT_OUT_SETTING 0 // default to no cut-off voltage
#define RECOM_VOL_CELL 33 // Minimum voltage per cell (Recommended 3.3V (33)) #define RECOM_VOL_CELL 33 // Minimum voltage per cell (Recommended 3.3V (33))
#define TEMPERATURE_INF 0 // default to 0 #define TEMPERATURE_INF 0 // default to 0

View File

@@ -28,6 +28,7 @@ extern "C" {
// File local variables // File local variables
extern uint32_t currentTempTargetDegC; extern uint32_t currentTempTargetDegC;
extern TickType_t lastMovementTime; extern TickType_t lastMovementTime;
extern bool heaterThermalRunaway;
extern osThreadId GUITaskHandle; extern osThreadId GUITaskHandle;
extern osThreadId MOVTaskHandle; extern osThreadId MOVTaskHandle;
extern osThreadId PIDTaskHandle; extern osThreadId PIDTaskHandle;
@@ -62,7 +63,7 @@ void GUIDelay() {
// This limits the re-draw rate to the LCD and also lets the DMA run // This limits the re-draw rate to the LCD and also lets the DMA run
// As the gui task can very easily fill this bus with transactions, which will // As the gui task can very easily fill this bus with transactions, which will
// prevent the movement detection from running // prevent the movement detection from running
osDelay(50); vTaskDelay(5 * TICKS_10MS);
} }
void gui_drawTipTemp(bool symbol, const FontStyle font) { void gui_drawTipTemp(bool symbol, const FontStyle font) {
// Draw tip temp handling unit conversion & tolerance near setpoint // Draw tip temp handling unit conversion & tolerance near setpoint
@@ -608,7 +609,6 @@ static void gui_solderingMode(uint8_t jumpToSleep) {
} }
} }
OLED::refresh(); OLED::refresh();
// Update the setpoints for the temperature // Update the setpoints for the temperature
if (boostModeOn) { if (boostModeOn) {
if (systemSettings.temperatureInF) if (systemSettings.temperatureInF)
@@ -645,6 +645,15 @@ static void gui_solderingMode(uint8_t jumpToSleep) {
} else { } else {
setStatusLED(LED_HEATING); setStatusLED(LED_HEATING);
} }
// If we have tripped thermal runaway, turn off header and show warning
if (heaterThermalRunaway) {
currentTempTargetDegC = 0; // heaater control off
// TODO WARNING
warnUser(translatedString(Tr->WarningThermalRunaway), 10 * TICKS_SECOND);
heaterThermalRunaway = false;
return;
}
// slow down ui update rate // slow down ui update rate
GUIDelay(); GUIDelay();
} }

View File

@@ -19,6 +19,7 @@ static TickType_t powerPulseDurationUnit = (5 * TICKS_100MS) / 2; // 250 ms
TaskHandle_t pidTaskNotification = NULL; TaskHandle_t pidTaskNotification = NULL;
uint32_t currentTempTargetDegC = 0; // Current temperature target in C uint32_t currentTempTargetDegC = 0; // Current temperature target in C
int32_t powerSupplyWattageLimit = 0; int32_t powerSupplyWattageLimit = 0;
bool heaterThermalRunaway = false;
/* StartPIDTask function */ /* StartPIDTask function */
void startPIDTask(void const *argument __unused) { void startPIDTask(void const *argument __unused) {
/* /*
@@ -32,8 +33,10 @@ void startPIDTask(void const *argument __unused) {
history<int32_t, PID_TIM_HZ> tempError = {{0}, 0, 0}; history<int32_t, PID_TIM_HZ> tempError = {{0}, 0, 0};
currentTempTargetDegC = 0; // Force start with no output (off). If in sleep / soldering this will currentTempTargetDegC = 0; // Force start with no output (off). If in sleep / soldering this will
// be over-ridden rapidly // be over-ridden rapidly
pidTaskNotification = xTaskGetCurrentTaskHandle(); pidTaskNotification = xTaskGetCurrentTaskHandle();
uint32_t PIDTempTarget = 0; uint32_t PIDTempTarget = 0;
uint16_t tipTempCRunawayTemp = 0;
TickType_t runawaylastChangeTime = 0;
#ifdef SLEW_LIMIT #ifdef SLEW_LIMIT
int32_t x10WattsOutLast = 0; int32_t x10WattsOutLast = 0;
#endif #endif
@@ -91,6 +94,33 @@ void startPIDTask(void const *argument __unused) {
// and counters extra power if the iron is no longer losing temp. // and counters extra power if the iron is no longer losing temp.
// basically: temp - lastTemp // basically: temp - lastTemp
// Unfortunately, our temp signal is too noisy to really help. // Unfortunately, our temp signal is too noisy to really help.
// Check for thermal runaway, where it has been x seconds with negligible (y) temp rise
// While trying to actively heat
if ((tError > THERMAL_RUNAWAY_TEMP_C)) {
// Temp error is high
int16_t delta = (int16_t)currentTipTempInC - (int16_t)tipTempCRunawayTemp;
if (delta < 0) {
delta = -delta;
}
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
heaterThermalRunaway = true;
}
}
} else {
tipTempCRunawayTemp = currentTipTempInC;
runawaylastChangeTime = xTaskGetTickCount();
}
} else {
tipTempCRunawayTemp = currentTipTempInC;
runawaylastChangeTime = xTaskGetTickCount();
} }
// If the user turns on the option of using an occasional pulse to keep the power bank on // If the user turns on the option of using an occasional pulse to keep the power bank on
if (systemSettings.KeepAwakePulse) { if (systemSettings.KeepAwakePulse) {
@@ -111,6 +141,9 @@ void startPIDTask(void const *argument __unused) {
if (getTipRawTemp(0) > (0x7FFF - 32)) { if (getTipRawTemp(0) > (0x7FFF - 32)) {
x10WattsOut = 0; x10WattsOut = 0;
} }
if (heaterThermalRunaway) {
x10WattsOut = 0;
}
if (systemSettings.powerLimit && x10WattsOut > (systemSettings.powerLimit * 10)) { if (systemSettings.powerLimit && x10WattsOut > (systemSettings.powerLimit * 10)) {
x10WattsOut = systemSettings.powerLimit * 10; x10WattsOut = systemSettings.powerLimit * 10;
} }