No retroactive changes with M851 Z
If using babystep to adjust the Z probe offset, the axis will move and the mesh will be updated at the same time, causing a doubling of the Z offset over the rest of the print. To correct for this, the current Z position would need to be modified in the opposite direction, canceling out the additional Z offset added to the mesh. This would be confusing to users, and moreover it would not be accurate without also taking the current Z fade level and current Z height into account. It might make sense to change the mesh in the case where no babystepping is taking place, but this could be considered an undesirable side-effect of changing the `zprobe_zoffset`. One way to remedy this would be to return to storing the mesh with `zprobe_zoffset` included, then subtracting `zprobe_zoffset` from the returned Z value. Thus, a babystep moving the Z axis up 1mm would subtract 1 from `zprobe_zoffset` while adding 1 to all mesh Z values. Without including the `zprobe_zoffset` in the `z_values` there is no safe way to alter the mesh in conjunction with babystepping, although it's fine without it.
This commit is contained in:
parent
7dacc999b9
commit
3bba7d60f3
|
@ -37,22 +37,17 @@ void GcodeSuite::M290() {
|
||||||
for (uint8_t a = X_AXIS; a <= Z_AXIS; a++)
|
for (uint8_t a = X_AXIS; a <= Z_AXIS; a++)
|
||||||
if (parser.seenval(axis_codes[a]) || (a == Z_AXIS && parser.seenval('S'))) {
|
if (parser.seenval(axis_codes[a]) || (a == Z_AXIS && parser.seenval('S'))) {
|
||||||
const float offs = constrain(parser.value_axis_units((AxisEnum)a), -2, 2);
|
const float offs = constrain(parser.value_axis_units((AxisEnum)a), -2, 2);
|
||||||
#if ENABLED(BABYSTEP_ZPROBE_OFFSET)
|
|
||||||
if (a == Z_AXIS) {
|
|
||||||
zprobe_zoffset += offs;
|
|
||||||
refresh_zprobe_zoffset(true); // 'true' to not babystep
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
thermalManager.babystep_axis((AxisEnum)a, offs * planner.axis_steps_per_mm[a]);
|
thermalManager.babystep_axis((AxisEnum)a, offs * planner.axis_steps_per_mm[a]);
|
||||||
|
#if ENABLED(BABYSTEP_ZPROBE_OFFSET)
|
||||||
|
zprobe_zoffset += offs;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (parser.seenval('Z') || parser.seenval('S')) {
|
if (parser.seenval('Z') || parser.seenval('S')) {
|
||||||
const float offs = constrain(parser.value_axis_units(Z_AXIS), -2, 2);
|
const float offs = constrain(parser.value_axis_units(Z_AXIS), -2, 2);
|
||||||
|
thermalManager.babystep_axis(Z_AXIS, offs * planner.axis_steps_per_mm[Z_AXIS]);
|
||||||
#if ENABLED(BABYSTEP_ZPROBE_OFFSET)
|
#if ENABLED(BABYSTEP_ZPROBE_OFFSET)
|
||||||
zprobe_zoffset += offs;
|
zprobe_zoffset += offs;
|
||||||
refresh_zprobe_zoffset(); // This will babystep the axis
|
|
||||||
#else
|
|
||||||
thermalManager.babystep_axis(Z_AXIS, offs * planner.axis_steps_per_mm[Z_AXIS]);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -35,7 +35,6 @@ void GcodeSuite::M851() {
|
||||||
const float value = parser.value_linear_units();
|
const float value = parser.value_linear_units();
|
||||||
if (WITHIN(value, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) {
|
if (WITHIN(value, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) {
|
||||||
zprobe_zoffset = value;
|
zprobe_zoffset = value;
|
||||||
refresh_zprobe_zoffset();
|
|
||||||
SERIAL_ECHO(zprobe_zoffset);
|
SERIAL_ECHO(zprobe_zoffset);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -1100,8 +1100,6 @@ void kill_screen(const char* lcd_msg) {
|
||||||
ENCODER_DIRECTION_NORMAL();
|
ENCODER_DIRECTION_NORMAL();
|
||||||
if (encoderPosition) {
|
if (encoderPosition) {
|
||||||
const int16_t babystep_increment = (int32_t)encoderPosition * (BABYSTEP_MULTIPLICATOR);
|
const int16_t babystep_increment = (int32_t)encoderPosition * (BABYSTEP_MULTIPLICATOR);
|
||||||
encoderPosition = 0;
|
|
||||||
|
|
||||||
const float new_zoffset = zprobe_zoffset + planner.steps_to_mm[Z_AXIS] * babystep_increment;
|
const float new_zoffset = zprobe_zoffset + planner.steps_to_mm[Z_AXIS] * babystep_increment;
|
||||||
if (WITHIN(new_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) {
|
if (WITHIN(new_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) {
|
||||||
|
|
||||||
|
@ -1109,9 +1107,9 @@ void kill_screen(const char* lcd_msg) {
|
||||||
thermalManager.babystep_axis(Z_AXIS, babystep_increment);
|
thermalManager.babystep_axis(Z_AXIS, babystep_increment);
|
||||||
|
|
||||||
zprobe_zoffset = new_zoffset;
|
zprobe_zoffset = new_zoffset;
|
||||||
refresh_zprobe_zoffset(true);
|
|
||||||
lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT;
|
lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT;
|
||||||
}
|
}
|
||||||
|
encoderPosition = 0;
|
||||||
}
|
}
|
||||||
if (lcdDrawUpdate) {
|
if (lcdDrawUpdate) {
|
||||||
lcd_implementation_drawedit(PSTR(MSG_ZPROBE_ZOFFSET), ftostr43sign(zprobe_zoffset));
|
lcd_implementation_drawedit(PSTR(MSG_ZPROBE_ZOFFSET), ftostr43sign(zprobe_zoffset));
|
||||||
|
@ -1678,11 +1676,6 @@ void kill_screen(const char* lcd_msg) {
|
||||||
static void lcd_load_settings() { lcd_completion_feedback(settings.load()); }
|
static void lcd_load_settings() { lcd_completion_feedback(settings.load()); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_BED_PROBE && DISABLED(BABYSTEP_ZPROBE_OFFSET)
|
|
||||||
static void lcd_refresh_zprobe_zoffset() { refresh_zprobe_zoffset(); }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if ENABLED(LEVEL_BED_CORNERS)
|
#if ENABLED(LEVEL_BED_CORNERS)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2000,7 +1993,7 @@ void kill_screen(const char* lcd_msg) {
|
||||||
#if ENABLED(BABYSTEP_ZPROBE_OFFSET)
|
#if ENABLED(BABYSTEP_ZPROBE_OFFSET)
|
||||||
MENU_ITEM(submenu, MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset);
|
MENU_ITEM(submenu, MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset);
|
||||||
#elif HAS_BED_PROBE
|
#elif HAS_BED_PROBE
|
||||||
MENU_ITEM_EDIT_CALLBACK(float32, MSG_ZPROBE_ZOFFSET, &zprobe_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX, lcd_refresh_zprobe_zoffset);
|
MENU_ITEM_EDIT(float32, MSG_ZPROBE_ZOFFSET, &zprobe_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
MENU_ITEM(submenu, MSG_LEVEL_BED, _lcd_level_bed_continue);
|
MENU_ITEM(submenu, MSG_LEVEL_BED, _lcd_level_bed_continue);
|
||||||
|
@ -3647,7 +3640,7 @@ void kill_screen(const char* lcd_msg) {
|
||||||
#if ENABLED(BABYSTEP_ZPROBE_OFFSET)
|
#if ENABLED(BABYSTEP_ZPROBE_OFFSET)
|
||||||
MENU_ITEM(submenu, MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset);
|
MENU_ITEM(submenu, MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset);
|
||||||
#elif HAS_BED_PROBE
|
#elif HAS_BED_PROBE
|
||||||
MENU_ITEM_EDIT_CALLBACK(float32, MSG_ZPROBE_ZOFFSET, &zprobe_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX, lcd_refresh_zprobe_zoffset);
|
MENU_ITEM_EDIT(float32, MSG_ZPROBE_ZOFFSET, &zprobe_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// M203 / M205 - Feedrate items
|
// M203 / M205 - Feedrate items
|
||||||
|
|
|
@ -247,10 +247,6 @@ void MarlinSettings::postprocess() {
|
||||||
set_z_fade_height(new_z_fade_height);
|
set_z_fade_height(new_z_fade_height);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_BED_PROBE
|
|
||||||
refresh_zprobe_zoffset();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ENABLED(AUTO_BED_LEVELING_BILINEAR)
|
#if ENABLED(AUTO_BED_LEVELING_BILINEAR)
|
||||||
refresh_bed_level();
|
refresh_bed_level();
|
||||||
//set_bed_leveling_enabled(leveling_is_on);
|
//set_bed_leveling_enabled(leveling_is_on);
|
||||||
|
@ -355,9 +351,8 @@ void MarlinSettings::postprocess() {
|
||||||
sizeof(mbl.z_values) == GRID_MAX_POINTS * sizeof(mbl.z_values[0][0]),
|
sizeof(mbl.z_values) == GRID_MAX_POINTS * sizeof(mbl.z_values[0][0]),
|
||||||
"MBL Z array is the wrong size."
|
"MBL Z array is the wrong size."
|
||||||
);
|
);
|
||||||
const bool leveling_is_on = mbl.has_mesh;
|
|
||||||
const uint8_t mesh_num_x = GRID_MAX_POINTS_X, mesh_num_y = GRID_MAX_POINTS_Y;
|
const uint8_t mesh_num_x = GRID_MAX_POINTS_X, mesh_num_y = GRID_MAX_POINTS_Y;
|
||||||
EEPROM_WRITE(leveling_is_on);
|
EEPROM_WRITE(mbl.has_mesh);
|
||||||
EEPROM_WRITE(mbl.z_offset);
|
EEPROM_WRITE(mbl.z_offset);
|
||||||
EEPROM_WRITE(mesh_num_x);
|
EEPROM_WRITE(mesh_num_x);
|
||||||
EEPROM_WRITE(mesh_num_y);
|
EEPROM_WRITE(mesh_num_y);
|
||||||
|
|
|
@ -640,42 +640,6 @@ float probe_pt(const float &rx, const float &ry, const bool stow, const uint8_t
|
||||||
return measured_z;
|
return measured_z;
|
||||||
}
|
}
|
||||||
|
|
||||||
void refresh_zprobe_zoffset(const bool no_babystep/*=false*/) {
|
|
||||||
static float last_zoffset = NAN;
|
|
||||||
|
|
||||||
if (!isnan(last_zoffset)) {
|
|
||||||
|
|
||||||
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(BABYSTEP_ZPROBE_OFFSET) || ENABLED(DELTA)
|
|
||||||
const float diff = zprobe_zoffset - last_zoffset;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ENABLED(AUTO_BED_LEVELING_BILINEAR)
|
|
||||||
// Correct bilinear grid for new probe offset
|
|
||||||
if (diff) {
|
|
||||||
for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++)
|
|
||||||
for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++)
|
|
||||||
z_values[x][y] -= diff;
|
|
||||||
}
|
|
||||||
#if ENABLED(ABL_BILINEAR_SUBDIVISION)
|
|
||||||
bed_level_virt_interpolate();
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ENABLED(BABYSTEP_ZPROBE_OFFSET)
|
|
||||||
if (!no_babystep && planner.leveling_active)
|
|
||||||
thermalManager.babystep_axis(Z_AXIS, -LROUND(diff * planner.axis_steps_per_mm[Z_AXIS]));
|
|
||||||
#else
|
|
||||||
UNUSED(no_babystep);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ENABLED(DELTA) // correct the delta_height
|
|
||||||
delta_height -= diff;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
last_zoffset = zprobe_zoffset;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if HAS_Z_SERVO_ENDSTOP
|
#if HAS_Z_SERVO_ENDSTOP
|
||||||
|
|
||||||
void servo_probe_init() {
|
void servo_probe_init() {
|
||||||
|
|
|
@ -34,7 +34,6 @@ float probe_pt(const float &rx, const float &ry, const bool, const uint8_t, cons
|
||||||
|
|
||||||
#if HAS_BED_PROBE
|
#if HAS_BED_PROBE
|
||||||
extern float zprobe_zoffset;
|
extern float zprobe_zoffset;
|
||||||
void refresh_zprobe_zoffset(const bool no_babystep=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
|
||||||
|
|
Loading…
Reference in a new issue