|
@ -1109,7 +1109,7 @@ inline void sync_plan_position() { |
|
|
destination[Z_AXIS] = -10; |
|
|
destination[Z_AXIS] = -10; |
|
|
prepare_move_raw(); |
|
|
prepare_move_raw(); |
|
|
st_synchronize(); |
|
|
st_synchronize(); |
|
|
endstops_hit_on_purpose(); |
|
|
endstops_hit_on_purpose(); // clear endstop hit flags
|
|
|
|
|
|
|
|
|
// we have to let the planner know where we are right now as it is not where we said to go.
|
|
|
// we have to let the planner know where we are right now as it is not where we said to go.
|
|
|
long stop_steps = st_get_position(Z_AXIS); |
|
|
long stop_steps = st_get_position(Z_AXIS); |
|
@ -1135,7 +1135,7 @@ inline void sync_plan_position() { |
|
|
zPosition += home_retract_mm(Z_AXIS); |
|
|
zPosition += home_retract_mm(Z_AXIS); |
|
|
line_to_z(zPosition); |
|
|
line_to_z(zPosition); |
|
|
st_synchronize(); |
|
|
st_synchronize(); |
|
|
endstops_hit_on_purpose(); |
|
|
endstops_hit_on_purpose(); // clear endstop hit flags
|
|
|
|
|
|
|
|
|
// move back down slowly to find bed
|
|
|
// move back down slowly to find bed
|
|
|
if (homing_bump_divisor[Z_AXIS] >= 1) |
|
|
if (homing_bump_divisor[Z_AXIS] >= 1) |
|
@ -1148,7 +1148,7 @@ inline void sync_plan_position() { |
|
|
zPosition -= home_retract_mm(Z_AXIS) * 2; |
|
|
zPosition -= home_retract_mm(Z_AXIS) * 2; |
|
|
line_to_z(zPosition); |
|
|
line_to_z(zPosition); |
|
|
st_synchronize(); |
|
|
st_synchronize(); |
|
|
endstops_hit_on_purpose(); |
|
|
endstops_hit_on_purpose(); // clear endstop hit flags
|
|
|
|
|
|
|
|
|
current_position[Z_AXIS] = st_get_position_mm(Z_AXIS); |
|
|
current_position[Z_AXIS] = st_get_position_mm(Z_AXIS); |
|
|
// make sure the planner knows where we are as it may be a bit different than we last said to move to
|
|
|
// make sure the planner knows where we are as it may be a bit different than we last said to move to
|
|
@ -1435,13 +1435,17 @@ inline void sync_plan_position() { |
|
|
|
|
|
|
|
|
#endif // ENABLE_AUTO_BED_LEVELING
|
|
|
#endif // ENABLE_AUTO_BED_LEVELING
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Home an individual axis |
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
#define HOMEAXIS(LETTER) homeaxis(LETTER##_AXIS) |
|
|
|
|
|
|
|
|
static void homeaxis(int axis) { |
|
|
static void homeaxis(int axis) { |
|
|
#define HOMEAXIS_DO(LETTER) \ |
|
|
#define HOMEAXIS_DO(LETTER) \ |
|
|
((LETTER##_MIN_PIN > -1 && LETTER##_HOME_DIR==-1) || (LETTER##_MAX_PIN > -1 && LETTER##_HOME_DIR==1)) |
|
|
((LETTER##_MIN_PIN > -1 && LETTER##_HOME_DIR==-1) || (LETTER##_MAX_PIN > -1 && LETTER##_HOME_DIR==1)) |
|
|
|
|
|
|
|
|
if (axis == X_AXIS ? HOMEAXIS_DO(X) : |
|
|
if (axis == X_AXIS ? HOMEAXIS_DO(X) : axis == Y_AXIS ? HOMEAXIS_DO(Y) : axis == Z_AXIS ? HOMEAXIS_DO(Z) : 0) { |
|
|
axis == Y_AXIS ? HOMEAXIS_DO(Y) : |
|
|
|
|
|
axis == Z_AXIS ? HOMEAXIS_DO(Z) : 0) { |
|
|
|
|
|
|
|
|
|
|
|
int axis_home_dir; |
|
|
int axis_home_dir; |
|
|
|
|
|
|
|
@ -1451,108 +1455,112 @@ static void homeaxis(int axis) { |
|
|
axis_home_dir = home_dir(axis); |
|
|
axis_home_dir = home_dir(axis); |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
// Set the axis position as setup for the move
|
|
|
current_position[axis] = 0; |
|
|
current_position[axis] = 0; |
|
|
sync_plan_position(); |
|
|
sync_plan_position(); |
|
|
|
|
|
|
|
|
#ifndef Z_PROBE_SLED |
|
|
// Engage Servo endstop if enabled
|
|
|
// Engage Servo endstop if enabled
|
|
|
#ifdef SERVO_ENDSTOPS && !defined(Z_PROBE_SLED) |
|
|
#ifdef SERVO_ENDSTOPS |
|
|
|
|
|
#if SERVO_LEVELING |
|
|
|
|
|
if (axis == Z_AXIS) { |
|
|
|
|
|
engage_z_probe(); |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
#endif // SERVO_LEVELING
|
|
|
|
|
|
|
|
|
|
|
|
if (servo_endstops[axis] > -1) |
|
|
|
|
|
servos[servo_endstops[axis]].write(servo_endstop_angles[axis * 2]); |
|
|
|
|
|
|
|
|
|
|
|
#endif // SERVO_ENDSTOPS
|
|
|
#if SERVO_LEVELING |
|
|
|
|
|
if (axis == Z_AXIS) engage_z_probe(); else |
|
|
|
|
|
#endif |
|
|
|
|
|
{ |
|
|
|
|
|
if (servo_endstops[axis] > -1) |
|
|
|
|
|
servos[servo_endstops[axis]].write(servo_endstop_angles[axis * 2]); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
#endif // Z_PROBE_SLED
|
|
|
#endif // SERVO_ENDSTOPS && !Z_PROBE_SLED
|
|
|
|
|
|
|
|
|
#ifdef Z_DUAL_ENDSTOPS |
|
|
#ifdef Z_DUAL_ENDSTOPS |
|
|
if (axis == Z_AXIS) In_Homing_Process(true); |
|
|
if (axis == Z_AXIS) In_Homing_Process(true); |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
// Move towards the endstop until an endstop is triggered
|
|
|
destination[axis] = 1.5 * max_length(axis) * axis_home_dir; |
|
|
destination[axis] = 1.5 * max_length(axis) * axis_home_dir; |
|
|
feedrate = homing_feedrate[axis]; |
|
|
feedrate = homing_feedrate[axis]; |
|
|
line_to_destination(); |
|
|
line_to_destination(); |
|
|
st_synchronize(); |
|
|
st_synchronize(); |
|
|
|
|
|
|
|
|
|
|
|
// Set the axis position as setup for the move
|
|
|
current_position[axis] = 0; |
|
|
current_position[axis] = 0; |
|
|
sync_plan_position(); |
|
|
sync_plan_position(); |
|
|
|
|
|
|
|
|
|
|
|
// Move away from the endstop by the axis HOME_RETRACT_MM
|
|
|
destination[axis] = -home_retract_mm(axis) * axis_home_dir; |
|
|
destination[axis] = -home_retract_mm(axis) * axis_home_dir; |
|
|
line_to_destination(); |
|
|
line_to_destination(); |
|
|
st_synchronize(); |
|
|
st_synchronize(); |
|
|
|
|
|
|
|
|
destination[axis] = 2 * home_retract_mm(axis) * axis_home_dir; |
|
|
// Slow down the feedrate for the next move
|
|
|
|
|
|
|
|
|
if (homing_bump_divisor[axis] >= 1) |
|
|
if (homing_bump_divisor[axis] >= 1) |
|
|
feedrate = homing_feedrate[axis] / homing_bump_divisor[axis]; |
|
|
feedrate = homing_feedrate[axis] / homing_bump_divisor[axis]; |
|
|
else { |
|
|
else { |
|
|
feedrate = homing_feedrate[axis] / 10; |
|
|
feedrate = homing_feedrate[axis] / 10; |
|
|
SERIAL_ECHOLN("Warning: The Homing Bump Feedrate Divisor cannot be less than 1"); |
|
|
SERIAL_ECHOLNPGM("Warning: The Homing Bump Feedrate Divisor cannot be less than 1"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Move slowly towards the endstop until triggered
|
|
|
|
|
|
destination[axis] = 2 * home_retract_mm(axis) * axis_home_dir; |
|
|
line_to_destination(); |
|
|
line_to_destination(); |
|
|
st_synchronize(); |
|
|
st_synchronize(); |
|
|
|
|
|
|
|
|
#ifdef Z_DUAL_ENDSTOPS |
|
|
#ifdef Z_DUAL_ENDSTOPS |
|
|
if (axis==Z_AXIS) |
|
|
if (axis == Z_AXIS) { |
|
|
{ |
|
|
float adj = fabs(z_endstop_adj); |
|
|
feedrate = homing_feedrate[axis]; |
|
|
bool lockZ1; |
|
|
sync_plan_position(); |
|
|
if (axis_home_dir > 0) { |
|
|
if (axis_home_dir > 0) |
|
|
adj = -adj; |
|
|
{ |
|
|
lockZ1 = (z_endstop_adj > 0); |
|
|
destination[axis] = (-1) * fabs(z_endstop_adj); |
|
|
|
|
|
if (z_endstop_adj > 0) Lock_z_motor(true); else Lock_z2_motor(true); |
|
|
|
|
|
} else { |
|
|
|
|
|
destination[axis] = fabs(z_endstop_adj); |
|
|
|
|
|
if (z_endstop_adj < 0) Lock_z_motor(true); else Lock_z2_motor(true); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
lockZ1 = (z_endstop_adj < 0); |
|
|
|
|
|
|
|
|
|
|
|
if (lockZ1) Lock_z_motor(true); else Lock_z2_motor(true); |
|
|
|
|
|
sync_plan_position(); |
|
|
|
|
|
|
|
|
|
|
|
// Move to the adjusted endstop height
|
|
|
|
|
|
feedrate = homing_feedrate[axis]; |
|
|
|
|
|
destination[Z_AXIS] = adj; |
|
|
line_to_destination(); |
|
|
line_to_destination(); |
|
|
st_synchronize(); |
|
|
st_synchronize(); |
|
|
Lock_z_motor(false); |
|
|
|
|
|
Lock_z2_motor(false); |
|
|
if (lockZ1) Lock_z_motor(false); else Lock_z2_motor(false); |
|
|
In_Homing_Process(false); |
|
|
In_Homing_Process(false); |
|
|
|
|
|
} // Z_AXIS
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#ifdef DELTA |
|
|
|
|
|
// retrace by the amount specified in endstop_adj
|
|
|
|
|
|
if (endstop_adj[axis] * axis_home_dir < 0) { |
|
|
|
|
|
sync_plan_position(); |
|
|
|
|
|
destination[axis] = endstop_adj[axis]; |
|
|
|
|
|
line_to_destination(); |
|
|
|
|
|
st_synchronize(); |
|
|
} |
|
|
} |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
#ifdef DELTA |
|
|
// Set the axis position to its home position (plus home offsets)
|
|
|
// retrace by the amount specified in endstop_adj
|
|
|
|
|
|
if (endstop_adj[axis] * axis_home_dir < 0) { |
|
|
|
|
|
sync_plan_position(); |
|
|
|
|
|
destination[axis] = endstop_adj[axis]; |
|
|
|
|
|
line_to_destination(); |
|
|
|
|
|
st_synchronize(); |
|
|
|
|
|
} |
|
|
|
|
|
#endif |
|
|
|
|
|
axis_is_at_home(axis); |
|
|
axis_is_at_home(axis); |
|
|
|
|
|
|
|
|
destination[axis] = current_position[axis]; |
|
|
destination[axis] = current_position[axis]; |
|
|
feedrate = 0.0; |
|
|
feedrate = 0.0; |
|
|
endstops_hit_on_purpose(); |
|
|
endstops_hit_on_purpose(); // clear endstop hit flags
|
|
|
axis_known_position[axis] = true; |
|
|
axis_known_position[axis] = true; |
|
|
|
|
|
|
|
|
// Retract Servo endstop if enabled
|
|
|
// Retract Servo endstop if enabled
|
|
|
#ifdef SERVO_ENDSTOPS |
|
|
#ifdef SERVO_ENDSTOPS |
|
|
if (servo_endstops[axis] > -1) { |
|
|
if (servo_endstops[axis] > -1) |
|
|
servos[servo_endstops[axis]].write(servo_endstop_angles[axis * 2 + 1]); |
|
|
servos[servo_endstops[axis]].write(servo_endstop_angles[axis * 2 + 1]); |
|
|
} |
|
|
|
|
|
#endif |
|
|
#endif |
|
|
#if SERVO_LEVELING |
|
|
|
|
|
#ifndef Z_PROBE_SLED |
|
|
#if SERVO_LEVELING && !defined(Z_PROBE_SLED) |
|
|
if (axis==Z_AXIS) retract_z_probe(); |
|
|
if (axis == Z_AXIS) retract_z_probe(); |
|
|
#endif |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
#define HOMEAXIS(LETTER) homeaxis(LETTER##_AXIS) |
|
|
|
|
|
|
|
|
|
|
|
void refresh_cmd_timeout(void) |
|
|
void refresh_cmd_timeout(void) { previous_millis_cmd = millis(); } |
|
|
{ |
|
|
|
|
|
previous_millis_cmd = millis(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#ifdef FWRETRACT |
|
|
#ifdef FWRETRACT |
|
|
|
|
|
|
|
@ -1780,7 +1788,7 @@ inline void gcode_G28() { |
|
|
feedrate = 1.732 * homing_feedrate[X_AXIS]; |
|
|
feedrate = 1.732 * homing_feedrate[X_AXIS]; |
|
|
line_to_destination(); |
|
|
line_to_destination(); |
|
|
st_synchronize(); |
|
|
st_synchronize(); |
|
|
endstops_hit_on_purpose(); |
|
|
endstops_hit_on_purpose(); // clear endstop hit flags
|
|
|
|
|
|
|
|
|
// Destination reached
|
|
|
// Destination reached
|
|
|
for (int i = X_AXIS; i <= Z_AXIS; i++) current_position[i] = destination[i]; |
|
|
for (int i = X_AXIS; i <= Z_AXIS; i++) current_position[i] = destination[i]; |
|
@ -1798,7 +1806,7 @@ inline void gcode_G28() { |
|
|
homeY = code_seen(axis_codes[Y_AXIS]), |
|
|
homeY = code_seen(axis_codes[Y_AXIS]), |
|
|
homeZ = code_seen(axis_codes[Z_AXIS]); |
|
|
homeZ = code_seen(axis_codes[Z_AXIS]); |
|
|
|
|
|
|
|
|
home_all_axis = !homeX && !homeY && !homeZ; // No parameters means home all axes
|
|
|
home_all_axis = !(homeX || homeY || homeZ) || (homeX && homeY && homeZ); |
|
|
|
|
|
|
|
|
#if Z_HOME_DIR > 0 // If homing away from BED do Z first
|
|
|
#if Z_HOME_DIR > 0 // If homing away from BED do Z first
|
|
|
|
|
|
|
|
@ -1849,7 +1857,7 @@ inline void gcode_G28() { |
|
|
line_to_destination(); |
|
|
line_to_destination(); |
|
|
feedrate = 0.0; |
|
|
feedrate = 0.0; |
|
|
st_synchronize(); |
|
|
st_synchronize(); |
|
|
endstops_hit_on_purpose(); |
|
|
endstops_hit_on_purpose(); // clear endstop hit flags
|
|
|
|
|
|
|
|
|
current_position[X_AXIS] = destination[X_AXIS]; |
|
|
current_position[X_AXIS] = destination[X_AXIS]; |
|
|
current_position[Y_AXIS] = destination[Y_AXIS]; |
|
|
current_position[Y_AXIS] = destination[Y_AXIS]; |
|
@ -1857,6 +1865,7 @@ inline void gcode_G28() { |
|
|
current_position[Z_AXIS] = destination[Z_AXIS]; |
|
|
current_position[Z_AXIS] = destination[Z_AXIS]; |
|
|
#endif |
|
|
#endif |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#endif // QUICK_HOME
|
|
|
#endif // QUICK_HOME
|
|
|
|
|
|
|
|
|
// Home X
|
|
|
// Home X
|
|
@ -2005,7 +2014,7 @@ inline void gcode_G28() { |
|
|
feedrate = saved_feedrate; |
|
|
feedrate = saved_feedrate; |
|
|
feedmultiply = saved_feedmultiply; |
|
|
feedmultiply = saved_feedmultiply; |
|
|
previous_millis_cmd = millis(); |
|
|
previous_millis_cmd = millis(); |
|
|
endstops_hit_on_purpose(); |
|
|
endstops_hit_on_purpose(); // clear endstop hit flags
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#if defined(MESH_BED_LEVELING) || defined(ENABLE_AUTO_BED_LEVELING) |
|
|
#if defined(MESH_BED_LEVELING) || defined(ENABLE_AUTO_BED_LEVELING) |
|
|