Browse Source

🚸 Refine stepper-driver-related G-codes (#23372)

Scott Lahteine 2 years ago
parent
commit
02b4e48c6d
No account linked to committer's email address

+ 6
- 37
Marlin/src/feature/tmc_util.h View File

45
   return 12650000UL * msteps / (256 * thrs * spmm);
45
   return 12650000UL * msteps / (256 * thrs * spmm);
46
 }
46
 }
47
 
47
 
48
+typedef struct {
49
+  uint8_t toff;
50
+  int8_t hend;
51
+  uint8_t hstrt;
52
+} chopper_timing_t;
53
+
48
 template<char AXIS_LETTER, char DRIVER_ID>
54
 template<char AXIS_LETTER, char DRIVER_ID>
49
 class TMCStorage {
55
 class TMCStorage {
50
   protected:
56
   protected:
297
                             sgt_max =  63;
303
                             sgt_max =  63;
298
 };
304
 };
299
 
305
 
300
-template<typename TMC>
301
-void tmc_print_current(TMC &st) {
302
-  st.printLabel();
303
-  SERIAL_ECHOLNPGM(" driver current: ", st.getMilliamps());
304
-}
305
-
306
-#if ENABLED(MONITOR_DRIVER_STATUS)
307
-  template<typename TMC>
308
-  void tmc_report_otpw(TMC &st) {
309
-    st.printLabel();
310
-    SERIAL_ECHOPGM(" temperature prewarn triggered: ");
311
-    serialprint_truefalse(st.getOTPW());
312
-    SERIAL_EOL();
313
-  }
314
-  template<typename TMC>
315
-  void tmc_clear_otpw(TMC &st) {
316
-    st.clear_otpw();
317
-    st.printLabel();
318
-    SERIAL_ECHOLNPGM(" prewarn flag cleared");
319
-  }
320
-#endif
321
-#if ENABLED(HYBRID_THRESHOLD)
322
-  template<typename TMC>
323
-  void tmc_print_pwmthrs(TMC &st) {
324
-    st.printLabel();
325
-    SERIAL_ECHOLNPGM(" stealthChop max speed: ", st.get_pwm_thrs());
326
-  }
327
-#endif
328
-#if USE_SENSORLESS
329
-  template<typename TMC>
330
-  void tmc_print_sgt(TMC &st) {
331
-    st.printLabel();
332
-    SERIAL_ECHOPGM(" homing sensitivity: ");
333
-    SERIAL_PRINTLN(st.homing_threshold(), PrintBase::Dec);
334
-  }
335
-#endif
336
-
337
 void monitor_tmc_drivers();
306
 void monitor_tmc_drivers();
338
 void test_tmc_connection(LOGICAL_AXIS_DECL(const bool, true));
307
 void test_tmc_connection(LOGICAL_AXIS_DECL(const bool, true));
339
 
308
 

+ 42
- 44
Marlin/src/gcode/feature/L6470/M906.cpp View File

202
  * On L6474 this sets the TVAL register (same address).
202
  * On L6474 this sets the TVAL register (same address).
203
  *
203
  *
204
  * I - select which driver(s) to change on multi-driver axis
204
  * I - select which driver(s) to change on multi-driver axis
205
- *     0 - (default) all drivers on the axis or E0
206
- *     1 - monitor only X, Y, Z or E1
207
- *     2 - monitor only X2, Y2, Z2 or E2
208
- *     3 - monitor only Z3 or E3
209
- *     4 - monitor only Z4 or E4
210
- *     5 - monitor only E5
205
+ *         (default) all drivers on the axis
206
+ *     0 - monitor only the first XYZ... driver
207
+ *     1 - monitor only X2, Y2, Z2
208
+ *     2 - monitor only Z3
209
+ *     3 - monitor only Z4
211
  * Xxxx, Yxxx, Zxxx, Exxx - axis to change (optional)
210
  * Xxxx, Yxxx, Zxxx, Exxx - axis to change (optional)
212
  *     L6474 - current in mA (4A max)
211
  *     L6474 - current in mA (4A max)
213
  *     All others - 0-255
212
  *     All others - 0-255
227
 
226
 
228
   uint8_t report_current = true;
227
   uint8_t report_current = true;
229
 
228
 
230
-  #if HAS_L64XX
231
-    const uint8_t index = parser.byteval('I');
229
+  #if AXIS_IS_L64XX(X2) || AXIS_IS_L64XX(Y2) || AXIS_IS_L64XX(Z2) || AXIS_IS_L64XX(Z3) || AXIS_IS_L64XX(Z4)
230
+    const int8_t index = parser.byteval('I', -1);
231
+  #else
232
+    constexpr int8_t index = -1;
232
   #endif
233
   #endif
233
 
234
 
