diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index 1aa237046b..0358c93b34 100644 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -260,6 +260,9 @@ extern float max_pos[3]; extern bool axis_known_position[3]; extern float zprobe_zoffset; extern int fanSpeed; +#ifdef TEMP_RUNAWAY_SAFETY_NET +extern unsigned char fanSpeedReduce; // reduction of fan speed due to "safety net" +#endif extern void homeaxis(int axis); diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 5dec1a7ef4..462c2bc218 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -320,6 +320,9 @@ float extruder_offset[NUM_EXTRUDER_OFFSETS][EXTRUDERS] = { uint8_t active_extruder = 0; int fanSpeed=0; +#ifdef TEMP_RUNAWAY_SAFETY_NET +unsigned char fanSpeedReduce=0; // reduction of fan speed due to "safety net" +#endif #ifdef FWRETRACT bool autoretract_enabled=false; diff --git a/Firmware/planner.cpp b/Firmware/planner.cpp index 7dd79903a2..ed570e9119 100644 --- a/Firmware/planner.cpp +++ b/Firmware/planner.cpp @@ -505,6 +505,10 @@ void check_axes_activity() disable_e1(); disable_e2(); } +#ifdef TEMP_RUNAWAY_SAFETY_NET + if (tail_fan_speed >= fanSpeedReduce) tail_fan_speed -= fanSpeedReduce; + else tail_fan_speed = 0; +#endif #if defined(FAN_PIN) && FAN_PIN > -1 #ifdef FAN_KICK_START_TIME static bool fan_kick = false; diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index 63b5020881..f5591fb67a 100644 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -1136,6 +1136,9 @@ void temp_runaway_check(int _heater_id, float _target_temperature, float _curren { __hysteresis = TEMP_RUNAWAY_EXTRUDER_HYSTERESIS; __timeout = TEMP_RUNAWAY_EXTRUDER_TIMEOUT; +#ifdef TEMP_RUNAWAY_SAFETY_NET + fanSpeedReduce = 0; // default assumption is no reduction in fan speed +#endif } #endif @@ -1215,6 +1218,30 @@ void temp_runaway_check(int _heater_id, float _target_temperature, float _curren if (temp_runaway_check_active) { +#if defined(TEMP_RUNAWAY_SAFETY_NET) && TEMP_RUNAWAY_SAFETY_NET < TEMP_RUNAWAY_EXTRUDER_HYSTERESIS + if (!_isbed) + { + if (fanSpeed > 0 && _current_temperature < (_target_temperature - TEMP_RUNAWAY_SAFETY_NET)) + { + // into safety net and beyond. + // implement trivial P regulator of fan speed against temperature + // over 60% of temperature span where runaway shutdown kicks in. + // this will reduce actual filament temperature when this mechanism is triggered + // which may happen to be not a bad thing for instance when bridging. + int reduce = (255.0 * (_target_temperature - TEMP_RUNAWAY_SAFETY_NET - _current_temperature)) / + (0.6 * (TEMP_RUNAWAY_EXTRUDER_HYSTERESIS - TEMP_RUNAWAY_SAFETY_NET)); + fanSpeedReduce = (reduce < 255) ? reduce : 255; +#if 0 // DEBUG + static unsigned char did_warn; // reset when? + if (!did_warn) + { + LCD_ALERTMESSAGEPGM("FAN THROTTLED"); + did_warn = 1; + } +#endif + } + } +#endif // we are in range if ((_isbed && (_target_temperature > TEMP_MAX_CHECKED_BED) && (_current_temperature > TEMP_MAX_CHECKED_BED)) || ((_current_temperature > (_target_temperature - __hysteresis)) && (_current_temperature < (_target_temperature + __hysteresis)))) { @@ -1324,6 +1351,10 @@ void disable_heater() WRITE(HEATER_BED_PIN,LOW); #endif #endif + + #ifdef TEMP_RUNAWAY_SAFETY_NET + fanSpeedReduce = 0; + #endif } void max_temp_error(uint8_t e) { diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 221a0bc6c8..ed6331853c 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -4942,6 +4942,9 @@ void lcd_print_stop() { SET_OUTPUT(FAN_PIN); WRITE(FAN_PIN, 0); fanSpeed=0; +#ifdef TEMP_RUNAWAY_SAFETY_NET + fanSpeedReduce = 0; +#endif } diff --git a/Firmware/variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h index 708a14c0e4..868df95a3e 100644 --- a/Firmware/variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h @@ -184,6 +184,7 @@ ADDITIONAL FEATURES SETTINGS #define TEMP_RUNAWAY_BED_HYSTERESIS 5 #define TEMP_RUNAWAY_BED_TIMEOUT 360 +#define TEMP_RUNAWAY_SAFETY_NET 3 // temperature difference where "fan reduce safety net" feature kicks in #define TEMP_RUNAWAY_EXTRUDER_HYSTERESIS 15 #define TEMP_RUNAWAY_EXTRUDER_TIMEOUT 45 diff --git a/Firmware/variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h b/Firmware/variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h index fbfc4290c7..8a1fdf010b 100644 --- a/Firmware/variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h @@ -184,6 +184,7 @@ ADDITIONAL FEATURES SETTINGS #define TEMP_RUNAWAY_BED_HYSTERESIS 5 #define TEMP_RUNAWAY_BED_TIMEOUT 360 +#define TEMP_RUNAWAY_SAFETY_NET 3 // temperature difference where "fan reduce safety net" feature kicks in #define TEMP_RUNAWAY_EXTRUDER_HYSTERESIS 15 #define TEMP_RUNAWAY_EXTRUDER_TIMEOUT 45 diff --git a/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h index 9e4ff1a2e9..e0ee638c2d 100644 --- a/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h @@ -181,6 +181,7 @@ ADDITIONAL FEATURES SETTINGS #define TEMP_RUNAWAY_BED_HYSTERESIS 5 #define TEMP_RUNAWAY_BED_TIMEOUT 360 +#define TEMP_RUNAWAY_SAFETY_NET 3 // temperature difference where "fan reduce safety net" feature kicks in #define TEMP_RUNAWAY_EXTRUDER_HYSTERESIS 15 #define TEMP_RUNAWAY_EXTRUDER_TIMEOUT 45 diff --git a/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h index a3c39a180b..ef556a3ed8 100644 --- a/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h @@ -183,6 +183,7 @@ ADDITIONAL FEATURES SETTINGS #define TEMP_RUNAWAY_BED_HYSTERESIS 5 #define TEMP_RUNAWAY_BED_TIMEOUT 360 +#define TEMP_RUNAWAY_SAFETY_NET 3 // temperature difference where "fan reduce safety net" feature kicks in #define TEMP_RUNAWAY_EXTRUDER_HYSTERESIS 15 #define TEMP_RUNAWAY_EXTRUDER_TIMEOUT 45 diff --git a/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h index 5833e3a8f3..6ca35ed43c 100644 --- a/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h @@ -181,6 +181,7 @@ ADDITIONAL FEATURES SETTINGS #define TEMP_RUNAWAY_BED_HYSTERESIS 5 #define TEMP_RUNAWAY_BED_TIMEOUT 360 +#define TEMP_RUNAWAY_SAFETY_NET 3 // temperature difference where "fan reduce safety net" feature kicks in #define TEMP_RUNAWAY_EXTRUDER_HYSTERESIS 15 #define TEMP_RUNAWAY_EXTRUDER_TIMEOUT 45 diff --git a/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h index 4cfa53239a..72de78f115 100644 --- a/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h @@ -183,6 +183,7 @@ ADDITIONAL FEATURES SETTINGS #define TEMP_RUNAWAY_BED_HYSTERESIS 5 #define TEMP_RUNAWAY_BED_TIMEOUT 360 +#define TEMP_RUNAWAY_SAFETY_NET 3 // temperature difference where "fan reduce safety net" feature kicks in #define TEMP_RUNAWAY_EXTRUDER_HYSTERESIS 15 #define TEMP_RUNAWAY_EXTRUDER_TIMEOUT 45