Browse Source

Add delta feedrate scaling (#11153)

Scott Lahteine 7 years ago
parent
commit
8eaac0dab3
No account linked to committer's email address

+ 3
- 0
Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration.h View File

@@ -522,6 +522,9 @@
522 522
   // and processor overload (too many expensive sqrt calls).
523 523
   #define DELTA_SEGMENTS_PER_SECOND 160
524 524
 
525
+  // Convert feedrates to apply to the Effector instead of the Carriages
526
+  #define DELTA_FEEDRATE_SCALING
527
+
525 528
   // After homing move down to a height where XY movement is unconstrained
526 529
   //#define DELTA_HOME_TO_SAFE_ZONE
527 530
 

+ 3
- 0
Marlin/src/config/examples/delta/FLSUN/kossel/Configuration.h View File

@@ -522,6 +522,9 @@
522 522
   // and processor overload (too many expensive sqrt calls).
523 523
   #define DELTA_SEGMENTS_PER_SECOND 160
524 524
 
525
+  // Convert feedrates to apply to the Effector instead of the Carriages
526
+  #define DELTA_FEEDRATE_SCALING
527
+
525 528
   // After homing move down to a height where XY movement is unconstrained
526 529
   //#define DELTA_HOME_TO_SAFE_ZONE
527 530
 

+ 3
- 0
Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration.h View File

@@ -522,6 +522,9 @@
522 522
   // and processor overload (too many expensive sqrt calls).
523 523
   #define DELTA_SEGMENTS_PER_SECOND 160
524 524
 
525
+  // Convert feedrates to apply to the Effector instead of the Carriages
526
+  #define DELTA_FEEDRATE_SCALING
527
+
525 528
   // After homing move down to a height where XY movement is unconstrained
526 529
   //#define DELTA_HOME_TO_SAFE_ZONE
527 530
 

+ 3
- 0
Marlin/src/config/examples/delta/Hatchbox_Alpha/Configuration.h View File

@@ -527,6 +527,9 @@
527 527
   // and processor overload (too many expensive sqrt calls).
528 528
   #define DELTA_SEGMENTS_PER_SECOND 200
529 529
 
530
+  // Convert feedrates to apply to the Effector instead of the Carriages
531
+  #define DELTA_FEEDRATE_SCALING
532
+
530 533
   // After homing move down to a height where XY movement is unconstrained
531 534
   //#define DELTA_HOME_TO_SAFE_ZONE
532 535
 

+ 3
- 0
Marlin/src/config/examples/delta/generic/Configuration.h View File

@@ -512,6 +512,9 @@
512 512
   // and processor overload (too many expensive sqrt calls).
513 513
   #define DELTA_SEGMENTS_PER_SECOND 200
514 514
 
515
+  // Convert feedrates to apply to the Effector instead of the Carriages
516
+  #define DELTA_FEEDRATE_SCALING
517
+
515 518
   // After homing move down to a height where XY movement is unconstrained
516 519
   //#define DELTA_HOME_TO_SAFE_ZONE
517 520
 

+ 3
- 0
Marlin/src/config/examples/delta/kossel_mini/Configuration.h View File

@@ -512,6 +512,9 @@
512 512
   // and processor overload (too many expensive sqrt calls).
513 513
   #define DELTA_SEGMENTS_PER_SECOND 200
514 514
 
515
+  // Convert feedrates to apply to the Effector instead of the Carriages
516
+  #define DELTA_FEEDRATE_SCALING
517
+
515 518
   // After homing move down to a height where XY movement is unconstrained
516 519
   //#define DELTA_HOME_TO_SAFE_ZONE
517 520
 

+ 3
- 0
Marlin/src/config/examples/delta/kossel_pro/Configuration.h View File

@@ -498,6 +498,9 @@
498 498
   // and processor overload (too many expensive sqrt calls).
499 499
   #define DELTA_SEGMENTS_PER_SECOND 160
500 500
 
501
+  // Convert feedrates to apply to the Effector instead of the Carriages
502
+  #define DELTA_FEEDRATE_SCALING
503
+
501 504
   // After homing move down to a height where XY movement is unconstrained
502 505
   //#define DELTA_HOME_TO_SAFE_ZONE
503 506
 

+ 3
- 0
Marlin/src/config/examples/delta/kossel_xl/Configuration.h View File

@@ -516,6 +516,9 @@
516 516
   // and processor overload (too many expensive sqrt calls).
517 517
   #define DELTA_SEGMENTS_PER_SECOND 160
518 518
 
519
+  // Convert feedrates to apply to the Effector instead of the Carriages
520
+  #define DELTA_FEEDRATE_SCALING
521
+
519 522
   // After homing move down to a height where XY movement is unconstrained
520 523
   //#define DELTA_HOME_TO_SAFE_ZONE
521 524
 

+ 26
- 6
Marlin/src/gcode/motion/G2_G3.cpp View File

@@ -35,7 +35,7 @@
35 35
   #include "../../module/scara.h"
36 36
 #endif
37 37
 
38
-#if ENABLED(SCARA_FEEDRATE_SCALING) && ENABLED(AUTO_BED_LEVELING_BILINEAR)
38
+#if HAS_FEEDRATE_SCALING && ENABLED(AUTO_BED_LEVELING_BILINEAR)
39 39
   #include "../../feature/bedlevel/abl/abl.h"
40 40
 #endif
41 41
 
@@ -141,12 +141,16 @@ void plan_arc(
141 141
 
142 142
   millis_t next_idle_ms = millis() + 200UL;
143 143
 
144
-  #if ENABLED(SCARA_FEEDRATE_SCALING)
144
+  #if HAS_FEEDRATE_SCALING
145 145
     // SCARA needs to scale the feed rate from mm/s to degrees/s
146 146
     const float inv_segment_length = 1.0 / (MM_PER_ARC_SEGMENT),
147 147
                 inverse_secs = inv_segment_length * fr_mm_s;
148 148
     float oldA = planner.position_float[A_AXIS],
149
-          oldB = planner.position_float[B_AXIS];
149
+          oldB = planner.position_float[B_AXIS]
150
+          #if ENABLED(DELTA_FEEDRATE_SCALING)
151
+            , oldC = planner.position_float[C_AXIS]
152
+          #endif
153
+          ;
150 154
   #endif
151 155
 
152 156
   #if N_ARC_CORRECTION > 1
@@ -192,14 +196,23 @@ void plan_arc(
192 196
 
193 197
     clamp_to_software_endstops(raw);
194 198
 
199
+    #if HAS_FEEDRATE_SCALING
200
+      inverse_kinematics(raw);
201
+      ADJUST_DELTA(raw);
202
+    #endif
203
+
195 204
     #if ENABLED(SCARA_FEEDRATE_SCALING)
196 205
       // For SCARA scale the feed rate from mm/s to degrees/s
197 206
       // i.e., Complete the angular vector in the given time.
198
-      inverse_kinematics(raw);
199
-      ADJUST_DELTA(raw);
200 207
       if (!planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], raw[Z_AXIS], raw[E_AXIS], HYPOT(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB) * inverse_secs, active_extruder))
201 208
         break;
202 209
       oldA = delta[A_AXIS]; oldB = delta[B_AXIS];
210
+    #elif ENABLED(DELTA_FEEDRATE_SCALING)
211
+      // For DELTA scale the feed rate from Effector mm/s to Carriage mm/s
212
+      // i.e., Complete the linear vector in the given time.
213
+      if (!planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], raw[E_AXIS], SQRT(sq(delta[A_AXIS] - oldA) + sq(delta[B_AXIS] - oldB) + sq(delta[C_AXIS] - oldC)) * inverse_secs, active_extruder))
214
+        break;
215
+      oldA = delta[A_AXIS]; oldB = delta[B_AXIS]; oldC = delta[C_AXIS];
203 216
     #elif HAS_UBL_AND_CURVES