234
   LOOP_LOGICAL_AXES(i) if (uint16_t value = parser.intval(axis_codes[i])) {
235
   LOOP_LOGICAL_AXES(i) if (uint16_t value = parser.intval(axis_codes[i])) {
243
     switch (i) {
244
     switch (i) {
244
       case X_AXIS:
245
       case X_AXIS:
245
         #if AXIS_IS_L64XX(X)
246
         #if AXIS_IS_L64XX(X)
246
-          if (index == 0) L6470_SET_KVAL_HOLD(X);
247
+          if (index < 0 || index == 0) L6470_SET_KVAL_HOLD(X);
247
         #endif
248
         #endif
248
         #if AXIS_IS_L64XX(X2)
249
         #if AXIS_IS_L64XX(X2)
249
-          if (index == 1) L6470_SET_KVAL_HOLD(X2);
250
+          if (index < 0 || index == 1) L6470_SET_KVAL_HOLD(X2);
250
         #endif
251
         #endif
251
         break;
252
         break;
252
 
253
 
253
       #if HAS_Y_AXIS
254
       #if HAS_Y_AXIS
254
         case Y_AXIS:
255
         case Y_AXIS:
255
           #if AXIS_IS_L64XX(Y)
256
           #if AXIS_IS_L64XX(Y)
256
-            if (index == 0) L6470_SET_KVAL_HOLD(Y);
257
+            if (index < 0 || index == 0) L6470_SET_KVAL_HOLD(Y);
257
           #endif
258
           #endif
258
           #if AXIS_IS_L64XX(Y2)
259
           #if AXIS_IS_L64XX(Y2)
259
-            if (index == 1) L6470_SET_KVAL_HOLD(Y2);
260
+            if (index < 0 || index == 1) L6470_SET_KVAL_HOLD(Y2);
260
           #endif
261
           #endif
261
           break;
262
           break;
262
       #endif
263
       #endif
264
       #if HAS_Z_AXIS
265
       #if HAS_Z_AXIS
265
         case Z_AXIS:
266
         case Z_AXIS:
266
           #if AXIS_IS_L64XX(Z)
267
           #if AXIS_IS_L64XX(Z)
267
-            if (index == 0) L6470_SET_KVAL_HOLD(Z);
268
+            if (index < 0 || index == 0) L6470_SET_KVAL_HOLD(Z);
268
           #endif
269
           #endif
269
           #if AXIS_IS_L64XX(Z2)
270
           #if AXIS_IS_L64XX(Z2)
270
-            if (index == 1) L6470_SET_KVAL_HOLD(Z2);
271
+            if (index < 0 || index == 1) L6470_SET_KVAL_HOLD(Z2);
271
           #endif
272
           #endif
272
           #if AXIS_IS_L64XX(Z3)
273
           #if AXIS_IS_L64XX(Z3)
273
-            if (index == 2) L6470_SET_KVAL_HOLD(Z3);
274
+            if (index < 0 || index == 2) L6470_SET_KVAL_HOLD(Z3);
274
           #endif
275
           #endif
275
           #if AXIS_DRIVER_TYPE_Z4(L6470)
276
           #if AXIS_DRIVER_TYPE_Z4(L6470)
276
-            if (index == 3) L6470_SET_KVAL_HOLD(Z4);
277
+            if (index < 0 || index == 3) L6470_SET_KVAL_HOLD(Z4);
277
           #endif
278
           #endif
278
           break;
279
           break;
279
       #endif
280
       #endif
280
 
281
 
281
       #if E_STEPPERS
282
       #if E_STEPPERS
282
         case E_AXIS: {
283
         case E_AXIS: {
283
-          const int8_t target_e_stepper = get_target_e_stepper_from_command(0);
284
-          if (target_e_stepper < 0) return;
285
-          switch (target_e_stepper) {
286
-            #if AXIS_IS_L64XX(E0)
287
-              case 0: L6470_SET_KVAL_HOLD(E0); break;
288
-            #endif
289
-            #if AXIS_IS_L64XX(E1)
290
-              case 1: L6470_SET_KVAL_HOLD(E1); break;
291
-            #endif
292
-            #if AXIS_IS_L64XX(E2)
293
-              case 2: L6470_SET_KVAL_HOLD(E2); break;
294
-            #endif
295
-            #if AXIS_IS_L64XX(E3)
296
-              case 3: L6470_SET_KVAL_HOLD(E3); break;
297
-            #endif
298
-            #if AXIS_IS_L64XX(E4)
299
-              case 4: L6470_SET_KVAL_HOLD(E4); break;
300
-            #endif
301
-            #if AXIS_IS_L64XX(E5)
302
-              case 5: L6470_SET_KVAL_HOLD(E5); break;
303
-            #endif
304
-            #if AXIS_IS_L64XX(E6)
305
-              case 6: L6470_SET_KVAL_HOLD(E6); break;
306
-            #endif
307
-            #if AXIS_IS_L64XX(E7)
308
-              case 7: L6470_SET_KVAL_HOLD(E7); break;
309
-            #endif
310
-          }
284
+          const int8_t eindex = get_target_e_stepper_from_command();
285
+          #if AXIS_IS_L64XX(E0)
286
+            if (eindex < 0 || eindex == 0) L6470_SET_KVAL_HOLD(E0);
287
+          #endif
288
+          #if AXIS_IS_L64XX(E1)
289
+            if (eindex < 0 || eindex == 1) L6470_SET_KVAL_HOLD(E1);
290
+          #endif
291
+          #if AXIS_IS_L64XX(E2)
292
+            if (eindex < 0 || eindex == 2) L6470_SET_KVAL_HOLD(E2);
293
+          #endif
294
+          #if AXIS_IS_L64XX(E3)
295
+            if (eindex < 0 || eindex == 3) L6470_SET_KVAL_HOLD(E3);
296
+          #endif
297
+          #if AXIS_IS_L64XX(E4)
298
+            if (eindex < 0 || eindex == 4) L6470_SET_KVAL_HOLD(E4);
299
+          #endif
300
+          #if AXIS_IS_L64XX(E5)
301
+            if (eindex < 0 || eindex == 5) L6470_SET_KVAL_HOLD(E5);
302
+          #endif
303
+          #if AXIS_IS_L64XX(E6)
304
+            if (eindex < 0 || eindex == 6) L6470_SET_KVAL_HOLD(E6);
305
+          #endif
306
+          #if AXIS_IS_L64XX(E7)
307
+            if (eindex < 0 || eindex == 7) L6470_SET_KVAL_HOLD(E7);
308
+          #endif
311
         } break;
309
         } break;
312
       #endif
310
       #endif
313
     }
311
     }

+ 22
- 25
Marlin/src/gcode/feature/trinamic/M569.cpp View File

40
   st.refresh_stepping_mode();
40
   st.refresh_stepping_mode();
41
 }
41
 }
