Update G33: Add F, fix height bug

This commit is contained in:
LVD-AC 2017-06-26 12:25:57 +02:00 committed by Scott Lahteine
parent 134116b874
commit 99592c8458

View File

@ -1772,8 +1772,9 @@ static void clean_up_after_endstop_or_probe_move() {
float z_dest = LOGICAL_Z_POSITION(z_raise); float z_dest = LOGICAL_Z_POSITION(z_raise);
if (zprobe_zoffset < 0) z_dest -= zprobe_zoffset; if (zprobe_zoffset < 0) z_dest -= zprobe_zoffset;
#if ENABLED(DELTA) #if ENABLED(DELTA)
z_dest -= home_offset[Z_AXIS]; z_dest -= home_offset[Z_AXIS]; // Account for delta height adjustment
#endif #endif
if (z_dest > current_position[Z_AXIS]) if (z_dest > current_position[Z_AXIS])
@ -2263,9 +2264,11 @@ static void clean_up_after_endstop_or_probe_move() {
// move down quickly before doing the slow probe // move down quickly before doing the slow probe
float z = LOGICAL_Z_POSITION(Z_CLEARANCE_BETWEEN_PROBES); float z = LOGICAL_Z_POSITION(Z_CLEARANCE_BETWEEN_PROBES);
if (zprobe_zoffset < 0) z -= zprobe_zoffset; if (zprobe_zoffset < 0) z -= zprobe_zoffset;
#if ENABLED(DELTA) #if ENABLED(DELTA)
z -= home_offset[Z_AXIS]; z -= home_offset[Z_AXIS]; // Account for delta height adjustment
#endif #endif
if (z < current_position[Z_AXIS]) if (z < current_position[Z_AXIS])
do_blocking_move_to_z(z, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); do_blocking_move_to_z(z, MMM_TO_MMS(Z_PROBE_SPEED_FAST));
@ -2285,7 +2288,11 @@ static void clean_up_after_endstop_or_probe_move() {
SERIAL_ECHOLNPAIR(" Discrepancy:", first_probe_z - current_position[Z_AXIS]); SERIAL_ECHOLNPAIR(" Discrepancy:", first_probe_z - current_position[Z_AXIS]);
} }
#endif #endif
return RAW_CURRENT_POSITION(Z) + zprobe_zoffset; return RAW_CURRENT_POSITION(Z) + zprobe_zoffset
#if ENABLED(DELTA)
+ home_offset[Z_AXIS] // Account for delta height adjustment
#endif
;
} }
/** /**
@ -5135,6 +5142,8 @@ void home_all_axes() { gcode_G28(true); }
* *
* Cn.nn Calibration precision; when omitted calibrates to maximum precision * Cn.nn Calibration precision; when omitted calibrates to maximum precision
* *
* Fn Force to run at least n iterations and takes the best result
*
* Vn Verbose level: * Vn Verbose level:
* *
* V0 Dry-run mode. Report settings and probe results. No calibration. * V0 Dry-run mode. Report settings and probe results. No calibration.
@ -5172,6 +5181,12 @@ void home_all_axes() { gcode_G28(true); }
return; return;
} }
const int8_t force_iterations = parser.seen('F') ? parser.value_int() : 1;
if (!WITHIN(force_iterations, 1, 30)) {
SERIAL_PROTOCOLLNPGM("?(F)orce iteration is implausible (1-30).");
return;
}
const bool towers_set = !parser.seen('T'), const bool towers_set = !parser.seen('T'),
stow_after_each = parser.seen('E') && parser.value_bool(), stow_after_each = parser.seen('E') && parser.value_bool(),
_1p_calibration = probe_points == 1, _1p_calibration = probe_points == 1,
@ -5206,6 +5221,7 @@ void home_all_axes() { gcode_G28(true); }
float test_precision, float test_precision,
zero_std_dev = (verbose_level ? 999.0 : 0.0), // 0.0 in dry-run mode : forced end zero_std_dev = (verbose_level ? 999.0 : 0.0), // 0.0 in dry-run mode : forced end
zero_std_dev_old = zero_std_dev, zero_std_dev_old = zero_std_dev,
zero_std_dev_min = zero_std_dev,
e_old[XYZ] = { e_old[XYZ] = {
endstop_adj[A_AXIS], endstop_adj[A_AXIS],
endstop_adj[B_AXIS], endstop_adj[B_AXIS],
@ -5284,9 +5300,10 @@ void home_all_axes() { gcode_G28(true); }
const uint8_t start = _4p_opposite_points ? 3 : 1, const uint8_t start = _4p_opposite_points ? 3 : 1,
step = _4p_calibration ? 4 : _7p_half_circle ? 2 : 1; step = _4p_calibration ? 4 : _7p_half_circle ? 2 : 1;
for (uint8_t axis = start; axis < 13; axis += step) { for (uint8_t axis = start; axis < 13; axis += step) {
const float offset_circles = _7p_quadruple_circle ? (zig_zag ? 1.5 : 1.0) : const float zigadd = (zig_zag ? 0.5 : 0.0),
_7p_triple_circle ? (zig_zag ? 1.0 : 0.5) : offset_circles = _7p_quadruple_circle ? zigadd + 1.0 :
_7p_double_circle ? (zig_zag ? 0.5 : 0.0) : 0; _7p_triple_circle ? zigadd + 0.5 :
_7p_double_circle ? zigadd : 0;
for (float circles = -offset_circles ; circles <= offset_circles; circles++) { for (float circles = -offset_circles ; circles <= offset_circles; circles++) {
const float a = RADIANS(180 + 30 * axis), const float a = RADIANS(180 + 30 * axis),
r = delta_calibration_radius * (1 + circles * (zig_zag ? 0.1 : -0.1)); r = delta_calibration_radius * (1 + circles * (zig_zag ? 0.1 : -0.1));
@ -5310,18 +5327,19 @@ void home_all_axes() { gcode_G28(true); }
N++; N++;
} }
zero_std_dev_old = zero_std_dev; zero_std_dev_old = zero_std_dev;
zero_std_dev = round(SQRT(S2 / N) * 1000.0) / 1000.0 + 0.00001; NOMORE(zero_std_dev_min, zero_std_dev);
zero_std_dev = round(sqrt(S2 / N) * 1000.0) / 1000.0 + 0.00001;
if (iterations == 1) home_offset[Z_AXIS] = zh_old; // reset height after 1st probe change
// Solve matrices // Solve matrices
if (zero_std_dev < test_precision && zero_std_dev > calibration_precision) { if ((zero_std_dev < test_precision && zero_std_dev > calibration_precision) || iterations <= force_iterations) {
if (zero_std_dev < zero_std_dev_min) {
COPY(e_old, endstop_adj); COPY(e_old, endstop_adj);
dr_old = delta_radius; dr_old = delta_radius;
zh_old = home_offset[Z_AXIS]; zh_old = home_offset[Z_AXIS];
alpha_old = delta_tower_angle_trim[A_AXIS]; alpha_old = delta_tower_angle_trim[A_AXIS];
beta_old = delta_tower_angle_trim[B_AXIS]; beta_old = delta_tower_angle_trim[B_AXIS];
}
float e_delta[XYZ] = { 0.0 }, r_delta = 0.0, t_alpha = 0.0, t_beta = 0.0; float e_delta[XYZ] = { 0.0 }, r_delta = 0.0, t_alpha = 0.0, t_beta = 0.0;
const float r_diff = delta_radius - delta_calibration_radius, const float r_diff = delta_radius - delta_calibration_radius,
@ -5420,7 +5438,7 @@ void home_all_axes() { gcode_G28(true); }
} }
} }
if (test_precision != 0.0) { // !forced end if (test_precision != 0.0) { // !forced end
if (zero_std_dev >= test_precision || zero_std_dev <= calibration_precision) { // end iterations if ((zero_std_dev >= test_precision || zero_std_dev <= calibration_precision) && iterations > force_iterations) { // end iterations
SERIAL_PROTOCOLPGM("Calibration OK"); SERIAL_PROTOCOLPGM("Calibration OK");
SERIAL_PROTOCOL_SP(36); SERIAL_PROTOCOL_SP(36);
if (zero_std_dev >= test_precision) if (zero_std_dev >= test_precision)
@ -5458,7 +5476,7 @@ void home_all_axes() { gcode_G28(true); }
SERIAL_PROTOCOLPGM(" Tz:+0.00"); SERIAL_PROTOCOLPGM(" Tz:+0.00");
SERIAL_EOL(); SERIAL_EOL();
} }
if (zero_std_dev >= test_precision || zero_std_dev <= calibration_precision) if ((zero_std_dev >= test_precision || zero_std_dev <= calibration_precision) && iterations > force_iterations)
serialprintPGM(save_message); serialprintPGM(save_message);
SERIAL_EOL(); SERIAL_EOL();
} }
@ -5485,7 +5503,7 @@ void home_all_axes() { gcode_G28(true); }
endstops.not_homing(); endstops.not_homing();
} }
while (zero_std_dev < test_precision && zero_std_dev > calibration_precision && iterations < 31); while ((zero_std_dev < test_precision && zero_std_dev > calibration_precision && iterations < 31) || iterations <= force_iterations);
#if ENABLED(DELTA_HOME_TO_SAFE_ZONE) #if ENABLED(DELTA_HOME_TO_SAFE_ZONE)
do_blocking_move_to_z(delta_clip_start_height); do_blocking_move_to_z(delta_clip_start_height);