Skip to content

Commit b99a26d

Browse files
🐛 Fix Dual Servo Toolchange Z Creep (#27381)
1 parent 6528109 commit b99a26d

File tree

1 file changed

+11
-11
lines changed

1 file changed

+11
-11
lines changed

Marlin/src/module/tool_change.cpp

+11-11
Original file line numberDiff line numberDiff line change
@@ -1225,8 +1225,6 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
12251225
}
12261226
#endif
12271227

1228-
TERN_(SWITCHING_NOZZLE_TWO_SERVOS, raise_nozzle(old_tool));
1229-
12301228
REMEMBER(fr, feedrate_mm_s, XY_PROBE_FEEDRATE_MM_S);
12311229

12321230
#if HAS_SOFTWARE_ENDSTOPS
@@ -1290,20 +1288,23 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
12901288
magnetic_switching_toolhead_tool_change(new_tool, no_move);
12911289
#elif ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) // Magnetic Switching ToolChanger
12921290
em_switching_toolhead_tool_change(new_tool, no_move);
1293-
#elif ENABLED(SWITCHING_NOZZLE) && !SWITCHING_NOZZLE_TWO_SERVOS // Switching Nozzle (single servo)
1291+
#elif ENABLED(SWITCHING_NOZZLE) // Switching Nozzle
12941292
// Raise by a configured distance to avoid workpiece, except with
12951293
// SWITCHING_NOZZLE_TWO_SERVOS, as both nozzles will lift instead.
1294+
TERN_(SWITCHING_NOZZLE_TWO_SERVOS, raise_nozzle(old_tool));
12961295
if (!no_move) {
12971296
const float newz = current_position.z + _MAX(-diff.z, 0.0);
1298-
12991297
// Check if Z has space to compensate at least z_offset, and if not, just abort now
13001298
const float maxz = _MIN(TERN(HAS_SOFTWARE_ENDSTOPS, soft_endstop.max.z, Z_MAX_POS), Z_MAX_POS);
13011299
if (newz > maxz) return;
1302-
13031300
current_position.z = _MIN(newz + toolchange_settings.z_raise, maxz);
13041301
fast_line_to_current(Z_AXIS);
13051302
}
1306-
move_nozzle_servo(new_tool);
1303+
#if SWITCHING_NOZZLE_TWO_SERVOS // Switching Nozzle with two servos
1304+
lower_nozzle(new_tool);
1305+
#else
1306+
move_nozzle_servo(new_tool);
1307+
#endif
13071308
#elif ANY(MECHANICAL_SWITCHING_EXTRUDER, MECHANICAL_SWITCHING_NOZZLE)
13081309
if (!no_move) {
13091310
current_position.z = _MIN(current_position.z + toolchange_settings.z_raise, _MIN(TERN(HAS_SOFTWARE_ENDSTOPS, soft_endstop.max.z, Z_MAX_POS), Z_MAX_POS));
@@ -1372,7 +1373,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
13721373
#if ENABLED(TOOLCHANGE_PARK)
13731374
if (toolchange_settings.enable_park) do_blocking_move_to_xy_z(destination, destination.z, MMM_TO_MMS(TOOLCHANGE_PARK_XY_FEEDRATE));
13741375
#else
1375-
do_blocking_move_to_xy(destination, planner.settings.max_feedrate_mm_s[X_AXIS]);
1376+
do_blocking_move_to_xy(destination, planner.settings.max_feedrate_mm_s[X_AXIS]* 0.5f);
13761377

13771378
// If using MECHANICAL_SWITCHING extruder/nozzle, set HOTEND_OFFSET in Z axis after running EVENT_GCODE_TOOLCHANGE below.
13781379
#if NONE(MECHANICAL_SWITCHING_EXTRUDER, MECHANICAL_SWITCHING_NOZZLE)
@@ -1405,16 +1406,14 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
14051406
#endif
14061407

14071408
TERN_(DUAL_X_CARRIAGE, idex_set_parked(false));
1408-
}
1409+
} // should_move
14091410

14101411
#if HAS_SWITCHING_NOZZLE
14111412
// Move back down. (Including when the new tool is higher.)
14121413
if (!should_move)
14131414
do_blocking_move_to_z(destination.z, planner.settings.max_feedrate_mm_s[Z_AXIS]);
14141415
#endif
14151416

1416-
TERN_(SWITCHING_NOZZLE_TWO_SERVOS, lower_nozzle(new_tool));
1417-
14181417
} // (new_tool != old_tool)
14191418

14201419
planner.synchronize();
@@ -1510,7 +1509,8 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
15101509
if (TERN1(DUAL_X_CARRIAGE, dual_x_carriage_mode == DXC_AUTO_PARK_MODE))
15111510
gcode.process_subcommands_now(F(EVENT_GCODE_AFTER_TOOLCHANGE));
15121511
#endif
1513-
}
1512+
1513+
} // !no_move
15141514

15151515
SERIAL_ECHOLNPGM(STR_ACTIVE_EXTRUDER, active_extruder);
15161516

0 commit comments

Comments
 (0)