Trinamic steppers Homing Phase (#17299)

This commit is contained in:
Fabio Santos
2020-04-20 06:08:00 -07:00
committed by GitHub
parent cba58b1027
commit ccfd5c1010
3 changed files with 104 additions and 8 deletions

View File

@ -1483,6 +1483,80 @@ void set_axis_not_trusted(const AxisEnum axis) {
#endif
}
/**
* Move the axis back to its home_phase if set and driver is capable (TMC)
*
* Improves homing repeatability by homing to stepper coil's nearest absolute
* phase position. Trinamic drivers use a stepper phase table with 1024 values
* spanning 4 full steps with 256 positions each (ergo, 1024 positions).
*/
void backout_to_tmc_homing_phase(const AxisEnum axis) {
#ifdef TMC_HOME_PHASE
const abc_long_t home_phase = TMC_HOME_PHASE;
// check if home phase is disabled for this axis.
if (home_phase[axis] < 0) return;
int16_t axisMicrostepSize;
int16_t phaseCurrent;
bool invertDir;
switch (axis) {
#ifdef X_MICROSTEPS
case X_AXIS:
axisMicrostepSize = 256 / (X_MICROSTEPS);
phaseCurrent = stepperX.get_microstep_counter();
invertDir = INVERT_X_DIR;
break;
#endif
#ifdef Y_MICROSTEPS
case Y_AXIS:
axisMicrostepSize = 256 / (Y_MICROSTEPS);
phaseCurrent = stepperY.get_microstep_counter();
invertDir = INVERT_Y_DIR;
break;
#endif
#ifdef Z_MICROSTEPS
case Z_AXIS:
axisMicrostepSize = 256 / (Z_MICROSTEPS);
phaseCurrent = stepperZ.get_microstep_counter();
invertDir = INVERT_Z_DIR;
break;
#endif
default: return;
}
// Depending on invert dir measure the distance to nearest home phase.
int16_t phaseDelta = (invertDir ? -1 : 1) * (home_phase[axis] - phaseCurrent);
// Check if home distance within endstop assumed repeatability noise of .05mm and warn.
if (ABS(phaseDelta) * planner.steps_to_mm[axis] / axisMicrostepSize < 0.05f)
DEBUG_ECHOLNPAIR("Selected home phase ", home_phase[axis],
" too close to endstop trigger phase ", phaseCurrent,
". Pick a different phase for ", axis_codes[axis]);
// Skip to next if target position is behind current. So it only moves away from endstop.
if (phaseDelta < 0) phaseDelta += 1024;
// Get the integer µsteps to target. Unreachable phase? Consistently stop at the µstep before / after based on invertDir.
const float mmDelta = -(int16_t(phaseDelta / axisMicrostepSize) * planner.steps_to_mm[axis] * (Z_HOME_DIR));
// optional debug messages.
if (DEBUGGING(LEVELING)) {
DEBUG_ECHOLNPAIR(
"Endstop ", axis_codes[axis], " hit at Phase:", phaseCurrent,
" Delta:", phaseDelta, " Distance:", mmDelta
);
}
if (mmDelta != 0) {
// retrace by the amount computed in mmDelta.
do_homing_move(axis, mmDelta, get_homing_bump_feedrate(axis));
}
#endif
}
/**
* Home an individual "raw axis" to its endstop.
* This applies to XYZ on Cartesian and Core robots, and
@ -1742,6 +1816,9 @@ void homeaxis(const AxisEnum axis) {
}
#endif
// move back to homing phase if configured and capable
backout_to_tmc_homing_phase(axis);
#if IS_SCARA
set_axis_is_at_home(axis);
@ -1753,10 +1830,13 @@ void homeaxis(const AxisEnum axis) {
// so here it re-homes each tower in turn.
// Delta homing treats the axes as normal linear axes.
// retrace by the amount specified in delta_endstop_adj + additional dist in order to have minimum steps
if (delta_endstop_adj[axis] * Z_HOME_DIR <= 0) {
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("delta_endstop_adj:");
do_homing_move(axis, delta_endstop_adj[axis] - (MIN_STEPS_PER_SEGMENT + 1) * planner.steps_to_mm[axis] * Z_HOME_DIR);
const float adjDistance = delta_endstop_adj[axis],
minDistance = (MIN_STEPS_PER_SEGMENT) * planner.steps_to_mm[axis];
// Retrace by the amount specified in delta_endstop_adj if more than min steps.
if (adjDistance * (Z_HOME_DIR) < 0 && ABS(adjDistance) > minDistance) { // away from endstop, more than min distance
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("adjDistance:", adjDistance);
do_homing_move(axis, adjDistance, get_homing_bump_feedrate(axis));
}
#else // CARTESIAN / CORE