mirror of
https://github.com/Ralim/IronOS.git
synced 2025-02-26 07:53:55 +00:00
Merge branch 'dev' into dev
This commit is contained in:
@@ -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))
|
||||
|
||||
@@ -63,8 +63,13 @@
|
||||
* OLED Brightness
|
||||
*
|
||||
*/
|
||||
#define MIN_BRIGHTNESS 0 // Min OLED brightness selectable
|
||||
#define MAX_BRIGHTNESS 100 // Max OLED brightness selectable
|
||||
#if defined(MODEL_TS101)
|
||||
#define MIN_BRIGHTNESS 1 // Min OLED brightness selectable
|
||||
#define MAX_BRIGHTNESS 101 // Max OLED brightness selectable
|
||||
#else
|
||||
#define MIN_BRIGHTNESS 0 // Min OLED brightness selectable
|
||||
#define MAX_BRIGHTNESS 100 // Max OLED brightness selectable
|
||||
#endif
|
||||
#define BRIGHTNESS_STEP 25 // OLED brightness increment
|
||||
#define DEFAULT_BRIGHTNESS 25 // default OLED brightness
|
||||
|
||||
@@ -104,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))
|
||||
@@ -214,6 +219,7 @@
|
||||
#define TEMP_NTC 1
|
||||
#define ACCEL_I2CBB1 1
|
||||
#define POW_EPR 1
|
||||
#define TIP_TYPE_SUPPORT 1 // Support for tips of different types, i.e. resistance
|
||||
#define AUTO_TIP_SELECTION 1 // Can auto-select the tip
|
||||
#define TIPTYPE_T12 1 // Can manually pick a T12 tip
|
||||
#define HAS_POWER_DEBUG_MENU
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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))
|
||||
@@ -155,6 +155,7 @@
|
||||
#define POW_EPR 1
|
||||
#define ENABLE_QC2 1
|
||||
#define MAG_SLEEP_SUPPORT 1
|
||||
#define TIP_TYPE_SUPPORT 1 // Support for tips of different types, i.e. resistance
|
||||
#define AUTO_TIP_SELECTION 1 // Can auto-select the tip
|
||||
#define TIPTYPE_T12 1 // Can manually pick a T12 tip
|
||||
#define DEVICE_HAS_VALIDATION_SUPPORT
|
||||
|
||||
@@ -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 USB_PD_TIMEOUT 1 // Default Timeout for USB-PD Protocol negotiation in x100ms
|
||||
|
||||
#define HARDWARE_MAX_WATTAGE_X10 600
|
||||
@@ -168,7 +168,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 USB_PD_TIMEOUT 1 // Default Timeout for USB-PD Protocol negotiation in x100ms
|
||||
|
||||
#define HARDWARE_MAX_WATTAGE_X10 600
|
||||
@@ -225,8 +225,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
|
||||
|
||||
@@ -123,6 +123,7 @@ typedef enum {
|
||||
* Some devices allow multiple types of tips to be fitted, this allows selecting them or overriding the logic
|
||||
* The first type will be the default (gets value of 0)
|
||||
*/
|
||||
#ifdef TIP_TYPE_SUPPORT
|
||||
typedef enum {
|
||||
#ifdef AUTO_TIP_SELECTION
|
||||
TIP_TYPE_AUTO, // If the hardware supports automatic detection
|
||||
@@ -142,7 +143,15 @@ typedef enum {
|
||||
// #endif
|
||||
TIP_TYPE_MAX, // Max value marker
|
||||
} tipType_t;
|
||||
uint8_t getUserSelectedTipResistance(); // returns the resistance matching the selected tip type or 0 for auto
|
||||
#else
|
||||
typedef enum {
|
||||
TIP_TYPE_AUTO = 0, // value for the default case
|
||||
TIP_TYPE_MAX = 0, // marker for settings when not supported
|
||||
} tipType_t;
|
||||
#endif /* TIP_TYPE_SUPPORT */
|
||||
|
||||
// returns the resistance matching the selected tip type or 0 for auto and when not supported
|
||||
uint8_t getUserSelectedTipResistance();
|
||||
|
||||
// Settings wide operations
|
||||
void saveSettings();
|
||||
@@ -162,5 +171,7 @@ void setSettingValue(const enum SettingsOptions option, const uint16_t newValue)
|
||||
// Special access helpers, to reduce logic duplication
|
||||
uint8_t lookupVoltageLevel();
|
||||
uint16_t lookupHallEffectThreshold();
|
||||
#ifdef TIP_TYPE_SUPPORT
|
||||
const char *lookupTipName(); // Get the name string for the current soldering tip
|
||||
#endif /* TIP_TYPE_SUPPORT */
|
||||
#endif /* SETTINGS_H_ */
|
||||
|
||||
@@ -298,16 +298,12 @@ uint8_t lookupVoltageLevel() {
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef TIP_TYPE_SUPPORT
|
||||
const char *lookupTipName() {
|
||||
// Get the name string for the current soldering tip
|
||||
tipType_t value = (tipType_t)getSettingValue(SettingsOptions::SolderingTipType);
|
||||
|
||||
switch (value) {
|
||||
#ifdef AUTO_TIP_SELECTION
|
||||
case tipType_t::TIP_TYPE_AUTO:
|
||||
return translatedString(Tr->TipTypeAuto);
|
||||
break;
|
||||
#endif
|
||||
#ifdef TIPTYPE_T12
|
||||
case tipType_t::T12_8_OHM:
|
||||
return translatedString(Tr->TipTypeT12Long);
|
||||
@@ -319,7 +315,7 @@ const char *lookupTipName() {
|
||||
return translatedString(Tr->TipTypeT12PTS);
|
||||
break;
|
||||
#endif
|
||||
#ifdef TIPTYE_TS80
|
||||
#ifdef TIPTYPE_TS80
|
||||
case tipType_t::TS80_4_5_OHM:
|
||||
return translatedString(Tr->TipTypeTS80);
|
||||
break;
|
||||
@@ -328,13 +324,19 @@ const char *lookupTipName() {
|
||||
case tipType_t::JBC_210_2_5_OHM:
|
||||
return translatedString(Tr->TipTypeJBCC210);
|
||||
break;
|
||||
#endif
|
||||
#ifdef AUTO_TIP_SELECTION
|
||||
case tipType_t::TIP_TYPE_AUTO:
|
||||
#endif
|
||||
default:
|
||||
return nullptr;
|
||||
return translatedString(Tr->TipTypeAuto);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif /* TIP_TYPE_SUPPORT */
|
||||
|
||||
// Returns the resistance for the current tip selected by the user or 0 for auto
|
||||
#ifdef TIP_TYPE_SUPPORT
|
||||
uint8_t getUserSelectedTipResistance() {
|
||||
tipType_t value = (tipType_t)getSettingValue(SettingsOptions::SolderingTipType);
|
||||
|
||||
@@ -370,3 +372,6 @@ uint8_t getUserSelectedTipResistance() {
|
||||
break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
uint8_t getUserSelectedTipResistance() { return tipType_t::TIP_TYPE_AUTO; }
|
||||
#endif /* TIP_TYPE_SUPPORT */
|
||||
|
||||
@@ -116,8 +116,10 @@ static bool showHallEffect(void);
|
||||
#endif /* HALL_SENSOR */
|
||||
|
||||
// Tip type selection
|
||||
#ifdef TIP_TYPE_SUPPORT
|
||||
static void displaySolderingTipType(void);
|
||||
static bool showSolderingTipType(void);
|
||||
#endif /* TIP_TYPE_SUPPORT */
|
||||
|
||||
// Menu functions
|
||||
|
||||
@@ -267,12 +269,12 @@ const menuitem powerMenu[] = {
|
||||
|
||||
const menuitem solderingMenu[] = {
|
||||
/*
|
||||
* Tip Type
|
||||
* Boost Mode Temp
|
||||
* Auto Start
|
||||
* Temp Change Short Step
|
||||
* Temp Change Long Step
|
||||
* Locking Mode
|
||||
* Tip Type
|
||||
* Profile Phases
|
||||
* Profile Preheat Temperature
|
||||
* Profile Preheat Max Temperature Change Per Second
|
||||
@@ -288,8 +290,6 @@ const menuitem solderingMenu[] = {
|
||||
* Profile Phase 5 Duration (s)
|
||||
* Profile Cooldown Max Temperature Change Per Second
|
||||
*/
|
||||
/* Tip Type */
|
||||
{SETTINGS_DESC(SettingsItemIndex::SolderingTipType), nullptr, displaySolderingTipType, showSolderingTipType, SettingsOptions::SolderingTipType, SettingsItemIndex::SolderingTipType, 5},
|
||||
/* Boost Temp */
|
||||
{SETTINGS_DESC(SettingsItemIndex::BoostTemperature), setBoostTemp, displayBoostTemp, nullptr, SettingsOptions::BoostTemp, SettingsItemIndex::BoostTemperature, 5},
|
||||
/* Auto start */
|
||||
@@ -300,6 +300,10 @@ const menuitem solderingMenu[] = {
|
||||
{SETTINGS_DESC(SettingsItemIndex::TempChangeLongStep), nullptr, displayTempChangeLongStep, nullptr, SettingsOptions::TempChangeLongStep, SettingsItemIndex::TempChangeLongStep, 6},
|
||||
/* Locking Mode */
|
||||
{SETTINGS_DESC(SettingsItemIndex::LockingMode), nullptr, displayLockingMode, nullptr, SettingsOptions::LockingMode, SettingsItemIndex::LockingMode, 7},
|
||||
#ifdef TIP_TYPE_SUPPORT
|
||||
/* Tip Type */
|
||||
{SETTINGS_DESC(SettingsItemIndex::SolderingTipType), nullptr, displaySolderingTipType, showSolderingTipType, SettingsOptions::SolderingTipType, SettingsItemIndex::SolderingTipType, 5},
|
||||
#endif /* TIP_TYPE_SUPPORT */
|
||||
#ifdef PROFILE_SUPPORT
|
||||
/* Profile Phases */
|
||||
{SETTINGS_DESC(SettingsItemIndex::ProfilePhases), nullptr, displayProfilePhases, nullptr, SettingsOptions::ProfilePhases, SettingsItemIndex::ProfilePhases, 7},
|
||||
@@ -763,12 +767,16 @@ static void displayHallEffectSleepTime(void) {
|
||||
}
|
||||
}
|
||||
#endif /* HALL_SENSOR */
|
||||
|
||||
#ifdef TIP_TYPE_SUPPORT
|
||||
static void displaySolderingTipType(void) {
|
||||
// TODO wrapping X value
|
||||
OLED::print(lookupTipName(), FontStyle::SMALL, 255, OLED::getCursorX());
|
||||
}
|
||||
// If there is no detection, and no options, max is 0
|
||||
static bool showSolderingTipType(void) { return tipType_t::TIP_TYPE_MAX != 0; }
|
||||
#endif /* TIP_TYPE_SUPPORT */
|
||||
|
||||
static void setTempF(const enum SettingsOptions option) {
|
||||
uint16_t Temp = getSettingValue(option);
|
||||
if (getSettingValue(SettingsOptions::TemperatureInF)) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,20 +29,20 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
enum class OperatingMode {
|
||||
StartupLogo = 0, // Showing the startup logo
|
||||
CJCCalibration, // Cold Junction Calibration
|
||||
StartupWarnings, // Startup checks and warnings
|
||||
InitialisationDone, // Special state we use just before we to home screen at first startup. Allows jumping to extra startup states
|
||||
HomeScreen, // Home/Idle screen that is the main launchpad to other modes
|
||||
Soldering, // Main soldering operating mode
|
||||
SolderingProfile, // Soldering by following a profile, used for reflow for example
|
||||
Sleeping, // Sleep state holds iron at lower sleep temp
|
||||
Hibernating, // Like sleeping but keeps heater fully off until woken
|
||||
SettingsMenu, // Settings Menu
|
||||
DebugMenuReadout, // Debug metrics
|
||||
TemperatureAdjust, // Set point temperature adjustment
|
||||
UsbPDDebug, // USB PD debugging information
|
||||
ThermalRunaway, // Thermal Runaway warning state.
|
||||
StartupLogo=10, // Showing the startup logo
|
||||
CJCCalibration=11, // Cold Junction Calibration
|
||||
StartupWarnings=12, // Startup checks and warnings
|
||||
InitialisationDone=13, // Special state we use just before we to home screen at first startup. Allows jumping to extra startup states
|
||||
HomeScreen=0, // Home/Idle screen that is the main launchpad to other modes
|
||||
Soldering=1, // Main soldering operating mode
|
||||
SolderingProfile=6, // Soldering by following a profile, used for reflow for example
|
||||
Sleeping=3, // Sleep state holds iron at lower sleep temp
|
||||
Hibernating=14, // Like sleeping but keeps heater fully off until woken
|
||||
SettingsMenu=4, // Settings Menu
|
||||
DebugMenuReadout=5, // Debug metrics
|
||||
TemperatureAdjust=7, // Set point temperature adjustment
|
||||
UsbPDDebug=8, // USB PD debugging information
|
||||
ThermalRunaway=9, // Thermal Runaway warning state.
|
||||
};
|
||||
|
||||
enum class TransitionAnimation {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user