Pārlūkot izejas kodu

Improvements for junction_deviation_mm

- Drop `max_jerk` with `JUNCTION_DEVIATION`
- Add `max_e_jerk_factor` for use by `LIN_ADVANCE`
- Recalculate `max_e_jerk_factor` when `junction_deviation_mm` changes
- Fix LCD editing of `junction_deviation_mm`
Scott Lahteine 7 gadus atpakaļ
vecāks
revīzija
9d04f47d98

+ 3
- 3
Marlin/src/gcode/config/M200-M205.cpp Parādīt failu

@@ -134,8 +134,10 @@ void GcodeSuite::M205() {
134 134
   #if ENABLED(JUNCTION_DEVIATION)
135 135
     if (parser.seen('J')) {
136 136
       const float junc_dev = parser.value_linear_units();
137
-      if (WITHIN(junc_dev, 0.01, 0.3))
137
+      if (WITHIN(junc_dev, 0.01, 0.3)) {
138 138
         planner.junction_deviation_mm = junc_dev;
139
+        planner.recalculate_max_e_jerk_factor();
140
+      }
139 141
       else {
140 142
         SERIAL_ERROR_START();
141 143
         SERIAL_ERRORLNPGM("?J out of range (0.01 to 0.3)");
@@ -151,8 +153,6 @@ void GcodeSuite::M205() {
151 153
           SERIAL_ECHOLNPGM("WARNING! Low Z Jerk may lead to unwanted pauses.");
152 154
       #endif
153 155
     }
154
-  #endif
155
-  #if DISABLED(JUNCTION_DEVIATION) || ENABLED(LIN_ADVANCE)
156 156
     if (parser.seen('E')) planner.max_jerk[E_AXIS] = parser.value_linear_units();
157 157
   #endif
158 158
 }

+ 3
- 1
Marlin/src/gcode/config/M92.cpp Parādīt failu

@@ -39,7 +39,9 @@ void GcodeSuite::M92() {
39 39
         const float value = parser.value_per_axis_unit((AxisEnum)(E_AXIS + TARGET_EXTRUDER));
40 40
         if (value < 20.0) {
41 41
           float factor = planner.axis_steps_per_mm[E_AXIS + TARGET_EXTRUDER] / value; // increase e constants if M92 E14 is given for netfab.
42
-          planner.max_jerk[E_AXIS] *= factor;
42
+          #if DISABLED(JUNCTION_DEVIATION)
43
+            planner.max_jerk[E_AXIS] *= factor;
44
+          #endif
43 45
           planner.max_feedrate_mm_s[E_AXIS + TARGET_EXTRUDER] *= factor;
44 46
           planner.max_acceleration_steps_per_s2[E_AXIS + TARGET_EXTRUDER] *= factor;
45 47
         }

+ 2
- 2
Marlin/src/lcd/ultralcd.cpp Parādīt failu

@@ -3752,7 +3752,7 @@ void lcd_quick_feedback(const bool clear_buttons) {
3752 3752
       MENU_BACK(MSG_MOTION);
3753 3753
 
3754 3754
       #if ENABLED(JUNCTION_DEVIATION)
3755
-        MENU_ITEM_EDIT(float3, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.01, 0.3);
3755
+        MENU_ITEM_EDIT_CALLBACK(float43, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.01, 0.3, planner.recalculate_max_e_jerk_factor);
3756 3756
       #else
3757 3757
         MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VA_JERK, &planner.max_jerk[A_AXIS], 1, 990);
3758 3758
         MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VB_JERK, &planner.max_jerk[B_AXIS], 1, 990);
@@ -3761,8 +3761,8 @@ void lcd_quick_feedback(const bool clear_buttons) {
3761 3761
         #else
3762 3762
           MENU_MULTIPLIER_ITEM_EDIT(float52sign, MSG_VC_JERK, &planner.max_jerk[C_AXIS], 0.1, 990);
3763 3763
         #endif
3764
+        MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VE_JERK, &planner.max_jerk[E_AXIS], 1, 990);
3764 3765
       #endif
3765
-      MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VE_JERK, &planner.max_jerk[E_AXIS], 1, 990);
3766 3766
 
3767 3767
       END_MENU();
3768 3768
     }

+ 14
- 8
Marlin/src/module/configuration_store.cpp Parādīt failu

@@ -330,6 +330,10 @@ void MarlinSettings::postprocess() {
330 330
     fwretract.refresh_autoretract();
331 331
   #endif
332 332
 
333
+  #if ENABLED(JUNCTION_DEVIATION) && ENABLED(LIN_ADVANCE)
334
+    planner.recalculate_max_e_jerk_factor();
335
+  #endif
336
+
333 337
   // Refresh steps_to_mm with the reciprocal of axis_steps_per_mm
334 338
   // and init stepper.count[], planner.position[] with current_position
335 339
   planner.refresh_positioning();
@@ -411,11 +415,13 @@ void MarlinSettings::postprocess() {
411 415
     EEPROM_WRITE(planner.travel_acceleration);
412 416
     EEPROM_WRITE(planner.min_feedrate_mm_s);
413 417
     EEPROM_WRITE(planner.min_travel_feedrate_mm_s);
414
-    EEPROM_WRITE(planner.max_jerk);
415 418
 
416 419
     #if ENABLED(JUNCTION_DEVIATION)
420
+      const float planner_max_jerk[] = { DEFAULT_XJERK, DEFAULT_YJERK, DEFAULT_ZJERK, DEFAULT_EJERK };
421
+      EEPROM_WRITE(planner_max_jerk);
417 422
       EEPROM_WRITE(planner.junction_deviation_mm);
418 423
     #else
424
+      EEPROM_WRITE(planner.max_jerk);
419 425
       dummy = 0.02;
420 426
       EEPROM_WRITE(dummy);
421 427
     #endif
@@ -1008,11 +1014,12 @@ void MarlinSettings::postprocess() {
1008 1014
       EEPROM_READ(planner.travel_acceleration);
1009 1015
       EEPROM_READ(planner.min_feedrate_mm_s);
1010 1016
       EEPROM_READ(planner.min_travel_feedrate_mm_s);
1011
-      EEPROM_READ(planner.max_jerk);
1012 1017
 
1013 1018
       #if ENABLED(JUNCTION_DEVIATION)
1019
+        for (uint8_t q = 4; q--;) EEPROM_READ(dummy);
1014 1020
         EEPROM_READ(planner.junction_deviation_mm);
1015 1021
       #else
1022
+        EEPROM_READ(planner.max_jerk);
1016 1023
         EEPROM_READ(dummy);
1017 1024
       #endif
1018 1025
 
@@ -1724,13 +1731,14 @@ void MarlinSettings::reset(PORTARG_SOLO) {
1724 1731
   planner.travel_acceleration = DEFAULT_TRAVEL_ACCELERATION;
1725 1732
   planner.min_feedrate_mm_s = DEFAULT_MINIMUMFEEDRATE;
1726 1733
   planner.min_travel_feedrate_mm_s = DEFAULT_MINTRAVELFEEDRATE;
1727
-  planner.max_jerk[X_AXIS] = DEFAULT_XJERK;
1728
-  planner.max_jerk[Y_AXIS] = DEFAULT_YJERK;
1729
-  planner.max_jerk[Z_AXIS] = DEFAULT_ZJERK;
1730
-  planner.max_jerk[E_AXIS] = DEFAULT_EJERK;
1731 1734
 
1732 1735
   #if ENABLED(JUNCTION_DEVIATION)
1733 1736
     planner.junction_deviation_mm = JUNCTION_DEVIATION_MM;
1737
+  #else
1738
+    planner.max_jerk[X_AXIS] = DEFAULT_XJERK;
1739
+    planner.max_jerk[Y_AXIS] = DEFAULT_YJERK;
1740
+    planner.max_jerk[Z_AXIS] = DEFAULT_ZJERK;
1741
+    planner.max_jerk[E_AXIS] = DEFAULT_EJERK;
1734 1742
   #endif
1735 1743
 
1736 1744
   #if HAS_HOME_OFFSET
@@ -2135,8 +2143,6 @@ void MarlinSettings::reset(PORTARG_SOLO) {
2135 2143
       SERIAL_ECHOPAIR_P(port, " X", LINEAR_UNIT(planner.max_jerk[X_AXIS]));
2136 2144
       SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(planner.max_jerk[Y_AXIS]));
2137 2145
       SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(planner.max_jerk[Z_AXIS]));
2138
-    #endif
2139
-    #if DISABLED(JUNCTION_DEVIATION) || ENABLED(LIN_ADVANCE)
2140 2146
       SERIAL_ECHOPAIR_P(port, " E", LINEAR_UNIT(planner.max_jerk[E_AXIS]));
2141 2147
     #endif
2142 2148
 

+ 17
- 7
Marlin/src/module/planner.cpp Parādīt failu

@@ -121,11 +121,15 @@ float Planner::max_feedrate_mm_s[XYZE_N],     // (mm/s) M203 XYZE - Max speeds
121 121
       Planner::acceleration,                  // (mm/s^2) M204 S - Normal acceleration. DEFAULT ACCELERATION for all printing moves.
122 122
       Planner::retract_acceleration,          // (mm/s^2) M204 R - Retract acceleration. Filament pull-back and push-forward while standing still in the other axes
123 123
       Planner::travel_acceleration,           // (mm/s^2) M204 T - Travel acceleration. DEFAULT ACCELERATION for all NON printing moves.
124
-      Planner::max_jerk[XYZE],                // (mm/s^2) M205 XYZE - The largest speed change requiring no acceleration.
125 124
       Planner::min_travel_feedrate_mm_s;      // (mm/s) M205 T - Minimum travel feedrate
126 125
 
127 126
 #if ENABLED(JUNCTION_DEVIATION)
128 127
   float Planner::junction_deviation_mm;       // (mm) M205 J
128
+  #if ENABLED(LIN_ADVANCE)
129
+    float Planner::max_e_jerk_factor;         // Calculated from junction_deviation_mm
130
+  #endif
131
+#else
132
+  float Planner::max_jerk[XYZE];              // (mm/s^2) M205 XYZE - The largest speed change requiring no acceleration.
129 133
 #endif
130 134
 
131 135
 #if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED)
@@ -134,6 +138,9 @@ float Planner::max_feedrate_mm_s[XYZE_N],     // (mm/s) M203 XYZE - Max speeds
134 138
 
135 139
 #if ENABLED(DISTINCT_E_FACTORS)
136 140
   uint8_t Planner::last_extruder = 0;     // Respond to extruder change
141
+  #define _EINDEX (E_AXIS + active_extruder)
142
+#else
143
+  #define _EINDEX E_AXIS
137 144
 #endif
138 145
 
139 146
 int16_t Planner::flow_percentage[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(100); // Extrusion factor for each extruder
@@ -2021,6 +2028,13 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
2021 2028
     accel = CEIL((esteps ? acceleration : travel_acceleration) * steps_per_mm);
2022 2029
 
2023 2030
     #if ENABLED(LIN_ADVANCE)
2031
+
2032
+      #if ENABLED(JUNCTION_DEVIATION)
2033
+        #define MAX_E_JERK (max_e_jerk_factor * max_acceleration_mm_per_s2[_EINDEX])
2034
+      #else
2035
+        #define MAX_E_JERK max_jerk[E_AXIS]
2036
+      #endif
2037
+
2024 2038
       /**
2025 2039
        *
2026 2040
        * Use LIN_ADVANCE for blocks if all these are true:
@@ -2051,10 +2065,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
2051 2065
         if (block->e_D_ratio > 3.0)
2052 2066
           block->use_advance_lead = false;
2053 2067
         else {
2054
-          const uint32_t max_accel_steps_per_s2 = max_jerk[E_AXIS] / (extruder_advance_K * block->e_D_ratio) * steps_per_mm;
2068
+          const uint32_t max_accel_steps_per_s2 = MAX_E_JERK / (extruder_advance_K * block->e_D_ratio) * steps_per_mm;
2055 2069
           #if ENABLED(LA_DEBUG)
2056
-            if (accel > max_accel_steps_per_s2)
2057
-              SERIAL_ECHOLNPGM("Acceleration limited.");
2070
+            if (accel > max_accel_steps_per_s2) SERIAL_ECHOLNPGM("Acceleration limited.");
2058 2071
           #endif
2059 2072
           NOMORE(accel, max_accel_steps_per_s2);
2060 2073
         }
@@ -2459,10 +2472,7 @@ bool Planner::buffer_segment(const float &a, const float &b, const float &c, con
2459 2472
 
2460 2473
 void Planner::_set_position_mm(const float &a, const float &b, const float &c, const float &e) {
2461 2474
   #if ENABLED(DISTINCT_E_FACTORS)
2462
-    #define _EINDEX (E_AXIS + active_extruder)
2463 2475
     last_extruder = active_extruder;
2464
-  #else
2465
-    #define _EINDEX E_AXIS
2466 2476
   #endif
2467 2477
   position[A_AXIS] = LROUND(a * axis_steps_per_mm[A_AXIS]),
2468 2478
   position[B_AXIS] = LROUND(b * axis_steps_per_mm[B_AXIS]),

+ 25
- 13
Marlin/src/module/planner.h Parādīt failu

@@ -195,21 +195,25 @@ class Planner {
195 195
                                                       // May be auto-adjusted by a filament width sensor
196 196
     #endif
197 197
 
198
-    static uint32_t max_acceleration_steps_per_s2[XYZE_N],
199
-                    max_acceleration_mm_per_s2[XYZE_N], // Use M201 to override
200
-                    min_segment_time_us; // Use 'M205 B<µs>' to override
201
-    static float max_feedrate_mm_s[XYZE_N],         // Max speeds in mm per second
202
-                 axis_steps_per_mm[XYZE_N],
203
-                 steps_to_mm[XYZE_N],
204
-                 min_feedrate_mm_s,
205
-                 acceleration,         // Normal acceleration mm/s^2  DEFAULT ACCELERATION for all printing moves. M204 SXXXX
206
-                 retract_acceleration, // Retract acceleration mm/s^2 filament pull-back and push-forward while standing still in the other axes M204 TXXXX
207
-                 travel_acceleration,  // Travel acceleration mm/s^2  DEFAULT ACCELERATION for all NON printing moves. M204 MXXXX
208
-                 max_jerk[XYZE],       // The largest speed change requiring no acceleration
209
-                 min_travel_feedrate_mm_s;
198
+    static uint32_t max_acceleration_mm_per_s2[XYZE_N],    // (mm/s^2) M201 XYZE
199
+                    max_acceleration_steps_per_s2[XYZE_N], // (steps/s^2) Derived from mm_per_s2
200
+                    min_segment_time_us;                   // (µs) M205 B
201
+    static float max_feedrate_mm_s[XYZE_N],     // (mm/s) M203 XYZE - Max speeds
202
+                 axis_steps_per_mm[XYZE_N],     // (steps) M92 XYZE - Steps per millimeter
203
+                 steps_to_mm[XYZE_N],           // (mm) Millimeters per step
204
+                 min_feedrate_mm_s,             // (mm/s) M205 S - Minimum linear feedrate
205
+                 acceleration,                  // (mm/s^2) M204 S - Normal acceleration. DEFAULT ACCELERATION for all printing moves.
206
+                 retract_acceleration,          // (mm/s^2) M204 R - Retract acceleration. Filament pull-back and push-forward while standing still in the other axes
207
+                 travel_acceleration,           // (mm/s^2) M204 T - Travel acceleration. DEFAULT ACCELERATION for all NON printing moves.
208
+                 min_travel_feedrate_mm_s;      // (mm/s) M205 T - Minimum travel feedrate
210 209
 
211 210
     #if ENABLED(JUNCTION_DEVIATION)
212
-      static float junction_deviation_mm; // Initialized by EEPROM
211
+      static float junction_deviation_mm;       // (mm) M205 J
212
+      #if ENABLED(LIN_ADVANCE)
213
+        static float max_e_jerk_factor;         // Calculated from junction_deviation_mm
214
+      #endif
215
+    #else
216
+      static float max_jerk[XYZE];              // (mm/s^2) M205 XYZE - The largest speed change requiring no acceleration.
213 217
     #endif
214 218
 
215 219
     #if HAS_LEVELING
@@ -745,6 +749,14 @@ class Planner {
745 749
       static void autotemp_M104_M109();
746 750
     #endif
747 751
 
752
+    #if ENABLED(JUNCTION_DEVIATION)
753
+      FORCE_INLINE static void recalculate_max_e_jerk_factor() {
754
+        #if ENABLED(LIN_ADVANCE)
755
+          max_e_jerk_factor = SQRT(SQRT(0.5) * junction_deviation_mm) * RECIPROCAL(1.0 - SQRT(0.5));
756
+        #endif
757
+      }
758
+    #endif
759
+
748 760
   private:
749 761
 
750 762
     /**

Notiek ielāde…
Atcelt
Saglabāt