|
|
@ -140,12 +140,6 @@ static void print_calibration_settings(const bool end_stops, const bool tower_an |
|
|
|
if ((!end_stops && tower_angles) || (end_stops && !tower_angles)) { // XOR
|
|
|
|
SERIAL_ECHOPAIR(" Radius:", delta_radius); |
|
|
|
} |
|
|
|
#if HAS_BED_PROBE |
|
|
|
if (!end_stops && !tower_angles) { |
|
|
|
SERIAL_ECHO_SP(30); |
|
|
|
print_signed_float(PSTR("Offset"), zprobe_zoffset); |
|
|
|
} |
|
|
|
#endif |
|
|
|
SERIAL_EOL(); |
|
|
|
} |
|
|
|
|
|
|
@ -194,30 +188,19 @@ static float std_dev_points(float z_pt[NPP + 1], const bool _0p_cal, const bool |
|
|
|
/**
|
|
|
|
* - Probe a point |
|
|
|
*/ |
|
|
|
static float calibration_probe(const float &nx, const float &ny, const bool stow, const bool set_up) { |
|
|
|
static float calibration_probe(const float &nx, const float &ny, const bool stow) { |
|
|
|
#if HAS_BED_PROBE |
|
|
|
return probe_pt(nx, ny, set_up ? PROBE_PT_BIG_RAISE : stow ? PROBE_PT_STOW : PROBE_PT_RAISE, 0, false); |
|
|
|
return probe_pt(nx, ny, stow ? PROBE_PT_STOW : PROBE_PT_RAISE, 0, false); |
|
|
|
#else |
|
|
|
UNUSED(stow); |
|
|
|
UNUSED(set_up); |
|
|
|
return lcd_probe_pt(nx, ny); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
#if HAS_BED_PROBE && HAS_LCD_MENU |
|
|
|
static float probe_z_shift(const float center) { |
|
|
|
STOW_PROBE(); |
|
|
|
endstops.enable_z_probe(false); |
|
|
|
float z_shift = lcd_probe_pt(0, 0) - center; |
|
|
|
endstops.enable_z_probe(true); |
|
|
|
return z_shift; |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
/**
|
|
|
|
* - Probe a grid |
|
|
|
*/ |
|
|
|
static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_points, const bool towers_set, const bool stow_after_each, const bool set_up) { |
|
|
|
static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_points, const bool towers_set, const bool stow_after_each) { |
|
|
|
const bool _0p_calibration = probe_points == 0, |
|
|
|
_1p_calibration = probe_points == 1 || probe_points == -1, |
|
|
|
_4p_calibration = probe_points == 2, |
|
|
@ -240,7 +223,7 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi |
|
|
|
if (!_0p_calibration) { |
|
|
|
|
|
|
|
if (!_7p_no_intermediates && !_7p_4_intermediates && !_7p_11_intermediates) { // probe the center
|
|
|
|
z_pt[CEN] += calibration_probe(0, 0, stow_after_each, set_up); |
|
|
|
z_pt[CEN] += calibration_probe(0, 0, stow_after_each); |
|
|
|
if (isnan(z_pt[CEN])) return false; |
|
|
|
} |
|
|
|
|
|
|
@ -250,7 +233,7 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi |
|
|
|
I_LOOP_CAL_PT(rad, start, steps) { |
|
|
|
const float a = RADIANS(210 + (360 / NPP) * (rad - 1)), |
|
|
|
r = delta_calibration_radius * 0.1; |
|
|
|
z_pt[CEN] += calibration_probe(cos(a) * r, sin(a) * r, stow_after_each, set_up); |
|
|
|
z_pt[CEN] += calibration_probe(cos(a) * r, sin(a) * r, stow_after_each); |
|
|
|
if (isnan(z_pt[CEN])) return false; |
|
|
|
} |
|
|
|
z_pt[CEN] /= float(_7p_2_intermediates ? 7 : probe_points); |
|
|
@ -274,7 +257,7 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi |
|
|
|
const float a = RADIANS(210 + (360 / NPP) * (rad - 1)), |
|
|
|
r = delta_calibration_radius * (1 - 0.1 * (zig_zag ? offset - circle : circle)), |
|
|
|
interpol = FMOD(rad, 1); |
|
|
|
const float z_temp = calibration_probe(cos(a) * r, sin(a) * r, stow_after_each, set_up); |
|
|
|
const float z_temp = calibration_probe(cos(a) * r, sin(a) * r, stow_after_each); |
|
|
|
if (isnan(z_temp)) return false; |
|
|
|
// split probe point to neighbouring calibration points
|
|
|
|
z_pt[uint8_t(LROUND(rad - interpol + NPP - 1)) % NPP + 1] += z_temp * sq(cos(RADIANS(interpol * 90))); |
|
|
@ -403,10 +386,7 @@ static float auto_tune_a() { |
|
|
|
* |
|
|
|
* Parameters: |
|
|
|
* |
|
|
|
* S Setup mode; disables probe protection |
|
|
|
* |
|
|
|
* Pn Number of probe points: |
|
|
|
* P-1 Checks the z_offset with a center probe and paper test. |
|
|
|
* P0 Normalizes calibration. |
|
|
|
* P1 Calibrates height only with center probe. |
|
|
|
* P2 Probe center and towers. Calibrate height, endstops and delta radius. |
|
|
@ -429,22 +409,15 @@ static float auto_tune_a() { |
|
|
|
*/ |
|
|
|
void GcodeSuite::G33() { |
|
|
|
|
|
|
|
const bool set_up = |
|
|
|
#if HAS_BED_PROBE |
|
|
|
parser.seen('S'); |
|
|
|
#else |
|
|
|
false; |
|
|
|
#endif |
|
|
|
|
|
|
|
const int8_t probe_points = set_up ? 2 : parser.intval('P', DELTA_CALIBRATION_DEFAULT_POINTS); |
|
|
|
if (!WITHIN(probe_points, -1, 10)) { |
|
|
|
SERIAL_ECHOLNPGM("?(P)oints is implausible (-1 - 10)."); |
|
|
|
const int8_t probe_points = parser.intval('P', DELTA_CALIBRATION_DEFAULT_POINTS); |
|
|
|
if (!WITHIN(probe_points, 0, 10)) { |
|
|
|
SERIAL_ECHOLNPGM("?(P)oints is implausible (0-10)."); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
const bool towers_set = !parser.seen('T'); |
|
|
|
|
|
|
|
const float calibration_precision = set_up ? Z_CLEARANCE_BETWEEN_PROBES / 5.0 : parser.floatval('C', 0.0); |
|
|
|
const float calibration_precision = parser.floatval('C', 0.0); |
|
|
|
if (calibration_precision < 0) { |
|
|
|
SERIAL_ECHOLNPGM("?(C)alibration precision is implausible (>=0)."); |
|
|
|
return; |
|
|
@ -452,26 +425,18 @@ void GcodeSuite::G33() { |
|
|
|
|
|
|
|
const int8_t force_iterations = parser.intval('F', 0); |
|
|
|
if (!WITHIN(force_iterations, 0, 30)) { |
|
|
|
SERIAL_ECHOLNPGM("?(F)orce iteration is implausible (0 - 30)."); |
|
|
|
SERIAL_ECHOLNPGM("?(F)orce iteration is implausible (0-30)."); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
const int8_t verbose_level = parser.byteval('V', 1); |
|
|
|
if (!WITHIN(verbose_level, 0, 3)) { |
|
|
|
SERIAL_ECHOLNPGM("?(V)erbose level is implausible (0 - 3)."); |
|
|
|
SERIAL_ECHOLNPGM("?(V)erbose level is implausible (0-3)."); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
const bool stow_after_each = parser.seen('E'); |
|
|
|
|
|
|
|
if (set_up) { |
|
|
|
delta_height = 999.99; |
|
|
|
delta_radius = DELTA_PRINTABLE_RADIUS; |
|
|
|
ZERO(delta_endstop_adj); |
|
|
|
ZERO(delta_tower_angle_trim); |
|
|
|
recalc_delta_settings(); |
|
|
|
} |
|
|
|
|
|
|
|
const bool _0p_calibration = probe_points == 0, |
|
|
|
_1p_calibration = probe_points == 1 || probe_points == -1, |
|
|
|
_4p_calibration = probe_points == 2, |
|
|
@ -520,7 +485,6 @@ void GcodeSuite::G33() { |
|
|
|
PGM_P checkingac = PSTR("Checking... AC"); |
|
|
|
serialprintPGM(checkingac); |
|
|
|
if (verbose_level == 0) SERIAL_ECHOPGM(" (DRY-RUN)"); |
|
|
|
if (set_up) SERIAL_ECHOPGM(" (SET-UP)"); |
|
|
|
SERIAL_EOL(); |
|
|
|
ui.set_status_P(checkingac); |
|
|
|
|
|
|
@ -539,7 +503,7 @@ void GcodeSuite::G33() { |
|
|
|
|
|
|
|
// Probe the points
|
|
|
|
zero_std_dev_old = zero_std_dev; |
|
|
|
if (!probe_calibration_points(z_at_pt, probe_points, towers_set, stow_after_each, set_up)) { |
|
|
|
if (!probe_calibration_points(z_at_pt, probe_points, towers_set, stow_after_each)) { |
|
|
|
SERIAL_ECHOLNPGM("Correct delta settings with M665 and M666"); |
|
|
|
return AC_CLEANUP(); |
|
|
|
} |
|
|
@ -587,11 +551,6 @@ void GcodeSuite::G33() { |
|
|
|
delta_calibration_radius = cr_old; |
|
|
|
|
|
|
|
switch (probe_points) { |
|
|
|
case -1: |
|
|
|
#if HAS_BED_PROBE && HAS_LCD_MENU |
|
|
|
zprobe_zoffset += probe_z_shift(z_at_pt[CEN]); |
|
|
|
#endif |
|
|
|
|
|
|
|
case 0: |
|
|
|
test_precision = 0.00; // forced end
|
|
|
|
break; |
|
|
|