From e8ff03c2842e0d6ecddd8c4882b4352ddebf3a9c Mon Sep 17 00:00:00 2001 From: Tom Brazier Date: Fri, 1 Apr 2022 21:34:38 +0100 Subject: [PATCH 01/14] M306 reports as gcode line --- Marlin/src/gcode/temp/M306.cpp | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/Marlin/src/gcode/temp/M306.cpp b/Marlin/src/gcode/temp/M306.cpp index 9e1a8dd8ef07..307972eec1d9 100644 --- a/Marlin/src/gcode/temp/M306.cpp +++ b/Marlin/src/gcode/temp/M306.cpp @@ -56,17 +56,7 @@ void GcodeSuite::M306() { return; } - HOTEND_LOOP() { - SERIAL_ECHOLNPGM("MPC constants for hotend ", e); - MPC_t& constants = thermalManager.temp_hotend[e].constants; - SERIAL_ECHOLNPGM("Heater power: ", constants.heater_power); - SERIAL_ECHOLNPGM("Heatblock heat capacity: ", constants.block_heat_capacity); - SERIAL_ECHOLNPAIR_F("Sensor responsivness: ", constants.sensor_responsiveness, 4); - SERIAL_ECHOLNPAIR_F("Ambient heat transfer coeff. (no fan): ", constants.ambient_xfer_coeff_fan0, 4); - #if ENABLED(MPC_INCLUDE_FAN) - SERIAL_ECHOLNPAIR_F("Ambient heat transfer coeff. (full fan): ", constants.ambient_xfer_coeff_fan0 + constants.fan255_adjustment, 4); - #endif - } + M306_report(true); } void GcodeSuite::M306_report(const bool forReplay/*=true*/) { From 933c028b91931a3c38d5cffb6d23333ec3e28204 Mon Sep 17 00:00:00 2001 From: Tom Brazier Date: Fri, 1 Apr 2022 21:35:05 +0100 Subject: [PATCH 02/14] MPC autotune sends M105s --- Marlin/src/module/temperature.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 4bd43705ade8..a099721ffa50 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -858,7 +858,9 @@ volatile bool Temperature::raw_temps_ready = false; if (ELAPSED(ms, next_report_ms)) { next_report_ms += 1000UL; - SERIAL_ECHOLNPGM("Temperature ", current_temp); + + print_heater_states(active_extruder); + SERIAL_EOL(); } hal.idletask(); @@ -902,6 +904,7 @@ volatile bool Temperature::raw_temps_ready = false; hotend.modeled_ambient_temp = ambient_temp; SERIAL_ECHOLNPGM("Heating to 200C"); + hotend.target = 200.0f; // so M105 looks nice hotend.soft_pwm_amount = MPC_MAX >> 1; const millis_t heat_start_time = ms; next_test_ms = ms; From 0c8a2313d3027bdc02c02fe71da2eb8a14e42f81 Mon Sep 17 00:00:00 2001 From: Tom Brazier Date: Sat, 2 Apr 2022 20:03:03 +0100 Subject: [PATCH 03/14] Sometimes ambient test doesn't even start if predicted steady state is more than 15 degrees above t3 --- Marlin/src/module/temperature.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index a099721ffa50..fec9edc6601a 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -973,7 +973,6 @@ volatile bool Temperature::raw_temps_ready = false; housekeeping(ms, current_temp, next_report_ms); if (ELAPSED(ms, next_test_ms)) { - // use MPC to control the temperature, let it settle for 30s and then track power output for 10s hotend.soft_pwm_amount = (int)get_pid_output_hotend(active_extruder) >> 1; if (ELAPSED(ms, settle_end_ms) && !ELAPSED(ms, test_end_ms) && TERN1(HAS_FAN, !fan0_done)) @@ -996,7 +995,7 @@ volatile bool Temperature::raw_temps_ready = false; next_test_ms += MPC_dT * 1000; } - if (!WITHIN(current_temp, hotend.target - 15.0f, hotend.target + 15.0f)) { + if (!WITHIN(current_temp, t3 - 15.0f, hotend.target + 15.0f)) { SERIAL_ECHOLNPGM("Temperature error while measuring ambient loss"); break; } From efb3263e276b0a82111b71d2f861e64b134fc840 Mon Sep 17 00:00:00 2001 From: Tom Brazier Date: Mon, 4 Apr 2022 09:39:00 +0100 Subject: [PATCH 04/14] More helpful user feedback while tuning MPC --- Marlin/src/core/language.h | 7 +++++++ Marlin/src/lcd/language/language_en.h | 1 + Marlin/src/module/temperature.cpp | 21 ++++++++++++--------- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index 89c0babc2568..6c243fd7b2f4 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -228,6 +228,13 @@ #define STR_PID_DEBUG_DTERM " dTerm " #define STR_PID_DEBUG_CTERM " cTerm " #define STR_INVALID_EXTRUDER_NUM " - Invalid extruder number !" +#define STR_MPC_AUTOTUNE_START "MPC Autotune start for " STR_E +#define STR_MPC_COOLING_TO_AMBIENT "Cooling to ambient" +#define STR_MPC_HEATING_PAST_200 "Heating to over 200C" +#define STR_MPC_MEASURING_AMBIENT "Measuring ambient heatloss at " +#define STR_MPC_TEMPERATURE_ERROR "Temperature error" +#define STR_MPC_AUTOTUNE_INTERRUPTED "MPC Autotune interrupted!" +#define STR_MPC_AUTOTUNE_FINISHED "MPC Autotune finished! Put the constants below into Configuration.h" #define STR_HEATER_BED "bed" #define STR_HEATER_CHAMBER "chamber" diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 313098a9f60d..66691efd0b88 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -350,6 +350,7 @@ namespace Language_en { LSTR MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Autotune failed. Bad extruder."); LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Autotune failed. Temperature too high."); LSTR MSG_PID_TIMEOUT = _UxGT("Autotune failed! Timeout."); + LSTR MSG_MPC_MEASURING_AMBIENT = _UxGT("Measuring ambient heatloss"); LSTR MSG_SELECT = _UxGT("Select"); LSTR MSG_SELECT_E = _UxGT("Select *"); LSTR MSG_ACC = _UxGT("Accel"); diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index fec9edc6601a..f22be743c34c 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -864,14 +864,14 @@ volatile bool Temperature::raw_temps_ready = false; } hal.idletask(); + TERN(DWIN_CREALITY_LCD, DWIN_Update(), ui.update()); }; - SERIAL_ECHOLNPGM("Measuring MPC constants for E", active_extruder); + SERIAL_ECHOLNPGM(STR_MPC_AUTOTUNE_START, active_extruder); MPCHeaterInfo& hotend = temp_hotend[active_extruder]; MPC_t& constants = hotend.constants; // move to center of bed, just above bed height and cool with max fan - SERIAL_ECHOLNPGM("Moving to tuning position"); TERN_(HAS_FAN, zero_fan_speeds()); disable_all_heaters(); TERN_(HAS_FAN, set_fan_speed(ANY(MPC_FAN_0_ALL_HOTENDS, MPC_FAN_0_ACTIVE_HOTEND) ? 0 : active_extruder, 255)); @@ -880,7 +880,8 @@ volatile bool Temperature::raw_temps_ready = false; const xyz_pos_t tuningpos = MPC_TUNING_POS; do_blocking_move_to(tuningpos); - SERIAL_ECHOLNPGM("Cooling to ambient"); + SERIAL_ECHOLNPGM(STR_MPC_COOLING_TO_AMBIENT); + LCD_MESSAGE(MSG_COOLING); millis_t ms = millis(), next_report_ms = ms, next_test_ms = ms + 10000UL; celsius_float_t current_temp = degHotend(active_extruder), ambient_temp = current_temp; @@ -903,7 +904,8 @@ volatile bool Temperature::raw_temps_ready = false; hotend.modeled_ambient_temp = ambient_temp; - SERIAL_ECHOLNPGM("Heating to 200C"); + SERIAL_ECHOLNPGM(STR_MPC_HEATING_PAST_200); + LCD_MESSAGE(MSG_HEATING); hotend.target = 200.0f; // so M105 looks nice hotend.soft_pwm_amount = MPC_MAX >> 1; const millis_t heat_start_time = ms; @@ -955,7 +957,8 @@ volatile bool Temperature::raw_temps_ready = false; hotend.modeled_sensor_temp = current_temp; // let the system stabilise under MPC control then get a better measure of ambient loss without and with fan - SERIAL_ECHOLNPGM("Measuring ambient heatloss at target ", hotend.modeled_block_temp); + SERIAL_ECHOLNPGM(STR_MPC_MEASURING_AMBIENT, hotend.modeled_block_temp); + LCD_MESSAGE(MSG_MPC_MEASURING_AMBIENT); hotend.target = hotend.modeled_block_temp; next_test_ms = ms + MPC_dT * 1000; constexpr millis_t settle_time = 20000UL, @@ -979,7 +982,6 @@ volatile bool Temperature::raw_temps_ready = false; total_energy_fan0 += constants.heater_power * hotend.soft_pwm_amount / 127 * MPC_dT + (last_temp - current_temp) * constants.block_heat_capacity; #if HAS_FAN else if (ELAPSED(ms, test_end_ms) && !fan0_done) { - SERIAL_ECHOLNPGM("Measuring ambient heatloss with full fan"); set_fan_speed(ANY(MPC_FAN_0_ALL_HOTENDS, MPC_FAN_0_ACTIVE_HOTEND) ? 0 : active_extruder, 255); planner.sync_fan_speeds(fan_speed); settle_end_ms = ms + settle_time; @@ -996,7 +998,7 @@ volatile bool Temperature::raw_temps_ready = false; } if (!WITHIN(current_temp, t3 - 15.0f, hotend.target + 15.0f)) { - SERIAL_ECHOLNPGM("Temperature error while measuring ambient loss"); + SERIAL_ECHOLNPGM(STR_MPC_TEMPERATURE_ERROR); break; } } @@ -1015,11 +1017,12 @@ volatile bool Temperature::raw_temps_ready = false; TERN_(HAS_FAN, set_fan_speed(ANY(MPC_FAN_0_ALL_HOTENDS, MPC_FAN_0_ACTIVE_HOTEND) ? 0 : active_extruder, 0)); TERN_(HAS_FAN, planner.sync_fan_speeds(fan_speed)); - if (!wait_for_heatup) SERIAL_ECHOLNPGM("Test was interrupted"); + if (!wait_for_heatup) SERIAL_ECHOLNPGM(STR_MPC_AUTOTUNE_INTERRUPTED); wait_for_heatup = false; - SERIAL_ECHOLNPGM("Done"); + SERIAL_ECHOLNPGM(STR_MPC_AUTOTUNE_FINISHED); + ui.reset_status(); /* <-- add a slash to enable SERIAL_ECHOLNPGM("t1_time ", t1_time); From 2c3115a225c16fc5fb0d897121d99ee3ff17d617 Mon Sep 17 00:00:00 2001 From: Tom Brazier Date: Mon, 4 Apr 2022 10:22:57 +0100 Subject: [PATCH 05/14] Thou shalt not divide by zero - even if the test was interrupted --- Marlin/src/module/temperature.cpp | 42 +++++++++++++++++++------------ 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index f22be743c34c..e59ce7790a16 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -865,8 +865,28 @@ volatile bool Temperature::raw_temps_ready = false; hal.idletask(); TERN(DWIN_CREALITY_LCD, DWIN_Update(), ui.update()); + + if (!wait_for_heatup) { + SERIAL_ECHOLNPGM(STR_MPC_AUTOTUNE_INTERRUPTED); + return false; + } + + return true; }; + struct Cleanup { + ~Cleanup() { + wait_for_heatup = false; + + ui.reset_status(); + + temp_hotend[active_extruder].target = 0.0f; + temp_hotend[active_extruder].soft_pwm_amount = 0; + TERN_(HAS_FAN, set_fan_speed(ANY(MPC_FAN_0_ALL_HOTENDS, MPC_FAN_0_ACTIVE_HOTEND) ? 0 : active_extruder, 0)); + TERN_(HAS_FAN, planner.sync_fan_speeds(fan_speed)); + } + } cleanup; + SERIAL_ECHOLNPGM(STR_MPC_AUTOTUNE_START, active_extruder); MPCHeaterInfo& hotend = temp_hotend[active_extruder]; MPC_t& constants = hotend.constants; @@ -887,8 +907,8 @@ volatile bool Temperature::raw_temps_ready = false; ambient_temp = current_temp; wait_for_heatup = true; // Can be interrupted with M108 - while (wait_for_heatup) { - housekeeping(ms, current_temp, next_report_ms); + while (true) { + if (!housekeeping(ms, current_temp, next_report_ms)) return; if (ELAPSED(ms, next_test_ms)) { if (current_temp >= ambient_temp) { @@ -915,8 +935,8 @@ volatile bool Temperature::raw_temps_ready = false; uint16_t sample_distance = 1; float t1_time = 0; - while (wait_for_heatup) { - housekeeping(ms, current_temp, next_report_ms); + while (true) { + if (!housekeeping(ms, current_temp, next_report_ms)) return; if (ELAPSED(ms, next_test_ms)) { // record samples between 100C and 200C @@ -972,8 +992,8 @@ volatile bool Temperature::raw_temps_ready = false; #endif float last_temp = current_temp; - while (wait_for_heatup) { - housekeeping(ms, current_temp, next_report_ms); + while (true) { + if (!housekeeping(ms, current_temp, next_report_ms)) return; if (ELAPSED(ms, next_test_ms)) { hotend.soft_pwm_amount = (int)get_pid_output_hotend(active_extruder) >> 1; @@ -1012,17 +1032,7 @@ volatile bool Temperature::raw_temps_ready = false; constants.fan255_adjustment = ambient_xfer_coeff_fan255 - constants.ambient_xfer_coeff_fan0; #endif - hotend.target = 0.0f; - hotend.soft_pwm_amount = 0; - TERN_(HAS_FAN, set_fan_speed(ANY(MPC_FAN_0_ALL_HOTENDS, MPC_FAN_0_ACTIVE_HOTEND) ? 0 : active_extruder, 0)); - TERN_(HAS_FAN, planner.sync_fan_speeds(fan_speed)); - - if (!wait_for_heatup) SERIAL_ECHOLNPGM(STR_MPC_AUTOTUNE_INTERRUPTED); - - wait_for_heatup = false; - SERIAL_ECHOLNPGM(STR_MPC_AUTOTUNE_FINISHED); - ui.reset_status(); /* <-- add a slash to enable SERIAL_ECHOLNPGM("t1_time ", t1_time); From b4afa42c119f45f0c6a0fed36176fe76505cb939 Mon Sep 17 00:00:00 2001 From: Tom Brazier Date: Tue, 5 Apr 2022 08:29:25 +0100 Subject: [PATCH 06/14] Z raise after M306 T --- Marlin/src/module/temperature.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index e59ce7790a16..8f4f91301e5c 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -141,8 +141,12 @@ #endif #endif -#if EITHER(MPCTEMP, PID_EXTRUSION_SCALING) +#if ENABLED(MPCTEMP) #include + #include "probe.h" +#endif + +#if EITHER(MPCTEMP, PID_EXTRUSION_SCALING) #include "stepper.h" #endif @@ -884,6 +888,8 @@ volatile bool Temperature::raw_temps_ready = false; temp_hotend[active_extruder].soft_pwm_amount = 0; TERN_(HAS_FAN, set_fan_speed(ANY(MPC_FAN_0_ALL_HOTENDS, MPC_FAN_0_ACTIVE_HOTEND) ? 0 : active_extruder, 0)); TERN_(HAS_FAN, planner.sync_fan_speeds(fan_speed)); + + do_z_clearance(Z_POST_CLEARANCE); } } cleanup; From edb7695f4bb1023521795368a3fbb5f2f1464e99 Mon Sep 17 00:00:00 2001 From: Tom Brazier Date: Tue, 5 Apr 2022 19:24:37 +0100 Subject: [PATCH 07/14] The better value for ambient transfer coefficient can give us a better value for other constants --- Marlin/src/module/temperature.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 8f4f91301e5c..99de993fa0ce 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -970,9 +970,9 @@ volatile bool Temperature::raw_temps_ready = false; sample_count = (sample_count + 1) / 2 * 2 - 1; const float t1 = temp_samples[0], t2 = temp_samples[(sample_count - 1) >> 1], - t3 = temp_samples[sample_count - 1], - asymp_temp = (t2 * t2 - t1 * t3) / (2 * t2 - t1 - t3), - block_responsiveness = -log((t2 - asymp_temp) / (t1 - asymp_temp)) / (sample_distance * (sample_count >> 1)); + t3 = temp_samples[sample_count - 1]; + float asymp_temp = (t2 * t2 - t1 * t3) / (2 * t2 - t1 - t3), + block_responsiveness = -log((t2 - asymp_temp) / (t1 - asymp_temp)) / (sample_distance * (sample_count >> 1)); constants.ambient_xfer_coeff_fan0 = constants.heater_power * MPC_MAX / 255 / (asymp_temp - ambient_temp); constants.fan255_adjustment = 0.0f; @@ -1038,6 +1038,12 @@ volatile bool Temperature::raw_temps_ready = false; constants.fan255_adjustment = ambient_xfer_coeff_fan255 - constants.ambient_xfer_coeff_fan0; #endif + // calculate a new and better asymptotic temperature and re-evaluate the other constants + asymp_temp = ambient_temp + constants.heater_power / constants.ambient_xfer_coeff_fan0; + block_responsiveness = -log((t2 - asymp_temp) / (t1 - asymp_temp)) / (sample_distance * (sample_count >> 1)); + constants.block_heat_capacity = constants.ambient_xfer_coeff_fan0 / block_responsiveness; + constants.sensor_responsiveness = block_responsiveness / (1.0f - (ambient_temp - asymp_temp) * exp(-block_responsiveness * t1_time) / (t1 - asymp_temp)); + SERIAL_ECHOLNPGM(STR_MPC_AUTOTUNE_FINISHED); /* <-- add a slash to enable From d4501e59544314e6fa5f92a016dbad307985eea1 Mon Sep 17 00:00:00 2001 From: Tom Brazier Date: Tue, 5 Apr 2022 22:01:13 +0100 Subject: [PATCH 08/14] For those who like to keep the head far away from the bed --- Marlin/Configuration.h | 1 + Marlin/src/module/temperature.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 9d059014579e..6fa35e6b1102 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -673,6 +673,7 @@ #define MPC_STEADYSTATE 0.5f // (K/s) Temperature change rate for steady state logic to be enforced. #define MPC_TUNING_POS { X_CENTER, Y_CENTER, 1.0f } // (mm) M306 Autotuning position, ideally bed center just above the surface. + #define MPC_TUNING_END_Z 10.0f // (mm) M306 Autotuning final Z position (how far to move away from the bed). #endif //=========================================================================== diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 99de993fa0ce..72a673c6bbc9 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -889,7 +889,7 @@ volatile bool Temperature::raw_temps_ready = false; TERN_(HAS_FAN, set_fan_speed(ANY(MPC_FAN_0_ALL_HOTENDS, MPC_FAN_0_ACTIVE_HOTEND) ? 0 : active_extruder, 0)); TERN_(HAS_FAN, planner.sync_fan_speeds(fan_speed)); - do_z_clearance(Z_POST_CLEARANCE); + do_z_clearance(MPC_TUNING_END_Z); } } cleanup; From 0a28fc1dc7f378d2b13430cacd3d4fa74ebc4f0d Mon Sep 17 00:00:00 2001 From: Tom Brazier Date: Wed, 6 Apr 2022 22:17:10 +0100 Subject: [PATCH 09/14] Added advanced temperature menu options for MPC #23996 --- Marlin/Configuration.h | 3 +++ Marlin/src/inc/SanityCheck.h | 8 +++++++ Marlin/src/lcd/language/language_en.h | 6 ++++++ Marlin/src/lcd/menu/menu_advanced.cpp | 30 ++++++++++++++++++++++++++- 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 6fa35e6b1102..30fbfbbfe02b 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -645,6 +645,9 @@ * for PID_EXTRUSION_SCALING and PID_FAN_SCALING. Use M306 to autotune the model. */ #if ENABLED(MPCTEMP) + //#define MPC_EDIT_MENU // Add MPC editing to the "Advanced Settings" menu. (~1300 bytes of PROGMEM) + //#define MPC_AUTOTUNE_MENU // Add MPC auto-tuning to the "Advanced Settings" menu. (~350 bytes of PROGMEM) + #define MPC_MAX BANG_MAX // (0..255) Current to nozzle while MPC is active. #define MPC_HEATER_POWER { 40.0f } // (W) Heat cartridge powers. diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index b4c97187e6b1..a8175cb7d88d 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2956,6 +2956,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "DWIN_CREALITY_LCD does not support PID_EDIT_MENU." #elif ENABLED(PID_AUTOTUNE_MENU) #error "DWIN_CREALITY_LCD does not support PID_AUTOTUNE_MENU." + #elif ENABLED(MPC_EDIT_MENU) + #error "DWIN_CREALITY_LCD does not support MPC_EDIT_MENU." + #elif ENABLED(MPC_AUTOTUNE_MENU) + #error "DWIN_CREALITY_LCD does not support MPC_AUTOTUNE_MENU." #elif ENABLED(LEVEL_BED_CORNERS) #error "DWIN_CREALITY_LCD does not support LEVEL_BED_CORNERS." #elif BOTH(LCD_BED_LEVELING, PROBE_MANUALLY) @@ -2968,6 +2972,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "DWIN_LCD_PROUI does not support PID_EDIT_MENU." #elif ENABLED(PID_AUTOTUNE_MENU) #error "DWIN_LCD_PROUI does not support PID_AUTOTUNE_MENU." + #elif ENABLED(MPC_EDIT_MENU) + #error "DWIN_LCD_PROUI does not support MPC_EDIT_MENU." + #elif ENABLED(MPC_AUTOTUNE_MENU) + #error "DWIN_LCD_PROUI does not support MPC_AUTOTUNE_MENU." #elif ENABLED(LEVEL_BED_CORNERS) #error "DWIN_LCD_PROUI does not support LEVEL_BED_CORNERS." #elif BOTH(LCD_BED_LEVELING, PROBE_MANUALLY) diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 66691efd0b88..9939bfa794b6 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -351,6 +351,12 @@ namespace Language_en { LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Autotune failed. Temperature too high."); LSTR MSG_PID_TIMEOUT = _UxGT("Autotune failed! Timeout."); LSTR MSG_MPC_MEASURING_AMBIENT = _UxGT("Measuring ambient heatloss"); + LSTR MSG_MPC_AUTOTUNE = _UxGT("MPC Autotune"); + LSTR MSG_MPC_POWER_E = _UxGT("Power *"); + LSTR MSG_MPC_BLOCK_HEAT_CAPACITY_E = _UxGT("Block C *"); + LSTR MSG_SENSOR_RESPONSIVENESS_E = _UxGT("Sensor res *"); + LSTR MSG_MPC_AMBIENT_XFER_COEFF_E = _UxGT("Ambient h *"); + LSTR MSG_MPC_AMBIENT_XFER_COEFF_FAN255_E= _UxGT("Amb. h fan *"); LSTR MSG_SELECT = _UxGT("Select"); LSTR MSG_SELECT_E = _UxGT("Select *"); LSTR MSG_ACC = _UxGT("Accel"); diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 80b8f5b1d2eb..9aaeca94bcbf 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -241,7 +241,7 @@ void menu_backlash(); #endif #endif -#if BOTH(AUTOTEMP, HAS_TEMP_HOTEND) || EITHER(PID_AUTOTUNE_MENU, PID_EDIT_MENU) +#if BOTH(AUTOTEMP, HAS_TEMP_HOTEND) || ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU, MPC_AUTOTUNE_MENU, MPC_EDIT_MENU) #define SHOW_MENU_ADVANCED_TEMPERATURE 1 #endif @@ -322,6 +322,34 @@ void menu_backlash(); REPEAT_S(1, HOTENDS, HOTEND_PID_EDIT_MENU_ITEMS) #endif + #if ENABLED(MPC_EDIT_MENU) + #define _MPC_CONSTANTS(N) thermalManager.temp_hotend[N].constants + + #define _HOTEND_MPC_EDIT_MENU_ITEMS(N) \ + EDIT_ITEM_FAST_N(float31sign, N, MSG_MPC_POWER_E, &_MPC_CONSTANTS(N).heater_power, 1, 200); \ + EDIT_ITEM_FAST_N(float31sign, N, MSG_MPC_BLOCK_HEAT_CAPACITY_E, &_MPC_CONSTANTS(N).block_heat_capacity, 0, 40); \ + EDIT_ITEM_FAST_N(float43, N, MSG_SENSOR_RESPONSIVENESS_E, &_MPC_CONSTANTS(N).sensor_responsiveness, 0, 1); \ + EDIT_ITEM_FAST_N(float43, N, MSG_MPC_AMBIENT_XFER_COEFF_E, &_MPC_CONSTANTS(N).ambient_xfer_coeff_fan0, 0, 1); + + #if ENABLED(MPC_INCLUDE_FAN) + #define HOTEND_MPC_EDIT_MENU_ITEMS(N) \ + _HOTEND_MPC_EDIT_MENU_ITEMS(N); \ + editable.decimal = _MPC_CONSTANTS(N).ambient_xfer_coeff_fan0 + _MPC_CONSTANTS(N).fan255_adjustment; \ + EDIT_ITEM_FAST_N(float43, N, MSG_MPC_AMBIENT_XFER_COEFF_FAN255_E, &editable.decimal, 0, 1, []{ \ + _MPC_CONSTANTS(N).fan255_adjustment = editable.decimal - _MPC_CONSTANTS(N).ambient_xfer_coeff_fan0; \ + }); + #else + #define HOTEND_MPC_EDIT_MENU_ITEMS(N) \ + _HOTEND_MPC_EDIT_MENU_ITEMS(N); + #endif + + REPEAT_S(0, HOTENDS, HOTEND_MPC_EDIT_MENU_ITEMS) + #endif + + #if ENABLED(MPC_AUTOTUNE_MENU) + ACTION_ITEM(MSG_MPC_AUTOTUNE, []{ queue.inject(F("M306 T")); ui.return_to_status(); }); + #endif + #if ENABLED(PIDTEMPBED) #if ENABLED(PID_EDIT_MENU) _PID_EDIT_ITEMS_TMPL(H_BED, thermalManager.temp_bed); From 540c7c4c161e84a22a83ecce01e01ba811701a3b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 9 Apr 2022 20:03:46 -0500 Subject: [PATCH 10/14] split up some strings --- Marlin/Configuration.h | 8 ++++---- Marlin/src/MarlinCore.cpp | 8 ++++++-- Marlin/src/core/language.h | 29 +++++++++++++++++------------ Marlin/src/feature/bltouch.cpp | 15 ++++----------- Marlin/src/gcode/temp/M303.cpp | 1 + Marlin/src/module/probe.cpp | 25 ++++++++++++++++++------- Marlin/src/module/probe.h | 2 ++ Marlin/src/module/temperature.cpp | 19 +++++++++++++------ 8 files changed, 65 insertions(+), 42 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 30fbfbbfe02b..2648b819928c 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -645,8 +645,8 @@ * for PID_EXTRUSION_SCALING and PID_FAN_SCALING. Use M306 to autotune the model. */ #if ENABLED(MPCTEMP) - //#define MPC_EDIT_MENU // Add MPC editing to the "Advanced Settings" menu. (~1300 bytes of PROGMEM) - //#define MPC_AUTOTUNE_MENU // Add MPC auto-tuning to the "Advanced Settings" menu. (~350 bytes of PROGMEM) + //#define MPC_EDIT_MENU // Add MPC editing to the "Advanced Settings" menu. (~1300 bytes of flash) + //#define MPC_AUTOTUNE_MENU // Add MPC auto-tuning to the "Advanced Settings" menu. (~350 bytes of flash) #define MPC_MAX BANG_MAX // (0..255) Current to nozzle while MPC is active. #define MPC_HEATER_POWER { 40.0f } // (W) Heat cartridge powers. @@ -676,7 +676,7 @@ #define MPC_STEADYSTATE 0.5f // (K/s) Temperature change rate for steady state logic to be enforced. #define MPC_TUNING_POS { X_CENTER, Y_CENTER, 1.0f } // (mm) M306 Autotuning position, ideally bed center just above the surface. - #define MPC_TUNING_END_Z 10.0f // (mm) M306 Autotuning final Z position (how far to move away from the bed). + #define MPC_TUNING_END_Z 10.0f // (mm) M306 Autotuning final Z position. #endif //=========================================================================== @@ -1973,7 +1973,7 @@ * M502 - Revert settings to "factory" defaults. (Follow with M500 to init the EEPROM.) */ //#define EEPROM_SETTINGS // Persistent storage with M500 and M501 -//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +//#define DISABLE_M503 // Saves ~2700 bytes of flash. Disable for release! #define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. #define EEPROM_BOOT_SILENT // Keep M503 quiet and only give errors during first load #if ENABLED(EEPROM_SETTINGS) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 2570e6ebde1f..553f992aae81 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -412,7 +412,9 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) { if (do_reset_timeout) gcode.reset_stepper_timeout(ms); if (gcode.stepper_max_timed_out(ms)) { - SERIAL_ERROR_MSG(STR_KILL_INACTIVE_TIME, parser.command_ptr); + SERIAL_ERROR_START(); + SERIAL_ECHOPGM(STR_KILL_PRE); + SERIAL_ECHOLNPGM(STR_KILL_INACTIVE_TIME, parser.command_ptr); kill(); } @@ -473,7 +475,9 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) { // KILL the machine // ---------------------------------------------------------------- if (killCount >= KILL_DELAY) { - SERIAL_ERROR_MSG(STR_KILL_BUTTON); + SERIAL_ERROR_START(); + SERIAL_ECHOPGM(STR_KILL_PRE); + SERIAL_ECHOLNPGM(STR_KILL_BUTTON); kill(); } #endif diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index 6c243fd7b2f4..d3086a445d57 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -199,16 +199,20 @@ #define STR_FILAMENT_CHANGE_INSERT_M108 "Insert filament and send M108" #define STR_FILAMENT_CHANGE_WAIT_M108 "Send M108 to resume" -#define STR_STOP_BLTOUCH "!! STOP called because of BLTouch error - restart with M999" -#define STR_STOP_UNHOMED "!! STOP called because of unhomed error - restart with M999" -#define STR_KILL_INACTIVE_TIME "!! KILL caused by too much inactive time - current command: " -#define STR_KILL_BUTTON "!! KILL caused by KILL button/pin" +#define STR_STOP_PRE "!! STOP called because of " +#define STR_STOP_POST " error - restart with M999" +#define STR_STOP_BLTOUCH "BLTouch" +#define STR_STOP_UNHOMED "unhomed" +#define STR_KILL_PRE "!! KILL caused by " +#define STR_KILL_INACTIVE_TIME "too much inactive time - current command: " +#define STR_KILL_BUTTON "KILL button/pin" // temperature.cpp strings -#define STR_PID_AUTOTUNE_START "PID Autotune start" -#define STR_PID_BAD_HEATER_ID "PID Autotune failed! Bad heater id" -#define STR_PID_TEMP_TOO_HIGH "PID Autotune failed! Temperature too high" -#define STR_PID_TIMEOUT "PID Autotune failed! timeout" +#define STR_PID_AUTOTUNE "PID Autotune" +#define STR_PID_AUTOTUNE_START " start" +#define STR_PID_BAD_HEATER_ID " failed! Bad heater id" +#define STR_PID_TEMP_TOO_HIGH " failed! Temperature too high" +#define STR_PID_TIMEOUT " failed! timeout" #define STR_BIAS " bias: " #define STR_D_COLON " d: " #define STR_T_MIN " min: " @@ -219,7 +223,7 @@ #define STR_KP " Kp: " #define STR_KI " Ki: " #define STR_KD " Kd: " -#define STR_PID_AUTOTUNE_FINISHED "PID Autotune finished! Put the last Kp, Ki and Kd constants from below into Configuration.h" +#define STR_PID_AUTOTUNE_FINISHED " finished! Put the last Kp, Ki and Kd constants from below into Configuration.h" #define STR_PID_DEBUG " PID_DEBUG " #define STR_PID_DEBUG_INPUT ": Input " #define STR_PID_DEBUG_OUTPUT " Output " @@ -228,13 +232,14 @@ #define STR_PID_DEBUG_DTERM " dTerm " #define STR_PID_DEBUG_CTERM " cTerm " #define STR_INVALID_EXTRUDER_NUM " - Invalid extruder number !" -#define STR_MPC_AUTOTUNE_START "MPC Autotune start for " STR_E +#define STR_MPC_AUTOTUNE "MPC Autotune" +#define STR_MPC_AUTOTUNE_START " start for " STR_E +#define STR_MPC_AUTOTUNE_INTERRUPTED " interrupted!" +#define STR_MPC_AUTOTUNE_FINISHED " finished! Put the constants below into Configuration.h" #define STR_MPC_COOLING_TO_AMBIENT "Cooling to ambient" #define STR_MPC_HEATING_PAST_200 "Heating to over 200C" #define STR_MPC_MEASURING_AMBIENT "Measuring ambient heatloss at " #define STR_MPC_TEMPERATURE_ERROR "Temperature error" -#define STR_MPC_AUTOTUNE_INTERRUPTED "MPC Autotune interrupted!" -#define STR_MPC_AUTOTUNE_FINISHED "MPC Autotune finished! Put the constants below into Configuration.h" #define STR_HEATER_BED "bed" #define STR_HEATER_CHAMBER "chamber" diff --git a/Marlin/src/feature/bltouch.cpp b/Marlin/src/feature/bltouch.cpp index b1cc30bee0d9..60b9eed49f5a 100644 --- a/Marlin/src/feature/bltouch.cpp +++ b/Marlin/src/feature/bltouch.cpp @@ -111,11 +111,8 @@ bool BLTouch::deploy_proc() { // Last attempt to DEPLOY if (_deploy_query_alarm()) { // The deploy might have failed or the probe is actually triggered (nozzle too low?) again - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("BLTouch Recovery Failed"); - - SERIAL_ERROR_MSG(STR_STOP_BLTOUCH); // Tell the user something is wrong, needs action - stop(); // but it's not too bad, no need to kill, allow restart - + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("BLTouch Deploy Failed"); + probe.probe_error_stop(); // Something is wrong, needs action, but not too bad, allow restart return true; // Tell our caller we goofed in case he cares to know } } @@ -153,12 +150,8 @@ bool BLTouch::stow_proc() { // But one more STOW will catch that // Last attempt to STOW if (_stow_query_alarm()) { // so if there is now STILL an ALARM condition: - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("BLTouch Recovery Failed"); - - SERIAL_ERROR_MSG(STR_STOP_BLTOUCH); // Tell the user something is wrong, needs action - stop(); // but it's not too bad, no need to kill, allow restart - + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("BLTouch Stow Failed"); + probe.probe_error_stop(); // Something is wrong, needs action, but not too bad, allow restart return true; // Tell our caller we goofed in case he cares to know } } diff --git a/Marlin/src/gcode/temp/M303.cpp b/Marlin/src/gcode/temp/M303.cpp index c1e400511c91..ce362984a6ca 100644 --- a/Marlin/src/gcode/temp/M303.cpp +++ b/Marlin/src/gcode/temp/M303.cpp @@ -71,6 +71,7 @@ void GcodeSuite::M303() { case H_CHAMBER: default_temp = PREHEAT_1_TEMP_CHAMBER; break; #endif default: + SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_BAD_HEATER_ID); TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_BAD_EXTRUDER_NUM)); TERN_(DWIN_LCD_PROUI, DWIN_PidTuning(PID_BAD_EXTRUDER_NUM)); diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index f9a64a02d37a..30cd8d5162b9 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -415,6 +415,21 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { #endif +/** + * Print an error and stop() + */ +void Probe::probe_error_stop() { + SERIAL_ERROR_START(); + SERIAL_ECHOPGM(STR_STOP_PRE); + #if EITHER(Z_PROBE_SLED, Z_PROBE_ALLEN_KEY) + SERIAL_ECHOPGM(STR_STOP_UNHOMED); + #elif ENABLED(BLTOUCH) + SERIAL_ECHOPGM(STR_STOP_BLTOUCH); + #endif + SERIAL_ECHOLNPGM(STR_STOP_POST); + stop(); +} + /** * Attempt to deploy or stow the probe * @@ -443,8 +458,7 @@ bool Probe::set_deployed(const bool deploy) { #if EITHER(Z_PROBE_SLED, Z_PROBE_ALLEN_KEY) if (homing_needed_error(TERN_(Z_PROBE_SLED, _BV(X_AXIS)))) { - SERIAL_ERROR_MSG(STR_STOP_UNHOMED); - stop(); + probe_error_stop(); return true; } #endif @@ -484,15 +498,12 @@ bool Probe::set_deployed(const bool deploy) { } /** - * @brief Used by run_z_probe to do a single Z probe move. + * @brief Move down until the probe triggers or the low limit is reached + * Used by run_z_probe to do a single Z probe move. * * @param z Z destination * @param fr_mm_s Feedrate in mm/s * @return true to indicate an error - */ - -/** - * @brief Move down until the probe triggers or the low limit is reached * * @details Used by run_z_probe to get each bed Z height measurement. * Sets current_position.z to the height where the probe triggered diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index c802411be3a1..6185196320c8 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -78,6 +78,8 @@ class Probe { static void preheat_for_probing(const celsius_t hotend_temp, const celsius_t bed_temp); #endif + static void probe_error_stop(); + static bool set_deployed(const bool deploy); #if IS_KINEMATIC diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 72a673c6bbc9..61c2474fa179 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -636,6 +636,7 @@ volatile bool Temperature::raw_temps_ready = false; TERN_(DWIN_LCD_PROUI, DWIN_PidTuning(isbed ? PID_BED_START : PID_EXTR_START)); if (target > GHV(CHAMBER_MAX_TARGET, BED_MAX_TARGET, temp_range[heater_id].maxtemp - (HOTEND_OVERSHOOT))) { + SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_TEMP_TOO_HIGH); TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_TEMP_TOO_HIGH)); TERN_(DWIN_LCD_PROUI, DWIN_PidTuning(PID_TEMP_TOO_HIGH)); @@ -643,6 +644,7 @@ volatile bool Temperature::raw_temps_ready = false; return; } + SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_AUTOTUNE_START); disable_all_heaters(); @@ -727,6 +729,7 @@ volatile bool Temperature::raw_temps_ready = false; #define MAX_OVERSHOOT_PID_AUTOTUNE 30 #endif if (current_temp > target + MAX_OVERSHOOT_PID_AUTOTUNE) { + SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_TEMP_TOO_HIGH); TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_TEMP_TOO_HIGH)); TERN_(DWIN_LCD_PROUI, DWIN_PidTuning(PID_TEMP_TOO_HIGH)); @@ -769,11 +772,13 @@ volatile bool Temperature::raw_temps_ready = false; TERN_(DWIN_LCD_PROUI, DWIN_PidTuning(PID_TUNING_TIMEOUT)); TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_TUNING_TIMEOUT)); TERN_(HOST_PROMPT_SUPPORT, hostui.notify(GET_TEXT_F(MSG_PID_TIMEOUT))); + SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_TIMEOUT); break; } if (cycles > ncycles && cycles > 2) { + SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_AUTOTUNE_FINISHED); TERN_(HOST_PROMPT_SUPPORT, hostui.notify(GET_TEXT_F(MSG_PID_AUTOTUNE_DONE))); @@ -871,6 +876,7 @@ volatile bool Temperature::raw_temps_ready = false; TERN(DWIN_CREALITY_LCD, DWIN_Update(), ui.update()); if (!wait_for_heatup) { + SERIAL_ECHOPGM(STR_MPC_AUTOTUNE); SERIAL_ECHOLNPGM(STR_MPC_AUTOTUNE_INTERRUPTED); return false; } @@ -893,6 +899,7 @@ volatile bool Temperature::raw_temps_ready = false; } } cleanup; + SERIAL_ECHOPGM(STR_MPC_AUTOTUNE); SERIAL_ECHOLNPGM(STR_MPC_AUTOTUNE_START, active_extruder); MPCHeaterInfo& hotend = temp_hotend[active_extruder]; MPC_t& constants = hotend.constants; @@ -987,10 +994,9 @@ volatile bool Temperature::raw_temps_ready = false; LCD_MESSAGE(MSG_MPC_MEASURING_AMBIENT); hotend.target = hotend.modeled_block_temp; next_test_ms = ms + MPC_dT * 1000; - constexpr millis_t settle_time = 20000UL, - test_length = 20000UL; + constexpr millis_t settle_time = 20000UL, test_duration = 20000UL; millis_t settle_end_ms = ms + settle_time, - test_end_ms = settle_end_ms + test_length; + test_end_ms = settle_end_ms + test_duration; float total_energy_fan0 = 0.0f; #if HAS_FAN bool fan0_done = false; @@ -1011,7 +1017,7 @@ volatile bool Temperature::raw_temps_ready = false; set_fan_speed(ANY(MPC_FAN_0_ALL_HOTENDS, MPC_FAN_0_ACTIVE_HOTEND) ? 0 : active_extruder, 255); planner.sync_fan_speeds(fan_speed); settle_end_ms = ms + settle_time; - test_end_ms = settle_end_ms + test_length; + test_end_ms = settle_end_ms + test_duration; fan0_done = true; } else if (ELAPSED(ms, settle_end_ms) && !ELAPSED(ms, test_end_ms)) @@ -1029,11 +1035,11 @@ volatile bool Temperature::raw_temps_ready = false; } } - const float power_fan0 = total_energy_fan0 * 1000 / test_length; + const float power_fan0 = total_energy_fan0 * 1000 / test_duration; constants.ambient_xfer_coeff_fan0 = power_fan0 / (hotend.target - ambient_temp); #if HAS_FAN - const float power_fan255 = total_energy_fan255 * 1000 / test_length, + const float power_fan255 = total_energy_fan255 * 1000 / test_duration, ambient_xfer_coeff_fan255 = power_fan255 / (hotend.target - ambient_temp); constants.fan255_adjustment = ambient_xfer_coeff_fan255 - constants.ambient_xfer_coeff_fan0; #endif @@ -1044,6 +1050,7 @@ volatile bool Temperature::raw_temps_ready = false; constants.block_heat_capacity = constants.ambient_xfer_coeff_fan0 / block_responsiveness; constants.sensor_responsiveness = block_responsiveness / (1.0f - (ambient_temp - asymp_temp) * exp(-block_responsiveness * t1_time) / (t1 - asymp_temp)); + SERIAL_ECHOPGM(STR_MPC_AUTOTUNE); SERIAL_ECHOLNPGM(STR_MPC_AUTOTUNE_FINISHED); /* <-- add a slash to enable From 7a4312dffd5e45858433e69893a716ea273ebe20 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 9 Apr 2022 21:47:48 -0500 Subject: [PATCH 11/14] cleanup --- Marlin/Configuration.h | 4 ++-- Marlin/src/feature/bltouch.cpp | 4 ++-- Marlin/src/inc/SanityCheck.h | 24 +++++++-------------- Marlin/src/lcd/language/language_en.h | 2 +- Marlin/src/lcd/menu/menu_advanced.cpp | 17 +++++++-------- Marlin/src/module/temperature.cpp | 31 ++++++++++++++------------- 6 files changed, 37 insertions(+), 45 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 2b1f854e2338..e2d99a44ecc6 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -770,8 +770,8 @@ #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. - //#define PID_EDIT_MENU // Add PID editing to the "Advanced Settings" menu. (~700 bytes of PROGMEM) - //#define PID_AUTOTUNE_MENU // Add PID auto-tuning to the "Advanced Settings" menu. (~250 bytes of PROGMEM) + //#define PID_EDIT_MENU // Add PID editing to the "Advanced Settings" menu. (~700 bytes of flash) + //#define PID_AUTOTUNE_MENU // Add PID auto-tuning to the "Advanced Settings" menu. (~250 bytes of flash) #endif // @section extruder diff --git a/Marlin/src/feature/bltouch.cpp b/Marlin/src/feature/bltouch.cpp index 60b9eed49f5a..d911fae6ae75 100644 --- a/Marlin/src/feature/bltouch.cpp +++ b/Marlin/src/feature/bltouch.cpp @@ -112,7 +112,7 @@ bool BLTouch::deploy_proc() { if (_deploy_query_alarm()) { // The deploy might have failed or the probe is actually triggered (nozzle too low?) again if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("BLTouch Deploy Failed"); - probe.probe_error_stop(); // Something is wrong, needs action, but not too bad, allow restart + probe.probe_error_stop(); // Something is wrong, needs action, but not too bad, allow restart return true; // Tell our caller we goofed in case he cares to know } } @@ -151,7 +151,7 @@ bool BLTouch::stow_proc() { // Last attempt to STOW if (_stow_query_alarm()) { // so if there is now STILL an ALARM condition: if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("BLTouch Stow Failed"); - probe.probe_error_stop(); // Something is wrong, needs action, but not too bad, allow restart + probe.probe_error_stop(); // Something is wrong, needs action, but not too bad, allow restart return true; // Tell our caller we goofed in case he cares to know } } diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index e1e4da5aa2bc..66317c6c29d7 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2960,14 +2960,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if ENABLED(DWIN_CREALITY_LCD) #if DISABLED(SDSUPPORT) #error "DWIN_CREALITY_LCD requires SDSUPPORT to be enabled." - #elif ENABLED(PID_EDIT_MENU) - #error "DWIN_CREALITY_LCD does not support PID_EDIT_MENU." - #elif ENABLED(PID_AUTOTUNE_MENU) - #error "DWIN_CREALITY_LCD does not support PID_AUTOTUNE_MENU." - #elif ENABLED(MPC_EDIT_MENU) - #error "DWIN_CREALITY_LCD does not support MPC_EDIT_MENU." - #elif ENABLED(MPC_AUTOTUNE_MENU) - #error "DWIN_CREALITY_LCD does not support MPC_AUTOTUNE_MENU." + #elif EITHER(PID_EDIT_MENU, PID_AUTOTUNE_MENU) + #error "DWIN_CREALITY_LCD does not support PID_EDIT_MENU or PID_AUTOTUNE_MENU." + #elif EITHER(MPC_EDIT_MENU, MPC_AUTOTUNE_MENU) + #error "DWIN_CREALITY_LCD does not support MPC_EDIT_MENU or MPC_AUTOTUNE_MENU." #elif ENABLED(LEVEL_BED_CORNERS) #error "DWIN_CREALITY_LCD does not support LEVEL_BED_CORNERS." #elif BOTH(LCD_BED_LEVELING, PROBE_MANUALLY) @@ -2976,14 +2972,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #elif ENABLED(DWIN_LCD_PROUI) #if DISABLED(SDSUPPORT) #error "DWIN_LCD_PROUI requires SDSUPPORT to be enabled." - #elif ENABLED(PID_EDIT_MENU) - #error "DWIN_LCD_PROUI does not support PID_EDIT_MENU." - #elif ENABLED(PID_AUTOTUNE_MENU) - #error "DWIN_LCD_PROUI does not support PID_AUTOTUNE_MENU." - #elif ENABLED(MPC_EDIT_MENU) - #error "DWIN_LCD_PROUI does not support MPC_EDIT_MENU." - #elif ENABLED(MPC_AUTOTUNE_MENU) - #error "DWIN_LCD_PROUI does not support MPC_AUTOTUNE_MENU." + #elif EITHER(PID_EDIT_MENU, PID_AUTOTUNE_MENU) + #error "DWIN_LCD_PROUI does not support PID_EDIT_MENU or PID_AUTOTUNE_MENU." + #elif EITHER(MPC_EDIT_MENU, MPC_AUTOTUNE_MENU) + #error "DWIN_LCD_PROUI does not support MPC_EDIT_MENU or MPC_AUTOTUNE_MENU." #elif ENABLED(LEVEL_BED_CORNERS) #error "DWIN_LCD_PROUI does not support LEVEL_BED_CORNERS." #elif BOTH(LCD_BED_LEVELING, PROBE_MANUALLY) diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index c83d5d4e69c4..2d7b65d5a02e 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -350,7 +350,7 @@ namespace Language_en { LSTR MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Autotune failed. Bad extruder."); LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Autotune failed. Temperature too high."); LSTR MSG_PID_TIMEOUT = _UxGT("Autotune failed! Timeout."); - LSTR MSG_MPC_MEASURING_AMBIENT = _UxGT("Measuring ambient heatloss"); + LSTR MSG_MPC_MEASURING_AMBIENT = _UxGT("Testing heat loss"); LSTR MSG_MPC_AUTOTUNE = _UxGT("MPC Autotune"); LSTR MSG_MPC_POWER_E = _UxGT("Power *"); LSTR MSG_MPC_BLOCK_HEAT_CAPACITY_E = _UxGT("Block C *"); diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index def0294650fa..fa0ea1cafaad 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -330,24 +330,23 @@ void menu_backlash(); #endif #if ENABLED(MPC_EDIT_MENU) - #define _MPC_CONSTANTS(N) thermalManager.temp_hotend[N].constants + #define _MPC_CONST(N) thermalManager.temp_hotend[N].constants #define _HOTEND_MPC_EDIT_MENU_ITEMS(N) \ - EDIT_ITEM_FAST_N(float31sign, N, MSG_MPC_POWER_E, &_MPC_CONSTANTS(N).heater_power, 1, 200); \ - EDIT_ITEM_FAST_N(float31sign, N, MSG_MPC_BLOCK_HEAT_CAPACITY_E, &_MPC_CONSTANTS(N).block_heat_capacity, 0, 40); \ - EDIT_ITEM_FAST_N(float43, N, MSG_SENSOR_RESPONSIVENESS_E, &_MPC_CONSTANTS(N).sensor_responsiveness, 0, 1); \ - EDIT_ITEM_FAST_N(float43, N, MSG_MPC_AMBIENT_XFER_COEFF_E, &_MPC_CONSTANTS(N).ambient_xfer_coeff_fan0, 0, 1); + EDIT_ITEM_FAST_N(float31sign, N, MSG_MPC_POWER_E, &_MPC_CONST(N).heater_power, 1, 200); \ + EDIT_ITEM_FAST_N(float31sign, N, MSG_MPC_BLOCK_HEAT_CAPACITY_E, &_MPC_CONST(N).block_heat_capacity, 0, 40); \ + EDIT_ITEM_FAST_N(float43, N, MSG_SENSOR_RESPONSIVENESS_E, &_MPC_CONST(N).sensor_responsiveness, 0, 1); \ + EDIT_ITEM_FAST_N(float43, N, MSG_MPC_AMBIENT_XFER_COEFF_E, &_MPC_CONST(N).ambient_xfer_coeff_fan0, 0, 1); #if ENABLED(MPC_INCLUDE_FAN) #define HOTEND_MPC_EDIT_MENU_ITEMS(N) \ _HOTEND_MPC_EDIT_MENU_ITEMS(N); \ - editable.decimal = _MPC_CONSTANTS(N).ambient_xfer_coeff_fan0 + _MPC_CONSTANTS(N).fan255_adjustment; \ + editable.decimal = _MPC_CONST(N).ambient_xfer_coeff_fan0 + _MPC_CONST(N).fan255_adjustment; \ EDIT_ITEM_FAST_N(float43, N, MSG_MPC_AMBIENT_XFER_COEFF_FAN255_E, &editable.decimal, 0, 1, []{ \ - _MPC_CONSTANTS(N).fan255_adjustment = editable.decimal - _MPC_CONSTANTS(N).ambient_xfer_coeff_fan0; \ + _MPC_CONST(N).fan255_adjustment = editable.decimal - _MPC_CONST(N).ambient_xfer_coeff_fan0; \ }); #else - #define HOTEND_MPC_EDIT_MENU_ITEMS(N) \ - _HOTEND_MPC_EDIT_MENU_ITEMS(N); + #define HOTEND_MPC_EDIT_MENU_ITEMS(N) _HOTEND_MPC_EDIT_MENU_ITEMS(N); #endif REPEAT_S(0, HOTENDS, HOTEND_MPC_EDIT_MENU_ITEMS) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index a2f22ce5f9e7..d08d7dfc52ab 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -660,10 +660,11 @@ volatile bool Temperature::raw_temps_ready = false; TERN_(NO_FAN_SLOWING_IN_PID_TUNING, adaptive_fan_slowing = false); - // PID Tuning loop - wait_for_heatup = true; // Can be interrupted with M108 LCD_MESSAGE(MSG_HEATING); - while (wait_for_heatup) { + + // PID Tuning loop + wait_for_heatup = true; + while (wait_for_heatup) { // Can be interrupted with M108 const millis_t ms = millis(); @@ -884,8 +885,8 @@ volatile bool Temperature::raw_temps_ready = false; return true; }; - struct Cleanup { - ~Cleanup() { + struct OnExit { + ~OnExit() { wait_for_heatup = false; ui.reset_status(); @@ -897,7 +898,7 @@ volatile bool Temperature::raw_temps_ready = false; do_z_clearance(MPC_TUNING_END_Z); } - } cleanup; + } on_exit; SERIAL_ECHOPGM(STR_MPC_AUTOTUNE); SERIAL_ECHOLNPGM(STR_MPC_AUTOTUNE_START, active_extruder); @@ -919,8 +920,8 @@ volatile bool Temperature::raw_temps_ready = false; celsius_float_t current_temp = degHotend(active_extruder), ambient_temp = current_temp; - wait_for_heatup = true; // Can be interrupted with M108 - while (true) { + wait_for_heatup = true; + for (;;) { // Can be interrupted with M108 if (!housekeeping(ms, current_temp, next_report_ms)) return; if (ELAPSED(ms, next_test_ms)) { @@ -932,6 +933,7 @@ volatile bool Temperature::raw_temps_ready = false; next_test_ms += 10000UL; } } + TERN_(HAS_FAN, set_fan_speed(ANY(MPC_FAN_0_ALL_HOTENDS, MPC_FAN_0_ACTIVE_HOTEND) ? 0 : active_extruder, 0)); TERN_(HAS_FAN, planner.sync_fan_speeds(fan_speed)); @@ -941,14 +943,13 @@ volatile bool Temperature::raw_temps_ready = false; LCD_MESSAGE(MSG_HEATING); hotend.target = 200.0f; // so M105 looks nice hotend.soft_pwm_amount = MPC_MAX >> 1; - const millis_t heat_start_time = ms; - next_test_ms = ms; + const millis_t heat_start_time = next_test_ms = ms; celsius_float_t temp_samples[16]; uint8_t sample_count = 0; uint16_t sample_distance = 1; float t1_time = 0; - while (true) { + for (;;) { // Can be interrupted with M108 if (!housekeeping(ms, current_temp, next_report_ms)) return; if (ELAPSED(ms, next_test_ms)) { @@ -973,7 +974,7 @@ volatile bool Temperature::raw_temps_ready = false; } hotend.soft_pwm_amount = 0; - // calculate physical constants from three equally spaced samples + // Calculate physical constants from three equally-spaced samples sample_count = (sample_count + 1) / 2 * 2 - 1; const float t1 = temp_samples[0], t2 = temp_samples[(sample_count - 1) >> 1], @@ -989,7 +990,7 @@ volatile bool Temperature::raw_temps_ready = false; hotend.modeled_block_temp = asymp_temp + (ambient_temp - asymp_temp) * exp(-block_responsiveness * (ms - heat_start_time) / 1000.0f); hotend.modeled_sensor_temp = current_temp; - // let the system stabilise under MPC control then get a better measure of ambient loss without and with fan + // Allow the system to stabilize under MPC, then get a better measure of ambient loss with and without fan SERIAL_ECHOLNPGM(STR_MPC_MEASURING_AMBIENT, hotend.modeled_block_temp); LCD_MESSAGE(MSG_MPC_MEASURING_AMBIENT); hotend.target = hotend.modeled_block_temp; @@ -1004,7 +1005,7 @@ volatile bool Temperature::raw_temps_ready = false; #endif float last_temp = current_temp; - while (true) { + for (;;) { // Can be interrupted with M108 if (!housekeeping(ms, current_temp, next_report_ms)) return; if (ELAPSED(ms, next_test_ms)) { @@ -1044,7 +1045,7 @@ volatile bool Temperature::raw_temps_ready = false; constants.fan255_adjustment = ambient_xfer_coeff_fan255 - constants.ambient_xfer_coeff_fan0; #endif - // calculate a new and better asymptotic temperature and re-evaluate the other constants + // Calculate a new and better asymptotic temperature and re-evaluate the other constants asymp_temp = ambient_temp + constants.heater_power / constants.ambient_xfer_coeff_fan0; block_responsiveness = -log((t2 - asymp_temp) / (t1 - asymp_temp)) / (sample_distance * (sample_count >> 1)); constants.block_heat_capacity = constants.ambient_xfer_coeff_fan0 / block_responsiveness; From d9f231e8bcd5217aa4682d6f0b89afc082484909 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 9 Apr 2022 22:44:38 -0500 Subject: [PATCH 12/14] MPC edit submenu --- Marlin/src/lcd/language/language_en.h | 1 + Marlin/src/lcd/menu/menu_advanced.cpp | 43 ++++++++++++++------------- Marlin/src/module/temperature.cpp | 8 ++--- 3 files changed, 28 insertions(+), 24 deletions(-) diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 2d7b65d5a02e..6ab0cb5a4014 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -352,6 +352,7 @@ namespace Language_en { LSTR MSG_PID_TIMEOUT = _UxGT("Autotune failed! Timeout."); LSTR MSG_MPC_MEASURING_AMBIENT = _UxGT("Testing heat loss"); LSTR MSG_MPC_AUTOTUNE = _UxGT("MPC Autotune"); + LSTR MSG_MPC_EDIT = _UxGT("Edit * MPC"); LSTR MSG_MPC_POWER_E = _UxGT("Power *"); LSTR MSG_MPC_BLOCK_HEAT_CAPACITY_E = _UxGT("Block C *"); LSTR MSG_SENSOR_RESPONSIVENESS_E = _UxGT("Sensor res *"); diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index fa0ea1cafaad..a7937239fa62 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -256,6 +256,7 @@ void menu_backlash(); void menu_advanced_temperature() { START_MENU(); BACK_ITEM(MSG_ADVANCED_SETTINGS); + // // Autotemp, Min, Max, Fact // @@ -325,31 +326,33 @@ void menu_backlash(); HOTEND_PID_EDIT_MENU_ITEMS(0); #if ENABLED(PID_PARAMS_PER_HOTEND) - REPEAT_S(1, HOTENDS, HOTEND_PID_EDIT_MENU_ITEMS) + REPEAT_S(1, HOTENDS, HOTEND_PID_EDIT_MENU_ITEMS); #endif #endif #if ENABLED(MPC_EDIT_MENU) - #define _MPC_CONST(N) thermalManager.temp_hotend[N].constants - - #define _HOTEND_MPC_EDIT_MENU_ITEMS(N) \ - EDIT_ITEM_FAST_N(float31sign, N, MSG_MPC_POWER_E, &_MPC_CONST(N).heater_power, 1, 200); \ - EDIT_ITEM_FAST_N(float31sign, N, MSG_MPC_BLOCK_HEAT_CAPACITY_E, &_MPC_CONST(N).block_heat_capacity, 0, 40); \ - EDIT_ITEM_FAST_N(float43, N, MSG_SENSOR_RESPONSIVENESS_E, &_MPC_CONST(N).sensor_responsiveness, 0, 1); \ - EDIT_ITEM_FAST_N(float43, N, MSG_MPC_AMBIENT_XFER_COEFF_E, &_MPC_CONST(N).ambient_xfer_coeff_fan0, 0, 1); - - #if ENABLED(MPC_INCLUDE_FAN) - #define HOTEND_MPC_EDIT_MENU_ITEMS(N) \ - _HOTEND_MPC_EDIT_MENU_ITEMS(N); \ - editable.decimal = _MPC_CONST(N).ambient_xfer_coeff_fan0 + _MPC_CONST(N).fan255_adjustment; \ - EDIT_ITEM_FAST_N(float43, N, MSG_MPC_AMBIENT_XFER_COEFF_FAN255_E, &editable.decimal, 0, 1, []{ \ - _MPC_CONST(N).fan255_adjustment = editable.decimal - _MPC_CONST(N).ambient_xfer_coeff_fan0; \ - }); - #else - #define HOTEND_MPC_EDIT_MENU_ITEMS(N) _HOTEND_MPC_EDIT_MENU_ITEMS(N); - #endif + auto mpc_edit_hotend = [&](const uint8_t e) { + MPC_t &c = thermalManager.temp_hotend[e].constants; + TERN_(MPC_INCLUDE_FAN, editable.decimal = c.ambient_xfer_coeff_fan0 + c.fan255_adjustment); + + START_MENU(); + BACK_ITEM(MSG_TEMPERATURE); + + EDIT_ITEM_FAST_N(float31sign, e, MSG_MPC_POWER_E, &c.heater_power, 1, 200); + EDIT_ITEM_FAST_N(float31sign, e, MSG_MPC_BLOCK_HEAT_CAPACITY_E, &c.block_heat_capacity, 0, 40); + EDIT_ITEM_FAST_N(float43, e, MSG_SENSOR_RESPONSIVENESS_E, &c.sensor_responsiveness, 0, 1); + EDIT_ITEM_FAST_N(float43, e, MSG_MPC_AMBIENT_XFER_COEFF_E, &c.ambient_xfer_coeff_fan0, 0, 1); + #if ENABLED(MPC_INCLUDE_FAN) + EDIT_ITEM_FAST_N(float43, e, MSG_MPC_AMBIENT_XFER_COEFF_FAN255_E, &editable.decimal, 0, 1, + []{ c.fan255_adjustment = editable.decimal - c.ambient_xfer_coeff_fan0; } + ); + #endif + + END_MENU(); + } - REPEAT_S(0, HOTENDS, HOTEND_MPC_EDIT_MENU_ITEMS) + #define MPC_SUBMENU(N) SUBMENU_N(N, MSG_MPC_EDIT, []{ mpc_edit_hotend(MenuItemBase::itemIndex); }); + REPEAT(HOTENDS, MPC_SUBMENU); #endif #if ENABLED(MPC_AUTOTUNE_MENU) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index d08d7dfc52ab..8fc84c0eb0ba 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -902,8 +902,8 @@ volatile bool Temperature::raw_temps_ready = false; SERIAL_ECHOPGM(STR_MPC_AUTOTUNE); SERIAL_ECHOLNPGM(STR_MPC_AUTOTUNE_START, active_extruder); - MPCHeaterInfo& hotend = temp_hotend[active_extruder]; - MPC_t& constants = hotend.constants; + MPCHeaterInfo &hotend = temp_hotend[active_extruder]; + MPC_t &constants = hotend.constants; // move to center of bed, just above bed height and cool with max fan TERN_(HAS_FAN, zero_fan_speeds()); @@ -1404,8 +1404,8 @@ void Temperature::min_temp_error(const heater_id_t heater_id) { #endif #elif ENABLED(MPCTEMP) - MPCHeaterInfo& hotend = temp_hotend[ee]; - MPC_t& constants = hotend.constants; + MPCHeaterInfo &hotend = temp_hotend[ee]; + MPC_t &constants = hotend.constants; // At startup, initialize modeled temperatures if (isnan(hotend.modeled_block_temp)) { From 26ab437dcd00157fbbc80569511187208fd3b91e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 10 Apr 2022 00:47:28 -0500 Subject: [PATCH 13/14] add test, single hotend menu items --- Marlin/src/lcd/menu/menu_advanced.cpp | 55 +++++++++++++++---------- Marlin/src/module/temperature.cpp | 58 +++++++++++++++------------ buildroot/tests/BIGTREE_GTR_V1_0 | 12 ++++-- 3 files changed, 75 insertions(+), 50 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index a7937239fa62..f1ca4662e35f 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -331,29 +331,42 @@ void menu_backlash(); #endif #if ENABLED(MPC_EDIT_MENU) - auto mpc_edit_hotend = [&](const uint8_t e) { - MPC_t &c = thermalManager.temp_hotend[e].constants; - TERN_(MPC_INCLUDE_FAN, editable.decimal = c.ambient_xfer_coeff_fan0 + c.fan255_adjustment); - - START_MENU(); - BACK_ITEM(MSG_TEMPERATURE); - - EDIT_ITEM_FAST_N(float31sign, e, MSG_MPC_POWER_E, &c.heater_power, 1, 200); - EDIT_ITEM_FAST_N(float31sign, e, MSG_MPC_BLOCK_HEAT_CAPACITY_E, &c.block_heat_capacity, 0, 40); - EDIT_ITEM_FAST_N(float43, e, MSG_SENSOR_RESPONSIVENESS_E, &c.sensor_responsiveness, 0, 1); - EDIT_ITEM_FAST_N(float43, e, MSG_MPC_AMBIENT_XFER_COEFF_E, &c.ambient_xfer_coeff_fan0, 0, 1); - #if ENABLED(MPC_INCLUDE_FAN) - EDIT_ITEM_FAST_N(float43, e, MSG_MPC_AMBIENT_XFER_COEFF_FAN255_E, &editable.decimal, 0, 1, - []{ c.fan255_adjustment = editable.decimal - c.ambient_xfer_coeff_fan0; } - ); - #endif - END_MENU(); - } + #define MPC_EDIT_DEFS(N) \ + MPC_t &c = thermalManager.temp_hotend[N].constants; \ + TERN(MPC_INCLUDE_FAN, editable.decimal = c.ambient_xfer_coeff_fan0 + c.fan255_adjustment) + + #define _MPC_EDIT_ITEMS(N) \ + EDIT_ITEM_FAST_N(float31sign, N, MSG_MPC_POWER_E, &c.heater_power, 1, 200); \ + EDIT_ITEM_FAST_N(float31sign, N, MSG_MPC_BLOCK_HEAT_CAPACITY_E, &c.block_heat_capacity, 0, 40); \ + EDIT_ITEM_FAST_N(float43, N, MSG_SENSOR_RESPONSIVENESS_E, &c.sensor_responsiveness, 0, 1); \ + EDIT_ITEM_FAST_N(float43, N, MSG_MPC_AMBIENT_XFER_COEFF_E, &c.ambient_xfer_coeff_fan0, 0, 1) + + #if ENABLED(MPC_INCLUDE_FAN) + #define MPC_EDIT_ITEMS(N) \ + _MPC_EDIT_ITEMS(N); \ + EDIT_ITEM_FAST_N(float43, N, MSG_MPC_AMBIENT_XFER_COEFF_FAN255_E, &editable.decimal, 0, 1, []{ \ + c.fan255_adjustment = editable.decimal - c.ambient_xfer_coeff_fan0; \ + }) + #else + #define MPC_EDIT_ITEMS _MPC_EDIT_ITEMS + #endif - #define MPC_SUBMENU(N) SUBMENU_N(N, MSG_MPC_EDIT, []{ mpc_edit_hotend(MenuItemBase::itemIndex); }); - REPEAT(HOTENDS, MPC_SUBMENU); - #endif + #if HAS_MULTI_HOTEND + auto mpc_edit_hotend = [&](const uint8_t e) { + MPC_EDIT_DEFS(e); + START_MENU(); + BACK_ITEM(MSG_TEMPERATURE); + MPC_EDIT_ITEMS(e); + END_MENU(); + }; + #define MPC_SUBMENU(N) SUBMENU_N(N, MSG_MPC_EDIT, []{ mpc_edit_hotend(MenuItemBase::itemIndex); }); + REPEAT(HOTENDS, MPC_SUBMENU); + #else + MPC_EDIT_DEFS(0); MPC_EDIT_ITEMS(0); + #endif + + #endif // MPC_EDIT_MENU #if ENABLED(MPC_AUTOTUNE_MENU) ACTION_ITEM(MSG_MPC_AUTOTUNE, []{ queue.inject(F("M306 T")); ui.return_to_status(); }); diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 8fc84c0eb0ba..58e6c816e8d5 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -893,8 +893,10 @@ volatile bool Temperature::raw_temps_ready = false; temp_hotend[active_extruder].target = 0.0f; temp_hotend[active_extruder].soft_pwm_amount = 0; - TERN_(HAS_FAN, set_fan_speed(ANY(MPC_FAN_0_ALL_HOTENDS, MPC_FAN_0_ACTIVE_HOTEND) ? 0 : active_extruder, 0)); - TERN_(HAS_FAN, planner.sync_fan_speeds(fan_speed)); + #if HAS_FAN + set_fan_speed(ANY(MPC_FAN_0_ALL_HOTENDS, MPC_FAN_0_ACTIVE_HOTEND) ? 0 : active_extruder, 0); + planner.sync_fan_speeds(fan_speed); + #endif do_z_clearance(MPC_TUNING_END_Z); } @@ -905,11 +907,13 @@ volatile bool Temperature::raw_temps_ready = false; MPCHeaterInfo &hotend = temp_hotend[active_extruder]; MPC_t &constants = hotend.constants; - // move to center of bed, just above bed height and cool with max fan - TERN_(HAS_FAN, zero_fan_speeds()); + // Move to center of bed, just above bed height and cool with max fan disable_all_heaters(); - TERN_(HAS_FAN, set_fan_speed(ANY(MPC_FAN_0_ALL_HOTENDS, MPC_FAN_0_ACTIVE_HOTEND) ? 0 : active_extruder, 255)); - TERN_(HAS_FAN, planner.sync_fan_speeds(fan_speed)); + #if HAS_FAN + zero_fan_speeds(); + set_fan_speed(ANY(MPC_FAN_0_ALL_HOTENDS, MPC_FAN_0_ACTIVE_HOTEND) ? 0 : active_extruder, 255); + planner.sync_fan_speeds(fan_speed); + #endif gcode.home_all_axes(true); const xyz_pos_t tuningpos = MPC_TUNING_POS; do_blocking_move_to(tuningpos); @@ -934,14 +938,16 @@ volatile bool Temperature::raw_temps_ready = false; } } - TERN_(HAS_FAN, set_fan_speed(ANY(MPC_FAN_0_ALL_HOTENDS, MPC_FAN_0_ACTIVE_HOTEND) ? 0 : active_extruder, 0)); - TERN_(HAS_FAN, planner.sync_fan_speeds(fan_speed)); + #if HAS_FAN + set_fan_speed(ANY(MPC_FAN_0_ALL_HOTENDS, MPC_FAN_0_ACTIVE_HOTEND) ? 0 : active_extruder, 0); + planner.sync_fan_speeds(fan_speed); + #endif hotend.modeled_ambient_temp = ambient_temp; SERIAL_ECHOLNPGM(STR_MPC_HEATING_PAST_200); LCD_MESSAGE(MSG_HEATING); - hotend.target = 200.0f; // so M105 looks nice + hotend.target = 200.0f; // So M105 looks nice hotend.soft_pwm_amount = MPC_MAX >> 1; const millis_t heat_start_time = next_test_ms = ms; celsius_float_t temp_samples[16]; @@ -953,9 +959,9 @@ volatile bool Temperature::raw_temps_ready = false; if (!housekeeping(ms, current_temp, next_report_ms)) return; if (ELAPSED(ms, next_test_ms)) { - // record samples between 100C and 200C + // Record samples between 100C and 200C if (current_temp >= 100.0f) { - // if there are too many samples, space them more widely + // If there are too many samples, space them more widely if (sample_count == COUNT(temp_samples)) { for (uint8_t i = 0; i < COUNT(temp_samples) / 2; i++) temp_samples[i] = temp_samples[i*2]; @@ -1409,7 +1415,7 @@ void Temperature::min_temp_error(const heater_id_t heater_id) { // At startup, initialize modeled temperatures if (isnan(hotend.modeled_block_temp)) { - hotend.modeled_ambient_temp = min(30.0f, hotend.celsius); // cap initial value at reasonable max room temperature of 30C + hotend.modeled_ambient_temp = min(30.0f, hotend.celsius); // Cap initial value at reasonable max room temperature of 30C hotend.modeled_block_temp = hotend.modeled_sensor_temp = hotend.celsius; } @@ -1430,16 +1436,16 @@ void Temperature::min_temp_error(const heater_id_t heater_id) { const int32_t e_position = stepper.position(E_AXIS); const float e_speed = (e_position - mpc_e_position) * planner.mm_per_step[E_AXIS] / MPC_dT; - // the position can appear to make big jumps when, e.g. homing + // The position can appear to make big jumps when, e.g. homing if (fabs(e_speed) > planner.settings.max_feedrate_mm_s[E_AXIS]) mpc_e_position = e_position; - else if (e_speed > 0.0f) { // ignore retract/recover moves + else if (e_speed > 0.0f) { // Ignore retract/recover moves ambient_xfer_coeff += e_speed * FILAMENT_HEAT_CAPACITY_PERMM; mpc_e_position = e_position; } } - // update the modeled temperatures + // Update the modeled temperatures float blocktempdelta = hotend.soft_pwm_amount * constants.heater_power * (MPC_dT / 127) / constants.block_heat_capacity; blocktempdelta += (hotend.modeled_ambient_temp - hotend.modeled_block_temp) * ambient_xfer_coeff * MPC_dT / constants.block_heat_capacity; hotend.modeled_block_temp += blocktempdelta; @@ -1453,18 +1459,18 @@ void Temperature::min_temp_error(const heater_id_t heater_id) { hotend.modeled_block_temp += delta_to_apply; hotend.modeled_sensor_temp += delta_to_apply; - // only correct ambient when close to steady state (output power is not clipped or asymptotic temperature is reached) + // Only correct ambient when close to steady state (output power is not clipped or asymptotic temperature is reached) if (WITHIN(hotend.soft_pwm_amount, 1, 126) || fabs(blocktempdelta + delta_to_apply) < (MPC_STEADYSTATE * MPC_dT)) hotend.modeled_ambient_temp += delta_to_apply > 0.f ? max(delta_to_apply, MPC_MIN_AMBIENT_CHANGE * MPC_dT) : min(delta_to_apply, -MPC_MIN_AMBIENT_CHANGE * MPC_dT); float power = 0.0; if (hotend.target != 0 && TERN1(HEATER_IDLE_HANDLER, !heater_idle[ee].timed_out)) { - // plan power level to get to target temperature in 2 seconds + // Plan power level to get to target temperature in 2 seconds power = (hotend.target - hotend.modeled_block_temp) * constants.block_heat_capacity / 2.0f; power -= (hotend.modeled_ambient_temp - hotend.modeled_block_temp) * ambient_xfer_coeff; } - float pid_output = power * 254.0f / constants.heater_power + 1.0f; // ensure correct quantization into a range of 0 to 127 + float pid_output = power * 254.0f / constants.heater_power + 1.0f; // Ensure correct quantization into a range of 0 to 127 pid_output = constrain(pid_output, 0, MPC_MAX); /* <-- add a slash to enable @@ -2110,7 +2116,7 @@ void Temperature::manage_heater() { - (t.beta_recip * t.res_25_log) - (t.sh_c_coeff * cu(t.res_25_log)); } - // maximum adc value .. take into account the over sampling + // Maximum ADC value .. take into account the over sampling constexpr raw_adc_t adc_max = MAX_RAW_THERMISTOR_VALUE; const raw_adc_t adc_raw = constrain(raw, 1, adc_max - 1); // constrain to prevent divide-by-zero @@ -3108,7 +3114,7 @@ void Temperature::disable_all_heaters() { spiInit(MAX_TC_SPEED_BITS); #endif - MAXTC_CS_WRITE(LOW); // enable MAXTC + MAXTC_CS_WRITE(LOW); // Enable MAXTC DELAY_NS(100); // Ensure 100ns delay // Read a big-endian temperature value without using a library @@ -3117,7 +3123,7 @@ void Temperature::disable_all_heaters() { if (i > 0) max_tc_temp <<= 8; // shift left if not the last byte } - MAXTC_CS_WRITE(HIGH); // disable MAXTC + MAXTC_CS_WRITE(HIGH); // Disable MAXTC #else #if HAS_MAX6675_LIBRARY MAX6675 &max6675ref = THERMO_SEL(max6675_0, max6675_1); @@ -3328,7 +3334,7 @@ void Temperature::isr() { static ADCSensorState adc_sensor_state = StartupDelay; static uint8_t pwm_count = _BV(SOFT_PWM_SCALE); - // avoid multiple loads of pwm_count + // Avoid multiple loads of pwm_count uint8_t pwm_count_tmp = pwm_count; #if HAS_ADC_BUTTONS @@ -3606,8 +3612,8 @@ void Temperature::isr() { // 5: / 4 = 244.1406 Hz pwm_count = pwm_count_tmp + _BV(SOFT_PWM_SCALE); - // increment slow_pwm_count only every 64th pwm_count, - // i.e. yielding a PWM frequency of 16/128 Hz (8s). + // Increment slow_pwm_count only every 64th pwm_count, + // i.e., yielding a PWM frequency of 16/128 Hz (8s). if (((pwm_count >> SOFT_PWM_SCALE) & 0x3F) == 0) { slow_pwm_count++; slow_pwm_count &= 0x7F; @@ -4060,7 +4066,7 @@ void Temperature::isr() { // Prevent a wait-forever situation if R is misused i.e. M109 R0 if (wants_to_cool) { - // break after MIN_COOLING_SLOPE_TIME seconds + // Break after MIN_COOLING_SLOPE_TIME seconds // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG if (!next_cool_check_ms || ELAPSED(now, next_cool_check_ms)) { if (old_temp - temp < float(MIN_COOLING_SLOPE_DEG)) break; @@ -4082,7 +4088,7 @@ void Temperature::isr() { wait_for_heatup = false; #if HAS_DWIN_E3V2_BASIC HMI_flag.heat_flag = 0; - duration_t elapsed = print_job_timer.duration(); // print timer + duration_t elapsed = print_job_timer.duration(); // Print timer dwin_heat_time = elapsed.value; #else ui.reset_status(); diff --git a/buildroot/tests/BIGTREE_GTR_V1_0 b/buildroot/tests/BIGTREE_GTR_V1_0 index 4f1a4a690a9c..ef178bc277e6 100755 --- a/buildroot/tests/BIGTREE_GTR_V1_0 +++ b/buildroot/tests/BIGTREE_GTR_V1_0 @@ -32,9 +32,15 @@ restore_configs opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 SERIAL_PORT -1 \ EXTRUDERS 3 TEMP_SENSOR_1 1 TEMP_SENSOR_2 1 \ SERVO_DELAY '{ 300, 300, 300 }' \ - SWITCHING_TOOLHEAD_X_POS '{ 215, 0 ,0 }' -opt_enable SWITCHING_TOOLHEAD TOOL_SENSOR -exec_test $1 $2 "BigTreeTech GTR | Switching Toolhead | Tool Sensors" "$3" + SWITCHING_TOOLHEAD_X_POS '{ 215, 0 ,0 }' \ + MPC_HEATER_POWER '{ 40.0f, 40.0f, 40.0f }' \ + MPC_BLOCK_HEAT_CAPACITY '{ 16.7f, 16.7f, 16.7f }' \ + MPC_SENSOR_RESPONSIVENESS '{ 0.22f, 0.22f, 0.22f }' \ + MPC_AMBIENT_XFER_COEFF '{ 0.068f, 0.068f, 0.068f }' \ + MPC_AMBIENT_XFER_COEFF_FAN255 '{ 0.097f, 0.097f, 0.097f }' +opt_enable SWITCHING_TOOLHEAD TOOL_SENSOR MPCTEMP +opt_disable PIDTEMP +exec_test $1 $2 "BigTreeTech GTR | MPC | Switching Toolhead | Tool Sensors" "$3" # clean up restore_configs From a5ddcddef4c2c8fba105d0f248e9aced9982e447 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 10 Apr 2022 01:18:01 -0500 Subject: [PATCH 14/14] optimize menu loop, add test --- Marlin/src/lcd/menu/menu_advanced.cpp | 21 ++++++++++++++------- buildroot/tests/STM32F103RC_btt | 1 - buildroot/tests/STM32F103RC_btt_maple | 1 - buildroot/tests/mega2560 | 5 ++--- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index f1ca4662e35f..ea81003f23d4 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -253,7 +253,17 @@ void menu_backlash(); // #if SHOW_MENU_ADVANCED_TEMPERATURE + #if ENABLED(MPC_EDIT_MENU) + #define MPC_EDIT_DEFS(N) \ + MPC_t &c = thermalManager.temp_hotend[N].constants; \ + TERN(MPC_INCLUDE_FAN, editable.decimal = c.ambient_xfer_coeff_fan0 + c.fan255_adjustment) + #endif + void menu_advanced_temperature() { + #if ENABLED(MPC_EDIT_MENU) && !HAS_MULTI_HOTEND + MPC_EDIT_DEFS(0); + #endif + START_MENU(); BACK_ITEM(MSG_ADVANCED_SETTINGS); @@ -332,10 +342,6 @@ void menu_backlash(); #if ENABLED(MPC_EDIT_MENU) - #define MPC_EDIT_DEFS(N) \ - MPC_t &c = thermalManager.temp_hotend[N].constants; \ - TERN(MPC_INCLUDE_FAN, editable.decimal = c.ambient_xfer_coeff_fan0 + c.fan255_adjustment) - #define _MPC_EDIT_ITEMS(N) \ EDIT_ITEM_FAST_N(float31sign, N, MSG_MPC_POWER_E, &c.heater_power, 1, 200); \ EDIT_ITEM_FAST_N(float31sign, N, MSG_MPC_BLOCK_HEAT_CAPACITY_E, &c.block_heat_capacity, 0, 40); \ @@ -360,12 +366,13 @@ void menu_backlash(); MPC_EDIT_ITEMS(e); END_MENU(); }; - #define MPC_SUBMENU(N) SUBMENU_N(N, MSG_MPC_EDIT, []{ mpc_edit_hotend(MenuItemBase::itemIndex); }); - REPEAT(HOTENDS, MPC_SUBMENU); + #define MPC_ENTRY(N) SUBMENU_N(N, MSG_MPC_EDIT, []{ mpc_edit_hotend(MenuItemBase::itemIndex); }); #else - MPC_EDIT_DEFS(0); MPC_EDIT_ITEMS(0); + #define MPC_ENTRY MPC_EDIT_ITEMS #endif + REPEAT(HOTENDS, MPC_ENTRY); + #endif // MPC_EDIT_MENU #if ENABLED(MPC_AUTOTUNE_MENU) diff --git a/buildroot/tests/STM32F103RC_btt b/buildroot/tests/STM32F103RC_btt index e76060aee82f..16419cbfa232 100755 --- a/buildroot/tests/STM32F103RC_btt +++ b/buildroot/tests/STM32F103RC_btt @@ -13,7 +13,6 @@ restore_configs opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_E3_V1_0 SERIAL_PORT 1 SERIAL_PORT_2 -1 \ X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2209 Z_DRIVER_TYPE TMC2209 E0_DRIVER_TYPE TMC2209 opt_enable PINS_DEBUGGING Z_IDLE_HEIGHT - exec_test $1 $2 "BigTreeTech SKR Mini E3 1.0 - Basic Config with TMC2209 HW Serial" "$3" # clean up diff --git a/buildroot/tests/STM32F103RC_btt_maple b/buildroot/tests/STM32F103RC_btt_maple index e74e5902132c..90e33ab52925 100755 --- a/buildroot/tests/STM32F103RC_btt_maple +++ b/buildroot/tests/STM32F103RC_btt_maple @@ -13,7 +13,6 @@ restore_configs opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_E3_V1_0 SERIAL_PORT 1 SERIAL_PORT_2 -1 \ X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2209 Z_DRIVER_TYPE TMC2209 E0_DRIVER_TYPE TMC2209 opt_enable PINS_DEBUGGING Z_IDLE_HEIGHT - exec_test $1 $2 "BigTreeTech SKR Mini E3 1.0 - Basic Config with TMC2209 HW Serial" "$3" # clean up diff --git a/buildroot/tests/mega2560 b/buildroot/tests/mega2560 index 5ae9a2dbcf0b..a9ac15ecda9e 100755 --- a/buildroot/tests/mega2560 +++ b/buildroot/tests/mega2560 @@ -181,7 +181,6 @@ opt_set MOTHERBOARD BOARD_RAMPS_14_EFB EXTRUDERS 0 LCD_LANGUAGE en TEMP_SENSOR_C AXIS_RELATIVE_MODES '{ false, false, false }' opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT EEPROM_SETTINGS EEPROM_BOOT_SILENT EEPROM_AUTO_INIT \ LASER_FEATURE AIR_EVACUATION AIR_EVACUATION_PIN AIR_ASSIST AIR_ASSIST_PIN LASER_COOLANT_FLOW_METER MEATPACK_ON_SERIAL_PORT_1 - exec_test $1 $2 "MEGA2560 RAMPS | Laser Feature | Air Evacuation | Air Assist | Cooler | Flowmeter | 12864 LCD | meatpack | SERIAL_PORT_2 " "$3" # @@ -196,7 +195,6 @@ opt_set MOTHERBOARD BOARD_RAMPS_14_EFB EXTRUDERS 0 LCD_LANGUAGE en TEMP_SENSOR_C AXIS_RELATIVE_MODES '{ false, false, false }' opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT EEPROM_SETTINGS EEPROM_BOOT_SILENT EEPROM_AUTO_INIT \ LASER_FEATURE AIR_EVACUATION AIR_EVACUATION_PIN AIR_ASSIST AIR_ASSIST_PIN LASER_COOLANT_FLOW_METER I2C_AMMETER - exec_test $1 $2 "MEGA2560 RAMPS | Laser Feature | Air Evacuation | Air Assist | Cooler | Flowmeter | 44780 LCD " "$3" # @@ -207,7 +205,8 @@ opt_set MOTHERBOARD BOARD_RAMPS_14_EFB EXTRUDERS 1 \ TEMP_SENSOR_0 -2 TEMP_SENSOR_REDUNDANT -2 \ TEMP_SENSOR_REDUNDANT_SOURCE E1 TEMP_SENSOR_REDUNDANT_TARGET E0 \ TEMP_0_CS_PIN 11 TEMP_1_CS_PIN 12 - +opt_enable MPCTEMP +opt_disable PIDTEMP exec_test $1 $2 "MEGA2560 RAMPS | Redundant temperature sensor | 2x MAX6675" "$3" #