Skip to content

Commit 1bc9a53

Browse files
authored
🐛 Fix Bed/Chamber PID Autotune with MPCTEMP (MarlinFirmware#23983)
1 parent 01797f7 commit 1bc9a53

File tree

2 files changed

+26
-45
lines changed

2 files changed

+26
-45
lines changed

Marlin/Configuration.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -619,8 +619,6 @@
619619
#define PID_K1 0.95 // Smoothing factor within any PID loop
620620

621621
#if ENABLED(PIDTEMP)
622-
//#define PID_EDIT_MENU // Add PID editing to the "Advanced Settings" menu. (~700 bytes of PROGMEM)
623-
//#define PID_AUTOTUNE_MENU // Add PID auto-tuning to the "Advanced Settings" menu. (~250 bytes of PROGMEM)
624622
//#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders)
625623
// Set/get with gcode: M301 E[extruder number, 0-2]
626624

@@ -767,6 +765,9 @@
767765
//#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay
768766
#define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature
769767
// is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max.
768+
769+
//#define PID_EDIT_MENU // Add PID editing to the "Advanced Settings" menu. (~700 bytes of PROGMEM)
770+
//#define PID_AUTOTUNE_MENU // Add PID auto-tuning to the "Advanced Settings" menu. (~250 bytes of PROGMEM)
770771
#endif
771772

772773
// @section extruder

Marlin/src/lcd/menu/menu_advanced.cpp

+23-43
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ void menu_backlash();
210210

211211
// Helpers for editing PID Ki & Kd values
212212
// grab the PID value out of the temp variable; scale it; then update the PID driver
213-
void copy_and_scalePID_i(int16_t e) {
213+
void copy_and_scalePID_i(const uint8_t e) {
214214
switch (e) {
215215
#if ENABLED(PIDTEMPBED)
216216
case H_BED: thermalManager.temp_bed.pid.Ki = scalePID_i(raw_Ki); break;
@@ -226,7 +226,7 @@ void menu_backlash();
226226
break;
227227
}
228228
}
229-
void copy_and_scalePID_d(int16_t e) {
229+
void copy_and_scalePID_d(const uint8_t e) {
230230
switch (e) {
231231
#if ENABLED(PIDTEMPBED)
232232
case H_BED: thermalManager.temp_bed.pid.Kd = scalePID_d(raw_Kd); break;
@@ -242,30 +242,6 @@ void menu_backlash();
242242
break;
243243
}
244244
}
245-
246-
#define _DEFINE_PIDTEMP_BASE_FUNCS(N) \
247-
void copy_and_scalePID_i_E##N() { copy_and_scalePID_i(N); } \
248-
void copy_and_scalePID_d_E##N() { copy_and_scalePID_d(N); }
249-
250-
#else
251-
252-
#define _DEFINE_PIDTEMP_BASE_FUNCS(N) //
253-
254-
#endif
255-
256-
#if ENABLED(PID_AUTOTUNE_MENU)
257-
#define DEFINE_PIDTEMP_FUNCS(N) \
258-
_DEFINE_PIDTEMP_BASE_FUNCS(N); \
259-
void lcd_autotune_callback_E##N() { _lcd_autotune(heater_id_t(N)); }
260-
#else
261-
#define DEFINE_PIDTEMP_FUNCS(N) _DEFINE_PIDTEMP_BASE_FUNCS(N);
262-
#endif
263-
264-
#if HAS_HOTEND
265-
DEFINE_PIDTEMP_FUNCS(0);
266-
#if ENABLED(PID_PARAMS_PER_HOTEND)
267-
REPEAT_S(1, HOTENDS, DEFINE_PIDTEMP_FUNCS)
268-
#endif
269245
#endif
270246

271247
#if BOTH(AUTOTEMP, HAS_TEMP_HOTEND) || EITHER(PID_AUTOTUNE_MENU, PID_EDIT_MENU)
@@ -299,14 +275,7 @@ void menu_backlash();
299275
// PID-P E5, PID-I E5, PID-D E5, PID-C E5, PID Autotune E5
300276
//
301277

302-
#if ENABLED(PID_EDIT_MENU)
303-
#define _PID_EDIT_ITEMS_TMPL(N,T) \
304-
raw_Ki = unscalePID_i(T.pid.Ki); \
305-
raw_Kd = unscalePID_d(T.pid.Kd); \
306-
EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_P_E, &T.pid.Kp, 1, 9990); \
307-
EDIT_ITEM_FAST_N(float52sign, N, MSG_PID_I_E, &raw_Ki, 0.01f, 9990, []{ copy_and_scalePID_i(N); }); \
308-
EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_D_E, &raw_Kd, 1, 9990, []{ copy_and_scalePID_d(N); })
309-
278+
#if BOTH(PIDTEMP, PID_EDIT_MENU)
310279
#define __PID_HOTEND_MENU_ITEMS(N) \
311280
raw_Ki = unscalePID_i(PID_PARAM(Ki, N)); \
312281
raw_Kd = unscalePID_d(PID_PARAM(Kd, N)); \
@@ -336,17 +305,28 @@ void menu_backlash();
336305

337306
#endif
338307

339-
#if ENABLED(PID_AUTOTUNE_MENU)
340-
#define HOTEND_PID_EDIT_MENU_ITEMS(N) \
341-
_HOTEND_PID_EDIT_MENU_ITEMS(N); \
342-
EDIT_ITEM_FAST_N(int3, N, MSG_PID_AUTOTUNE_E, &autotune_temp[N], 150, thermalManager.hotend_max_target(N), []{ _lcd_autotune(heater_id_t(MenuItemBase::itemIndex)); });
343-
#else
344-
#define HOTEND_PID_EDIT_MENU_ITEMS(N) _HOTEND_PID_EDIT_MENU_ITEMS(N);
308+
#if ENABLED(PID_EDIT_MENU) && EITHER(PIDTEMPBED, PIDTEMPCHAMBER)
309+
#define _PID_EDIT_ITEMS_TMPL(N,T) \
310+
raw_Ki = unscalePID_i(T.pid.Ki); \
311+
raw_Kd = unscalePID_d(T.pid.Kd); \
312+
EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_P_E, &T.pid.Kp, 1, 9990); \
313+
EDIT_ITEM_FAST_N(float52sign, N, MSG_PID_I_E, &raw_Ki, 0.01f, 9990, []{ copy_and_scalePID_i(N); }); \
314+
EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_D_E, &raw_Kd, 1, 9990, []{ copy_and_scalePID_d(N); })
345315
#endif
346316

