Skip to content

Commit 2d8a75d

Browse files
tombrazierthinkyhead
authored andcommitted
🚸 Improve MPC tuning, add menu items (MarlinFirmware#23984)
Co-authored-by: Scott Lahteine <[email protected]>
1 parent 460a38f commit 2d8a75d

File tree

11 files changed

+177
-74
lines changed

11 files changed

+177
-74
lines changed

Marlin/Configuration.h

+4
Original file line numberDiff line numberDiff line change
@@ -643,6 +643,9 @@
643643
* for PID_EXTRUSION_SCALING and PID_FAN_SCALING. Use M306 to autotune the model.
644644
*/
645645
#if ENABLED(MPCTEMP)
646+
//#define MPC_EDIT_MENU // Add MPC editing to the "Advanced Settings" menu. (~1300 bytes of flash)
647+
//#define MPC_AUTOTUNE_MENU // Add MPC auto-tuning to the "Advanced Settings" menu. (~350 bytes of flash)
648+
646649
#define MPC_MAX BANG_MAX // (0..255) Current to nozzle while MPC is active.
647650
#define MPC_HEATER_POWER { 40.0f } // (W) Heat cartridge powers.
648651

@@ -671,6 +674,7 @@
671674
#define MPC_STEADYSTATE 0.5f // (K/s) Temperature change rate for steady state logic to be enforced.
672675

673676
#define MPC_TUNING_POS { X_CENTER, Y_CENTER, 1.0f } // (mm) M306 Autotuning position, ideally bed center just above the surface.
677+
#define MPC_TUNING_END_Z 10.0f // (mm) M306 Autotuning final Z position.
674678
#endif
675679

676680
//===========================================================================

Marlin/src/core/language.h

+8
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,14 @@
232232
#define STR_PID_DEBUG_DTERM " dTerm "
233233
#define STR_PID_DEBUG_CTERM " cTerm "
234234
#define STR_INVALID_EXTRUDER_NUM " - Invalid extruder number !"
235+
#define STR_MPC_AUTOTUNE "MPC Autotune"
236+
#define STR_MPC_AUTOTUNE_START " start for " STR_E
237+
#define STR_MPC_AUTOTUNE_INTERRUPTED " interrupted!"
238+
#define STR_MPC_AUTOTUNE_FINISHED " finished! Put the constants below into Configuration.h"
239+
#define STR_MPC_COOLING_TO_AMBIENT "Cooling to ambient"
240+
#define STR_MPC_HEATING_PAST_200 "Heating to over 200C"
241+
#define STR_MPC_MEASURING_AMBIENT "Measuring ambient heatloss at "
242+
#define STR_MPC_TEMPERATURE_ERROR "Temperature error"
235243

236244
#define STR_HEATER_BED "bed"
237245
#define STR_HEATER_CHAMBER "chamber"

Marlin/src/gcode/temp/M306.cpp

+1-11
Original file line numberDiff line numberDiff line change
@@ -56,17 +56,7 @@ void GcodeSuite::M306() {
5656
return;
5757
}
5858

59-
HOTEND_LOOP() {
60-
SERIAL_ECHOLNPGM("MPC constants for hotend ", e);
61-
MPC_t& constants = thermalManager.temp_hotend[e].constants;
62-
SERIAL_ECHOLNPGM("Heater power: ", constants.heater_power);
63-
SERIAL_ECHOLNPGM("Heatblock heat capacity: ", constants.block_heat_capacity);
64-
SERIAL_ECHOLNPAIR_F("Sensor responsivness: ", constants.sensor_responsiveness, 4);
65-
SERIAL_ECHOLNPAIR_F("Ambient heat transfer coeff. (no fan): ", constants.ambient_xfer_coeff_fan0, 4);
66-
#if ENABLED(MPC_INCLUDE_FAN)
67-
SERIAL_ECHOLNPAIR_F("Ambient heat transfer coeff. (full fan): ", constants.ambient_xfer_coeff_fan0 + constants.fan255_adjustment, 4);
68-
#endif
69-
}
59+
M306_report(true);
7060
}
7161