42
 
42
 
43
-static void set_stealth_status(const bool enable, const int8_t target_e_stepper) {
43
+static void set_stealth_status(const bool enable, const int8_t eindex) {
44
   #define TMC_SET_STEALTH(Q) tmc_set_stealthChop(stepper##Q, enable)
44
   #define TMC_SET_STEALTH(Q) tmc_set_stealthChop(stepper##Q, enable)
45
 
45
 
46
-  #if    X_HAS_STEALTHCHOP  || Y_HAS_STEALTHCHOP  || Z_HAS_STEALTHCHOP \
47
-      || I_HAS_STEALTHCHOP  || J_HAS_STEALTHCHOP  || K_HAS_STEALTHCHOP \
48
-      || X2_HAS_STEALTHCHOP || Y2_HAS_STEALTHCHOP || Z2_HAS_STEALTHCHOP || Z3_HAS_STEALTHCHOP || Z4_HAS_STEALTHCHOP
49
-    const uint8_t index = parser.byteval('I');
46
+  #if X2_HAS_STEALTHCHOP || Y2_HAS_STEALTHCHOP || Z2_HAS_STEALTHCHOP || Z3_HAS_STEALTHCHOP || Z4_HAS_STEALTHCHOP
47
+    const int8_t index = parser.byteval('I', -1);
48
+  #else
49
+    constexpr int8_t index = -1;
50
   #endif
50
   #endif
51
 
51
 
52
   LOOP_LOGICAL_AXES(i) if (parser.seen(axis_codes[i])) {
52
   LOOP_LOGICAL_AXES(i) if (parser.seen(axis_codes[i])) {
53
     switch (i) {
53
     switch (i) {
54
       case X_AXIS:
54
       case X_AXIS:
55
-        TERN_(X_HAS_STEALTHCHOP,  if (index == 0) TMC_SET_STEALTH(X));
56
-        TERN_(X2_HAS_STEALTHCHOP, if (index == 1) TMC_SET_STEALTH(X2));
55
+        TERN_(X_HAS_STEALTHCHOP,  if (index < 0 || index == 0) TMC_SET_STEALTH(X));
56
+        TERN_(X2_HAS_STEALTHCHOP, if (index < 0 || index == 1) TMC_SET_STEALTH(X2));
57
         break;
57
         break;
58
 
58
 
59
       #if HAS_Y_AXIS
59
       #if HAS_Y_AXIS
60
         case Y_AXIS:
60
         case Y_AXIS:
61
-          TERN_(Y_HAS_STEALTHCHOP,  if (index == 0) TMC_SET_STEALTH(Y));
62
-          TERN_(Y2_HAS_STEALTHCHOP, if (index == 1) TMC_SET_STEALTH(Y2));
61
+          TERN_(Y_HAS_STEALTHCHOP,  if (index < 0 || index == 0) TMC_SET_STEALTH(Y));
62
+          TERN_(Y2_HAS_STEALTHCHOP, if (index < 0 || index == 1) TMC_SET_STEALTH(Y2));
63
           break;
63
           break;
64
       #endif
64
       #endif
65
 
65
 
66
       #if HAS_Z_AXIS
66
       #if HAS_Z_AXIS
67
         case Z_AXIS:
67
         case Z_AXIS:
68
-          TERN_(Z_HAS_STEALTHCHOP,  if (index == 0) TMC_SET_STEALTH(Z));
69
-          TERN_(Z2_HAS_STEALTHCHOP, if (index == 1) TMC_SET_STEALTH(Z2));
70
-          TERN_(Z3_HAS_STEALTHCHOP, if (index == 2) TMC_SET_STEALTH(Z3));
71
-          TERN_(Z4_HAS_STEALTHCHOP, if (index == 3) TMC_SET_STEALTH(Z4));
68
+          TERN_(Z_HAS_STEALTHCHOP,  if (index < 0 || index == 0) TMC_SET_STEALTH(Z));
69
+          TERN_(Z2_HAS_STEALTHCHOP, if (index < 0 || index == 1) TMC_SET_STEALTH(Z2));
70
+          TERN_(Z3_HAS_STEALTHCHOP, if (index < 0 || index == 2) TMC_SET_STEALTH(Z3));
71
+          TERN_(Z4_HAS_STEALTHCHOP, if (index < 0 || index == 3) TMC_SET_STEALTH(Z4));
72
           break;
72
           break;
73
       #endif
73
       #endif
74
 
74
 
84
 
84
 
85
       #if E_STEPPERS
85
       #if E_STEPPERS
86
         case E_AXIS: {
86
         case E_AXIS: {
87
-          if (target_e_stepper < 0) return;
88
-          switch (target_e_stepper) {
89
-            TERN_(E0_HAS_STEALTHCHOP, case 0: TMC_SET_STEALTH(E0); break;)
90
-            TERN_(E1_HAS_STEALTHCHOP, case 1: TMC_SET_STEALTH(E1); break;)
91
-            TERN_(E2_HAS_STEALTHCHOP, case 2: TMC_SET_STEALTH(E2); break;)
92
-            TERN_(E3_HAS_STEALTHCHOP, case 3: TMC_SET_STEALTH(E3); break;)
93
-            TERN_(E4_HAS_STEALTHCHOP, case 4: TMC_SET_STEALTH(E4); break;)
94
-            TERN_(E5_HAS_STEALTHCHOP, case 5: TMC_SET_STEALTH(E5); break;)
95
-            TERN_(E6_HAS_STEALTHCHOP, case 6: TMC_SET_STEALTH(E6); break;)
96
-            TERN_(E7_HAS_STEALTHCHOP, case 7: TMC_SET_STEALTH(E7); break;)
97
-          }
87
+          TERN_(E0_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 0) TMC_SET_STEALTH(E0));
88
+          TERN_(E1_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 1) TMC_SET_STEALTH(E1));
89
+          TERN_(E2_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 2) TMC_SET_STEALTH(E2));
90
+          TERN_(E3_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 3) TMC_SET_STEALTH(E3));
91
+          TERN_(E4_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 4) TMC_SET_STEALTH(E4));
92
+          TERN_(E5_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 5) TMC_SET_STEALTH(E5));
93
+          TERN_(E6_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 6) TMC_SET_STEALTH(E6));
94
+          TERN_(E7_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 7) TMC_SET_STEALTH(E7));
98
         } break;