347-
HOTEND_PID_EDIT_MENU_ITEMS(0);
348-
#if ENABLED(PID_PARAMS_PER_HOTEND)
349-
REPEAT_S(1, HOTENDS, HOTEND_PID_EDIT_MENU_ITEMS)
317+
#if ENABLED(PIDTEMP)
318+
#if ENABLED(PID_AUTOTUNE_MENU)
319+
#define HOTEND_PID_EDIT_MENU_ITEMS(N) \
320+
_HOTEND_PID_EDIT_MENU_ITEMS(N); \
321+
EDIT_ITEM_FAST_N(int3, N, MSG_PID_AUTOTUNE_E, &autotune_temp[N], 150, thermalManager.hotend_max_target(N), []{ _lcd_autotune(heater_id_t(MenuItemBase::itemIndex)); });
322+
#else
323+
#define HOTEND_PID_EDIT_MENU_ITEMS(N) _HOTEND_PID_EDIT_MENU_ITEMS(N);
324+
#endif
325+
326+
HOTEND_PID_EDIT_MENU_ITEMS(0);
327+
#if ENABLED(PID_PARAMS_PER_HOTEND)
328+
REPEAT_S(1, HOTENDS, HOTEND_PID_EDIT_MENU_ITEMS)
329+
#endif
350330
#endif
351331

352332
#if ENABLED(PIDTEMPBED)

0 commit comments

Comments
 (0)