Improved backlash compensation for Hibiscus (T2220)

master
Marcio Teixeira 6 years ago
parent 35763f53f4
commit f762f5e501

@ -13,7 +13,7 @@
* got disabled. * got disabled.
*/ */
#define LULZBOT_FW_VERSION ".42" // Change this with each update #define LULZBOT_FW_VERSION ".47" // Change this with each update
#if ( \ #if ( \
!defined(LULZBOT_Gladiola_Mini) && \ !defined(LULZBOT_Gladiola_Mini) && \
@ -1622,6 +1622,7 @@
void gcode_G29_with_retry() { \ void gcode_G29_with_retry() { \
set_bed_leveling_enabled(false); \ set_bed_leveling_enabled(false); \
for(uint8_t i = 0; i < LULZBOT_NUM_REWIPES; i++) { \ for(uint8_t i = 0; i < LULZBOT_NUM_REWIPES; i++) { \
LULZBOT_BACKLASH_MEASUREMENT_START \
LULZBOT_ENABLE_PROBE_PINS(true); \ LULZBOT_ENABLE_PROBE_PINS(true); \
gcode_G29(); \ gcode_G29(); \
LULZBOT_ENABLE_PROBE_PINS(false); \ LULZBOT_ENABLE_PROBE_PINS(false); \
@ -1704,8 +1705,10 @@
/****************************** BACKLASH COMPENSATION **************************/ /****************************** BACKLASH COMPENSATION **************************/
#if defined(LULZBOT_USE_Z_BACKLASH_COMPENSATION) #if defined(LULZBOT_USE_Z_BACKLASH_COMPENSATION)
#define LULZBOT_BACKLASH_MEASUREMENT_RESOLUTION 0.005 #define LULZBOT_BACKLASH_MEASUREMENT_RESOLUTION 0.005
#define LULZBOT_BACKLASH_MEASUREMENT_LIMIT 0.5 #define LULZBOT_BACKLASH_MEASUREMENT_LIMIT 0.5
#define LULZBOT_BACKLASH_SMOOTHING_DISTANCE 1500
#if ENABLED(LULZBOT_Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) #if ENABLED(LULZBOT_Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN)
#if defined(LULZBOT_Z_MIN_ENDSTOP_INVERTING) #if defined(LULZBOT_Z_MIN_ENDSTOP_INVERTING)
@ -1721,9 +1724,9 @@
#endif #endif
#endif #endif
#define LULZBOT_BACKLASH_MEASUREMENT_DECL int32_t z_backlash_steps = 0; #define LULZBOT_BACKLASH_MEASUREMENT_DECL int32_t z_backlash_steps;
#define LULZBOT_BACKLASH_MEASUREMENT_EXTERN extern int32_t z_backlash_steps; #define LULZBOT_BACKLASH_MEASUREMENT_EXTERN extern int32_t z_backlash_steps;
#define LULZBOT_BACKLASH_MEASUREMENT_START z_backlash_steps = LULZBOT_BACKLASH_MEASUREMENT_LIMIT * planner.axis_steps_per_mm[Z_AXIS]; #define LULZBOT_BACKLASH_MEASUREMENT_START z_backlash_steps = 0;
#define LULZBOT_BACKLASH_MEASUREMENT \ #define LULZBOT_BACKLASH_MEASUREMENT \
{ \ { \
@ -1733,27 +1736,36 @@
do_blocking_move_to_z(current_position[Z_AXIS] + LULZBOT_BACKLASH_MEASUREMENT_RESOLUTION, MMM_TO_MMS(Z_PROBE_SPEED_SLOW)); \ do_blocking_move_to_z(current_position[Z_AXIS] + LULZBOT_BACKLASH_MEASUREMENT_RESOLUTION, MMM_TO_MMS(Z_PROBE_SPEED_SLOW)); \
} \ } \
const float measured_backlash_mm = current_position[Z_AXIS] - start_height; \ const float measured_backlash_mm = current_position[Z_AXIS] - start_height; \
/* Take the minimum backlash from all four corners, as we can only compensate for the shared amount */ \ /* Average the backlash from all four corners */ \
z_backlash_steps = min(z_backlash_steps, measured_backlash_mm * planner.axis_steps_per_mm[Z_AXIS]); \ z_backlash_steps += 0.25 * measured_backlash_mm * planner.axis_steps_per_mm[Z_AXIS]; \
} }
#define LULZBOT_BACKLASH_COMPENSATION \ #define LULZBOT_BACKLASH_COMPENSATION \
{ \ { \
static bool last_z_direction; \ static bool last_z_direction; \
static bool is_correction = false; \ static int32_t residual_z_error = 0; \
if(!is_correction && planner.leveling_active) { \ if(planner.leveling_active) { \
const bool new_z_direction = TEST(dm, Z_AXIS); \ if(dc != 0) { \
/* When Z changes direction, insert backlash correction */ \ const bool new_z_direction = TEST(dm, Z_AXIS); \
if((last_z_direction != new_z_direction) && (dc != 0)) { \ /* When Z changes direction, add backlash correction to residual_z_error, \
last_z_direction = new_z_direction; \ * to be compensated over one or more subsequent segments */ \
int32_t saved_position[NUM_AXIS], tweaked_position[XYZE]; \ if(last_z_direction != new_z_direction) { \
COPY( saved_position, position); \ last_z_direction = new_z_direction; \
COPY(tweaked_position, position); \ if(dc < 0) { \
tweaked_position[Z_AXIS] += dc < 0 ? -z_backlash_steps : z_backlash_steps; \ residual_z_error -= z_backlash_steps; \
is_correction = true; /* Avoid infinite recursion */ \ } else { \
_buffer_steps(tweaked_position, fr_mm_s, extruder); \ residual_z_error += z_backlash_steps; \
is_correction = false; \ } \
COPY(position, saved_position); \ } \
/* Take up a portion of the residual_z_error in this segment, but \
* only when the current segment travels along Z in the same \
* direction as the residual error */ \
if((dc > 0 && residual_z_error > 0) || (dc < 0 && residual_z_error < 0)) { \
const float segment_len = sqrt(da*da+db*db); \
const int32_t z_adj = residual_z_error * min(1.0, segment_len / LULZBOT_BACKLASH_SMOOTHING_DISTANCE); \
dc += z_adj; \
residual_z_error -= z_adj; \
} \
} \ } \
} \ } \
} }

@ -11827,7 +11827,6 @@ void process_parsed_command(
#if HAS_LEVELING #if HAS_LEVELING
case 29: // G29 Detailed Z probe, probes the bed at 3 or more points, case 29: // G29 Detailed Z probe, probes the bed at 3 or more points,
// or provides access to the UBL System if enabled. // or provides access to the UBL System if enabled.
LULZBOT_BACKLASH_MEASUREMENT_START
#if defined(LULZBOT_G29_COMMAND) #if defined(LULZBOT_G29_COMMAND)
LULZBOT_G29_COMMAND LULZBOT_G29_COMMAND
#else #else

@ -720,9 +720,15 @@ void Planner::check_axes_activity() {
*/ */
void Planner::_buffer_steps(const int32_t (&target)[XYZE], float fr_mm_s, const uint8_t extruder) { void Planner::_buffer_steps(const int32_t (&target)[XYZE], float fr_mm_s, const uint8_t extruder) {
#if defined(LULZBOT_USE_Z_BACKLASH_COMPENSATION)
int32_t da = target[X_AXIS] - position[X_AXIS],
db = target[Y_AXIS] - position[Y_AXIS],
dc = target[Z_AXIS] - position[Z_AXIS];
#else
const int32_t da = target[X_AXIS] - position[X_AXIS], const int32_t da = target[X_AXIS] - position[X_AXIS],
db = target[Y_AXIS] - position[Y_AXIS], db = target[Y_AXIS] - position[Y_AXIS],
dc = target[Z_AXIS] - position[Z_AXIS]; dc = target[Z_AXIS] - position[Z_AXIS];
#endif
int32_t de = target[E_AXIS] - position[E_AXIS]; int32_t de = target[E_AXIS] - position[E_AXIS];

Loading…
Cancel
Save