95
         } break;
99
       #endif
96
       #endif
100
     }
97
     }
133
  */
130
  */
134
 void GcodeSuite::M569() {
131
 void GcodeSuite::M569() {
135
   if (parser.seen('S'))
132
   if (parser.seen('S'))
136
-    set_stealth_status(parser.value_bool(), get_target_e_stepper_from_command(0));
133
+    set_stealth_status(parser.value_bool(), get_target_e_stepper_from_command());
137
   else
134
   else
138
     say_stealth_status();
135
     say_stealth_status();
139
 }
136
 }

+ 43
- 38
Marlin/src/gcode/feature/trinamic/M906.cpp View File

28
 #include "../../../feature/tmc_util.h"
28
 #include "../../../feature/tmc_util.h"
29
 #include "../../../module/stepper/indirection.h"
29
 #include "../../../module/stepper/indirection.h"
30
 
30
 
31
+template<typename TMC>
32
+static void tmc_print_current(TMC &st) {
33
+  st.printLabel();
34
+  SERIAL_ECHOLNPGM(" driver current: ", st.getMilliamps());
35
+}
36
+
31
 /**
37
 /**
32
  * M906: Set motor current in milliamps.
38
  * M906: Set motor current in milliamps.
33
  *
39
  *
48
 
54
 
49
   bool report = true;
55
   bool report = true;
50
 
56
 
51
-  #if AXIS_IS_TMC(X) || AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) || AXIS_IS_TMC(I) || AXIS_IS_TMC(J) || AXIS_IS_TMC(K)
52
-    const uint8_t index = parser.byteval('I');
57
+  #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4)
58
+    const int8_t index = parser.byteval('I', -1);
59
+  #else
60
+    constexpr int8_t index = -1;
53
   #endif
61
   #endif
54
 
62
 
55
   LOOP_LOGICAL_AXES(i) if (uint16_t value = parser.intval(axis_codes[i])) {
63
   LOOP_LOGICAL_AXES(i) if (uint16_t value = parser.intval(axis_codes[i])) {
57
     switch (i) {
65
     switch (i) {
58
       case X_AXIS:
66
       case X_AXIS:
59
         #if AXIS_IS_TMC(X)
67
         #if AXIS_IS_TMC(X)
60
-          if (index == 0) TMC_SET_CURRENT(X);
68
+          if (index < 0 || index == 0) TMC_SET_CURRENT(X);
61
         #endif
69
         #endif
62
         #if AXIS_IS_TMC(X2)
70
         #if AXIS_IS_TMC(X2)
63
-          if (index == 1) TMC_SET_CURRENT(X2);
71
+          if (index < 0 || index == 1) TMC_SET_CURRENT(X2);
64
         #endif
72
         #endif
65
         break;
73
         break;
66
 
74
 
67
       #if HAS_Y_AXIS
75
       #if HAS_Y_AXIS
68
         case Y_AXIS:
76
         case Y_AXIS:
69
           #if AXIS_IS_TMC(Y)
77
           #if AXIS_IS_TMC(Y)
70
-            if (index == 0) TMC_SET_CURRENT(Y);
78
+            if (index < 0 || index == 0) TMC_SET_CURRENT(Y);
71
           #endif
79
           #endif
72
           #if AXIS_IS_TMC(Y2)
80
           #if AXIS_IS_TMC(Y2)
73
-            if (index == 1) TMC_SET_CURRENT(Y2);
81
+            if (index < 0 || index == 1) TMC_SET_CURRENT(Y2);
74
           #endif
82
           #endif
75
           break;
83
           break;
76
       #endif
84
       #endif
78
       #if HAS_Z_AXIS
86
       #if HAS_Z_AXIS
79
         case Z_AXIS:
87
         case Z_AXIS:
80
           #if AXIS_IS_TMC(Z)
88
           #if AXIS_IS_TMC(Z)
81
-            if (index == 0) TMC_SET_CURRENT(Z);
89
+            if (index < 0 || index == 0) TMC_SET_CURRENT(Z);
82
           #endif
90
           #endif
83
           #if AXIS_IS_TMC(Z2)
91
           #if AXIS_IS_TMC(Z2)
84
-            if (index == 1) TMC_SET_CURRENT(Z2);
92
+            if (index < 0 || index == 1) TMC_SET_CURRENT(Z2);
85
           #endif
93
           #endif
86
           #if AXIS_IS_TMC(Z3)
94
           #if AXIS_IS_TMC(Z3)
87
-            if (index == 2) TMC_SET_CURRENT(Z3);
95
+            if (index < 0 || index == 2) TMC_SET_CURRENT(Z3);
88
           #endif
96
           #endif
89
           #if AXIS_IS_TMC(Z4)
97
           #if AXIS_IS_TMC(Z4)
90
-            if (index == 3) TMC_SET_CURRENT(Z4);
98
+            if (index < 0 || index == 3) TMC_SET_CURRENT(Z4);
91
           #endif
99
           #endif
92
           break;
100
           break;
93
       #endif
101
       #endif
104
 
112
 
105
       #if E_STEPPERS
113
       #if E_STEPPERS
106
         case E_AXIS: {
114
         case E_AXIS: {
107
-          const int8_t target_e_stepper = get_target_e_stepper_from_command(0);
108
-          if (target_e_stepper < 0) return;
109
-          switch (target_e_stepper) {
110
-            #if AXIS_IS_TMC(E0)
111
-              case 0: TMC_SET_CURRENT(E0); break;
112
-            #endif
113
-            #if AXIS_IS_TMC(E1)
114
-              case 1: TMC_SET_CURRENT(E1); break;
115
-            #endif
116
-            #if AXIS_IS_TMC(E2)
117
-              case 2: TMC_SET_CURRENT(E2); break;
118
-            #endif
119
-            #if AXIS_IS_TMC(E3)
120
-              case 3: TMC_SET_CURRENT(E3); break;
121
-            #endif
122
-            #if AXIS_IS_TMC(E4)
123
-              case 4: TMC_SET_CURRENT(E4); break;
124
-            #endif
125
-            #if AXIS_IS_TMC(E5)
126
-              case 5: TMC_SET_CURRENT(E5); break;
127
-            #endif
128
-            #if AXIS_IS_TMC(E6)
129
-              case 6: TMC_SET_CURRENT(E6); break;
130
-            #endif
131
-            #if AXIS_IS_TMC(E7)
132
-              case 7: TMC_SET_CURRENT(E7); break;
133
-            #endif
134
-          }
115
+          const int8_t eindex = get_target_e_stepper_from_command();
116
+          #if AXIS_IS_TMC(E0)
117
+            if (eindex < 0 || eindex == 0) TMC_SET_CURRENT(E0);
118
+          #endif
119
+          #if AXIS_IS_TMC(E1)
120
+            if (eindex < 0 || eindex == 1) TMC_SET_CURRENT(E1);
121
+          #endif
122
+          #if AXIS_IS_TMC(E2)
123
+            if (eindex < 0 || eindex == 2) TMC_SET_CURRENT(E2);
124
+          #endif
125
+          #if AXIS_IS_TMC(E3)
126
+            if (eindex < 0 || eindex == 3) TMC_SET_CURRENT(E3);
127
+          #endif
128
+          #if AXIS_IS_TMC(E4)
129
+            if (eindex < 0 || eindex == 4) TMC_SET_CURRENT(E4);
130
+          #endif
131
+          #if AXIS_IS_TMC(E5)
132
+            if (eindex < 0 || eindex == 5) TMC_SET_CURRENT(E5);
133
+          #endif
134
+          #if AXIS_IS_TMC(E6)
135
+            if (eindex < 0 || eindex == 6) TMC_SET_CURRENT(E6);
136
+          #endif
137
+          #if AXIS_IS_TMC(E7)
138
+            if (eindex < 0 || eindex == 7) TMC_SET_CURRENT(E7);
139
+          #endif
135
         } break;
140
         } break;
136
       #endif
141
       #endif
137
     }
142
     }

+ 55
- 28
Marlin/src/gcode/feature/trinamic/M911-M914.cpp View File

62
     #error "MONITOR_DRIVER_STATUS requires at least one TMC2130, 2160, 2208, 2209, 2660, 5130, or 5160."
62
     #error "MONITOR_DRIVER_STATUS requires at least one TMC2130, 2160, 2208, 2209, 2660, 5130, or 5160."
63
   #endif
63
   #endif
64
 
64
 
65
+  template<typename TMC>
66
+  static void tmc_report_otpw(TMC &st) {
67
+    st.printLabel();
68
+    SERIAL_ECHOPGM(" temperature prewarn triggered: ");
69
+    serialprint_truefalse(st.getOTPW());
70
+    SERIAL_EOL();
71
+  }
72
+
73
+  template<typename TMC>
74
+  static void tmc_clear_otpw(TMC &st) {
75
+    st.clear_otpw();
76
+    st.printLabel();
77
+    SERIAL_ECHOLNPGM(" prewarn flag cleared");
78
+  }
79
+
65
   /**
80
   /**
66
    * M911: Report TMC stepper driver overtemperature pre-warn flag
81
    * M911: Report TMC stepper driver overtemperature pre-warn flag
67
    *       This flag is held by the library, persisting until cleared by M912
82
    *       This flag is held by the library, persisting until cleared by M912
223
 
238
 
224
 #endif // MONITOR_DRIVER_STATUS
239
 #endif // MONITOR_DRIVER_STATUS
225
 
240
 
226
-/**
227
- * M913: Set HYBRID_THRESHOLD speed.
228
- */
229
 #if ENABLED(HYBRID_THRESHOLD)