7262
void GcodeSuite::M306_report(const bool forReplay/*=true*/) {

Marlin/src/inc/SanityCheck.h

+4
Original file line numberDiff line numberDiff line change
@@ -2964,6 +2964,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
29642964
#error "DWIN_CREALITY_LCD requires SDSUPPORT to be enabled."
29652965
#elif EITHER(PID_EDIT_MENU, PID_AUTOTUNE_MENU)
29662966
#error "DWIN_CREALITY_LCD does not support PID_EDIT_MENU or PID_AUTOTUNE_MENU."
2967+
#elif EITHER(MPC_EDIT_MENU, MPC_AUTOTUNE_MENU)
2968+
#error "DWIN_CREALITY_LCD does not support MPC_EDIT_MENU or MPC_AUTOTUNE_MENU."
29672969
#elif ENABLED(LEVEL_BED_CORNERS)
29682970
#error "DWIN_CREALITY_LCD does not support LEVEL_BED_CORNERS."
29692971
#elif BOTH(LCD_BED_LEVELING, PROBE_MANUALLY)
@@ -2974,6 +2976,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
29742976
#error "DWIN_LCD_PROUI requires SDSUPPORT to be enabled."
29752977
#elif EITHER(PID_EDIT_MENU, PID_AUTOTUNE_MENU)
29762978
#error "DWIN_LCD_PROUI does not support PID_EDIT_MENU or PID_AUTOTUNE_MENU."
2979+
#elif EITHER(MPC_EDIT_MENU, MPC_AUTOTUNE_MENU)
2980+
#error "DWIN_LCD_PROUI does not support MPC_EDIT_MENU or MPC_AUTOTUNE_MENU."
29772981
#elif ENABLED(LEVEL_BED_CORNERS)
29782982
#error "DWIN_LCD_PROUI does not support LEVEL_BED_CORNERS."
29792983
#elif BOTH(LCD_BED_LEVELING, PROBE_MANUALLY)

Marlin/src/lcd/language/language_en.h

+8
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,14 @@ namespace Language_en {
350350
LSTR MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Autotune failed. Bad extruder.");
351351
LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Autotune failed. Temperature too high.");
352352
LSTR MSG_PID_TIMEOUT = _UxGT("Autotune failed! Timeout.");
353+
LSTR MSG_MPC_MEASURING_AMBIENT = _UxGT("Testing heat loss");
354+
LSTR MSG_MPC_AUTOTUNE = _UxGT("MPC Autotune");
355+
LSTR MSG_MPC_EDIT = _UxGT("Edit * MPC");
356+
LSTR MSG_MPC_POWER_E = _UxGT("Power *");
357+
LSTR MSG_MPC_BLOCK_HEAT_CAPACITY_E = _UxGT("Block C *");
358+
LSTR MSG_SENSOR_RESPONSIVENESS_E = _UxGT("Sensor res *");
359+
LSTR MSG_MPC_AMBIENT_XFER_COEFF_E = _UxGT("Ambient h *");
360+
LSTR MSG_MPC_AMBIENT_XFER_COEFF_FAN255_E= _UxGT("Amb. h fan *");
353361
LSTR MSG_SELECT = _UxGT("Select");
354362
LSTR MSG_SELECT_E = _UxGT("Select *");
355363
LSTR MSG_ACC = _UxGT("Accel");

Marlin/src/lcd/menu/menu_advanced.cpp

+50-1
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ void menu_backlash();
244244
}
245245
#endif
246246

247-
#if BOTH(AUTOTEMP, HAS_TEMP_HOTEND) || EITHER(PID_AUTOTUNE_MENU, PID_EDIT_MENU)
247+
#if BOTH(AUTOTEMP, HAS_TEMP_HOTEND) || ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU, MPC_AUTOTUNE_MENU, MPC_EDIT_MENU)
248248
#define SHOW_MENU_ADVANCED_TEMPERATURE 1
249249
#endif
250250

@@ -253,7 +253,17 @@ void menu_backlash();
253253
//
254254
#if SHOW_MENU_ADVANCED_TEMPERATURE
255255

256+
#if ENABLED(MPC_EDIT_MENU)
257+
#define MPC_EDIT_DEFS(N) \
258+
MPC_t &c = thermalManager.temp_hotend[N].constants; \
259+
TERN(MPC_INCLUDE_FAN, editable.decimal = c.ambient_xfer_coeff_fan0 + c.fan255_adjustment)
260+
#endif
261+
256262
void menu_advanced_temperature() {
263+
#if ENABLED(MPC_EDIT_MENU) && !HAS_MULTI_HOTEND
264+
MPC_EDIT_DEFS(0);
265+
#endif
266+
257267
START_MENU();
258268
BACK_ITEM(MSG_ADVANCED_SETTINGS);
259269

@@ -330,6 +340,45 @@ void menu_backlash();
330340
#endif
331341
#endif
332342

343+
#if ENABLED(MPC_EDIT_MENU)
344+
345+
#define _MPC_EDIT_ITEMS(N) \
346+
EDIT_ITEM_FAST_N(float31sign, N, MSG_MPC_POWER_E, &c.heater_power, 1, 200); \
347+
EDIT_ITEM_FAST_N(float31sign, N, MSG_MPC_BLOCK_HEAT_CAPACITY_E, &c.block_heat_capacity, 0, 40); \
348+
EDIT_ITEM_FAST_N(float43, N, MSG_SENSOR_RESPONSIVENESS_E, &c.sensor_responsiveness, 0, 1); \
349+
EDIT_ITEM_FAST_N(float43, N, MSG_MPC_AMBIENT_XFER_COEFF_E, &c.ambient_xfer_coeff_fan0, 0, 1)
350+
351+
#if ENABLED(MPC_INCLUDE_FAN)
352+
#define MPC_EDIT_ITEMS(N) \
353+
_MPC_EDIT_ITEMS(N); \
354+
EDIT_ITEM_FAST_N(float43, N, MSG_MPC_AMBIENT_XFER_COEFF_FAN255_E, &editable.decimal, 0, 1, []{ \
355+
c.fan255_adjustment = editable.decimal - c.ambient_xfer_coeff_fan0; \
356+
})
357+
#else
358+
#define MPC_EDIT_ITEMS _MPC_EDIT_ITEMS
359+
#endif
360+
361+
#if HAS_MULTI_HOTEND
362+
auto mpc_edit_hotend = [&](const uint8_t e) {
363+
MPC_EDIT_DEFS(e);
364+
START_MENU();
365+
BACK_ITEM(MSG_TEMPERATURE);
366+
MPC_EDIT_ITEMS(e);
367+
END_MENU();
368+
};
369+
#define MPC_ENTRY(N) SUBMENU_N(N, MSG_MPC_EDIT, []{ mpc_edit_hotend(MenuItemBase::itemIndex); });
370+
#else
371+
#define MPC_ENTRY MPC_EDIT_ITEMS
372+
#endif
373+
374+
REPEAT(HOTENDS, MPC_ENTRY);
375+
376+
#endif // MPC_EDIT_MENU
377+
378+
#if ENABLED(MPC_AUTOTUNE_MENU)
379+
ACTION_ITEM(MSG_MPC_AUTOTUNE, []{ queue.inject(F("M306 T")); ui.return_to_status(); });
380+
#endif
381+
333382
#if ENABLED(PIDTEMPBED)
334383
#if ENABLED(PID_EDIT_MENU)
335384
_PID_EDIT_ITEMS_TMPL(H_BED, thermalManager.temp_bed);

0 commit comments

Comments
 (0)