|
|
@ -307,7 +307,7 @@ static uint8_t cmd_queue_index_r = 0,
|
|
|
|
* Feed rates are often configured with mm/m
|
|
|
|
* Feed rates are often configured with mm/m
|
|
|
|
* but the planner and stepper like mm/s units.
|
|
|
|
* but the planner and stepper like mm/s units.
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
const float homing_feedrate_mm_s[] = {
|
|
|
|
float constexpr homing_feedrate_mm_s[] = {
|
|
|
|
#if ENABLED(DELTA)
|
|
|
|
#if ENABLED(DELTA)
|
|
|
|
MMM_TO_MMS(HOMING_FEEDRATE_Z), MMM_TO_MMS(HOMING_FEEDRATE_Z),
|
|
|
|
MMM_TO_MMS(HOMING_FEEDRATE_Z), MMM_TO_MMS(HOMING_FEEDRATE_Z),
|
|
|
|
#else
|
|
|
|
#else
|
|
|
@ -1368,6 +1368,9 @@ static void set_axis_is_at_home(AxisEnum axis) {
|
|
|
|
|
|
|
|
|
|
|
|
#if ENABLED(MORGAN_SCARA)
|
|
|
|
#if ENABLED(MORGAN_SCARA)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Morgan SCARA homes XY at the same time
|
|
|
|
|
|
|
|
*/
|
|
|
|
if (axis == X_AXIS || axis == Y_AXIS) {
|
|
|
|
if (axis == X_AXIS || axis == Y_AXIS) {
|
|
|
|
|
|
|
|
|
|
|
|
float homeposition[XYZ];
|
|
|
|
float homeposition[XYZ];
|
|
|
@ -1399,34 +1402,37 @@ static void set_axis_is_at_home(AxisEnum axis) {
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
{
|
|
|
|
current_position[axis] = LOGICAL_POSITION(base_home_pos(axis), axis);
|
|
|
|
current_position[axis] = LOGICAL_POSITION(base_home_pos(axis), axis);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (axis == Z_AXIS) {
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Z Probe Z Homing? Account for the probe's Z offset.
|
|
|
|
|
|
|
|
*/
|
|
|
|
#if HAS_BED_PROBE && Z_HOME_DIR < 0
|
|
|
|
#if HAS_BED_PROBE && Z_HOME_DIR < 0
|
|
|
|
|
|
|
|
if (axis == Z_AXIS) {
|
|
|
|
#if HOMING_Z_WITH_PROBE
|
|
|
|
#if HOMING_Z_WITH_PROBE
|
|
|
|
|
|
|
|
|
|
|
|
current_position[Z_AXIS] -= zprobe_zoffset;
|
|
|
|
current_position[Z_AXIS] -= zprobe_zoffset;
|
|
|
|
|
|
|
|
|
|
|
|
#if ENABLED(DEBUG_LEVELING_FEATURE)
|
|
|
|
#if ENABLED(DEBUG_LEVELING_FEATURE)
|
|
|
|
if (DEBUGGING(LEVELING)) {
|
|
|
|
if (DEBUGGING(LEVELING)) {
|
|
|
|
SERIAL_ECHOLNPGM("*** Z HOMED WITH PROBE (Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) ***");
|
|
|
|
SERIAL_ECHOLNPGM("*** Z HOMED WITH PROBE (Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) ***");
|
|
|
|
SERIAL_ECHOLNPAIR("> zprobe_zoffset = ", zprobe_zoffset);
|
|
|
|
SERIAL_ECHOLNPAIR("> zprobe_zoffset = ", zprobe_zoffset);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#elif ENABLED(DEBUG_LEVELING_FEATURE)
|
|
|
|
#elif ENABLED(DEBUG_LEVELING_FEATURE)
|
|
|
|
if (DEBUGGING(LEVELING))
|
|
|
|
|
|
|
|
SERIAL_ECHOLNPGM("*** Z HOMED TO ENDSTOP (Z_MIN_PROBE_ENDSTOP) ***");
|
|
|
|
if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("*** Z HOMED TO ENDSTOP (Z_MIN_PROBE_ENDSTOP) ***");
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if ENABLED(DEBUG_LEVELING_FEATURE)
|
|
|
|
#if ENABLED(DEBUG_LEVELING_FEATURE)
|
|
|
|
if (DEBUGGING(LEVELING)) {
|
|
|
|
if (DEBUGGING(LEVELING)) {
|
|
|
|
SERIAL_ECHOPAIR("> home_offset[", axis_codes[axis]);
|
|
|
|
SERIAL_ECHOPAIR("> home_offset[", axis_codes[axis]);
|
|
|
|
SERIAL_ECHOLNPAIR("] = ", home_offset[axis]);
|
|
|
|
SERIAL_ECHOLNPAIR("] = ", home_offset[axis]);
|
|
|
|
DEBUG_POS("", current_position);
|
|
|
|
DEBUG_POS("", current_position);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#if ENABLED(DEBUG_LEVELING_FEATURE)
|
|
|
|
|
|
|
|
if (DEBUGGING(LEVELING)) {
|
|
|
|
|
|
|
|
SERIAL_ECHOPAIR("<<< set_axis_is_at_home(", axis_codes[axis]);
|
|
|
|
SERIAL_ECHOPAIR("<<< set_axis_is_at_home(", axis_codes[axis]);
|
|
|
|
SERIAL_ECHOLNPGM(")");
|
|
|
|
SERIAL_ECHOLNPGM(")");
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -1437,7 +1443,7 @@ static void set_axis_is_at_home(AxisEnum axis) {
|
|
|
|
* Some planner shorthand inline functions
|
|
|
|
* Some planner shorthand inline functions
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
inline float get_homing_bump_feedrate(AxisEnum axis) {
|
|
|
|
inline float get_homing_bump_feedrate(AxisEnum axis) {
|
|
|
|
const int homing_bump_divisor[] = HOMING_BUMP_DIVISOR;
|
|
|
|
int constexpr homing_bump_divisor[] = HOMING_BUMP_DIVISOR;
|
|
|
|
int hbd = homing_bump_divisor[axis];
|
|
|
|
int hbd = homing_bump_divisor[axis];
|
|
|
|
if (hbd < 1) {
|
|
|
|
if (hbd < 1) {
|
|
|
|
hbd = 10;
|
|
|
|
hbd = 10;
|
|
|
@ -1475,13 +1481,13 @@ inline void set_destination_to_current() { memcpy(destination, current_position,
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Calculate delta, start a line, and set current_position to destination
|
|
|
|
* Calculate delta, start a line, and set current_position to destination
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
void prepare_uninterpolated_move_to_destination() {
|
|
|
|
void prepare_uninterpolated_move_to_destination(const float fr_mm_s=0.0) {
|
|
|
|
#if ENABLED(DEBUG_LEVELING_FEATURE)
|
|
|
|
#if ENABLED(DEBUG_LEVELING_FEATURE)
|
|
|
|
if (DEBUGGING(LEVELING)) DEBUG_POS("prepare_uninterpolated_move_to_destination", destination);
|
|
|
|
if (DEBUGGING(LEVELING)) DEBUG_POS("prepare_uninterpolated_move_to_destination", destination);
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
refresh_cmd_timeout();
|
|
|
|
refresh_cmd_timeout();
|
|
|
|
inverse_kinematics(destination);
|
|
|
|
inverse_kinematics(destination);
|
|
|
|
planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], destination[E_AXIS], MMS_SCALED(feedrate_mm_s), active_extruder);
|
|
|
|
planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], destination[E_AXIS], MMS_SCALED(fr_mm_s ? fr_mm_s : feedrate_mm_s), active_extruder);
|
|
|
|
set_current_to_destination();
|
|
|
|
set_current_to_destination();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
@ -1499,7 +1505,7 @@ void do_blocking_move_to(const float &x, const float &y, const float &z, const f
|
|
|
|
|
|
|
|
|
|
|
|
#if ENABLED(DELTA)
|
|
|
|
#if ENABLED(DELTA)
|
|
|
|
|
|
|
|
|
|
|
|
feedrate_mm_s = (fr_mm_s != 0.0) ? fr_mm_s : XY_PROBE_FEEDRATE_MM_S;
|
|
|
|
feedrate_mm_s = fr_mm_s ? fr_mm_s : XY_PROBE_FEEDRATE_MM_S;
|
|
|
|
|
|
|
|
|
|
|
|
set_destination_to_current(); // sync destination at the start
|
|
|
|
set_destination_to_current(); // sync destination at the start
|
|
|
|
|
|
|
|
|
|
|
@ -1561,41 +1567,37 @@ void do_blocking_move_to(const float &x, const float &y, const float &z, const f
|
|
|
|
|
|
|
|
|
|
|
|
// If Z needs to raise, do it before moving XY
|
|
|
|
// If Z needs to raise, do it before moving XY
|
|
|
|
if (current_position[Z_AXIS] < z) {
|
|
|
|
if (current_position[Z_AXIS] < z) {
|
|
|
|
feedrate_mm_s = (fr_mm_s != 0.0) ? fr_mm_s : homing_feedrate_mm_s[Z_AXIS];
|
|
|
|
|
|
|
|
destination[Z_AXIS] = z;
|
|
|
|
destination[Z_AXIS] = z;
|
|
|
|
prepare_uninterpolated_move_to_destination();
|
|
|
|
prepare_uninterpolated_move_to_destination(fr_mm_s ? fr_mm_s : homing_feedrate_mm_s[Z_AXIS]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
feedrate_mm_s = (fr_mm_s != 0.0) ? fr_mm_s : XY_PROBE_FEEDRATE_MM_S;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
destination[X_AXIS] = x;
|
|
|
|
destination[X_AXIS] = x;
|
|
|
|
destination[Y_AXIS] = y;
|
|
|
|
destination[Y_AXIS] = y;
|
|
|
|
prepare_uninterpolated_move_to_destination();
|
|
|
|
prepare_uninterpolated_move_to_destination(fr_mm_s ? fr_mm_s : XY_PROBE_FEEDRATE_MM_S);
|
|
|
|
|
|
|
|
|
|
|
|
// If Z needs to lower, do it after moving XY
|
|
|
|
// If Z needs to lower, do it after moving XY
|
|
|
|
if (current_position[Z_AXIS] > z) {
|
|
|
|
if (current_position[Z_AXIS] > z) {
|
|
|
|
feedrate_mm_s = (fr_mm_s != 0.0) ? fr_mm_s : homing_feedrate_mm_s[Z_AXIS];
|
|
|
|
|
|
|
|
destination[Z_AXIS] = z;
|
|
|
|
destination[Z_AXIS] = z;
|
|
|
|
prepare_uninterpolated_move_to_destination();
|
|
|
|
prepare_uninterpolated_move_to_destination(fr_mm_s ? fr_mm_s : homing_feedrate_mm_s[Z_AXIS]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
#else
|
|
|
|
|
|
|
|
|
|
|
|
// If Z needs to raise, do it before moving XY
|
|
|
|
// If Z needs to raise, do it before moving XY
|
|
|
|
if (current_position[Z_AXIS] < z) {
|
|
|
|
if (current_position[Z_AXIS] < z) {
|
|
|
|
feedrate_mm_s = (fr_mm_s != 0.0) ? fr_mm_s : homing_feedrate_mm_s[Z_AXIS];
|
|
|
|
feedrate_mm_s = fr_mm_s ? fr_mm_s : homing_feedrate_mm_s[Z_AXIS];
|
|
|
|
current_position[Z_AXIS] = z;
|
|
|
|
current_position[Z_AXIS] = z;
|
|
|
|
line_to_current_position();
|
|
|
|
line_to_current_position();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
feedrate_mm_s = (fr_mm_s != 0.0) ? fr_mm_s : XY_PROBE_FEEDRATE_MM_S;
|
|
|
|
feedrate_mm_s = fr_mm_s ? fr_mm_s : XY_PROBE_FEEDRATE_MM_S;
|
|
|
|
current_position[X_AXIS] = x;
|
|
|
|
current_position[X_AXIS] = x;
|
|
|
|
current_position[Y_AXIS] = y;
|
|
|
|
current_position[Y_AXIS] = y;
|
|
|
|
line_to_current_position();
|
|
|
|
line_to_current_position();
|
|
|
|
|
|
|
|
|
|
|
|
// If Z needs to lower, do it after moving XY
|
|
|
|
// If Z needs to lower, do it after moving XY
|
|
|
|
if (current_position[Z_AXIS] > z) {
|
|
|
|
if (current_position[Z_AXIS] > z) {
|
|
|
|
feedrate_mm_s = (fr_mm_s != 0.0) ? fr_mm_s : homing_feedrate_mm_s[Z_AXIS];
|
|
|
|
feedrate_mm_s = fr_mm_s ? fr_mm_s : homing_feedrate_mm_s[Z_AXIS];
|
|
|
|
current_position[Z_AXIS] = z;
|
|
|
|
current_position[Z_AXIS] = z;
|
|
|
|
line_to_current_position();
|
|
|
|
line_to_current_position();
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -2221,7 +2223,7 @@ static void clean_up_after_endstop_or_probe_move() {
|
|
|
|
* Home an individual linear axis
|
|
|
|
* Home an individual linear axis
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
static void do_homing_move(AxisEnum axis, float where, float fr_mm_s = 0.0) {
|
|
|
|
static void do_homing_move(AxisEnum axis, float where, float fr_mm_s=0.0) {
|
|
|
|
|
|
|
|
|
|
|
|
#if HOMING_Z_WITH_PROBE && ENABLED(BLTOUCH)
|
|
|
|
#if HOMING_Z_WITH_PROBE && ENABLED(BLTOUCH)
|
|
|
|
if (axis == Z_AXIS) set_bltouch_deployed(true);
|
|
|
|
if (axis == Z_AXIS) set_bltouch_deployed(true);
|
|
|
@ -2230,7 +2232,7 @@ static void do_homing_move(AxisEnum axis, float where, float fr_mm_s = 0.0) {
|
|
|
|
current_position[axis] = 0;
|
|
|
|
current_position[axis] = 0;
|
|
|
|
sync_plan_position();
|
|
|
|
sync_plan_position();
|
|
|
|
current_position[axis] = where;
|
|
|
|
current_position[axis] = where;
|
|
|
|
planner.buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], (fr_mm_s != 0.0) ? fr_mm_s : homing_feedrate_mm_s[axis], active_extruder);
|
|
|
|
planner.buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], fr_mm_s ? fr_mm_s : homing_feedrate_mm_s[axis], active_extruder);
|
|
|
|
stepper.synchronize();
|
|
|
|
stepper.synchronize();
|
|
|
|
|
|
|
|
|
|
|
|
#if HOMING_Z_WITH_PROBE && ENABLED(BLTOUCH)
|
|
|
|
#if HOMING_Z_WITH_PROBE && ENABLED(BLTOUCH)
|
|
|
@ -2287,23 +2289,13 @@ static void homeaxis(AxisEnum axis) {
|
|
|
|
if (axis == Z_AXIS) stepper.set_homing_flag(true);
|
|
|
|
if (axis == Z_AXIS) stepper.set_homing_flag(true);
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
// Move towards the endstop until an endstop is triggered
|
|
|
|
// 1. Fast move towards endstop until triggered
|
|
|
|
|
|
|
|
// 2. Move away from the endstop by the axis HOME_BUMP_MM
|
|
|
|
|
|
|
|
// 3. Slow move towards endstop until triggered
|
|
|
|
do_homing_move(axis, 1.5 * max_length(axis) * axis_home_dir);
|
|
|
|
do_homing_move(axis, 1.5 * max_length(axis) * axis_home_dir);
|
|
|
|
|
|
|
|
|
|
|
|
#if ENABLED(DEBUG_LEVELING_FEATURE)
|
|
|
|
|
|
|
|
if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPAIR("> 1st Home ", current_position[axis]);
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Move away from the endstop by the axis HOME_BUMP_MM
|
|
|
|
|
|
|
|
do_homing_move(axis, -home_bump_mm(axis) * axis_home_dir);
|
|
|
|
do_homing_move(axis, -home_bump_mm(axis) * axis_home_dir);
|
|
|
|
|
|
|
|
|
|
|
|
// Move slowly towards the endstop until triggered
|
|
|
|
|
|
|
|
do_homing_move(axis, 2 * home_bump_mm(axis) * axis_home_dir, get_homing_bump_feedrate(axis));
|
|
|
|
do_homing_move(axis, 2 * home_bump_mm(axis) * axis_home_dir, get_homing_bump_feedrate(axis));
|
|
|
|
|
|
|
|
|
|
|
|
#if ENABLED(DEBUG_LEVELING_FEATURE)
|
|
|
|
|
|
|
|
if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPAIR("> 2nd Home ", current_position[axis]);
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if ENABLED(Z_DUAL_ENDSTOPS)
|
|
|
|
#if ENABLED(Z_DUAL_ENDSTOPS)
|
|
|
|
if (axis == Z_AXIS) {
|
|
|
|
if (axis == Z_AXIS) {
|
|
|
|
float adj = fabs(z_endstop_adj);
|
|
|
|
float adj = fabs(z_endstop_adj);
|
|
|
@ -2349,7 +2341,8 @@ static void homeaxis(AxisEnum axis) {
|
|
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
#else
|
|
|
|
|
|
|
|
|
|
|
|
// Set the axis position to its home position (plus home offsets)
|
|
|
|
// For cartesian/core machines,
|
|
|
|
|
|
|
|
// set the axis to its home position
|
|
|
|
set_axis_is_at_home(axis);
|
|
|
|
set_axis_is_at_home(axis);
|
|
|
|
sync_plan_position();
|
|
|
|
sync_plan_position();
|
|
|
|
|
|
|
|
|
|
|
|