241
 #if ENABLED(HYBRID_THRESHOLD)
230
 
242
 
243
+  template<typename TMC>
244
+  static void tmc_print_pwmthrs(TMC &st) {
245
+    st.printLabel();
246
+    SERIAL_ECHOLNPGM(" stealthChop max speed: ", st.get_pwm_thrs());
247
+  }
248
+
249
+  /**
250
+   * M913: Set HYBRID_THRESHOLD speed.
251
+   */
231
   void GcodeSuite::M913() {
252
   void GcodeSuite::M913() {
232
     #define TMC_SAY_PWMTHRS(A,Q) tmc_print_pwmthrs(stepper##Q)
253
     #define TMC_SAY_PWMTHRS(A,Q) tmc_print_pwmthrs(stepper##Q)
233
     #define TMC_SET_PWMTHRS(A,Q) stepper##Q.set_pwm_thrs(value)
254
     #define TMC_SET_PWMTHRS(A,Q) stepper##Q.set_pwm_thrs(value)
235
     #define TMC_SET_PWMTHRS_E(E) stepperE##E.set_pwm_thrs(value)
256
     #define TMC_SET_PWMTHRS_E(E) stepperE##E.set_pwm_thrs(value)
236
 
257
 
237
     bool report = true;
258
     bool report = true;
238
-    #if AXIS_IS_TMC(X) || AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) || AXIS_IS_TMC(I) || AXIS_IS_TMC(J) || AXIS_IS_TMC(K)
239
-      const uint8_t index = parser.byteval('I');
259
+    #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4)
260
+      const int8_t index = parser.byteval('I', -1);
261
+    #else
262
+      constexpr int8_t index = -1;
240
     #endif
263
     #endif
241
     LOOP_LOGICAL_AXES(i) if (int32_t value = parser.longval(axis_codes[i])) {
264
     LOOP_LOGICAL_AXES(i) if (int32_t value = parser.longval(axis_codes[i])) {
242
       report = false;
265
       report = false;
243
       switch (i) {
266
       switch (i) {
244
         case X_AXIS:
267
         case X_AXIS:
245
-          TERN_(X_HAS_STEALTHCHOP,  if (index < 2) TMC_SET_PWMTHRS(X,X));
246
-          TERN_(X2_HAS_STEALTHCHOP, if (!(index & 1)) TMC_SET_PWMTHRS(X,X2));
268
+          TERN_(X_HAS_STEALTHCHOP,  if (index < 0 || index == 0) TMC_SET_PWMTHRS(X,X));
269
+          TERN_(X2_HAS_STEALTHCHOP, if (index < 0 || index == 1) TMC_SET_PWMTHRS(X,X2));
247
           break;
270
           break;
248
         case Y_AXIS:
271
         case Y_AXIS:
249
-          TERN_(Y_HAS_STEALTHCHOP,  if (index < 2) TMC_SET_PWMTHRS(Y,Y));
250
-          TERN_(Y2_HAS_STEALTHCHOP, if (!(index & 1)) TMC_SET_PWMTHRS(Y,Y2));
272
+          TERN_(Y_HAS_STEALTHCHOP,  if (index < 0 || index == 0) TMC_SET_PWMTHRS(Y,Y));
273
+          TERN_(Y2_HAS_STEALTHCHOP, if (index < 0 || index == 1) TMC_SET_PWMTHRS(Y,Y2));
251
           break;
274
           break;
252
 
275
 
253
         #if I_HAS_STEALTHCHOP
276
         #if I_HAS_STEALTHCHOP
261
         #endif
284
         #endif
262
 
285
 
263
         case Z_AXIS:
286
         case Z_AXIS:
264
-          TERN_(Z_HAS_STEALTHCHOP, if (index < 2) TMC_SET_PWMTHRS(Z,Z));
265
-          TERN_(Z2_HAS_STEALTHCHOP, if (index == 0 || index == 2) TMC_SET_PWMTHRS(Z,Z2));
266
-          TERN_(Z3_HAS_STEALTHCHOP, if (index == 0 || index == 3) TMC_SET_PWMTHRS(Z,Z3));
267
-          TERN_(Z4_HAS_STEALTHCHOP, if (index == 0 || index == 4) TMC_SET_PWMTHRS(Z,Z4));
287
+          TERN_(Z_HAS_STEALTHCHOP,  if (index < 0 || index == 0) TMC_SET_PWMTHRS(Z,Z));
288
+          TERN_(Z2_HAS_STEALTHCHOP, if (index < 0 || index == 1) TMC_SET_PWMTHRS(Z,Z2));
289
+          TERN_(Z3_HAS_STEALTHCHOP, if (index < 0 || index == 2) TMC_SET_PWMTHRS(Z,Z3));
290
+          TERN_(Z4_HAS_STEALTHCHOP, if (index < 0 || index == 3) TMC_SET_PWMTHRS(Z,Z4));
268
           break;
291
           break;
269
         #if E_STEPPERS
292
         #if E_STEPPERS
270
           case E_AXIS: {
293
           case E_AXIS: {
271
-            const int8_t target_e_stepper = get_target_e_stepper_from_command(0);
272
-            if (target_e_stepper < 0) return;
273
-            switch (target_e_stepper) {
274
-              TERN_(E0_HAS_STEALTHCHOP, case 0: TMC_SET_PWMTHRS_E(0); break;)
275
-              TERN_(E1_HAS_STEALTHCHOP, case 1: TMC_SET_PWMTHRS_E(1); break;)
276
-              TERN_(E2_HAS_STEALTHCHOP, case 2: TMC_SET_PWMTHRS_E(2); break;)
277
-              TERN_(E3_HAS_STEALTHCHOP, case 3: TMC_SET_PWMTHRS_E(3); break;)
278
-              TERN_(E4_HAS_STEALTHCHOP, case 4: TMC_SET_PWMTHRS_E(4); break;)
279
-              TERN_(E5_HAS_STEALTHCHOP, case 5: TMC_SET_PWMTHRS_E(5); break;)
280
-              TERN_(E6_HAS_STEALTHCHOP, case 6: TMC_SET_PWMTHRS_E(6); break;)
281
-              TERN_(E7_HAS_STEALTHCHOP, case 7: TMC_SET_PWMTHRS_E(7); break;)
282
-            }
294
+            const int8_t eindex = get_target_e_stepper_from_command();
295
+            TERN_(E0_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 0) TMC_SET_PWMTHRS_E(0));
296
+            TERN_(E1_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 1) TMC_SET_PWMTHRS_E(1));
297
+            TERN_(E2_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 2) TMC_SET_PWMTHRS_E(2));
298
+            TERN_(E3_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 3) TMC_SET_PWMTHRS_E(3));
299
+            TERN_(E4_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 4) TMC_SET_PWMTHRS_E(4));
300
+            TERN_(E5_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 5) TMC_SET_PWMTHRS_E(5));
301
+            TERN_(E6_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 6) TMC_SET_PWMTHRS_E(6));
302
+            TERN_(E7_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 7) TMC_SET_PWMTHRS_E(7));
283
           } break;