204 217
       float pos[XYZ] = { raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS] };
205 218
       planner.apply_leveling(pos);
@@ -212,12 +225,19 @@ void plan_arc(
212 225
   }
213 226
 
214 227
   // Ensure last segment arrives at target location.
215
-  #if ENABLED(SCARA_FEEDRATE_SCALING)
228
+  #if HAS_FEEDRATE_SCALING
216 229
     inverse_kinematics(cart);
217 230
     ADJUST_DELTA(cart);
231
+  #endif
232
+
233
+  #if ENABLED(SCARA_FEEDRATE_SCALING)
218 234
     const float diff2 = HYPOT2(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB);
219 235
     if (diff2)
220 236
       planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], cart[Z_AXIS], cart[E_AXIS], SQRT(diff2) * inverse_secs, active_extruder);
237
+  #elif ENABLED(DELTA_FEEDRATE_SCALING)
238
+    const float diff2 = sq(delta[A_AXIS] - oldA) + sq(delta[B_AXIS] - oldB) + sq(delta[C_AXIS] - oldC);
239
+    if (diff2)
240
+      planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], cart[E_AXIS], SQRT(diff2) * inverse_secs, active_extruder);
221 241
   #elif HAS_UBL_AND_CURVES
222 242
     float pos[XYZ] = { cart[X_AXIS], cart[Y_AXIS], cart[Z_AXIS] };
223 243
     planner.apply_leveling(pos);

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

