diff --git a/Marlin/Conditionals.h b/Marlin/Conditionals.h
index b0a06195cd01c5978fb895a55d9f7809d3650aa8..1966f436febbd65be2f0ddc53fd7573e0401de4e 100644
--- a/Marlin/Conditionals.h
+++ b/Marlin/Conditionals.h
@@ -505,6 +505,12 @@
#define BED_USES_THERMISTOR
#endif
+ /**
+ * Flags for PID handling
+ */
+ #define HAS_PID_HEATING (ENABLED(PIDTEMP) || ENABLED(PIDTEMPBED))
+ #define HAS_PID_FOR_BOTH (ENABLED(PIDTEMP) && ENABLED(PIDTEMPBED))
+
/**
* ARRAY_BY_EXTRUDERS based on EXTRUDERS
*/
diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp
index 7b232e56bd0013b18120d2a4286c419b2941faf7..dabd7653219219b0b04f679605080fdab849a445 100644
--- a/Marlin/Marlin_main.cpp
+++ b/Marlin/Marlin_main.cpp
@@ -5559,7 +5559,7 @@ inline void gcode_M226() {
* U<bool> with a non-zero value will apply the result to current settings
*/
inline void gcode_M303() {
- #if ENABLED(PIDTEMP)
+ #if HAS_PID_HEATING
int e = code_seen('E') ? code_value_short() : 0;
int c = code_seen('C') ? code_value_short() : 5;
bool u = code_seen('U') && code_value_short() != 0;
diff --git a/Marlin/configuration_store.cpp b/Marlin/configuration_store.cpp
index 7d5a1b4d67a7ca94ac4826f1b0752e1296bd7c06..ced96e26023e71cea71b6892f56015a41e2fafab 100644
--- a/Marlin/configuration_store.cpp
+++ b/Marlin/configuration_store.cpp
@@ -794,7 +794,7 @@ void Config_PrintSettings(bool forReplay) {
SERIAL_EOL;
#endif // ULTIPANEL
- #if ENABLED(PIDTEMP) || ENABLED(PIDTEMPBED)
+ #if HAS_PID_HEATING
CONFIG_ECHO_START;
if (!forReplay) {
diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp
index bfbadc6cbe2c99d611077d59f6562e5f67254bcb..cb175efc8fe1b0de4904aff8c410ec4476414147 100644
--- a/Marlin/temperature.cpp
+++ b/Marlin/temperature.cpp
@@ -221,7 +221,7 @@ static void updateTemperaturesFromRawValues();
//================================ Functions ================================
//===========================================================================
-#if ENABLED(PIDTEMP)
+#if HAS_PID_HEATING
void PID_autotune(float temp, int extruder, int ncycles, bool set_result/*=false*/) {
float input = 0.0;
@@ -240,8 +240,13 @@ static void updateTemperaturesFromRawValues();
millis_t next_auto_fan_check_ms = temp_ms + 2500UL;
#endif
- if (extruder >= EXTRUDERS
- #if !HAS_TEMP_BED
+ if (false
+ #if ENABLED(PIDTEMP)
+ || extruder >= EXTRUDERS
+ #else
+ || extruder >= 0
+ #endif
+ #if DISABLED(PIDTEMPBED)
|| extruder < 0
#endif
) {
@@ -253,10 +258,16 @@ static void updateTemperaturesFromRawValues();
disable_all_heaters(); // switch off all heaters.
- if (extruder < 0)
- soft_pwm_bed = bias = d = (MAX_BED_POWER) / 2;
- else
+ #if HAS_PID_FOR_BOTH
+ if (extruder < 0)
+ soft_pwm_bed = bias = d = (MAX_BED_POWER) / 2;
+ else
+ soft_pwm[extruder] = bias = d = (PID_MAX) / 2;
+ #elif ENABLED(PIDTEMP)
soft_pwm[extruder] = bias = d = (PID_MAX) / 2;
+ #else
+ soft_pwm_bed = bias = d = (MAX_BED_POWER) / 2;
+ #endif
// PID Tuning loop
for (;;) {
@@ -266,7 +277,15 @@ static void updateTemperaturesFromRawValues();
if (temp_meas_ready) { // temp sample ready
updateTemperaturesFromRawValues();
- input = (extruder < 0) ? current_temperature_bed : current_temperature[extruder];
+ input =
+ #if HAS_PID_FOR_BOTH
+ extruder < 0 ? current_temperature_bed : current_temperature[extruder]
+ #elif ENABLED(PIDTEMP)
+ current_temperature[extruder]
+ #else
+ current_temperature_bed
+ #endif
+ ;
max = max(max, input);
min = min(min, input);
@@ -281,10 +300,16 @@ static void updateTemperaturesFromRawValues();
if (heating && input > temp) {
if (ELAPSED(ms, t2 + 5000UL)) {
heating = false;
- if (extruder < 0)
- soft_pwm_bed = (bias - d) >> 1;
- else
+ #if HAS_PID_FOR_BOTH
+ if (extruder < 0)
+ soft_pwm_bed = (bias - d) >> 1;
+ else
+ soft_pwm[extruder] = (bias - d) >> 1;
+ #elif ENABLED(PIDTEMP)
soft_pwm[extruder] = (bias - d) >> 1;
+ #elif ENABLED(PIDTEMPBED)
+ soft_pwm_bed = (bias - d) >> 1;
+ #endif
t1 = ms;
t_high = t1 - t2;
max = temp;
@@ -297,7 +322,15 @@ static void updateTemperaturesFromRawValues();
t2 = ms;
t_low = t2 - t1;
if (cycles > 0) {
- long max_pow = extruder < 0 ? MAX_BED_POWER : PID_MAX;
+ long max_pow =
+ #if HAS_PID_FOR_BOTH
+ extruder < 0 ? MAX_BED_POWER : PID_MAX
+ #elif ENABLED(PIDTEMP)
+ PID_MAX
+ #else
+ MAX_BED_POWER
+ #endif
+ ;
bias += (d * (t_high - t_low)) / (t_low + t_high);
bias = constrain(bias, 20, max_pow - 20);
d = (bias > max_pow / 2) ? max_pow - 1 - bias : bias;
@@ -336,10 +369,16 @@ static void updateTemperaturesFromRawValues();
*/
}
}
- if (extruder < 0)
- soft_pwm_bed = (bias + d) >> 1;
- else
+ #if HAS_PID_FOR_BOTH
+ if (extruder < 0)
+ soft_pwm_bed = (bias + d) >> 1;
+ else
+ soft_pwm[extruder] = (bias + d) >> 1;
+ #elif ENABLED(PIDTEMP)
soft_pwm[extruder] = (bias + d) >> 1;
+ #else
+ soft_pwm_bed = (bias + d) >> 1;
+ #endif
cycles++;
min = temp;
}
@@ -366,27 +405,48 @@ static void updateTemperaturesFromRawValues();
}
if (cycles > ncycles) {
SERIAL_PROTOCOLLNPGM(MSG_PID_AUTOTUNE_FINISHED);
- const char* estring = extruder < 0 ? "bed" : "";
- SERIAL_PROTOCOLPGM("#define DEFAULT_"); SERIAL_PROTOCOL(estring); SERIAL_PROTOCOLPGM("Kp "); SERIAL_PROTOCOLLN(workKp);
- SERIAL_PROTOCOLPGM("#define DEFAULT_"); SERIAL_PROTOCOL(estring); SERIAL_PROTOCOLPGM("Ki "); SERIAL_PROTOCOLLN(workKi);
- SERIAL_PROTOCOLPGM("#define DEFAULT_"); SERIAL_PROTOCOL(estring); SERIAL_PROTOCOLPGM("Kd "); SERIAL_PROTOCOLLN(workKd);
+
+ #if HAS_PID_FOR_BOTH
+ const char* estring = extruder < 0 ? "bed" : "";
+ SERIAL_PROTOCOLPGM("#define DEFAULT_"); SERIAL_PROTOCOL(estring); SERIAL_PROTOCOLPGM("Kp "); SERIAL_PROTOCOLLN(workKp);
+ SERIAL_PROTOCOLPGM("#define DEFAULT_"); SERIAL_PROTOCOL(estring); SERIAL_PROTOCOLPGM("Ki "); SERIAL_PROTOCOLLN(workKi);
+ SERIAL_PROTOCOLPGM("#define DEFAULT_"); SERIAL_PROTOCOL(estring); SERIAL_PROTOCOLPGM("Kd "); SERIAL_PROTOCOLLN(workKd);
+ #elif ENABLED(PIDTEMP)
+ SERIAL_PROTOCOLPGM("#define DEFAULT_Kp "); SERIAL_PROTOCOLLN(workKp);
+ SERIAL_PROTOCOLPGM("#define DEFAULT_Ki "); SERIAL_PROTOCOLLN(workKi);
+ SERIAL_PROTOCOLPGM("#define DEFAULT_Kd "); SERIAL_PROTOCOLLN(workKd);
+ #else
+ SERIAL_PROTOCOLPGM("#define DEFAULT_bedKp "); SERIAL_PROTOCOLLN(workKp);
+ SERIAL_PROTOCOLPGM("#define DEFAULT_bedKi "); SERIAL_PROTOCOLLN(workKi);
+ SERIAL_PROTOCOLPGM("#define DEFAULT_bedKd "); SERIAL_PROTOCOLLN(workKd);
+ #endif
+
+ #define _SET_BED_PID() \
+ bedKp = workKp; \
+ bedKi = scalePID_i(workKi); \
+ bedKd = scalePID_d(workKd); \
+ updatePID()
+
+ #define _SET_EXTRUDER_PID() \
+ PID_PARAM(Kp, extruder) = workKp; \
+ PID_PARAM(Ki, extruder) = scalePID_i(workKi); \
+ PID_PARAM(Kd, extruder) = scalePID_d(workKd); \
+ updatePID()
// Use the result? (As with "M303 U1")
if (set_result) {
- if (extruder < 0) {
- #if ENABLED(PIDTEMPBED)
- bedKp = workKp;
- bedKi = scalePID_i(workKi);
- bedKd = scalePID_d(workKd);
- updatePID();
- #endif
- }
- else {
- PID_PARAM(Kp, extruder) = workKp;
- PID_PARAM(Ki, extruder) = scalePID_i(workKi);
- PID_PARAM(Kd, extruder) = scalePID_d(workKd);
- updatePID();
- }
+ #if HAS_PID_FOR_BOTH
+ if (extruder < 0) {
+ _SET_BED_PID();
+ }
+ else {
+ _SET_EXTRUDER_PID();
+ }
+ #elif ENABLED(PIDTEMP)
+ _SET_EXTRUDER_PID();
+ #else
+ _SET_BED_PID();
+ #endif
}
return;
}
diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp
index a8296c0db6d641650e1d4b0d345435ee75e11895..cb9e717fbc8e6c40b070dea3501e96e0fed67c60 100644
--- a/Marlin/ultralcd.cpp
+++ b/Marlin/ultralcd.cpp
@@ -1343,7 +1343,7 @@ static void lcd_control_menu() {
static void _lcd_autotune(int e) {
char cmd[30];
sprintf_P(cmd, PSTR("M303 U1 E%d S%d"), e,
- #if ENABLED(PIDTEMP) && ENABLED(PIDTEMPBED)
+ #if HAS_PID_FOR_BOTH
e < 0 ? autotune_temp_bed : autotune_temp[e]
#elif ENABLED(PIDTEMPBED)
autotune_temp_bed