303
           } break;
284
         #endif // E_STEPPERS
304
         #endif // E_STEPPERS
285
       }
305
       }
407
 
427
 
408
 #endif // HYBRID_THRESHOLD
428
 #endif // HYBRID_THRESHOLD
409
 
429
 
410
-/**
411
- * M914: Set StallGuard sensitivity.
412
- */
413
 #if USE_SENSORLESS
430
 #if USE_SENSORLESS
414
 
431
 
432
+  template<typename TMC>
433
+  static void tmc_print_sgt(TMC &st) {
434
+    st.printLabel();
435
+    SERIAL_ECHOPGM(" homing sensitivity: ");
436
+    SERIAL_PRINTLN(st.homing_threshold(), PrintBase::Dec);
437
+  }
438
+
439
+  /**
440
+   * M914: Set StallGuard sensitivity.
441
+   */
415
   void GcodeSuite::M914() {
442
   void GcodeSuite::M914() {
416
 
443
 
417
     bool report = true;
444
     bool report = true;

+ 1
- 1
Marlin/src/gcode/gcode.cpp View File

159
 }
159
 }
160
 
160
 
161
 /**
161
 /**
162
- * Set XYZIJKE destination and feedrate from the current GCode command
162
+ * Set XYZ...E destination and feedrate from the current GCode command
163
  *
163
  *
164
  *  - Set destination from included axis codes
164
  *  - Set destination from included axis codes
165
  *  - Set to current for missing axis codes
165
  *  - Set to current for missing axis codes

+ 1
- 1
Marlin/src/gcode/gcode.h View File

284
  * M871 - Print/reset/clear first layer temperature offset values. (Requires PTC_PROBE, PTC_BED, or PTC_HOTEND)
284
  * M871 - Print/reset/clear first layer temperature offset values. (Requires PTC_PROBE, PTC_BED, or PTC_HOTEND)
285
  * M876 - Handle Prompt Response. (Requires HOST_PROMPT_SUPPORT and not EMERGENCY_PARSER)
285
  * M876 - Handle Prompt Response. (Requires HOST_PROMPT_SUPPORT and not EMERGENCY_PARSER)
286
  * M900 - Get or Set Linear Advance K-factor. (Requires LIN_ADVANCE)
286
  * M900 - Get or Set Linear Advance K-factor. (Requires LIN_ADVANCE)
287
- * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660 or L6470)
287
+ * M906 - Set or get motor current in milliamps using axis codes XYZE, etc. Report values if no axis codes given. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660 or L6470)
288
  * M907 - Set digital trimpot motor current using axis codes. (Requires a board with digital trimpots)
288
  * M907 - Set digital trimpot motor current using axis codes. (Requires a board with digital trimpots)
289
  * M908 - Control digital trimpot directly. (Requires HAS_MOTOR_CURRENT_DAC or DIGIPOTSS_PIN)
289
  * M908 - Control digital trimpot directly. (Requires HAS_MOTOR_CURRENT_DAC or DIGIPOTSS_PIN)
290
  * M909 - Print digipot/DAC current value. (Requires HAS_MOTOR_CURRENT_DAC)
290
  * M909 - Print digipot/DAC current value. (Requires HAS_MOTOR_CURRENT_DAC)

+ 0
- 6
Marlin/src/module/stepper/trinamic.h View File

74
   #define TMC_CLASS_E(N) TMC_CLASS(E##N, E)
74
   #define TMC_CLASS_E(N) TMC_CLASS(E##N, E)
75
 #endif
75
 #endif
76
 
76
 
77
-typedef struct {
78
-  uint8_t toff;
79
-  int8_t hend;
80
-  uint8_t hstrt;
81
-} chopper_timing_t;
82
-
83
 #ifndef CHOPPER_TIMING_X
77
 #ifndef CHOPPER_TIMING_X
84
   #define CHOPPER_TIMING_X CHOPPER_TIMING
78
   #define CHOPPER_TIMING_X CHOPPER_TIMING
85
 #endif
79
 #endif

Loading…
Cancel
Save