Improve MMU toolchange when E-cool mode is enabled
Currently we are queuing many small 2 mm E-moves until the filament sensor triggers. We do this because we never abort any queued moves, so making small 2 mm moves ensures we do not move the E-motor more than 2 mm past the filament sensor. Unfortunately, when E-cool mode is enabled, the E-motor will create audible clicking sounds (similar one hears during jam or a loose grub screw). A workaround for this is to queue one or more very long moves. Where very long is something of the order of hundreds of millimeters. I have it set to 350 mm but it's just a random constant really. Keep in mind the firmware will block too large E-moves, if I recall correctly it was anything above > 450 mm (see PREVENT_LENGTHY_EXTRUDE) In order to use very long moves, we must somehow stop the E-motor from moving once the filament sensor triggers. In other words, throw away what's left of the current E-motor move. For this simple purpose we can use planner_abort_hard() but we must set planner_aborted to false afterwards because the code architecture does not allow the main loop() to run until the Toolchange command is done processing. Change in memory: Flash: +18 bytes SRAM: 0 bytes
This commit is contained in:
parent
6dbf35f6e6
commit
6bdc3c5cfb
|
|
@ -922,10 +922,12 @@ void MMU2::ReportError(ErrorCode ec, ErrorSource res) {
|
||||||
switch (logic.Progress()) {
|
switch (logic.Progress()) {
|
||||||
case ProgressCode::UnloadingToFinda:
|
case ProgressCode::UnloadingToFinda:
|
||||||
unloadFilamentStarted = false;
|
unloadFilamentStarted = false;
|
||||||
|
planner_abort_queued_moves(); // Abort excess E-moves to be safe
|
||||||
break;
|
break;
|
||||||
case ProgressCode::FeedingToFSensor:
|
case ProgressCode::FeedingToFSensor:
|
||||||
// FSENSOR error during load. Make sure E-motor stops moving.
|
// FSENSOR error during load. Make sure E-motor stops moving.
|
||||||
loadFilamentStarted = false;
|
loadFilamentStarted = false;
|
||||||
|
planner_abort_queued_moves(); // Abort excess E-moves to be safe
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
@ -1040,6 +1042,10 @@ void MMU2::OnMMUProgressMsgSame(ProgressCode pc) {
|
||||||
case FilamentState::AT_FSENSOR:
|
case FilamentState::AT_FSENSOR:
|
||||||
// fsensor triggered, finish FeedingToExtruder state
|
// fsensor triggered, finish FeedingToExtruder state
|
||||||
loadFilamentStarted = false;
|
loadFilamentStarted = false;
|
||||||
|
|
||||||
|
// Abort any excess E-move from the planner queue
|
||||||
|
planner_abort_queued_moves();
|
||||||
|
|
||||||
// After the MMU knows the FSENSOR is triggered it will:
|
// After the MMU knows the FSENSOR is triggered it will:
|
||||||
// 1. Push the filament by additional 30mm (see fsensorToNozzle)
|
// 1. Push the filament by additional 30mm (see fsensorToNozzle)
|
||||||
// 2. Disengage the idler and push another 2mm.
|
// 2. Disengage the idler and push another 2mm.
|
||||||
|
|
@ -1048,7 +1054,7 @@ void MMU2::OnMMUProgressMsgSame(ProgressCode pc) {
|
||||||
case FilamentState::NOT_PRESENT:
|
case FilamentState::NOT_PRESENT:
|
||||||
// fsensor not triggered, continue moving extruder
|
// fsensor not triggered, continue moving extruder
|
||||||
if (!planner_any_moves()) { // Only plan a move if there is no move ongoing
|
if (!planner_any_moves()) { // Only plan a move if there is no move ongoing
|
||||||
MoveE(2.0f, MMU2_LOAD_TO_NOZZLE_FEED_RATE);
|
MoveE(350.0f, MMU2_LOAD_TO_NOZZLE_FEED_RATE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ void MoveE(float delta, float feedRate);
|
||||||
|
|
||||||
float MoveRaiseZ(float delta);
|
float MoveRaiseZ(float delta);
|
||||||
|
|
||||||
|
void planner_abort_queued_moves();
|
||||||
void planner_synchronize();
|
void planner_synchronize();
|
||||||
bool planner_any_moves();
|
bool planner_any_moves();
|
||||||
float planner_get_machine_position_E_mm();
|
float planner_get_machine_position_E_mm();
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,11 @@ float MoveRaiseZ(float delta) {
|
||||||
return raise_z(delta);
|
return raise_z(delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void planner_abort_queued_moves() {
|
||||||
|
planner_abort_hard();
|
||||||
|
planner_aborted = false;
|
||||||
|
}
|
||||||
|
|
||||||
void planner_synchronize() {
|
void planner_synchronize() {
|
||||||
st_synchronize();
|
st_synchronize();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue