Add Z_PROBE_LOW_POINT to prevent damage

This commit is contained in:
Scott Lahteine 2018-04-08 23:53:09 -05:00
parent e87ae5b643
commit 4f660a18bc
4 changed files with 36 additions and 9 deletions

View File

@ -744,6 +744,8 @@
#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points #define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points
//#define Z_AFTER_PROBING 5 // Z position after probing is done //#define Z_AFTER_PROBING 5 // Z position after probing is done
#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping
// For M851 give a range for adjusting the Z probe offset // For M851 give a range for adjusting the Z probe offset
#define Z_PROBE_OFFSET_RANGE_MIN -20 #define Z_PROBE_OFFSET_RANGE_MIN -20
#define Z_PROBE_OFFSET_RANGE_MAX 20 #define Z_PROBE_OFFSET_RANGE_MAX 20

View File

@ -392,7 +392,7 @@ void report_current_position();
PROBE_PT_STOW, // Do a complete stow after run_z_probe PROBE_PT_STOW, // Do a complete stow after run_z_probe
PROBE_PT_RAISE // Raise to "between" clearance after run_z_probe PROBE_PT_RAISE // Raise to "between" clearance after run_z_probe
}; };
float probe_pt(const float &rx, const float &ry, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true); float probe_pt(const float &rx, const float &ry, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool is_calibration=false);
#define DEPLOY_PROBE() set_probe_deployed(true) #define DEPLOY_PROBE() set_probe_deployed(true)
#define STOW_PROBE() set_probe_deployed(false) #define STOW_PROBE() set_probe_deployed(false)
#else #else

View File

@ -2238,17 +2238,34 @@ static void clean_up_after_endstop_or_probe_move() {
* *
* @return The raw Z position where the probe was triggered * @return The raw Z position where the probe was triggered
*/ */
static float run_z_probe() { #define HAS_CALIBRATION_PROBE (ENABLED(DELTA_AUTO_CALIBRATION) && Z_PROBE_LOW_POINT < 0)
static float run_z_probe(
#if HAS_CALIBRATION_PROBE
const bool is_calibration
#endif
) {
#if ENABLED(DEBUG_LEVELING_FEATURE) #if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) DEBUG_POS(">>> run_z_probe", current_position); if (DEBUGGING(LEVELING)) DEBUG_POS(">>> run_z_probe", current_position);
#endif #endif
#if Z_PROBE_LOW_POINT < 0
// Stop the probe before it goes too low to prevent damage.
// If Z isn't known or this is a "calibration probe" then probe to -10mm.
#if !HAS_CALIBRATION_PROBE
constexpr bool is_calibration = false;
#endif
const float z_probe_low_point = !is_calibration && axis_known_position[Z_AXIS] ? -zprobe_zoffset + Z_PROBE_LOW_POINT : -10.0;
#else
// Assertively move down in all cases
constexpr float z_probe_low_point = -10.0;
#endif
// Double-probing does a fast probe followed by a slow probe // Double-probing does a fast probe followed by a slow probe
#if MULTIPLE_PROBING == 2 #if MULTIPLE_PROBING == 2
// Do a first probe at the fast speed // Do a first probe at the fast speed
if (do_probe_move(-10, Z_PROBE_SPEED_FAST)) return NAN; if (do_probe_move(z_probe_low_point, Z_PROBE_SPEED_FAST)) return NAN;
float first_probe_z = current_position[Z_AXIS]; float first_probe_z = current_position[Z_AXIS];
@ -2279,7 +2296,7 @@ static void clean_up_after_endstop_or_probe_move() {
#endif #endif
// move down slowly to find bed // move down slowly to find bed
if (do_probe_move(-10, Z_PROBE_SPEED_SLOW)) return NAN; if (do_probe_move(z_probe_low_point, Z_PROBE_SPEED_SLOW)) return NAN;
#if MULTIPLE_PROBING > 2 #if MULTIPLE_PROBING > 2
probes_total += current_position[Z_AXIS]; probes_total += current_position[Z_AXIS];
@ -2327,14 +2344,14 @@ static void clean_up_after_endstop_or_probe_move() {
* - Raise to the BETWEEN height * - Raise to the BETWEEN height
* - Return the probed Z position * - Return the probed Z position
*/ */
float probe_pt(const float &rx, const float &ry, const ProbePtRaise raise_after/*=PROBE_PT_NONE*/, const uint8_t verbose_level/*=0*/, const bool probe_relative/*=true*/) { float probe_pt(const float &rx, const float &ry, const ProbePtRaise raise_after/*=PROBE_PT_NONE*/, const uint8_t verbose_level/*=0*/, const bool is_calibration/*=false*/) {
#if ENABLED(DEBUG_LEVELING_FEATURE) #if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) { if (DEBUGGING(LEVELING)) {
SERIAL_ECHOPAIR(">>> probe_pt(", LOGICAL_X_POSITION(rx)); SERIAL_ECHOPAIR(">>> probe_pt(", LOGICAL_X_POSITION(rx));
SERIAL_ECHOPAIR(", ", LOGICAL_Y_POSITION(ry)); SERIAL_ECHOPAIR(", ", LOGICAL_Y_POSITION(ry));
SERIAL_ECHOPAIR(", ", raise_after == PROBE_PT_RAISE ? "raise" : raise_after == PROBE_PT_STOW ? "stow" : "none"); SERIAL_ECHOPAIR(", ", raise_after == PROBE_PT_RAISE ? "raise" : raise_after == PROBE_PT_STOW ? "stow" : "none");
SERIAL_ECHOPAIR(", ", int(verbose_level)); SERIAL_ECHOPAIR(", ", int(verbose_level));
SERIAL_ECHOPAIR(", ", probe_relative ? "probe" : "nozzle"); SERIAL_ECHOPAIR(", ", is_calibration ? "nozzle" : "probe");
SERIAL_ECHOLNPGM("_relative)"); SERIAL_ECHOLNPGM("_relative)");
DEBUG_POS("", current_position); DEBUG_POS("", current_position);
} }
@ -2342,7 +2359,7 @@ static void clean_up_after_endstop_or_probe_move() {
// TODO: Adapt for SCARA, where the offset rotates // TODO: Adapt for SCARA, where the offset rotates
float nx = rx, ny = ry; float nx = rx, ny = ry;
if (probe_relative) { if (!is_calibration) {
if (!position_is_reachable_by_probe(rx, ry)) return NAN; // The given position is in terms of the probe if (!position_is_reachable_by_probe(rx, ry)) return NAN; // The given position is in terms of the probe
nx -= (X_PROBE_OFFSET_FROM_EXTRUDER); // Get the nozzle position nx -= (X_PROBE_OFFSET_FROM_EXTRUDER); // Get the nozzle position
ny -= (Y_PROBE_OFFSET_FROM_EXTRUDER); ny -= (Y_PROBE_OFFSET_FROM_EXTRUDER);
@ -2366,7 +2383,11 @@ static void clean_up_after_endstop_or_probe_move() {
float measured_z = NAN; float measured_z = NAN;
if (!DEPLOY_PROBE()) { if (!DEPLOY_PROBE()) {
measured_z = run_z_probe() + zprobe_zoffset; measured_z = run_z_probe(
#if HAS_CALIBRATION_PROBE
is_calibration
#endif
) + zprobe_zoffset;
if (raise_after == PROBE_PT_RAISE) if (raise_after == PROBE_PT_RAISE)
do_blocking_move_to_z(current_position[Z_AXIS] + Z_CLEARANCE_BETWEEN_PROBES, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); do_blocking_move_to_z(current_position[Z_AXIS] + Z_CLEARANCE_BETWEEN_PROBES, MMM_TO_MMS(Z_PROBE_SPEED_FAST));
@ -5436,7 +5457,7 @@ void home_all_axes() { gcode_G28(true); }
inline float calibration_probe(const float nx, const float ny, const bool stow) { inline float calibration_probe(const float nx, const float ny, const bool stow) {
#if HAS_BED_PROBE #if HAS_BED_PROBE
return probe_pt(nx, ny, stow ? PROBE_PT_STOW : PROBE_PT_RAISE, 0, false); return probe_pt(nx, ny, stow ? PROBE_PT_STOW : PROBE_PT_RAISE, 0, true);
#else #else
UNUSED(stow); UNUSED(stow);
return lcd_probe_pt(nx, ny); return lcd_probe_pt(nx, ny);

View File

@ -759,6 +759,10 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
#error "MULTIPLE_PROBING must be >= 2." #error "MULTIPLE_PROBING must be >= 2."
#endif #endif
#if Z_PROBE_LOW_POINT > 0
#error "Z_PROBE_LOW_POINT must be less than or equal to 0."
#endif
#else #else
/** /**