Browse Source

Limited backlash editing with Core kinematics (#17281)

Scott Lahteine 5 years ago
parent
commit
53fe572bbd
No account linked to committer's email address

+ 8
- 12
Marlin/src/gcode/calibrate/G28.cpp View File

@@ -255,28 +255,28 @@ void GcodeSuite::G28() {
255 255
   #define HAS_HOMING_CURRENT (HAS_CURRENT_HOME(X) || HAS_CURRENT_HOME(X2) || HAS_CURRENT_HOME(Y) || HAS_CURRENT_HOME(Y2))
256 256
 
257 257
   #if HAS_HOMING_CURRENT
258
-    auto debug_current = [](const char * const s, const int16_t a, const int16_t b){
259
-      DEBUG_ECHO(s); DEBUG_ECHOLNPAIR(" current: ", a, " -> ", b);
258
+    auto debug_current = [](PGM_P const s, const int16_t a, const int16_t b){
259
+      serialprintPGM(s); DEBUG_ECHOLNPAIR(" current: ", a, " -> ", b);
260 260
     };
261 261
     #if HAS_CURRENT_HOME(X)
262 262
       const int16_t tmc_save_current_X = stepperX.getMilliamps();
263 263
       stepperX.rms_current(X_CURRENT_HOME);
264
-      if (DEBUGGING(LEVELING)) debug_current("X", tmc_save_current_X, X_CURRENT_HOME);
264
+      if (DEBUGGING(LEVELING)) debug_current(PSTR("X"), tmc_save_current_X, X_CURRENT_HOME);
265 265
     #endif
266 266
     #if HAS_CURRENT_HOME(X2)
267 267
       const int16_t tmc_save_current_X2 = stepperX2.getMilliamps();
268 268
       stepperX2.rms_current(X2_CURRENT_HOME);
269
-      if (DEBUGGING(LEVELING)) debug_current("X2", tmc_save_current_X2, X2_CURRENT_HOME);
269
+      if (DEBUGGING(LEVELING)) debug_current(PSTR("X2"), tmc_save_current_X2, X2_CURRENT_HOME);
270 270
     #endif
271 271
     #if HAS_CURRENT_HOME(Y)
272 272
       const int16_t tmc_save_current_Y = stepperY.getMilliamps();
273 273
       stepperY.rms_current(Y_CURRENT_HOME);
274
-      if (DEBUGGING(LEVELING)) debug_current("Y", tmc_save_current_Y, Y_CURRENT_HOME);
274
+      if (DEBUGGING(LEVELING)) debug_current(PSTR("Y"), tmc_save_current_Y, Y_CURRENT_HOME);
275 275
     #endif
276 276
     #if HAS_CURRENT_HOME(Y2)
277 277
       const int16_t tmc_save_current_Y2 = stepperY2.getMilliamps();
278 278
       stepperY2.rms_current(Y2_CURRENT_HOME);
279
-      if (DEBUGGING(LEVELING)) debug_current("Y2", tmc_save_current_Y2, Y2_CURRENT_HOME);
279
+      if (DEBUGGING(LEVELING)) debug_current(PSTR("Y2"), tmc_save_current_Y2, Y2_CURRENT_HOME);
280 280
     #endif
281 281
   #endif
282 282
 
@@ -345,12 +345,8 @@ void GcodeSuite::G28() {
345 345
     #endif
346 346
 
347 347
     // Home Y (before X)
348
-    #if ENABLED(HOME_Y_BEFORE_X)
349
-
350
-      if (doY || (doX && ENABLED(CODEPENDENT_XY_HOMING)))
351
-        homeaxis(Y_AXIS);
352
-
353
-    #endif
348
+    if (ENABLED(HOME_Y_BEFORE_X) && (doY || (ENABLED(CODEPENDENT_XY_HOMING) && doX)))
349
+      homeaxis(Y_AXIS);
354 350
 
355 351
     // Home X
356 352
     if (doX || (doY && ENABLED(CODEPENDENT_XY_HOMING) && DISABLED(HOME_Y_BEFORE_X))) {

+ 85
- 59
Marlin/src/gcode/calibrate/G425.cpp View File

@@ -37,6 +37,21 @@
37 37
 #include "../../module/endstops.h"
38 38
 #include "../../feature/bedlevel/bedlevel.h"
39 39
 
40
+#if !AXIS_CAN_CALIBRATE(X)
41
+  #undef CALIBRATION_MEASURE_LEFT
42
+  #undef CALIBRATION_MEASURE_RIGHT
43
+#endif
44
+
45
+#if !AXIS_CAN_CALIBRATE(Y)
46
+  #undef CALIBRATION_MEASURE_FRONT
47
+  #undef CALIBRATION_MEASURE_BACK
48
+#endif
49
+
50
+#if !AXIS_CAN_CALIBRATE(Z)
51
+  #undef CALIBRATION_MEASURE_AT_TOP_EDGES
52
+#endif
53
+
54
+
40 55
 /**
41 56
  * G425 backs away from the calibration object by various distances
42 57
  * depending on the confidence level:
@@ -207,42 +222,52 @@ inline float measure(const AxisEnum axis, const int dir, const bool stop_state,
207 222
 inline void probe_side(measurements_t &m, const float uncertainty, const side_t side, const bool probe_top_at_edge=false) {
208 223
   const xyz_float_t dimensions = CALIBRATION_OBJECT_DIMENSIONS;
209 224
   AxisEnum axis;
210
-  float dir;
225
+  float dir = 1;
211 226
 
212 227
   park_above_object(m, uncertainty);
213 228
 
214 229
   switch (side) {
215
-    case TOP: {
216
-      const float measurement = measure(Z_AXIS, -1, true, &m.backlash[TOP], uncertainty);
217
-      m.obj_center.z = measurement - dimensions.z / 2;
218
-      m.obj_side[TOP] = measurement;
219
-      return;
220
-    }
221
-    case RIGHT: axis = X_AXIS; dir = -1; break;
222
-    case FRONT: axis = Y_AXIS; dir =  1; break;
223
-    case LEFT:  axis = X_AXIS; dir =  1; break;
224
-    case BACK:  axis = Y_AXIS; dir = -1; break;
230
+    #if AXIS_CAN_CALIBRATE(Z)
231
+      case TOP: {
232
+        const float measurement = measure(Z_AXIS, -1, true, &m.backlash[TOP], uncertainty);
233
+        m.obj_center.z = measurement - dimensions.z / 2;
234
+        m.obj_side[TOP] = measurement;
235
+        return;
236
+      }
237
+    #endif
238
+    #if AXIS_CAN_CALIBRATE(X)
239
+      case LEFT:  axis = X_AXIS; break;
240
+      case RIGHT: axis = X_AXIS; dir = -1; break;
241
+    #endif
242
+    #if AXIS_CAN_CALIBRATE(Y)
243
+      case FRONT: axis = Y_AXIS; break;
244
+      case BACK:  axis = Y_AXIS; dir = -1; break;
245
+    #endif
225 246
     default: return;
226 247
   }
227 248
 
228 249
   if (probe_top_at_edge) {
229
-    // Probe top nearest the side we are probing
230
-    current_position[axis] = m.obj_center[axis] + (-dir) * (dimensions[axis] / 2 - m.nozzle_outer_dimension[axis]);
231
-    calibration_move();
232
-    m.obj_side[TOP] = measure(Z_AXIS, -1, true, &m.backlash[TOP], uncertainty);
233
-    m.obj_center.z = m.obj_side[TOP] - dimensions.z / 2;
250
+    #if AXIS_CAN_CALIBRATE(Z)
251
+      // Probe top nearest the side we are probing
252
+      current_position[axis] = m.obj_center[axis] + (-dir) * (dimensions[axis] / 2 - m.nozzle_outer_dimension[axis]);
253
+      calibration_move();
254
+      m.obj_side[TOP] = measure(Z_AXIS, -1, true, &m.backlash[TOP], uncertainty);
255
+      m.obj_center.z = m.obj_side[TOP] - dimensions.z / 2;
256
+    #endif
234 257
   }
235 258
 
236
-  // Move to safe distance to the side of the calibration object
237
-  current_position[axis] = m.obj_center[axis] + (-dir) * (dimensions[axis] / 2 + m.nozzle_outer_dimension[axis] / 2 + uncertainty);
238
-  calibration_move();
259
+  if (AXIS_CAN_CALIBRATE(X) && axis == X_AXIS || AXIS_CAN_CALIBRATE(Y) && axis == Y_AXIS) {
260
+    // Move to safe distance to the side of the calibration object
261
+    current_position[axis] = m.obj_center[axis] + (-dir) * (dimensions[axis] / 2 + m.nozzle_outer_dimension[axis] / 2 + uncertainty);
262
+    calibration_move();
239 263
 
240
-  // Plunge below the side of the calibration object and measure
241
-  current_position.z = m.obj_side[TOP] - CALIBRATION_NOZZLE_TIP_HEIGHT * 0.7;
242
-  calibration_move();
243
-  const float measurement = measure(axis, dir, true, &m.backlash[side], uncertainty);
244
-  m.obj_center[axis] = measurement + dir * (dimensions[axis] / 2 + m.nozzle_outer_dimension[axis] / 2);
245
-  m.obj_side[side] = measurement;
264
+    // Plunge below the side of the calibration object and measure
265
+    current_position.z = m.obj_side[TOP] - (CALIBRATION_NOZZLE_TIP_HEIGHT) * 0.7f;
266
+    calibration_move();
267
+    const float measurement = measure(axis, dir, true, &m.backlash[side], uncertainty);
268
+    m.obj_center[axis] = measurement + dir * (dimensions[axis] / 2 + m.nozzle_outer_dimension[axis] / 2);
269
+    m.obj_side[side] = measurement;
270
+  }
246 271
 }
247 272
 
248 273
 /**
@@ -252,7 +277,7 @@ inline void probe_side(measurements_t &m, const float uncertainty, const side_t
252 277
  *   uncertainty        in     - How far away from the calibration object to begin probing
253 278
  */
254 279
 inline void probe_sides(measurements_t &m, const float uncertainty) {
255
-  #ifdef CALIBRATION_MEASURE_AT_TOP_EDGES
280
+  #if ENABLED(CALIBRATION_MEASURE_AT_TOP_EDGES)
256 281
     constexpr bool probe_top_at_edge = true;
257 282
   #else
258 283
     // Probing at the exact center only works if the center is flat. Probing on a washer
@@ -261,18 +286,18 @@ inline void probe_sides(measurements_t &m, const float uncertainty) {
261 286
     probe_side(m, uncertainty, TOP);
262 287
   #endif
263 288
 
264
-  #ifdef CALIBRATION_MEASURE_RIGHT
289
+  #if ENABLED(CALIBRATION_MEASURE_RIGHT)
265 290
     probe_side(m, uncertainty, RIGHT, probe_top_at_edge);
266 291
   #endif
267 292
 
268
-  #ifdef CALIBRATION_MEASURE_FRONT
293
+  #if ENABLED(CALIBRATION_MEASURE_FRONT)
269 294
     probe_side(m, uncertainty, FRONT, probe_top_at_edge);
270 295
   #endif
271 296
 
272
-  #ifdef CALIBRATION_MEASURE_LEFT
297
+  #if ENABLED(CALIBRATION_MEASURE_LEFT)
273 298
     probe_side(m, uncertainty, LEFT,  probe_top_at_edge);
274 299
   #endif
275
-  #ifdef CALIBRATION_MEASURE_BACK
300
+  #if ENABLED(CALIBRATION_MEASURE_BACK)
276 301
     probe_side(m, uncertainty, BACK,  probe_top_at_edge);
277 302
   #endif
278 303
 
@@ -313,7 +338,9 @@ inline void probe_sides(measurements_t &m, const float uncertainty) {
313 338
 #if ENABLED(CALIBRATION_REPORTING)
314 339
   inline void report_measured_faces(const measurements_t &m) {
315 340
     SERIAL_ECHOLNPGM("Sides:");
316
-    SERIAL_ECHOLNPAIR("  Top: ", m.obj_side[TOP]);
341
+    #if AXIS_CAN_CALIBRATE(Z)
342
+      SERIAL_ECHOLNPAIR("  Top: ", m.obj_side[TOP]);
343
+    #endif
317 344
     #if ENABLED(CALIBRATION_MEASURE_LEFT)
318 345
       SERIAL_ECHOLNPAIR("  Left: ", m.obj_side[LEFT]);
319 346
     #endif
@@ -343,19 +370,25 @@ inline void probe_sides(measurements_t &m, const float uncertainty) {
343 370
 
344 371
   inline void report_measured_backlash(const measurements_t &m) {
345 372
     SERIAL_ECHOLNPGM("Backlash:");
346
-    #if ENABLED(CALIBRATION_MEASURE_LEFT)
347
-      SERIAL_ECHOLNPAIR("  Left: ", m.backlash[LEFT]);
348
-    #endif
349
-    #if ENABLED(CALIBRATION_MEASURE_RIGHT)
350
-      SERIAL_ECHOLNPAIR("  Right: ", m.backlash[RIGHT]);
373
+    #if AXIS_CAN_CALIBRATE(X)
374
+      #if ENABLED(CALIBRATION_MEASURE_LEFT)
375
+        SERIAL_ECHOLNPAIR("  Left: ", m.backlash[LEFT]);
376
+      #endif
377
+      #if ENABLED(CALIBRATION_MEASURE_RIGHT)
378
+        SERIAL_ECHOLNPAIR("  Right: ", m.backlash[RIGHT]);
379
+      #endif
351 380
     #endif
352
-    #if ENABLED(CALIBRATION_MEASURE_FRONT)
353
-      SERIAL_ECHOLNPAIR("  Front: ", m.backlash[FRONT]);
381
+    #if AXIS_CAN_CALIBRATE(Y)
382
+      #if ENABLED(CALIBRATION_MEASURE_FRONT)
383
+        SERIAL_ECHOLNPAIR("  Front: ", m.backlash[FRONT]);
384
+      #endif
385
+      #if ENABLED(CALIBRATION_MEASURE_BACK)
386
+        SERIAL_ECHOLNPAIR("  Back: ", m.backlash[BACK]);
387
+      #endif
354 388
     #endif
355
-    #if ENABLED(CALIBRATION_MEASURE_BACK)
356
-      SERIAL_ECHOLNPAIR("  Back: ", m.backlash[BACK]);
389
+    #if AXIS_CAN_CALIBRATE(Z)
390
+      SERIAL_ECHOLNPAIR("  Top: ", m.backlash[TOP]);
357 391
     #endif
358
-    SERIAL_ECHOLNPAIR("  Top: ", m.backlash[TOP]);
359 392
     SERIAL_EOL();
360 393
   }
361 394
 
@@ -369,7 +402,7 @@ inline void probe_sides(measurements_t &m, const float uncertainty) {
369 402
     #if HAS_Y_CENTER
370 403
       SERIAL_ECHOLNPAIR_P(SP_Y_STR, m.pos_error.y);
371 404
     #endif
372
-    SERIAL_ECHOLNPAIR_P(SP_Z_STR, m.pos_error.z);
405
+    if (AXIS_CAN_CALIBRATE(Z)) SERIAL_ECHOLNPAIR_P(SP_Z_STR, m.pos_error.z);
373 406
     SERIAL_EOL();
374 407
   }
375 408
 
@@ -417,6 +450,7 @@ inline void calibrate_backlash(measurements_t &m, const float uncertainty) {
417 450
     probe_sides(m, uncertainty);
418 451
 
419 452
     #if ENABLED(BACKLASH_GCODE)
453
+
420 454
       #if HAS_X_CENTER
421 455
         backlash.distance_mm.x = (m.backlash[LEFT] + m.backlash[RIGHT]) / 2;
422 456
       #elif ENABLED(CALIBRATION_MEASURE_LEFT)
@@ -433,18 +467,18 @@ inline void calibrate_backlash(measurements_t &m, const float uncertainty) {
433 467
         backlash.distance_mm.y = m.backlash[BACK];
434 468
       #endif
435 469
 
436
-      backlash.distance_mm.z = m.backlash[TOP];
470
+      if (AXIS_CAN_CALIBRATE(Z)) backlash.distance_mm.z = m.backlash[TOP];
437 471
     #endif
438 472
   }
439 473
 
440 474
   #if ENABLED(BACKLASH_GCODE)
441 475
     // Turn on backlash compensation and move in all
442
-    // directions to take up any backlash
476
+    // allowed directions to take up any backlash
443 477
     {
444 478
       // New scope for TEMPORARY_BACKLASH_CORRECTION
445 479
       TEMPORARY_BACKLASH_CORRECTION(all_on);
446 480
       TEMPORARY_BACKLASH_SMOOTHING(0.0f);
447
-      const xyz_float_t move = { 3, 3, 3 };
481
+      const xyz_float_t move = { AXIS_CAN_CALIBRATE(X) * 3, AXIS_CAN_CALIBRATE(Y) * 3, AXIS_CAN_CALIBRATE(Z) * 3 };
448 482
       current_position += move; calibration_move();
449 483
       current_position -= move; calibration_move();
450 484
     }
@@ -482,26 +516,18 @@ inline void calibrate_toolhead(measurements_t &m, const float uncertainty, const
482 516
 
483 517
   // Adjust the hotend offset
484 518
   #if HAS_HOTEND_OFFSET
485
-    #if HAS_X_CENTER
486
-      hotend_offset[extruder].x += m.pos_error.x;
487
-    #endif
488
-    #if HAS_Y_CENTER
489
-      hotend_offset[extruder].y += m.pos_error.y;
490
-    #endif
491
-    hotend_offset[extruder].z += m.pos_error.z;
519
+    if (ENABLED(HAS_X_CENTER) && AXIS_CAN_CALIBRATE(X)) hotend_offset[extruder].x += m.pos_error.x;
520
+    if (ENABLED(HAS_Y_CENTER) && AXIS_CAN_CALIBRATE(Y)) hotend_offset[extruder].y += m.pos_error.y;
521
+                             if (AXIS_CAN_CALIBRATE(Z)) hotend_offset[extruder].z += m.pos_error.z;
492 522
     normalize_hotend_offsets();
493 523
   #endif
494 524
 
495 525
   // Correct for positional error, so the object
496 526
   // is at the known actual spot
497 527
   planner.synchronize();
498
-  #if HAS_X_CENTER
499
-    update_measurements(m, X_AXIS);
500
-  #endif
501
-  #if HAS_Y_CENTER
502
-    update_measurements(m, Y_AXIS);
503
-  #endif
504
-  update_measurements(m, Z_AXIS);
528
+  if (ENABLED(HAS_X_CENTER) && AXIS_CAN_CALIBRATE(X)) update_measurements(m, X_AXIS);
529
+  if (ENABLED(HAS_Y_CENTER) && AXIS_CAN_CALIBRATE(Y)) update_measurements(m, Y_AXIS);
530
+                           if (AXIS_CAN_CALIBRATE(Z)) update_measurements(m, Z_AXIS);
505 531
 
506 532
   sync_plan_position();
507 533
 }

+ 3
- 3
Marlin/src/gcode/calibrate/M425.cpp View File

@@ -47,7 +47,7 @@ void GcodeSuite::M425() {
47 47
   bool noArgs = true;
48 48
 
49 49
   LOOP_XYZ(a) {
50
-    if (parser.seen(XYZ_CHAR(a))) {
50
+    if (CAN_CALIBRATE(a) && parser.seen(XYZ_CHAR(a))) {
51 51
       planner.synchronize();
52 52
       backlash.distance_mm[a] = parser.has_value() ? parser.value_linear_units() : backlash.get_measurement(AxisEnum(a));
53 53
       noArgs = false;
@@ -74,7 +74,7 @@ void GcodeSuite::M425() {
74 74
     SERIAL_ECHOLNPGM("active:");
75 75
     SERIAL_ECHOLNPAIR("  Correction Amount/Fade-out:     F", backlash.get_correction(), " (F1.0 = full, F0.0 = none)");
76 76
     SERIAL_ECHOPGM("  Backlash Distance (mm):        ");
77
-    LOOP_XYZ(a) {
77
+    LOOP_XYZ(a) if (CAN_CALIBRATE(a)) {
78 78
       SERIAL_CHAR(' ', XYZ_CHAR(a));
79 79
       SERIAL_ECHO(backlash.distance_mm[a]);
80 80
       SERIAL_EOL();
@@ -87,7 +87,7 @@ void GcodeSuite::M425() {
87 87
     #if ENABLED(MEASURE_BACKLASH_WHEN_PROBING)
88 88
       SERIAL_ECHOPGM("  Average measured backlash (mm):");
89 89
       if (backlash.has_any_measurement()) {
90
-        LOOP_XYZ(a) if (backlash.has_measurement(AxisEnum(a))) {
90
+        LOOP_XYZ(a) if (CAN_CALIBRATE(a) && backlash.has_measurement(AxisEnum(a))) {
91 91
           SERIAL_CHAR(' ', XYZ_CHAR(a));
92 92
           SERIAL_ECHO(backlash.get_measurement(AxisEnum(a)));
93 93
         }

+ 13
- 0
Marlin/src/inc/Conditionals_post.h View File

@@ -139,6 +139,19 @@
139 139
   #define CORESIGN(n) (ANY(COREYX, COREZX, COREZY) ? (-(n)) : (n))
140 140
 #endif
141 141
 
142
+// Calibration codes only for non-core axes
143
+#if EITHER(BACKLASH_GCODE, CALIBRATION_GCODE)
144
+  #if IS_CORE
145
+    #define X_AXIS_INDEX 0
146
+    #define Y_AXIS_INDEX 1
147
+    #define Z_AXIS_INDEX 2
148
+    #define CAN_CALIBRATE(A,B) (A##_AXIS_INDEX == B##_INDEX)
149
+  #else
150
+    #define CAN_CALIBRATE(...) 1
151
+  #endif
152
+#endif
153
+#define AXIS_CAN_CALIBRATE(A) CAN_CALIBRATE(A,NORMAL_AXIS)
154
+
142 155
 /**
143 156
  * No adjustable bed on non-cartesians
144 157
  */

+ 2
- 1
Marlin/src/inc/MarlinConfig.h View File

@@ -35,11 +35,12 @@
35 35
 #include "Conditionals_post.h"
36 36
 #include HAL_PATH(../HAL, inc/Conditionals_post.h)
37 37
 
38
+#include "../core/types.h"  // Ahead of sanity-checks
39
+
38 40
 #include "SanityCheck.h"
39 41
 #include HAL_PATH(../HAL, inc/SanityCheck.h)
40 42
 
41 43
 // Include all core headers
42
-#include "../core/types.h"
43 44
 #include "../core/language.h"
44 45
 #include "../core/utility.h"
45 46
 #include "../core/serial.h"

+ 3
- 3
Marlin/src/lcd/menu/menu_backlash.cpp View File

@@ -39,9 +39,9 @@ void menu_backlash() {
39 39
   EDIT_ITEM_FAST(percent, MSG_BACKLASH_CORRECTION, &backlash.correction, all_off, all_on);
40 40
 
41 41
   #define EDIT_BACKLASH_DISTANCE(N) EDIT_ITEM_FAST(float43, MSG_BACKLASH_##N, &backlash.distance_mm[_AXIS(N)], 0.0f, 9.9f);
42
-  EDIT_BACKLASH_DISTANCE(A);
43
-  EDIT_BACKLASH_DISTANCE(B);
44
-  EDIT_BACKLASH_DISTANCE(C);
42
+  if (AXIS_CAN_CALIBRATE(A)) EDIT_BACKLASH_DISTANCE(A);
43
+  if (AXIS_CAN_CALIBRATE(B)) EDIT_BACKLASH_DISTANCE(B);
44
+  if (AXIS_CAN_CALIBRATE(C)) EDIT_BACKLASH_DISTANCE(C);
45 45
 
46 46
   #ifdef BACKLASH_SMOOTHING_MM
47 47
     EDIT_ITEM_FAST(float43, MSG_BACKLASH_SMOOTHING, &backlash.smoothing_mm, 0.0f, 9.9f);

Loading…
Cancel
Save