@ -1300,6 +1300,10 @@ static void setup_for_endstop_move() {
feedrate = oldFeedRate ;
feedrate = oldFeedRate ;
}
}
inline void do_blocking_move_to_xy ( float x , float y ) { do_blocking_move_to ( x , y , current_position [ Z_AXIS ] ) ; }
inline void do_blocking_move_to_x ( float x ) { do_blocking_move_to ( x , current_position [ Y_AXIS ] , current_position [ Z_AXIS ] ) ; }
inline void do_blocking_move_to_z ( float z ) { do_blocking_move_to ( current_position [ X_AXIS ] , current_position [ Y_AXIS ] , z ) ; }
static void clean_up_after_endstop_move ( ) {
static void clean_up_after_endstop_move ( ) {
# ifdef ENDSTOPS_ONLY_FOR_HOMING
# ifdef ENDSTOPS_ONLY_FOR_HOMING
enable_endstops ( false ) ;
enable_endstops ( false ) ;
@ -1408,7 +1412,7 @@ static void setup_for_endstop_move() {
# if Z_RAISE_AFTER_PROBING > 0
# if Z_RAISE_AFTER_PROBING > 0
if ( doRaise ) {
if ( doRaise ) {
do_blocking_move_to ( current_position [ X_AXIS ] , current_position [ Y_AXIS ] , current_position [ Z_AXIS ] + Z_RAISE_AFTER_PROBING ) ; // this also updates current_position
do_blocking_move_to_z ( current_position [ Z_AXIS ] + Z_RAISE_AFTER_PROBING ) ; // this also updates current_position
st_synchronize ( ) ;
st_synchronize ( ) ;
}
}
# endif
# endif
@ -1494,8 +1498,8 @@ static void setup_for_endstop_move() {
// Probe bed height at position (x,y), returns the measured z value
// Probe bed height at position (x,y), returns the measured z value
static float probe_pt ( float x , float y , float z_before , ProbeAction probe_action = ProbeDeployAndStow , int verbose_level = 1 ) {
static float probe_pt ( float x , float y , float z_before , ProbeAction probe_action = ProbeDeployAndStow , int verbose_level = 1 ) {
// Move Z up to the z_before height, then move the probe to the given XY
// Move Z up to the z_before height, then move the probe to the given XY
do_blocking_move_to ( current_position [ X_AXIS ] , current_position [ Y_AXIS ] , z_before ) ; // this also updates current_position
do_blocking_move_to_z ( z_before ) ; // this also updates current_position
do_blocking_move_to ( x - X_PROBE_OFFSET_FROM_EXTRUDER , y - Y_PROBE_OFFSET_FROM_EXTRUDER , current_position [ Z_AXIS ] ) ; // this also updates current_position
do_blocking_move_to_xy ( x - X_PROBE_OFFSET_FROM_EXTRUDER , y - Y_PROBE_OFFSET_FROM_EXTRUDER ) ; // this also updates current_position
# if !defined(Z_PROBE_SLED) && !defined(Z_PROBE_ALLEN_KEY)
# if !defined(Z_PROBE_SLED) && !defined(Z_PROBE_ALLEN_KEY)
if ( probe_action & ProbeDeploy ) deploy_z_probe ( ) ;
if ( probe_action & ProbeDeploy ) deploy_z_probe ( ) ;
@ -1604,20 +1608,18 @@ static void setup_for_endstop_move() {
return ;
return ;
}
}
if ( dock ) {
float oldXpos = current_position [ X_AXIS ] ; // save x position
float oldXpos = current_position [ X_AXIS ] ; // save x position
do_blocking_move_to ( current_position [ X_AXIS ] , current_position [ Y_AXIS ] , current_position [ Z_AXIS ] + Z_RAISE_AFTER_PROBING ) ; // rise Z
if ( dock ) {
do_blocking_move_to ( X_MAX_POS + SLED_DOCKING_OFFSET + offset - 1 , current_position [ Y_AXIS ] , current_position [ Z_AXIS ] ) ; // Dock sled a bit closer to ensure proper capturing
do_blocking_move_to_z ( current_position [ Z_AXIS ] + Z_RAISE_AFTER_PROBING ) ; // raise Z
do_blocking_move_to_x ( X_MAX_POS + SLED_DOCKING_OFFSET + offset - 1 ) ; // Dock sled a bit closer to ensure proper capturing
digitalWrite ( SLED_PIN , LOW ) ; // turn off magnet
digitalWrite ( SLED_PIN , LOW ) ; // turn off magnet
do_blocking_move_to ( oldXpos , current_position [ Y_AXIS ] , current_position [ Z_AXIS ] ) ; // return to position before docking
} else {
} else {
float oldXpos = current_position [ X_AXIS ] ; // save x position
float z_loc = current_position [ Z_AXIS ] ;
float z_loc = current_position [ Z_AXIS ] ;
if ( z_loc < Z_RAISE_BEFORE_PROBING + 5 ) z_loc = Z_RAISE_BEFORE_PROBING ;
if ( z_loc < Z_RAISE_BEFORE_PROBING + 5 ) z_loc = Z_RAISE_BEFORE_PROBING ;
do_blocking_move_to ( X_MAX_POS + SLED_DOCKING_OFFSET + offset , current_position [ Y_AXIS ] , z_loc ) ; // this also updates current_position
do_blocking_move_to ( X_MAX_POS + SLED_DOCKING_OFFSET + offset , current_position [ Y_AXIS ] , z_loc ) ; // this also updates current_position
digitalWrite ( SLED_PIN , HIGH ) ; // turn on magnet
digitalWrite ( SLED_PIN , HIGH ) ; // turn on magnet
do_blocking_move_to ( oldXpos , current_position [ Y_AXIS ] , current_position [ Z_AXIS ] ) ; // return to position before docking
}
}
do_blocking_move_to_x ( oldXpos ) ; // return to position before docking
}
}
# endif // Z_PROBE_SLED
# endif // Z_PROBE_SLED
@ -2744,11 +2746,28 @@ inline void gcode_G28() {
float x_tmp = current_position [ X_AXIS ] + X_PROBE_OFFSET_FROM_EXTRUDER ,
float x_tmp = current_position [ X_AXIS ] + X_PROBE_OFFSET_FROM_EXTRUDER ,
y_tmp = current_position [ Y_AXIS ] + Y_PROBE_OFFSET_FROM_EXTRUDER ,
y_tmp = current_position [ Y_AXIS ] + Y_PROBE_OFFSET_FROM_EXTRUDER ,
z_tmp = current_position [ Z_AXIS ] ,
z_tmp = current_position [ Z_AXIS ] ,
real_z = st_get_position_mm ( Z_AXIS ) ; //get the real Z (since the auto bed leveling is already correcting the plane)
real_z = st_get_position_mm ( Z_AXIS ) ; //get the real Z (since plan_get_position is now correcting the plane)
apply_rotation_xyz ( plan_bed_level_matrix , x_tmp , y_tmp , z_tmp ) ; // Apply the correction sending the probe offset
apply_rotation_xyz ( plan_bed_level_matrix , x_tmp , y_tmp , z_tmp ) ; // Apply the correction sending the probe offset
//line below controls z probe offset, zprobe_zoffset is the actual offset that can be modified via m851 or is read from EEPROM
current_position [ Z_AXIS ] = z_tmp - real_z - zprobe_zoffset ; // The difference is added to current position and sent to planner.
// Get the current Z position and send it to the planner.
//
// >> (z_tmp - real_z) : The rotated current Z minus the uncorrected Z (most recent plan_set_position/sync_plan_position)
//
// >> zprobe_zoffset : Z distance from nozzle to probe (set by default, M851, EEPROM, or Menu)
//
// >> Z_RAISE_AFTER_PROBING : The distance the probe will have lifted after the last probe
//
// >> Should home_offset[Z_AXIS] be included?
//
// Discussion: home_offset[Z_AXIS] was applied in G28 to set the starting Z.
// If Z is not tweaked in G29 -and- the Z probe in G29 is not actually "homing" Z...
// then perhaps it should not be included here. The purpose of home_offset[] is to
// adjust for inaccurate endstops, not for reasonably accurate probes. If it were
// added here, it could be seen as a compensating factor for the Z probe.
//
current_position [ Z_AXIS ] = - zprobe_zoffset + Z_RAISE_AFTER_PROBING + ( z_tmp - real_z ) ;
// current_position[Z_AXIS] += home_offset[Z_AXIS]; // The probe determines Z=0, not "Z home"
sync_plan_position ( ) ;
sync_plan_position ( ) ;
}
}
# endif // !DELTA
# endif // !DELTA
@ -4542,8 +4561,7 @@ inline void gcode_M400() { st_synchronize(); }
void raise_z_for_servo ( ) {
void raise_z_for_servo ( ) {
float zpos = current_position [ Z_AXIS ] , z_dest = Z_RAISE_BEFORE_HOMING ;
float zpos = current_position [ Z_AXIS ] , z_dest = Z_RAISE_BEFORE_HOMING ;
z_dest + = axis_known_position [ Z_AXIS ] ? zprobe_zoffset : zpos ;
z_dest + = axis_known_position [ Z_AXIS ] ? zprobe_zoffset : zpos ;
if ( zpos < z_dest )
if ( zpos < z_dest ) do_blocking_move_to_z ( z_dest ) ; // also updates current_position
do_blocking_move_to ( current_position [ X_AXIS ] , current_position [ Y_AXIS ] , z_dest ) ; // also updates current_position
}
}
# endif
# endif