From c7cf8fcf6c14bab080524adc147f0df2ef8d3639 Mon Sep 17 00:00:00 2001 From: David Buezas Date: Fri, 21 Jun 2024 19:09:00 +0200 Subject: [PATCH 1/9] Fan override --- Marlin/src/gcode/temp/M106_M107.cpp | 16 ++++++++++++++++ Marlin/src/lcd/language/language_en.h | 3 +++ Marlin/src/lcd/menu/menu_temperature.cpp | 8 ++++++++ Marlin/src/module/planner.cpp | 2 +- Marlin/src/module/temperature.cpp | 9 +++++++++ Marlin/src/module/temperature.h | 5 ++++- 6 files changed, 41 insertions(+), 2 deletions(-) diff --git a/Marlin/src/gcode/temp/M106_M107.cpp b/Marlin/src/gcode/temp/M106_M107.cpp index afa2ebfc5669..97a32482c1cd 100644 --- a/Marlin/src/gcode/temp/M106_M107.cpp +++ b/Marlin/src/gcode/temp/M106_M107.cpp @@ -50,6 +50,8 @@ * I Material Preset index (if material presets are defined) * S Speed between 0-255 * P Fan index, if more than one fan + * L Lock fan + * U Unlock fan * * With EXTRA_FAN_SPEED enabled: * @@ -59,6 +61,19 @@ * 3-255 = Set the speed for use with T2 */ void GcodeSuite::M106() { + if (parser.seen('L')) { + thermalManager.lock_fan = true; + if (!parser.seenval('S')) return; + } if (parser.seen('U')) { + thermalManager.lock_fan = false; + return; + } else if (thermalManager.lock_fan) return; + + if (parser.seenval('M')) { + thermalManager.set_fan_multiplier(parser.value_float()); + if (!parser.seenval('S')) return; + } + const uint8_t pfan = parser.byteval('P', _ALT_P); if (pfan >= _CNT_P) return; if (FAN_IS_REDUNDANT(pfan)) return; @@ -98,6 +113,7 @@ void GcodeSuite::M106() { * M107: Fan Off */ void GcodeSuite::M107() { + if (thermalManager.lock_fan) return; const uint8_t pfan = parser.byteval('P', _ALT_P); if (pfan >= _CNT_P) return; if (FAN_IS_REDUNDANT(pfan)) return; diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index f30b29dd4e64..af73a95f0881 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -561,6 +561,9 @@ namespace LanguageNarrow_en { LSTR MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Recover Speed"); LSTR MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Fan Speed"); LSTR MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Fan Time"); + LSTR MSG_LOCK_FAN = _UxGT("Lock Fan"); + LSTR MSG_UNLOCK_FAN = _UxGT("Unlock Fan"); + LSTR MSG_FAN_MULTIPLIER = _UxGT("Fan Multiplier"); LSTR MSG_TOOL_MIGRATION_ON = _UxGT("Auto ON"); LSTR MSG_TOOL_MIGRATION_OFF = _UxGT("Auto OFF"); LSTR MSG_TOOL_MIGRATION = _UxGT("Tool Migration"); diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index e8a7b25dcb38..4bbfcf813a73 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -219,6 +219,14 @@ void menu_temperature() { #if FAN_IS_M106ABLE(0) _FAN_EDIT_ITEMS(0, FIRST_FAN_SPEED); + if (thermalManager.lock_fan) { + ACTION_ITEM(MSG_UNLOCK_FAN, []{ thermalManager.lock_fan = false; ui.refresh(); }); + } else { + ACTION_ITEM(MSG_LOCK_FAN, []{ thermalManager.lock_fan = true; ui.refresh(); }); + } + editable.decimal = thermalManager.get_fan_multiplier(); + EDIT_ITEM_FAST(float31, MSG_FAN_MULTIPLIER, &editable.decimal, 0.0f, 9.9f, []{ thermalManager.set_fan_multiplier(editable.decimal); }, true); + #endif #if FAN_IS_M106ABLE(1) FAN_EDIT_ITEMS(1); diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 892258ff3b36..a92ca4c2136c 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1186,7 +1186,7 @@ void Planner::recalculate(const_float_t safe_exit_speed_sqr) { #if ENABLED(FAN_SOFT_PWM) #define _FAN_SET(F) thermalManager.soft_pwm_amount_fan[F] = CALC_FAN_SPEED(fan_speed[F]); #else - #define _FAN_SET(F) hal.set_pwm_duty(pin_t(FAN##F##_PIN), CALC_FAN_SPEED(fan_speed[F])); + #define _FAN_SET(F) hal.set_pwm_duty(pin_t(FAN##F##_PIN), CALC_FAN_SPEED(constrain(fan_speed[F] * thermalManager.get_fan_multiplier(), 0, 255))); #endif #define FAN_SET(F) do{ kickstart_fan(fan_speed, ms, F); _FAN_SET(F); }while(0) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 1b8ebeea6964..7661dde1a1d8 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -284,6 +284,15 @@ PGMSTR(str_t_heating_failed, STR_T_HEATING_FAILED); * public: */ + void Temperature::set_fan_multiplier(float m){ + fan_multiplier = m; + planner.sync_fan_speeds(fan_speed); + } + + float Temperature::get_fan_multiplier(){ + return fan_multiplier; + } + #if ENABLED(TEMP_TUNING_MAINTAIN_FAN) bool Temperature::adaptive_fan_slowing = true; #endif diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 15cfeac91118..436757d960d7 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -597,6 +597,9 @@ typedef struct { raw_adc_t raw_min, raw_max; celsius_t mintemp, maxtemp; } temp_ class Temperature { public: + bool lock_fan; + void set_fan_multiplier(float m); + float get_fan_multiplier(); #if HAS_HOTEND static hotend_info_t temp_hotend[HOTENDS]; @@ -1334,7 +1337,7 @@ class Temperature { #endif private: - + float fan_multiplier = 1; // Reading raw temperatures and converting to Celsius when ready static volatile bool raw_temps_ready; static void update_raw_temperatures(); From 85e653dac984452589c46b9ed7fe47283da041d4 Mon Sep 17 00:00:00 2001 From: David Buezas Date: Tue, 25 Jun 2024 21:11:50 +0200 Subject: [PATCH 2/9] Fix non passing test --- Marlin/src/module/temperature.cpp | 2 ++ Marlin/src/module/temperature.h | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 7661dde1a1d8..2ea9436e121c 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -284,10 +284,12 @@ PGMSTR(str_t_heating_failed, STR_T_HEATING_FAILED); * public: */ +#if HAS_FAN void Temperature::set_fan_multiplier(float m){ fan_multiplier = m; planner.sync_fan_speeds(fan_speed); } +#endif float Temperature::get_fan_multiplier(){ return fan_multiplier; diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 436757d960d7..d2a7f1f38bb1 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -598,8 +598,10 @@ class Temperature { public: bool lock_fan; - void set_fan_multiplier(float m); - float get_fan_multiplier(); + #if HAS_FAN + void set_fan_multiplier(float m); + float get_fan_multiplier(); + #endif #if HAS_HOTEND static hotend_info_t temp_hotend[HOTENDS]; From b6fab3ad5878f2d2e8a3cc365bd14affe9a7839d Mon Sep 17 00:00:00 2001 From: David Buezas Date: Tue, 25 Jun 2024 21:17:42 +0200 Subject: [PATCH 3/9] fix --- Marlin/src/module/temperature.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 2ea9436e121c..b83f90524b80 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -289,11 +289,11 @@ PGMSTR(str_t_heating_failed, STR_T_HEATING_FAILED); fan_multiplier = m; planner.sync_fan_speeds(fan_speed); } -#endif float Temperature::get_fan_multiplier(){ return fan_multiplier; } +#endif #if ENABLED(TEMP_TUNING_MAINTAIN_FAN) bool Temperature::adaptive_fan_slowing = true; From a3d16e013d3e32b61aa18bd79839777c7dd7242e Mon Sep 17 00:00:00 2001 From: David Buezas Date: Sat, 6 Jul 2024 09:57:35 +0200 Subject: [PATCH 4/9] Make fan multiplier optional # Conflicts: # Marlin/src/module/temperature.cpp # Marlin/src/module/temperature.h --- Marlin/Configuration_adv.h | 8 ++++++ Marlin/src/gcode/temp/M106_M107.cpp | 32 ++++++++++++++---------- Marlin/src/inc/Conditionals_post.h | 4 ++- Marlin/src/lcd/menu/menu_temperature.cpp | 17 +++++++------ Marlin/src/module/planner.cpp | 2 +- Marlin/src/module/temperature.cpp | 2 +- Marlin/src/module/temperature.h | 8 +++--- 7 files changed, 46 insertions(+), 27 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index cf203c447d65..1198e17d0a6d 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3894,6 +3894,14 @@ //#define REPORT_FAN_CHANGE // Report the new fan speed when changed by M106 (and others) +/** + * Add UI and gcode options to multiply fan speed and lock fan + * at the current speed to override what is sent via M106. + * These are useful to fine tune fan speeds after while printing. + * Not persisted in EEPROM. +*/ +// #define FAN_MULTIPLIER + /** * Auto-report temperatures with M155 S */ diff --git a/Marlin/src/gcode/temp/M106_M107.cpp b/Marlin/src/gcode/temp/M106_M107.cpp index 97a32482c1cd..8454332bc2f1 100644 --- a/Marlin/src/gcode/temp/M106_M107.cpp +++ b/Marlin/src/gcode/temp/M106_M107.cpp @@ -52,6 +52,7 @@ * P Fan index, if more than one fan * L Lock fan * U Unlock fan + * M Fan speed multiplier between 0.1 and 10 * * With EXTRA_FAN_SPEED enabled: * @@ -61,18 +62,20 @@ * 3-255 = Set the speed for use with T2 */ void GcodeSuite::M106() { - if (parser.seen('L')) { - thermalManager.lock_fan = true; - if (!parser.seenval('S')) return; - } if (parser.seen('U')) { - thermalManager.lock_fan = false; - return; - } else if (thermalManager.lock_fan) return; - - if (parser.seenval('M')) { - thermalManager.set_fan_multiplier(parser.value_float()); - if (!parser.seenval('S')) return; - } + #if ENABLED(FAN_MULTIPLIER) + if (parser.seen('L')) { + thermalManager.lock_fan = true; + if (!parser.seenval('S')) return; + } if (parser.seen('U')) { + thermalManager.lock_fan = false; + return; + } else if (thermalManager.lock_fan) return; + + if (parser.seenval('M')) { + thermalManager.set_fan_multiplier(parser.value_float()); + if (!parser.seenval('S')) return; + } + #endif const uint8_t pfan = parser.byteval('P', _ALT_P); if (pfan >= _CNT_P) return; @@ -113,7 +116,10 @@ void GcodeSuite::M106() { * M107: Fan Off */ void GcodeSuite::M107() { - if (thermalManager.lock_fan) return; + #if ENABLED(FAN_MULTIPLIER) + if (thermalManager.lock_fan) return; + #endif + const uint8_t pfan = parser.byteval('P', _ALT_P); if (pfan >= _CNT_P) return; if (FAN_IS_REDUNDANT(pfan)) return; diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 7af8536d90fe..5882be9d933c 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2748,8 +2748,10 @@ #ifndef FAN_MAX_PWM #define FAN_MAX_PWM 255 #endif - #if FAN_MIN_PWM == 0 && FAN_MAX_PWM == 255 + #if FAN_MIN_PWM == 0 && FAN_MAX_PWM == 255 && !defined(FAN_MULTIPLIER) #define CALC_FAN_SPEED(f) (f ?: FAN_OFF_PWM) + #elif defined(FAN_MULTIPLIER) + #define CALC_FAN_SPEED(f) (f ? map(f * thermalManager.get_fan_multiplier(), 1, 255, FAN_MIN_PWM, FAN_MAX_PWM) : FAN_OFF_PWM) #else #define CALC_FAN_SPEED(f) (f ? map(f, 1, 255, FAN_MIN_PWM, FAN_MAX_PWM) : FAN_OFF_PWM) #endif diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 4bbfcf813a73..eac885fc3825 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -219,14 +219,15 @@ void menu_temperature() { #if FAN_IS_M106ABLE(0) _FAN_EDIT_ITEMS(0, FIRST_FAN_SPEED); - if (thermalManager.lock_fan) { - ACTION_ITEM(MSG_UNLOCK_FAN, []{ thermalManager.lock_fan = false; ui.refresh(); }); - } else { - ACTION_ITEM(MSG_LOCK_FAN, []{ thermalManager.lock_fan = true; ui.refresh(); }); - } - editable.decimal = thermalManager.get_fan_multiplier(); - EDIT_ITEM_FAST(float31, MSG_FAN_MULTIPLIER, &editable.decimal, 0.0f, 9.9f, []{ thermalManager.set_fan_multiplier(editable.decimal); }, true); - + #if ENABLED(FAN_MULTIPLIER) + if (thermalManager.lock_fan) { + ACTION_ITEM(MSG_UNLOCK_FAN, []{ thermalManager.lock_fan = false; ui.refresh(); }); + } else { + ACTION_ITEM(MSG_LOCK_FAN, []{ thermalManager.lock_fan = true; ui.refresh(); }); + } + editable.decimal = thermalManager.get_fan_multiplier(); + EDIT_ITEM_FAST(float31, MSG_FAN_MULTIPLIER, &editable.decimal, 0.0f, 9.9f, []{ thermalManager.set_fan_multiplier(editable.decimal); }, true); + #endif #endif #if FAN_IS_M106ABLE(1) FAN_EDIT_ITEMS(1); diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index a92ca4c2136c..892258ff3b36 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1186,7 +1186,7 @@ void Planner::recalculate(const_float_t safe_exit_speed_sqr) { #if ENABLED(FAN_SOFT_PWM) #define _FAN_SET(F) thermalManager.soft_pwm_amount_fan[F] = CALC_FAN_SPEED(fan_speed[F]); #else - #define _FAN_SET(F) hal.set_pwm_duty(pin_t(FAN##F##_PIN), CALC_FAN_SPEED(constrain(fan_speed[F] * thermalManager.get_fan_multiplier(), 0, 255))); + #define _FAN_SET(F) hal.set_pwm_duty(pin_t(FAN##F##_PIN), CALC_FAN_SPEED(fan_speed[F])); #endif #define FAN_SET(F) do{ kickstart_fan(fan_speed, ms, F); _FAN_SET(F); }while(0) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index b83f90524b80..04857da85567 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -284,7 +284,7 @@ PGMSTR(str_t_heating_failed, STR_T_HEATING_FAILED); * public: */ -#if HAS_FAN +#if ALL(HAS_FAN, FAN_MULTIPLIER) void Temperature::set_fan_multiplier(float m){ fan_multiplier = m; planner.sync_fan_speeds(fan_speed); diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index d2a7f1f38bb1..9442961b0661 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -597,8 +597,8 @@ typedef struct { raw_adc_t raw_min, raw_max; celsius_t mintemp, maxtemp; } temp_ class Temperature { public: - bool lock_fan; - #if HAS_FAN + #if ALL(HAS_FAN, FAN_MULTIPLIER) + bool lock_fan; void set_fan_multiplier(float m); float get_fan_multiplier(); #endif @@ -1339,7 +1339,9 @@ class Temperature { #endif private: - float fan_multiplier = 1; + #if ENABLED(FAN_MULTIPLIER) + float fan_multiplier = 1; + #endif // Reading raw temperatures and converting to Celsius when ready static volatile bool raw_temps_ready; static void update_raw_temperatures(); From 1351545caec8bb9a2489a5dbf15a14ccafdf4f6e Mon Sep 17 00:00:00 2001 From: David Buezas Date: Sat, 6 Jul 2024 23:48:18 +0200 Subject: [PATCH 5/9] Better docs --- Marlin/Configuration_adv.h | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 1198e17d0a6d..83ffd28ddcf2 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3895,12 +3895,14 @@ //#define REPORT_FAN_CHANGE // Report the new fan speed when changed by M106 (and others) /** - * Add UI and gcode options to multiply fan speed and lock fan - * at the current speed to override what is sent via M106. - * These are useful to fine tune fan speeds after while printing. - * Not persisted in EEPROM. -*/ -// #define FAN_MULTIPLIER + * Adds UI and G-code (M106) options to control fan speed while printing. + * + * - Lock Fan Speed: To prevent G-code commands (i.e., M106) from altering the current fan speed. + * - Fan Speed Multiplier: Multiplies the fan speed set by G-code commands by a specified factor for fine-tuning. + * + * Note: Settings are not saved in EEPROM and will reset after a power cycle. + */ +//#define FAN_MULTIPLIER /** * Auto-report temperatures with M155 S From 8f5f9a1f38e2e0ce369ed6b04f3ea45538388866 Mon Sep 17 00:00:00 2001 From: David Buezas Date: Sun, 7 Jul 2024 22:07:46 +0200 Subject: [PATCH 6/9] fix fan multiplier when factor>1 --- Marlin/src/inc/Conditionals_post.h | 4 ++-- Marlin/src/module/temperature.cpp | 4 ++++ Marlin/src/module/temperature.h | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 5882be9d933c..322827f48584 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2749,9 +2749,9 @@ #define FAN_MAX_PWM 255 #endif #if FAN_MIN_PWM == 0 && FAN_MAX_PWM == 255 && !defined(FAN_MULTIPLIER) - #define CALC_FAN_SPEED(f) (f ?: FAN_OFF_PWM) + #define CALC_FAN_SPEED(f) (f ? f : FAN_OFF_PWM) #elif defined(FAN_MULTIPLIER) - #define CALC_FAN_SPEED(f) (f ? map(f * thermalManager.get_fan_multiplier(), 1, 255, FAN_MIN_PWM, FAN_MAX_PWM) : FAN_OFF_PWM) + #define CALC_FAN_SPEED(f) (f ? map(thermalManager.compute_multiplied_fan(f), 1, 255, FAN_MIN_PWM, FAN_MAX_PWM) : FAN_OFF_PWM) #else #define CALC_FAN_SPEED(f) (f ? map(f, 1, 255, FAN_MIN_PWM, FAN_MAX_PWM) : FAN_OFF_PWM) #endif diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 04857da85567..221d1e904772 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -290,6 +290,10 @@ PGMSTR(str_t_heating_failed, STR_T_HEATING_FAILED); planner.sync_fan_speeds(fan_speed); } + uint8_t Temperature::compute_multiplied_fan(uint8_t speed){ + return constrain(speed * fan_multiplier, 1, 255); + } + float Temperature::get_fan_multiplier(){ return fan_multiplier; } diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 9442961b0661..7f235b5fd0b7 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -600,6 +600,7 @@ class Temperature { #if ALL(HAS_FAN, FAN_MULTIPLIER) bool lock_fan; void set_fan_multiplier(float m); + uint8_t compute_multiplied_fan(uint8_t speed); float get_fan_multiplier(); #endif From d90c4ba783931de385a948cf2775809c9a445163 Mon Sep 17 00:00:00 2001 From: David Buezas Date: Sun, 7 Jul 2024 22:11:08 +0200 Subject: [PATCH 7/9] undo unnecessary change --- Marlin/src/inc/Conditionals_post.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 322827f48584..230aef760e1c 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2749,7 +2749,7 @@ #define FAN_MAX_PWM 255 #endif #if FAN_MIN_PWM == 0 && FAN_MAX_PWM == 255 && !defined(FAN_MULTIPLIER) - #define CALC_FAN_SPEED(f) (f ? f : FAN_OFF_PWM) + #define CALC_FAN_SPEED(f) (f ?: FAN_OFF_PWM) #elif defined(FAN_MULTIPLIER) #define CALC_FAN_SPEED(f) (f ? map(thermalManager.compute_multiplied_fan(f), 1, 255, FAN_MIN_PWM, FAN_MAX_PWM) : FAN_OFF_PWM) #else From df9234a68b55c43fc35c05bcca0f15975e8a85f5 Mon Sep 17 00:00:00 2001 From: David Buezas Date: Sun, 7 Jul 2024 22:30:47 +0200 Subject: [PATCH 8/9] Fix multiplier affecting controller fan --- Marlin/src/inc/Conditionals_post.h | 4 +--- Marlin/src/module/planner.cpp | 10 ++++++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 230aef760e1c..7af8536d90fe 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2748,10 +2748,8 @@ #ifndef FAN_MAX_PWM #define FAN_MAX_PWM 255 #endif - #if FAN_MIN_PWM == 0 && FAN_MAX_PWM == 255 && !defined(FAN_MULTIPLIER) + #if FAN_MIN_PWM == 0 && FAN_MAX_PWM == 255 #define CALC_FAN_SPEED(f) (f ?: FAN_OFF_PWM) - #elif defined(FAN_MULTIPLIER) - #define CALC_FAN_SPEED(f) (f ? map(thermalManager.compute_multiplied_fan(f), 1, 255, FAN_MIN_PWM, FAN_MAX_PWM) : FAN_OFF_PWM) #else #define CALC_FAN_SPEED(f) (f ? map(f, 1, 255, FAN_MIN_PWM, FAN_MAX_PWM) : FAN_OFF_PWM) #endif diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 892258ff3b36..e8213917c6c3 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1183,10 +1183,16 @@ void Planner::recalculate(const_float_t safe_exit_speed_sqr) { void Planner::sync_fan_speeds(uint8_t (&fan_speed)[FAN_COUNT]) { + #if defined(FAN_MULTIPLIER) + #define _CALC_FAN_SPEED(f) CALC_FAN_SPEED(thermalManager.compute_multiplied_fan(f)) + #else + #define _CALC_FAN_SPEED(f) CALC_FAN_SPEED(f) + #endif + #if ENABLED(FAN_SOFT_PWM) - #define _FAN_SET(F) thermalManager.soft_pwm_amount_fan[F] = CALC_FAN_SPEED(fan_speed[F]); + #define _FAN_SET(F) thermalManager.soft_pwm_amount_fan[F] = _CALC_FAN_SPEED(fan_speed[F]); #else - #define _FAN_SET(F) hal.set_pwm_duty(pin_t(FAN##F##_PIN), CALC_FAN_SPEED(fan_speed[F])); + #define _FAN_SET(F) hal.set_pwm_duty(pin_t(FAN##F##_PIN), _CALC_FAN_SPEED(fan_speed[F])); #endif #define FAN_SET(F) do{ kickstart_fan(fan_speed, ms, F); _FAN_SET(F); }while(0) From bd607b0ed16856bdbe3bb756372ce610e8ca1860 Mon Sep 17 00:00:00 2001 From: David Buezas Date: Sun, 7 Jul 2024 22:52:13 +0200 Subject: [PATCH 9/9] Handle special case of speed = 0 --- Marlin/src/module/planner.cpp | 2 +- Marlin/src/module/temperature.cpp | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index e8213917c6c3..ba0565407ed2 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1184,7 +1184,7 @@ void Planner::recalculate(const_float_t safe_exit_speed_sqr) { void Planner::sync_fan_speeds(uint8_t (&fan_speed)[FAN_COUNT]) { #if defined(FAN_MULTIPLIER) - #define _CALC_FAN_SPEED(f) CALC_FAN_SPEED(thermalManager.compute_multiplied_fan(f)) + #define _CALC_FAN_SPEED(f) CALC_FAN_SPEED(thermalManager.compute_multiplied_fan(f)) #else #define _CALC_FAN_SPEED(f) CALC_FAN_SPEED(f) #endif diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 221d1e904772..1c93326fb2ff 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -291,7 +291,9 @@ PGMSTR(str_t_heating_failed, STR_T_HEATING_FAILED); } uint8_t Temperature::compute_multiplied_fan(uint8_t speed){ - return constrain(speed * fan_multiplier, 1, 255); + if (!speed) return 0; + float new_speed = speed * fan_multiplier; + return constrain(new_speed, 1, 255); } float Temperature::get_fan_multiplier(){