@@ -1053,6 +1053,7 @@
1053 1053
 #define PLANNER_LEVELING      (OLDSCHOOL_ABL || ENABLED(MESH_BED_LEVELING) || UBL_SEGMENTED || ENABLED(SKEW_CORRECTION))
1054 1054
 #define HAS_PROBING_PROCEDURE (HAS_ABL || ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST))
1055 1055
 #define HAS_UBL_AND_CURVES (ENABLED(AUTO_BED_LEVELING_UBL) && !PLANNER_LEVELING && (ENABLED(ARC_SUPPORT) || ENABLED(BEZIER_CURVE_SUPPORT)))
1056
+#define HAS_FEEDRATE_SCALING (ENABLED(SCARA_FEEDRATE_SCALING) || ENABLED(DELTA_FEEDRATE_SCALING))
1056 1057
 
1057 1058
 #if ENABLED(AUTO_BED_LEVELING_UBL)
1058 1059
   #undef LCD_BED_LEVELING

+ 45
- 11
Marlin/src/module/motion.cpp View File

@@ -581,7 +581,7 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS },
581 581
                   ediff * inv_segments
582 582
                 };
583 583
 
584
-    #if DISABLED(SCARA_FEEDRATE_SCALING)
584
+    #if !HAS_FEEDRATE_SCALING
585 585
       const float cartesian_segment_mm = cartesian_mm * inv_segments;
586 586
     #endif
587 587
 
@@ -589,14 +589,13 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS },
589 589
     SERIAL_ECHOPAIR("mm=", cartesian_mm);
590 590
     SERIAL_ECHOPAIR(" seconds=", seconds);
591 591
     SERIAL_ECHOPAIR(" segments=", segments);
592
-    #if DISABLED(SCARA_FEEDRATE_SCALING)
593
-      SERIAL_ECHOLNPAIR(" segment_mm=", cartesian_segment_mm);
594
-    #else
595
-      SERIAL_EOL();
592
+    #if !HAS_FEEDRATE_SCALING
593
+      SERIAL_ECHOPAIR(" segment_mm=", cartesian_segment_mm);
596 594
     #endif
595
+    SERIAL_EOL();
597 596
     //*/
598 597
 
599
-    #if ENABLED(SCARA_FEEDRATE_SCALING)
598
+    #if HAS_FEEDRATE_SCALING
600 599
       // SCARA needs to scale the feed rate from mm/s to degrees/s
601 600
       // i.e., Complete the angular vector in the given time.
602 601
       const float segment_length = cartesian_mm * inv_segments,
@@ -604,7 +603,11 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS },
604 603
                   inverse_secs = inv_segment_length * _feedrate_mm_s;
605 604
 
606 605
       float oldA = planner.position_float[A_AXIS],
607
-            oldB = planner.position_float[B_AXIS];
606
+            oldB = planner.position_float[B_AXIS]
607
+            #if ENABLED(DELTA_FEEDRATE_SCALING)
608
+              , oldC = planner.position_float[C_AXIS]
609
+            #endif
610
+            ;
608 611
 
609 612
       /*
610 613
       SERIAL_ECHOPGM("Scaled kinematic move: ");
@@ -613,7 +616,11 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS },
613 616
       SERIAL_ECHOPAIR(") _feedrate_mm_s=", _feedrate_mm_s);
614 617
       SERIAL_ECHOPAIR(" inverse_secs=", inverse_secs);
615 618
       SERIAL_ECHOPAIR(" oldA=", oldA);
616
-      SERIAL_ECHOLNPAIR(" oldB=", oldB);
619
+      SERIAL_ECHOPAIR(" oldB=", oldB);
620
+      #if ENABLED(DELTA_FEEDRATE_SCALING)
621
+        SERIAL_ECHOPAIR(" oldC=", oldC);
622
+      #endif
623
+      SERIAL_EOL();
617 624
       safe_delay(5);
618 625
       //*/
619 626
     #endif
@@ -654,6 +661,19 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS },
654 661
         safe_delay(5);
655 662
         //*/
656 663
         oldA = delta[A_AXIS]; oldB = delta[B_AXIS];
664
+      #elif ENABLED(DELTA_FEEDRATE_SCALING)
665
+        // For DELTA scale the feed rate from Effector mm/s to Carriage mm/s
666
+        // i.e., Complete the linear vector in the given time.
667
+        if (!planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], raw[E_AXIS], SQRT(sq(delta[A_AXIS] - oldA) + sq(delta[B_AXIS] - oldB) + sq(delta[C_AXIS] - oldC)) * inverse_secs, active_extruder))
668
+          break;
669
+        /*
670
+        SERIAL_ECHO(segments);
671
+        SERIAL_ECHOPAIR(": X=", raw[X_AXIS]); SERIAL_ECHOPAIR(" Y=", raw[Y_AXIS]);
672
+        SERIAL_ECHOPAIR(" A=", delta[A_AXIS]); SERIAL_ECHOPAIR(" B=", delta[B_AXIS]); SERIAL_ECHOPAIR(" C=", delta[C_AXIS]);
673
+        SERIAL_ECHOLNPAIR(" F", SQRT(sq(delta[A_AXIS] - oldA) + sq(delta[B_AXIS] - oldB) + sq(delta[C_AXIS] - oldC)) * inverse_secs * 60);
674
+        safe_delay(5);
675
+        //*/
676
+        oldA = delta[A_AXIS]; oldB = delta[B_AXIS]; oldC = delta[C_AXIS];
657 677
       #else
658 678
         if (!planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], raw[E_AXIS], _feedrate_mm_s, active_extruder, cartesian_segment_mm))
659 679
           break;
@@ -661,17 +681,31 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS },
661 681
     }
662 682
 
663 683
     // Ensure last segment arrives at target location.
664
-    #if ENABLED(SCARA_FEEDRATE_SCALING)
684
+    #if HAS_FEEDRATE_SCALING
665 685
       inverse_kinematics(rtarget);
666 686
       ADJUST_DELTA(rtarget);
687
+    #endif
688
+
689
+    #if ENABLED(SCARA_FEEDRATE_SCALING)
667 690
       const float diff2 = HYPOT2(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB);
668 691
       if (diff2) {
669 692
         planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], rtarget[Z_AXIS], rtarget[E_AXIS], SQRT(diff2) * inverse_secs, active_extruder);
670
-
671 693
         /*
672 694
         SERIAL_ECHOPAIR("final: A=", delta[A_AXIS]); SERIAL_ECHOPAIR(" B=", delta[B_AXIS]);
673 695
         SERIAL_ECHOPAIR(" adiff=", delta[A_AXIS] - oldA); SERIAL_ECHOPAIR(" bdiff=", delta[B_AXIS] - oldB);
674
-        SERIAL_ECHOLNPAIR(" F", (SQRT(diff2) * inverse_secs) * 60);
696
+        SERIAL_ECHOLNPAIR(" F", SQRT(diff2) * inverse_secs * 60);
697
+        SERIAL_EOL();
698
+        safe_delay(5);
699
+        //*/
700
+      }
701
+    #elif ENABLED(DELTA_FEEDRATE_SCALING)
702
+      const float diff2 = sq(delta[A_AXIS] - oldA) + sq(delta[B_AXIS] - oldB) + sq(delta[C_AXIS] - oldC);
703
+      if (diff2) {
704
+        planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], rtarget[E_AXIS], SQRT(diff2) * inverse_secs, active_extruder);
705
+        /*
706
+        SERIAL_ECHOPAIR("final: A=", delta[A_AXIS]); SERIAL_ECHOPAIR(" B=", delta[B_AXIS]); SERIAL_ECHOPAIR(" C=", delta[C_AXIS]);
707
+        SERIAL_ECHOPAIR(" adiff=", delta[A_AXIS] - oldA); SERIAL_ECHOPAIR(" bdiff=", delta[B_AXIS] - oldB); SERIAL_ECHOPAIR(" cdiff=", delta[C_AXIS] - oldC);
708
+        SERIAL_ECHOLNPAIR(" F", SQRT(diff2) * inverse_secs * 60);
675 709
         SERIAL_EOL();
676 710
         safe_delay(5);
677 711
         //*/

+ 3
- 3
Marlin/src/module/planner.cpp View File

@@ -1567,9 +1567,9 @@ bool Planner::_buffer_steps(const int32_t (&target)[XYZE]
1567 1567
 
1568 1568
   // Fill the block with the specified movement
1569 1569
   if (!_populate_block(block, false, target
1570
-  #if HAS_POSITION_FLOAT
1571
-    , target_float
1572
-  #endif
1570
+    #if HAS_POSITION_FLOAT
1571
+      , target_float
1572
+    #endif
1573 1573
     , fr_mm_s, extruder, millimeters
1574 1574
   )) {
1575 1575
     // Movement was not queued, probably because it was too short.

+ 1
- 1
Marlin/src/module/planner.h View File

@@ -149,7 +149,7 @@ typedef struct {
149 149
 
150 150
 } block_t;
151 151
 
152
-#define HAS_POSITION_FLOAT (ENABLED(LIN_ADVANCE) || ENABLED(SCARA_FEEDRATE_SCALING))
152
+#define HAS_POSITION_FLOAT (ENABLED(LIN_ADVANCE) || HAS_FEEDRATE_SCALING)
153 153
 
154 154
 #define BLOCK_MOD(n) ((n)&(BLOCK_BUFFER_SIZE-1))
155 155
 

Loading…
Cancel
Save