Ver código fonte

Migrate to a new TMC library (#11943)

teemuatlut 6 anos atrás
pai
commit
c3229e1b34

+ 3
- 0
Marlin/src/Marlin.cpp Ver arquivo

@@ -736,6 +736,9 @@ void setup() {
736 736
   SERIAL_ECHO_START();
737 737
 
738 738
   #if HAS_DRIVER(TMC2130)
739
+    #if DISABLED(TMC_USE_SW_SPI)
740
+      SPI.begin();
741
+    #endif
739 742
     tmc_init_cs_pins();
740 743
   #endif
741 744
   #if HAS_DRIVER(TMC2208)

+ 3
- 3
Marlin/src/core/drivers.h Ver arquivo

@@ -31,9 +31,9 @@
31 31
 #define TB6560              0x006
32 32
 #define TB6600              0x007
33 33
 #define TMC2100             0x008
34
-#define TMC2130             0x109
34
+#define TMC2130             2130
35 35
 #define TMC2130_STANDALONE  0x009
36
-#define TMC2208             0x10A
36
+#define TMC2208             2208
37 37
 #define TMC2208_STANDALONE  0x00A
38 38
 #define TMC26X              0x10B
39 39
 #define TMC26X_STANDALONE   0x00B
@@ -45,7 +45,7 @@
45 45
 #define AXIS_DRIVER_TYPE_X(T) _AXIS_DRIVER_TYPE(X,T)
46 46
 #define AXIS_DRIVER_TYPE_Y(T) _AXIS_DRIVER_TYPE(Y,T)
47 47
 #define AXIS_DRIVER_TYPE_Z(T) _AXIS_DRIVER_TYPE(Z,T)
48
-#define AXIS_DRIVER_TYPE_X2(T) (ENABLED(X_DUAL_STEPPER_DRIVERS) || ENABLED(DUAL_X_CARRIAGE)) && _AXIS_DRIVER_TYPE(X2,T)
48
+#define AXIS_DRIVER_TYPE_X2(T) ((ENABLED(X_DUAL_STEPPER_DRIVERS) || ENABLED(DUAL_X_CARRIAGE)) && _AXIS_DRIVER_TYPE(X2,T))
49 49
 #define AXIS_DRIVER_TYPE_Y2(T) (ENABLED(Y_DUAL_STEPPER_DRIVERS) && _AXIS_DRIVER_TYPE(Y2,T))
50 50
 #define AXIS_DRIVER_TYPE_Z2(T) (Z_MULTI_STEPPER_DRIVERS && _AXIS_DRIVER_TYPE(Z2,T))
51 51
 #define AXIS_DRIVER_TYPE_Z3(T) (ENABLED(Z_TRIPLE_STEPPER_DRIVERS) && _AXIS_DRIVER_TYPE(Z3,T))

+ 5
- 0
Marlin/src/core/language.h Ver arquivo

@@ -285,6 +285,10 @@
285 285
   #define MSG_B "Y"
286 286
   #define MSG_C "Z"
287 287
 #endif
288
+#define MSG_X2 "X2"
289
+#define MSG_Y2 "Y2"
290
+#define MSG_Z2 "Z2"
291
+#define MSG_Z3 "Z3"
288 292
 #define MSG_H1 "1"
289 293
 #define MSG_H2 "2"
290 294
 #define MSG_H3 "3"
@@ -297,6 +301,7 @@
297 301
 #define MSG_N4 " 4"
298 302
 #define MSG_N5 " 5"
299 303
 #define MSG_N6 " 6"
304
+#define MSG_E0 "E0"
300 305
 #define MSG_E1 "E1"
301 306
 #define MSG_E2 "E2"
302 307
 #define MSG_E3 "E3"

+ 92
- 196
Marlin/src/feature/tmc_util.cpp Ver arquivo

@@ -36,8 +36,6 @@
36 36
   #include "../module/planner.h"
37 37
 #endif
38 38
 
39
-bool report_tmc_status = false;
40
-
41 39
 /**
42 40
  * Check for over temperature or short to ground error flags.
43 41
  * Report and log warning of overtemperature condition.
@@ -46,6 +44,8 @@ bool report_tmc_status = false;
46 44
  * and so we don't repeatedly report warning before the condition is cleared.
47 45
  */
48 46
 #if ENABLED(MONITOR_DRIVER_STATUS)
47
+  static bool report_tmc_status = false;
48
+
49 49
   struct TMC_driver_data {
50 50
     uint32_t drv_status;
51 51
     bool is_otpw;
@@ -95,13 +95,13 @@ bool report_tmc_status = false;
95 95
   #endif
96 96
 
97 97
   template<typename TMC>
98
-  void monitor_tmc_driver(TMC &st, const TMC_AxisEnum axis, uint8_t &otpw_cnt) {
98
+  void monitor_tmc_driver(TMC &st) {
99 99
     TMC_driver_data data = get_driver_data(st);
100 100
 
101 101
     #if ENABLED(STOP_ON_ERROR)
102 102
       if (data.is_error) {
103 103
         SERIAL_EOL();
104
-        _tmc_say_axis(axis);
104
+        st.printLabel();
105 105
         SERIAL_ECHOLNPGM(" driver error detected:");
106 106
         if (data.is_ot) SERIAL_ECHOLNPGM("overtemperature");
107 107
         if (st.s2ga()) SERIAL_ECHOLNPGM("short to ground (coil A)");
@@ -114,7 +114,7 @@ bool report_tmc_status = false;
114 114
     #endif
115 115
 
116 116
     // Report if a warning was triggered
117
-    if (data.is_otpw && otpw_cnt == 0) {
117
+    if (data.is_otpw && st.otpw_count == 0) {
118 118
       char timestamp[10];
119 119
       duration_t elapsed = print_job_timer.duration();
120 120
       const bool has_days = (elapsed.value > 60*60*24L);
@@ -122,38 +122,38 @@ bool report_tmc_status = false;
122 122
       SERIAL_EOL();
123 123
       SERIAL_ECHO(timestamp);
124 124
       SERIAL_ECHOPGM(": ");
125
-      _tmc_say_axis(axis);
125
+      st.printLabel();
126 126
       SERIAL_ECHOPGM(" driver overtemperature warning! (");
127
-      SERIAL_ECHO(st.getCurrent());
127
+      SERIAL_ECHO(st.getMilliamps());
128 128
       SERIAL_ECHOLNPGM("mA)");
129 129
     }
130 130
     #if CURRENT_STEP_DOWN > 0
131 131
       // Decrease current if is_otpw is true and driver is enabled and there's been more than 4 warnings
132
-      if (data.is_otpw && st.isEnabled() && otpw_cnt > 4) {
133
-        st.setCurrent(st.getCurrent() - (CURRENT_STEP_DOWN), R_SENSE, HOLD_MULTIPLIER);
132
+      if (data.is_otpw && st.isEnabled() && st.otpw_count > 4) {
133
+        st.rms_current(st.getMilliamps() - (CURRENT_STEP_DOWN));
134 134
         #if ENABLED(REPORT_CURRENT_CHANGE)
135
-          _tmc_say_axis(axis);
136
-          SERIAL_ECHOLNPAIR(" current decreased to ", st.getCurrent());
135
+          st.printLabel();
136
+          SERIAL_ECHOLNPAIR(" current decreased to ", st.getMilliamps());
137 137
         #endif
138 138
       }
139 139
     #endif
140 140
 
141 141
     if (data.is_otpw) {
142
-      otpw_cnt++;
142
+      st.otpw_count++;
143 143
       st.flag_otpw = true;
144 144
     }
145
-    else if (otpw_cnt > 0) otpw_cnt = 0;
145
+    else if (st.otpw_count > 0) st.otpw_count = 0;
146 146
 
147 147
     if (report_tmc_status) {
148 148
       const uint32_t pwm_scale = get_pwm_scale(st);
149
-      _tmc_say_axis(axis);
149
+      st.printLabel();
150 150
       SERIAL_ECHOPAIR(":", pwm_scale);
151 151
       SERIAL_ECHOPGM(" |0b"); SERIAL_PRINT(get_status_response(st), BIN);
152 152
       SERIAL_ECHOPGM("| ");
153 153
       if (data.is_error) SERIAL_CHAR('E');
154 154
       else if (data.is_ot) SERIAL_CHAR('O');
155 155
       else if (data.is_otpw) SERIAL_CHAR('W');
156
-      else if (otpw_cnt > 0) SERIAL_PRINT(otpw_cnt, DEC);
156
+      else if (st.otpw_count > 0) SERIAL_PRINT(st.otpw_count, DEC);
157 157
       else if (st.flag_otpw) SERIAL_CHAR('F');
158 158
       SERIAL_CHAR('\t');
159 159
     }
@@ -166,56 +166,43 @@ bool report_tmc_status = false;
166 166
     if (ELAPSED(millis(), next_cOT)) {
167 167
       next_cOT = millis() + 500;
168 168
       #if HAS_HW_COMMS(X)
169
-        static uint8_t x_otpw_cnt = 0;
170
-        monitor_tmc_driver(stepperX, TMC_X, x_otpw_cnt);
169
+        monitor_tmc_driver(stepperX);
171 170
       #endif
172 171
       #if HAS_HW_COMMS(Y)
173
-        static uint8_t y_otpw_cnt = 0;
174
-        monitor_tmc_driver(stepperY, TMC_Y, y_otpw_cnt);
172
+        monitor_tmc_driver(stepperY);
175 173
       #endif
176 174
       #if HAS_HW_COMMS(Z)
177
-        static uint8_t z_otpw_cnt = 0;
178
-        monitor_tmc_driver(stepperZ, TMC_Z, z_otpw_cnt);
175
+        monitor_tmc_driver(stepperZ);
179 176
       #endif
180 177
       #if HAS_HW_COMMS(X2)
181
-        static uint8_t x2_otpw_cnt = 0;
182
-        monitor_tmc_driver(stepperX2, TMC_X, x2_otpw_cnt);
178
+        monitor_tmc_driver(stepperX2);
183 179
       #endif
184 180
       #if HAS_HW_COMMS(Y2)
185
-        static uint8_t y2_otpw_cnt = 0;
186
-        monitor_tmc_driver(stepperY2, TMC_Y, y2_otpw_cnt);
181
+        monitor_tmc_driver(stepperY2);
187 182
       #endif
188 183
       #if HAS_HW_COMMS(Z2)
189
-        static uint8_t z2_otpw_cnt = 0;
190
-        monitor_tmc_driver(stepperZ2, TMC_Z, z2_otpw_cnt);
184
+        monitor_tmc_driver(stepperZ2);
191 185
       #endif
192 186
       #if HAS_HW_COMMS(Z3)
193
-        static uint8_t z3_otpw_cnt = 0;
194
-        monitor_tmc_driver(stepperZ3, TMC_Z, z3_otpw_cnt);
187
+        monitor_tmc_driver(stepperZ3);
195 188
       #endif
196 189
       #if HAS_HW_COMMS(E0)
197
-        static uint8_t e0_otpw_cnt = 0;
198
-        monitor_tmc_driver(stepperE0, TMC_E0, e0_otpw_cnt);
190
+        monitor_tmc_driver(stepperE0);
199 191
       #endif
200 192
       #if HAS_HW_COMMS(E1)
201
-        static uint8_t e1_otpw_cnt = 0;
202
-        monitor_tmc_driver(stepperE1, TMC_E1, e1_otpw_cnt);
193
+        monitor_tmc_driver(stepperE1);
203 194
       #endif
204 195
       #if HAS_HW_COMMS(E2)
205
-        static uint8_t e2_otpw_cnt = 0;
206
-        monitor_tmc_driver(stepperE2, TMC_E2, e2_otpw_cnt);
196
+        monitor_tmc_driver(stepperE2);
207 197
       #endif
208 198
       #if HAS_HW_COMMS(E3)
209
-        static uint8_t e3_otpw_cnt = 0;
210
-        monitor_tmc_driver(stepperE3, TMC_E3, e3_otpw_cnt);
199
+        monitor_tmc_driver(stepperE3);
211 200
       #endif
212 201
       #if HAS_HW_COMMS(E4)
213
-        static uint8_t e4_otpw_cnt = 0;
214
-        monitor_tmc_driver(stepperE4, TMC_E4, e4_otpw_cnt);
202
+        monitor_tmc_driver(stepperE4);
215 203
       #endif
216 204
       #if HAS_HW_COMMS(E5)
217
-        static uint8_t e5_otpw_cnt = 0;
218
-        monitor_tmc_driver(stepperE5, TMC_E5, e5_otpw_cnt);
205
+        monitor_tmc_driver(stepperE5);
219 206
       #endif
220 207
 
221 208
       if (report_tmc_status) SERIAL_EOL();
@@ -224,100 +211,6 @@ bool report_tmc_status = false;
224 211
 
225 212
 #endif // MONITOR_DRIVER_STATUS
226 213
 
227
-void _tmc_say_axis(const TMC_AxisEnum axis) {
228
-  static const char ext_X[] PROGMEM = "X", ext_Y[] PROGMEM = "Y", ext_Z[] PROGMEM = "Z"
229
-    #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(X_DUAL_STEPPER_DRIVERS)
230
-      , ext_X2[] PROGMEM = "X2"
231
-    #endif
232
-    #if ENABLED(Y_DUAL_STEPPER_DRIVERS)
233
-      , ext_Y2[] PROGMEM = "Y2"
234
-    #endif
235
-    #if Z_MULTI_STEPPER_DRIVERS
236
-      , ext_Z2[] PROGMEM = "Z2"
237
-      #if ENABLED(Z_TRIPLE_STEPPER_DRIVERS)
238
-        , ext_Z3[] PROGMEM = "Z3"
239
-      #endif
240
-    #endif
241
-    #if E_STEPPERS
242
-      , ext_E0[] PROGMEM = "E0"
243
-      #if E_STEPPERS > 1
244
-        , ext_E1[] PROGMEM = "E1"
245
-        #if E_STEPPERS > 2
246
-          , ext_E2[] PROGMEM = "E2"
247
-          #if E_STEPPERS > 3
248
-            , ext_E3[] PROGMEM = "E3"
249
-            #if E_STEPPERS > 4
250
-              , ext_E4[] PROGMEM = "E4"
251
-              #if E_STEPPERS > 5
252
-                , ext_E5[] PROGMEM = "E5"
253
-              #endif
254
-            #endif
255
-          #endif
256
-        #endif
257
-      #endif
258
-    #endif
259
-  ;
260
-
261
-  static PGM_P const tmc_axes[] PROGMEM = {
262
-    ext_X, ext_Y, ext_Z
263
-    #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(X_DUAL_STEPPER_DRIVERS)
264
-      , ext_X2
265
-    #endif
266
-    #if ENABLED(Y_DUAL_STEPPER_DRIVERS)
267
-      , ext_Y2
268
-    #endif
269
-    #if Z_MULTI_STEPPER_DRIVERS
270
-      , ext_Z2
271
-      #if ENABLED(Z_TRIPLE_STEPPER_DRIVERS)
272
-        , ext_Z3
273
-      #endif
274
-    #endif
275
-    #if E_STEPPERS
276
-      , ext_E0
277
-      #if E_STEPPERS > 1
278
-        , ext_E1
279
-        #if E_STEPPERS > 2
280
-          , ext_E2
281
-          #if E_STEPPERS > 3
282
-            , ext_E3
283
-            #if E_STEPPERS > 4
284
-              , ext_E4
285
-              #if E_STEPPERS > 5
286
-                , ext_E5
287
-              #endif
288
-            #endif
289
-          #endif
290
-        #endif
291
-      #endif
292
-    #endif
293
-  };
294
-  serialprintPGM((char*)pgm_read_ptr(&tmc_axes[axis]));
295
-}
296
-
297
-void _tmc_say_current(const TMC_AxisEnum axis, const uint16_t curr) {
298
-  _tmc_say_axis(axis);
299
-  SERIAL_ECHOLNPAIR(" driver current: ", curr);
300
-}
301
-void _tmc_say_otpw(const TMC_AxisEnum axis, const bool otpw) {
302
-  _tmc_say_axis(axis);
303
-  SERIAL_ECHOPGM(" temperature prewarn triggered: ");
304
-  serialprintPGM(otpw ? PSTR("true") : PSTR("false"));
305
-  SERIAL_EOL();
306
-}
307
-void _tmc_say_otpw_cleared(const TMC_AxisEnum axis) {
308
-  _tmc_say_axis(axis);
309
-  SERIAL_ECHOLNPGM(" prewarn flag cleared");
310
-}
311
-void _tmc_say_pwmthrs(const TMC_AxisEnum axis, const uint32_t thrs) {
312
-  _tmc_say_axis(axis);
313
-  SERIAL_ECHOLNPAIR(" stealthChop max speed: ", thrs);
314
-}
315
-void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) {
316
-  _tmc_say_axis(axis);
317
-  SERIAL_ECHOPGM(" homing sensitivity: ");
318
-  SERIAL_PRINTLN(sgt, DEC);
319
-}
320
-
321 214
 #if ENABLED(TMC_DEBUG)
322 215
 
323 216
   enum TMC_debug_enum : char {
@@ -366,9 +259,7 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) {
366 259
     TMC_S2VSB,
367 260
     TMC_S2VSA
368 261
   };
369
-  static void drv_status_print_hex(const TMC_AxisEnum axis, const uint32_t drv_status) {
370
-    _tmc_say_axis(axis);
371
-    SERIAL_ECHOPGM(" = 0x");
262
+  static void drv_status_print_hex(const uint32_t drv_status) {
372 263
     for (int B = 24; B >= 8; B -= 8){
373 264
       SERIAL_PRINT((drv_status >> (B + 4)) & 0xF, HEX);
374 265
       SERIAL_PRINT((drv_status >> B) & 0xF, HEX);
@@ -379,17 +270,19 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) {
379 270
     SERIAL_EOL();
380 271
   }
381 272
 
273
+  template<class TMC>
274
+  static void print_vsense(TMC &st) { serialprintPGM(st.vsense() ? PSTR("1=.18") : PSTR("0=.325")); }
275
+
382 276
   #if HAS_DRIVER(TMC2130)
383 277
     static void tmc_status(TMC2130Stepper &st, const TMC_debug_enum i) {
384 278
       switch (i) {
385 279
         case TMC_PWM_SCALE: SERIAL_PRINT(st.PWM_SCALE(), DEC); break;
386
-        case TMC_TSTEP: SERIAL_ECHO(st.TSTEP()); break;
387 280
         case TMC_SGT: SERIAL_PRINT(st.sgt(), DEC); break;
388
-        case TMC_STEALTHCHOP: serialprintPGM(st.stealthChop() ? PSTR("true") : PSTR("false")); break;
281
+        case TMC_STEALTHCHOP: serialprintPGM(st.en_pwm_mode() ? PSTR("true") : PSTR("false")); break;
389 282
         default: break;
390 283
       }
391 284
     }
392
-    static void tmc_parse_drv_status(TMC2130Stepper &st, const TMC_drv_status_enum i) {
285
+    static void _tmc_parse_drv_status(TMC2130Stepper &st, const TMC_drv_status_enum i) {
393 286
       switch (i) {
394 287
         case TMC_STALLGUARD: if (st.stallguard()) SERIAL_CHAR('X'); break;
395 288
         case TMC_SG_RESULT:  SERIAL_PRINT(st.sg_result(), DEC);   break;
@@ -402,7 +295,6 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) {
402 295
   #if HAS_DRIVER(TMC2208)
403 296
     static void tmc_status(TMC2208Stepper &st, const TMC_debug_enum i) {
404 297
       switch (i) {
405
-        case TMC_TSTEP: { uint32_t data = 0; st.TSTEP(&data); SERIAL_PROTOCOL(data); break; }
406 298
         case TMC_PWM_SCALE: SERIAL_PRINT(st.pwm_scale_sum(), DEC); break;
407 299
         case TMC_STEALTHCHOP: serialprintPGM(st.stealth() ? PSTR("true") : PSTR("false")); break;
408 300
         case TMC_S2VSA: if (st.s2vsa()) SERIAL_CHAR('X'); break;
@@ -410,7 +302,7 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) {
410 302
         default: break;
411 303
       }
412 304
     }
413
-    static void tmc_parse_drv_status(TMC2208Stepper &st, const TMC_drv_status_enum i) {
305
+    static void _tmc_parse_drv_status(TMC2208Stepper &st, const TMC_drv_status_enum i) {
414 306
       switch (i) {
415 307
         case TMC_T157: if (st.t157()) SERIAL_CHAR('X'); break;
416 308
         case TMC_T150: if (st.t150()) SERIAL_CHAR('X'); break;
@@ -422,12 +314,12 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) {
422 314
   #endif
423 315
 
424 316
   template <typename TMC>
425
-  static void tmc_status(TMC &st, const TMC_AxisEnum axis, const TMC_debug_enum i, const float spmm) {
317
+  static void tmc_status(TMC &st, const TMC_debug_enum i, const float spmm) {
426 318
     SERIAL_ECHO('\t');
427 319
     switch (i) {
428
-      case TMC_CODES: _tmc_say_axis(axis); break;
320
+      case TMC_CODES: st.printLabel(); break;
429 321
       case TMC_ENABLED: serialprintPGM(st.isEnabled() ? PSTR("true") : PSTR("false")); break;
430
-      case TMC_CURRENT: SERIAL_ECHO(st.getCurrent()); break;
322
+      case TMC_CURRENT: SERIAL_ECHO(st.getMilliamps()); break;
431 323
       case TMC_RMS_CURRENT: SERIAL_PROTOCOL(st.rms_current()); break;
432 324
       case TMC_MAX_CURRENT: SERIAL_PRINT((float)st.rms_current() * 1.41, 0); break;
433 325
       case TMC_IRUN:
@@ -442,10 +334,9 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) {
442 334
         SERIAL_PRINT(st.cs_actual(), DEC);
443 335
         SERIAL_ECHOPGM("/31");
444 336
         break;
445
-
446
-      case TMC_VSENSE: serialprintPGM(st.vsense() ? PSTR("1=.18") : PSTR("0=.325")); break;
447
-
337
+      case TMC_VSENSE: print_vsense(st); break;
448 338
       case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break;
339
+      case TMC_TSTEP: SERIAL_ECHO(st.TSTEP()); break;
449 340
       case TMC_TPWMTHRS: {
450 341
           uint32_t tpwmthrs_val = st.TPWMTHRS();
451 342
           SERIAL_ECHO(tpwmthrs_val);
@@ -470,10 +361,10 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) {
470 361
   }
471 362
 
472 363
   template <typename TMC>
473
-  static void tmc_parse_drv_status(TMC &st, const TMC_AxisEnum axis, const TMC_drv_status_enum i) {
364
+  static void tmc_parse_drv_status(TMC &st, const TMC_drv_status_enum i) {
474 365
     SERIAL_CHAR('\t');
475 366
     switch (i) {
476
-      case TMC_DRV_CODES:     _tmc_say_axis(axis);  break;
367
+      case TMC_DRV_CODES:     st.printLabel();  break;
477 368
       case TMC_STST:          if (st.stst())         SERIAL_CHAR('X'); break;
478 369
       case TMC_OLB:           if (st.olb())          SERIAL_CHAR('X'); break;
479 370
       case TMC_OLA:           if (st.ola())          SERIAL_CHAR('X'); break;
@@ -482,69 +373,73 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) {
482 373
       case TMC_DRV_OTPW:      if (st.otpw())         SERIAL_CHAR('X'); break;
483 374
       case TMC_OT:            if (st.ot())           SERIAL_CHAR('X'); break;
484 375
       case TMC_DRV_CS_ACTUAL: SERIAL_PRINT(st.cs_actual(), DEC);       break;
485
-      case TMC_DRV_STATUS_HEX:drv_status_print_hex(axis, st.DRV_STATUS()); break;
486
-      default: tmc_parse_drv_status(st, i); break;
376
+      case TMC_DRV_STATUS_HEX:
377
+        st.printLabel();
378
+        SERIAL_ECHOPGM("\t0x");
379
+        drv_status_print_hex(st.DRV_STATUS());
380
+        break;
381
+      default: _tmc_parse_drv_status(st, i); break;
487 382
     }
488 383
   }
489 384
 
490 385
   static void tmc_debug_loop(const TMC_debug_enum i) {
491 386
     #if AXIS_IS_TMC(X)
492
-      tmc_status(stepperX, TMC_X, i, planner.axis_steps_per_mm[X_AXIS]);
387
+      tmc_status(stepperX, i, planner.axis_steps_per_mm[X_AXIS]);
493 388
     #endif
494 389
     #if AXIS_IS_TMC(X2)
495
-      tmc_status(stepperX2, TMC_X2, i, planner.axis_steps_per_mm[X_AXIS]);
390
+      tmc_status(stepperX2, i, planner.axis_steps_per_mm[X_AXIS]);
496 391
     #endif
497 392
 
498 393
     #if AXIS_IS_TMC(Y)
499
-      tmc_status(stepperY, TMC_Y, i, planner.axis_steps_per_mm[Y_AXIS]);
394
+      tmc_status(stepperY, i, planner.axis_steps_per_mm[Y_AXIS]);
500 395
     #endif
501 396
     #if AXIS_IS_TMC(Y2)
502
-      tmc_status(stepperY2, TMC_Y2, i, planner.axis_steps_per_mm[Y_AXIS]);
397
+      tmc_status(stepperY2, i, planner.axis_steps_per_mm[Y_AXIS]);
503 398
     #endif
504 399
 
505 400
     #if AXIS_IS_TMC(Z)
506
-      tmc_status(stepperZ, TMC_Z, i, planner.axis_steps_per_mm[Z_AXIS]);
401
+      tmc_status(stepperZ, i, planner.axis_steps_per_mm[Z_AXIS]);
507 402
     #endif
508 403
     #if AXIS_IS_TMC(Z2)
509
-      tmc_status(stepperZ2, TMC_Z2, i, planner.axis_steps_per_mm[Z_AXIS]);
404
+      tmc_status(stepperZ2, i, planner.axis_steps_per_mm[Z_AXIS]);
510 405
     #endif
511 406
     #if AXIS_IS_TMC(Z3)
512
-      tmc_status(stepperZ3, TMC_Z3, i, planner.axis_steps_per_mm[Z_AXIS]);
407
+      tmc_status(stepperZ3, i, planner.axis_steps_per_mm[Z_AXIS]);
513 408
     #endif
514 409
 
515 410
     #if AXIS_IS_TMC(E0)
516
-      tmc_status(stepperE0, TMC_E0, i, planner.axis_steps_per_mm[E_AXIS]);
411
+      tmc_status(stepperE0, i, planner.axis_steps_per_mm[E_AXIS]);
517 412
     #endif
518 413
     #if AXIS_IS_TMC(E1)
519
-      tmc_status(stepperE1, TMC_E1, i, planner.axis_steps_per_mm[E_AXIS
414
+      tmc_status(stepperE1, i, planner.axis_steps_per_mm[E_AXIS
520 415
         #if ENABLED(DISTINCT_E_FACTORS)
521 416
           + 1
522 417
         #endif
523 418
       ]);
524 419
     #endif
525 420
     #if AXIS_IS_TMC(E2)
526
-      tmc_status(stepperE2, TMC_E2, i, planner.axis_steps_per_mm[E_AXIS
421
+      tmc_status(stepperE2, i, planner.axis_steps_per_mm[E_AXIS
527 422
         #if ENABLED(DISTINCT_E_FACTORS)
528 423
           + 2
529 424
         #endif
530 425
       ]);
531 426
     #endif
532 427
     #if AXIS_IS_TMC(E3)
533
-      tmc_status(stepperE3, TMC_E3, i, planner.axis_steps_per_mm[E_AXIS
428
+      tmc_status(stepperE3, i, planner.axis_steps_per_mm[E_AXIS
534 429
         #if ENABLED(DISTINCT_E_FACTORS)
535 430
           + 3
536 431
         #endif
537 432
       ]);
538 433
     #endif
539 434
     #if AXIS_IS_TMC(E4)
540
-      tmc_status(stepperE4, TMC_E4, i, planner.axis_steps_per_mm[E_AXIS
435
+      tmc_status(stepperE4, i, planner.axis_steps_per_mm[E_AXIS
541 436
         #if ENABLED(DISTINCT_E_FACTORS)
542 437
           + 4
543 438
         #endif
544 439
       ]);
545 440
     #endif
546 441
     #if AXIS_IS_TMC(E5)
547
-      tmc_status(stepperE5, TMC_E5, i, planner.axis_steps_per_mm[E_AXIS
442
+      tmc_status(stepperE5, i, planner.axis_steps_per_mm[E_AXIS
548 443
         #if ENABLED(DISTINCT_E_FACTORS)
549 444
           + 5
550 445
         #endif
@@ -556,46 +451,46 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) {
556 451
 
557 452
   static void drv_status_loop(const TMC_drv_status_enum i) {
558 453
     #if AXIS_IS_TMC(X)
559
-      tmc_parse_drv_status(stepperX, TMC_X, i);
454
+      tmc_parse_drv_status(stepperX, i);
560 455
     #endif
561 456
     #if AXIS_IS_TMC(X2)
562
-      tmc_parse_drv_status(stepperX2, TMC_X2, i);
457
+      tmc_parse_drv_status(stepperX2, i);
563 458
     #endif
564 459
 
565 460
     #if AXIS_IS_TMC(Y)
566
-      tmc_parse_drv_status(stepperY, TMC_Y, i);
461
+      tmc_parse_drv_status(stepperY, i);
567 462
     #endif
568 463
     #if AXIS_IS_TMC(Y2)
569
-      tmc_parse_drv_status(stepperY2, TMC_Y2, i);
464
+      tmc_parse_drv_status(stepperY2, i);
570 465
     #endif
571 466
 
572 467
     #if AXIS_IS_TMC(Z)
573
-      tmc_parse_drv_status(stepperZ, TMC_Z, i);
468
+      tmc_parse_drv_status(stepperZ, i);
574 469
     #endif
575 470
     #if AXIS_IS_TMC(Z2)
576
-      tmc_parse_drv_status(stepperZ2, TMC_Z2, i);
471
+      tmc_parse_drv_status(stepperZ2, i);
577 472
     #endif
578 473
     #if AXIS_IS_TMC(Z3)
579
-      tmc_parse_drv_status(stepperZ3, TMC_Z3, i);
474
+      tmc_parse_drv_status(stepperZ3, i);
580 475
     #endif
581 476
 
582 477
     #if AXIS_IS_TMC(E0)
583
-      tmc_parse_drv_status(stepperE0, TMC_E0, i);
478
+      tmc_parse_drv_status(stepperE0, i);
584 479
     #endif
585 480
     #if AXIS_IS_TMC(E1)
586
-      tmc_parse_drv_status(stepperE1, TMC_E1, i);
481
+      tmc_parse_drv_status(stepperE1, i);
587 482
     #endif
588 483
     #if AXIS_IS_TMC(E2)
589
-      tmc_parse_drv_status(stepperE2, TMC_E2, i);
484
+      tmc_parse_drv_status(stepperE2, i);
590 485
     #endif
591 486
     #if AXIS_IS_TMC(E3)
592
-      tmc_parse_drv_status(stepperE3, TMC_E3, i);
487
+      tmc_parse_drv_status(stepperE3, i);
593 488
     #endif
594 489
     #if AXIS_IS_TMC(E4)
595
-      tmc_parse_drv_status(stepperE4, TMC_E4, i);
490
+      tmc_parse_drv_status(stepperE4, i);
596 491
     #endif
597 492
     #if AXIS_IS_TMC(E5)
598
-      tmc_parse_drv_status(stepperE5, TMC_E5, i);
493
+      tmc_parse_drv_status(stepperE5, i);
599 494
     #endif
600 495
 
601 496
     SERIAL_EOL();
@@ -620,7 +515,7 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) {
620 515
     TMC_REPORT("Run current",        TMC_IRUN);
621 516
     TMC_REPORT("Hold current",       TMC_IHOLD);
622 517
     TMC_REPORT("CS actual\t",        TMC_CS_ACTUAL);
623
-    TMC_REPORT("PWM scale\t",        TMC_PWM_SCALE);
518
+    TMC_REPORT("PWM scale",          TMC_PWM_SCALE);
624 519
     TMC_REPORT("vsense\t",           TMC_VSENSE);
625 520
     TMC_REPORT("stealthChop",        TMC_STEALTHCHOP);
626 521
     TMC_REPORT("msteps\t",           TMC_MICROSTEPS);
@@ -657,7 +552,7 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) {
657 552
       DRV_REPORT("s2vsa\t",          TMC_S2VSA);
658 553
       DRV_REPORT("s2vsb\t",          TMC_S2VSB);
659 554
     #endif
660
-    DRV_REPORT("Driver registers:",  TMC_DRV_STATUS_HEX);
555
+    DRV_REPORT("Driver registers:\n",TMC_DRV_STATUS_HEX);
661 556
     SERIAL_EOL();
662 557
   }
663 558
 
@@ -666,9 +561,9 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) {
666 561
 #if USE_SENSORLESS
667 562
 
668 563
   void tmc_stallguard(TMC2130Stepper &st, const bool enable/*=true*/) {
669
-    st.coolstep_min_speed(enable ? 1024UL * 1024UL - 1UL : 0);
564
+    st.TCOOLTHRS(enable ? 0xFFFFF : 0);
670 565
     #if ENABLED(STEALTHCHOP)
671
-      st.stealthChop(!enable);
566
+      st.en_pwm_mode(!enable);
672 567
     #endif
673 568
     st.diag1_stall(enable ? 1 : 0);
674 569
   }
@@ -676,45 +571,46 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) {
676 571
 #endif // USE_SENSORLESS
677 572
 
678 573
 #if HAS_DRIVER(TMC2130)
574
+  #define IS_TMC_SPI(ST) AXIS_DRIVER_TYPE(ST, TMC2130)
679 575
   #define SET_CS_PIN(st) OUT_WRITE(st##_CS_PIN, HIGH)
680 576
   void tmc_init_cs_pins() {
681
-    #if AXIS_DRIVER_TYPE(X, TMC2130)
577
+    #if IS_TMC_SPI(X)
682 578
       SET_CS_PIN(X);
683 579
     #endif
684
-    #if AXIS_DRIVER_TYPE(Y, TMC2130)
580
+    #if IS_TMC_SPI(Y)
685 581
       SET_CS_PIN(Y);
686 582
     #endif
687
-    #if AXIS_DRIVER_TYPE(Z, TMC2130)
583
+    #if IS_TMC_SPI(Z)
688 584
       SET_CS_PIN(Z);
689 585
     #endif
690
-    #if AXIS_DRIVER_TYPE(X2, TMC2130)
586
+    #if IS_TMC_SPI(X2)
691 587
       SET_CS_PIN(X2);
692 588
     #endif
693
-    #if AXIS_DRIVER_TYPE(Y2, TMC2130)
589
+    #if IS_TMC_SPI(Y2)
694 590
       SET_CS_PIN(Y2);
695 591
     #endif
696
-    #if AXIS_DRIVER_TYPE(Z2, TMC2130)
592
+    #if IS_TMC_SPI(Z2)
697 593
       SET_CS_PIN(Z2);
698 594
     #endif
699
-    #if AXIS_DRIVER_TYPE(Z3, TMC2130)
595
+    #if IS_TMC_SPI(Z3)
700 596
       SET_CS_PIN(Z3);
701 597
     #endif
702
-    #if AXIS_DRIVER_TYPE(E0, TMC2130)
598
+    #if IS_TMC_SPI(E0)
703 599
       SET_CS_PIN(E0);
704 600
     #endif
705
-    #if AXIS_DRIVER_TYPE(E1, TMC2130)
601
+    #if IS_TMC_SPI(E1)
706 602
       SET_CS_PIN(E1);
707 603
     #endif
708
-    #if AXIS_DRIVER_TYPE(E2, TMC2130)
604
+    #if IS_TMC_SPI(E2)
709 605
       SET_CS_PIN(E2);
710 606
     #endif
711
-    #if AXIS_DRIVER_TYPE(E3, TMC2130)
607
+    #if IS_TMC_SPI(E3)
712 608
       SET_CS_PIN(E3);
713 609
     #endif
714
-    #if AXIS_DRIVER_TYPE(E4, TMC2130)
610
+    #if IS_TMC_SPI(E4)
715 611
       SET_CS_PIN(E4);
716 612
     #endif
717
-    #if AXIS_DRIVER_TYPE(E5, TMC2130)
613
+    #if IS_TMC_SPI(E5)
718 614
       SET_CS_PIN(E5);
719 615
     #endif
720 616
   }

+ 105
- 64
Marlin/src/feature/tmc_util.h Ver arquivo

@@ -23,91 +23,132 @@
23 23
 #ifndef _TMC_UTIL_H_
24 24
 #define _TMC_UTIL_H_
25 25
 
26
-#include "../inc/MarlinConfigPre.h"
27
-
28
-#if HAS_DRIVER(TMC2130)
29
-  #include <TMC2130Stepper.h>
26
+#include "../inc/MarlinConfig.h"
27
+#if HAS_TRINAMIC
28
+  #include <TMCStepper.h>
30 29
 #endif
31 30
 
32
-#if HAS_DRIVER(TMC2208)
33
-  #include <TMC2208Stepper.h>
34
-#endif
31
+#define TMC_X_LABEL 'X', '0'
32
+#define TMC_Y_LABEL 'Y', '0'
33
+#define TMC_Z_LABEL 'Z', '0'
34
+
35
+#define TMC_X2_LABEL 'X', '2'
36
+#define TMC_Y2_LABEL 'Y', '2'
37
+#define TMC_Z2_LABEL 'Z', '2'
38
+#define TMC_Z3_LABEL 'Z', '3'
39
+
40
+#define TMC_E0_LABEL 'E', '0'
41
+#define TMC_E1_LABEL 'E', '1'
42
+#define TMC_E2_LABEL 'E', '2'
43
+#define TMC_E3_LABEL 'E', '3'
44
+#define TMC_E4_LABEL 'E', '4'
45
+#define TMC_E5_LABEL 'E', '5'
46
+
47
+template<char AXIS_LETTER, char DRIVER_ID>
48
+class TMCStorage {
49
+  protected:
50
+    // Only a child class has access to constructor => Don't create on its own! "Poor man's abstract class"
51
+    TMCStorage() {}
52
+
53
+    uint16_t val_mA = 0;
54
+
55
+  public:
56
+    #if ENABLED(MONITOR_DRIVER_STATUS)
57
+      uint8_t otpw_count = 0;
58
+      bool flag_otpw = false;
59
+      bool getOTPW() { return flag_otpw; }
60
+      void clear_otpw() { flag_otpw = 0; }
61
+    #endif
62
+
63
+    uint16_t getMilliamps() { return val_mA; }
35 64
 
36
-extern bool report_tmc_status;
37
-
38
-enum TMC_AxisEnum : char {
39
-  TMC_X, TMC_Y, TMC_Z
40
-  #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(X_DUAL_STEPPER_DRIVERS)
41
-    , TMC_X2
42
-  #endif
43
-  #if ENABLED(Y_DUAL_STEPPER_DRIVERS)
44
-    , TMC_Y2
45
-  #endif
46
-  #if ENABLED(Z_DUAL_STEPPER_DRIVERS)
47
-    , TMC_Z2
48
-  #endif
49
-  #if ENABLED(Z_TRIPLE_STEPPER_DRIVERS)
50
-    , TMC_Z3
51
-  #endif
52
-  #if E_STEPPERS
53
-    , TMC_E0
54
-    #if E_STEPPERS > 1
55
-      , TMC_E1
56
-      #if E_STEPPERS > 2
57
-        , TMC_E2
58
-        #if E_STEPPERS > 3
59
-          , TMC_E3
60
-          #if E_STEPPERS > 4
61
-            , TMC_E4
62
-            #if E_STEPPERS > 5
63
-              , TMC_E5
64
-            #endif // E_STEPPERS > 5
65
-          #endif // E_STEPPERS > 4
66
-        #endif // E_STEPPERS > 3
67
-      #endif // E_STEPPERS > 2
68
-    #endif // E_STEPPERS > 1
69
-  #endif // E_STEPPERS
65
+    void printLabel() {
66
+      SERIAL_CHAR(AXIS_LETTER);
67
+      if (DRIVER_ID > '0') SERIAL_CHAR(DRIVER_ID);
68
+    }
69
+};
70
+
71
+template<class TMC, char AXIS_LETTER, char DRIVER_ID>
72
+class TMCMarlin : public TMC, public TMCStorage<AXIS_LETTER, DRIVER_ID> {
73
+  public:
74
+    TMCMarlin(uint16_t cs_pin, float RS) :
75
+      TMC(cs_pin, RS)
76
+      {}
77
+    TMCMarlin(uint16_t CS, float RS, uint16_t pinMOSI, uint16_t pinMISO, uint16_t pinSCK) :
78
+      TMC(CS, RS, pinMOSI, pinMISO, pinSCK)
79
+      {}
80
+    uint16_t rms_current() { return TMC::rms_current(); }
81
+    void rms_current(uint16_t mA) {
82
+      this->val_mA = mA;
83
+      TMC::rms_current(mA);
84
+    }
85
+    void rms_current(uint16_t mA, float mult) {
86
+      this->val_mA = mA;
87
+      TMC::rms_current(mA, mult);
88
+    }
89
+};
90
+template<char AXIS_LETTER, char DRIVER_ID>
91
+class TMCMarlin<TMC2208Stepper, AXIS_LETTER, DRIVER_ID> : public TMC2208Stepper, public TMCStorage<AXIS_LETTER, DRIVER_ID> {
92
+  public:
93
+    TMCMarlin(Stream * SerialPort, float RS, bool has_rx=true) :
94
+      TMC2208Stepper(SerialPort, RS, has_rx=true)
95
+      {}
96
+    TMCMarlin(uint16_t RX, uint16_t TX, float RS, bool has_rx=true) :
97
+      TMC2208Stepper(RX, TX, RS, has_rx=true)
98
+      {}
99
+    uint16_t rms_current() { return TMC2208Stepper::rms_current(); }
100
+    void rms_current(uint16_t mA) {
101
+      this->val_mA = mA;
102
+      TMC2208Stepper::rms_current(mA);
103
+    }
104
+    void rms_current(uint16_t mA, float mult) {
105
+      this->val_mA = mA;
106
+      TMC2208Stepper::rms_current(mA, mult);
107
+    }
70 108
 };
71 109
 
72 110
 constexpr uint32_t _tmc_thrs(const uint16_t msteps, const int32_t thrs, const uint32_t spmm) {
73 111
   return 12650000UL * msteps / (256 * thrs * spmm);
74 112
 }
75 113
 
76
-void _tmc_say_axis(const TMC_AxisEnum axis);
77
-void _tmc_say_current(const TMC_AxisEnum axis, const uint16_t curr);
78
-void _tmc_say_otpw(const TMC_AxisEnum axis, const bool otpw);
79
-void _tmc_say_otpw_cleared(const TMC_AxisEnum axis);
80
-void _tmc_say_pwmthrs(const TMC_AxisEnum axis, const uint32_t thrs);
81
-void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt);
82
-
83 114
 template<typename TMC>
84
-void tmc_get_current(TMC &st, const TMC_AxisEnum axis) {
85
-  _tmc_say_current(axis, st.getCurrent());
115
+void tmc_get_current(TMC &st) {
116
+  st.printLabel();
117
+  SERIAL_ECHOLNPAIR(" driver current: ", st.getMilliamps());
86 118
 }
87 119
 template<typename TMC>
88 120
 void tmc_set_current(TMC &st, const int mA) {
89
-  st.setCurrent(mA, R_SENSE, HOLD_MULTIPLIER);
90
-}
91
-template<typename TMC>
92
-void tmc_report_otpw(TMC &st, const TMC_AxisEnum axis) {
93
-  _tmc_say_otpw(axis, st.getOTPW());
94
-}
95
-template<typename TMC>
96
-void tmc_clear_otpw(TMC &st, const TMC_AxisEnum axis) {
97
-  st.clear_otpw();
98
-  _tmc_say_otpw_cleared(axis);
121
+  st.rms_current(mA);
99 122
 }
123
+#if ENABLED(MONITOR_DRIVER_STATUS)
124
+  template<typename TMC>
125
+  void tmc_report_otpw(TMC &st) {
126
+    st.printLabel();
127
+    SERIAL_ECHOPGM(" temperature prewarn triggered: ");
128
+    serialprintPGM(st.getOTPW() ? PSTR("true") : PSTR("false"));
129
+    SERIAL_EOL();
130
+  }
131
+  template<typename TMC>
132
+  void tmc_clear_otpw(TMC &st) {
133
+    st.clear_otpw();
134
+    st.printLabel();
135
+    SERIAL_ECHOLNPGM(" prewarn flag cleared");
136
+  }
137
+#endif
100 138
 template<typename TMC>
101
-void tmc_get_pwmthrs(TMC &st, const TMC_AxisEnum axis, const uint16_t spmm) {
102
-  _tmc_say_pwmthrs(axis, _tmc_thrs(st.microsteps(), st.TPWMTHRS(), spmm));
139
+void tmc_get_pwmthrs(TMC &st, const uint16_t spmm) {
140
+  st.printLabel();
141
+  SERIAL_ECHOLNPAIR(" stealthChop max speed: ", _tmc_thrs(st.microsteps(), st.TPWMTHRS(), spmm));
103 142
 }
104 143
 template<typename TMC>
105 144
 void tmc_set_pwmthrs(TMC &st, const int32_t thrs, const uint32_t spmm) {
106 145
   st.TPWMTHRS(_tmc_thrs(st.microsteps(), thrs, spmm));
107 146
 }
108 147
 template<typename TMC>
109
-void tmc_get_sgt(TMC &st, const TMC_AxisEnum axis) {
110
-  _tmc_say_sgt(axis, st.sgt());
148
+void tmc_get_sgt(TMC &st) {
149
+  st.printLabel();
150
+  SERIAL_ECHOPGM(" homing sensitivity: ");
151
+  SERIAL_PRINTLN(st.sgt(), DEC);
111 152
 }
112 153
 template<typename TMC>
113 154
 void tmc_set_sgt(TMC &st, const int8_t sgt_val) {

+ 1
- 1
Marlin/src/gcode/feature/trinamic/M906.cpp Ver arquivo

@@ -33,7 +33,7 @@
33 33
  * Report driver currents when no axis specified
34 34
  */
35 35
 void GcodeSuite::M906() {
36
-  #define TMC_SAY_CURRENT(Q) tmc_get_current(stepper##Q, TMC_##Q)
36
+  #define TMC_SAY_CURRENT(Q) tmc_get_current(stepper##Q)
37 37
   #define TMC_SET_CURRENT(Q) tmc_set_current(stepper##Q, value)
38 38
 
39 39
   bool report = true;

+ 126
- 124
Marlin/src/gcode/feature/trinamic/M911-M915.cpp Ver arquivo

@@ -33,135 +33,137 @@
33 33
 #define M91x_USE(ST) (AXIS_DRIVER_TYPE(ST, TMC2130) || (AXIS_DRIVER_TYPE(ST, TMC2208) && PIN_EXISTS(ST##_SERIAL_RX)))
34 34
 #define M91x_USE_E(N) (E_STEPPERS > N && M91x_USE(E##N))
35 35
 
36
-/**
37
- * M911: Report TMC stepper driver overtemperature pre-warn flag
38
- *       This flag is held by the library, persisting until cleared by M912
39
- */
40
-void GcodeSuite::M911() {
41
-  #if M91x_USE(X)
42
-    tmc_report_otpw(stepperX, TMC_X);
43
-  #endif
44
-  #if M91x_USE(X2)
45
-    tmc_report_otpw(stepperX2, TMC_X2);
46
-  #endif
47
-  #if M91x_USE(Y)
48
-    tmc_report_otpw(stepperY, TMC_Y);
49
-  #endif
50
-  #if M91x_USE(Y2)
51
-    tmc_report_otpw(stepperY2, TMC_Y2);
52
-  #endif
53
-  #if M91x_USE(Z)
54
-    tmc_report_otpw(stepperZ, TMC_Z);
55
-  #endif
56
-  #if M91x_USE(Z2)
57
-    tmc_report_otpw(stepperZ2, TMC_Z2);
58
-  #endif
59
-  #if M91x_USE(Z3)
60
-    tmc_report_otpw(stepperZ3, TMC_Z3);
61
-  #endif
62
-  #if M91x_USE_E(0)
63
-    tmc_report_otpw(stepperE0, TMC_E0);
64
-  #endif
65
-  #if M91x_USE_E(1)
66
-    tmc_report_otpw(stepperE1, TMC_E1);
67
-  #endif
68
-  #if M91x_USE_E(2)
69
-    tmc_report_otpw(stepperE2, TMC_E2);
70
-  #endif
71
-  #if M91x_USE_E(3)
72
-    tmc_report_otpw(stepperE3, TMC_E3);
73
-  #endif
74
-  #if M91x_USE_E(4)
75
-    tmc_report_otpw(stepperE4, TMC_E4);
76
-  #endif
77
-  #if M91x_USE_E(5)
78
-    tmc_report_otpw(stepperE5, TMC_E5);
79
-  #endif
80
-}
36
+#if ENABLED(MONITOR_DRIVER_STATUS)
37
+  /**
38
+   * M911: Report TMC stepper driver overtemperature pre-warn flag
39
+   *       This flag is held by the library, persisting until cleared by M912
40
+   */
41
+  void GcodeSuite::M911() {
42
+    #if M91x_USE(X)
43
+      tmc_report_otpw(stepperX);
44
+    #endif
45
+    #if M91x_USE(X2)
46
+      tmc_report_otpw(stepperX2);
47
+    #endif
48
+    #if M91x_USE(Y)
49
+      tmc_report_otpw(stepperY);
50
+    #endif
51
+    #if M91x_USE(Y2)
52
+      tmc_report_otpw(stepperY2);
53
+    #endif
54
+    #if M91x_USE(Z)
55
+      tmc_report_otpw(stepperZ);
56
+    #endif
57
+    #if M91x_USE(Z2)
58
+      tmc_report_otpw(stepperZ2);
59
+    #endif
60
+    #if M91x_USE(Z3)
61
+      tmc_report_otpw(stepperZ3);
62
+    #endif
63
+    #if M91x_USE_E(0)
64
+      tmc_report_otpw(stepperE0);
65
+    #endif
66
+    #if M91x_USE_E(1)
67
+      tmc_report_otpw(stepperE1);
68
+    #endif
69
+    #if M91x_USE_E(2)
70
+      tmc_report_otpw(stepperE2);
71
+    #endif
72
+    #if M91x_USE_E(3)
73
+      tmc_report_otpw(stepperE3);
74
+    #endif
75
+    #if M91x_USE_E(4)
76
+      tmc_report_otpw(stepperE4);
77
+    #endif
78
+    #if M91x_USE_E(5)
79
+      tmc_report_otpw(stepperE5);
80
+    #endif
81
+  }
81 82
 
82
-/**
83
- * M912: Clear TMC stepper driver overtemperature pre-warn flag held by the library
84
- *       Specify one or more axes with X, Y, Z, X1, Y1, Z1, X2, Y2, Z2, Z3 and E[index].
85
- *       If no axes are given, clear all.
86
- *
87
- * Examples:
88
- *       M912 X   ; clear X and X2
89
- *       M912 X1  ; clear X1 only
90
- *       M912 X2  ; clear X2 only
91
- *       M912 X E ; clear X, X2, and all E
92
- *       M912 E1  ; clear E1 only
93
- */
94
-void GcodeSuite::M912() {
95
-    const bool hasX = parser.seen(axis_codes[X_AXIS]),
96
-               hasY = parser.seen(axis_codes[Y_AXIS]),
97
-               hasZ = parser.seen(axis_codes[Z_AXIS]),
98
-               hasE = parser.seen(axis_codes[E_AXIS]),
99
-               hasNone = !hasX && !hasY && !hasZ && !hasE;
83
+  /**
84
+   * M912: Clear TMC stepper driver overtemperature pre-warn flag held by the library
85
+   *       Specify one or more axes with X, Y, Z, X1, Y1, Z1, X2, Y2, Z2, Z3 and E[index].
86
+   *       If no axes are given, clear all.
87
+   *
88
+   * Examples:
89
+   *       M912 X   ; clear X and X2
90
+   *       M912 X1  ; clear X1 only
91
+   *       M912 X2  ; clear X2 only
92
+   *       M912 X E ; clear X, X2, and all E
93
+   *       M912 E1  ; clear E1 only
94
+   */
95
+  void GcodeSuite::M912() {
96
+      const bool hasX = parser.seen(axis_codes[X_AXIS]),
97
+                 hasY = parser.seen(axis_codes[Y_AXIS]),
98
+                 hasZ = parser.seen(axis_codes[Z_AXIS]),
99
+                 hasE = parser.seen(axis_codes[E_AXIS]),
100
+                 hasNone = !hasX && !hasY && !hasZ && !hasE;
100 101
 
101
-    #if M91x_USE(X) || M91x_USE(X2)
102
-      const int8_t xval = int8_t(parser.byteval(axis_codes[X_AXIS], 0xFF));
103
-      #if M91x_USE(X)
104
-        if (hasNone || xval == 1 || (hasX && xval < 0)) tmc_clear_otpw(stepperX, TMC_X);
105
-      #endif
106
-      #if M91x_USE(X2)
107
-        if (hasNone || xval == 2 || (hasX && xval < 0)) tmc_clear_otpw(stepperX2, TMC_X2);
102
+      #if M91x_USE(X) || M91x_USE(X2)
103
+        const int8_t xval = int8_t(parser.byteval(axis_codes[X_AXIS], 0xFF));
104
+        #if M91x_USE(X)
105
+          if (hasNone || xval == 1 || (hasX && xval < 0)) tmc_clear_otpw(stepperX);
106
+        #endif
107
+        #if M91x_USE(X2)
108
+          if (hasNone || xval == 2 || (hasX && xval < 0)) tmc_clear_otpw(stepperX2);
109
+        #endif
108 110
       #endif
109
-    #endif
110 111
 
111
-    #if M91x_USE(Y) || M91x_USE(Y2)
112
-      const int8_t yval = int8_t(parser.byteval(axis_codes[Y_AXIS], 0xFF));
113
-      #if M91x_USE(Y)
114
-        if (hasNone || yval == 1 || (hasY && yval < 0)) tmc_clear_otpw(stepperY, TMC_Y);
115
-      #endif
116
-      #if M91x_USE(Y2)
117
-        if (hasNone || yval == 2 || (hasY && yval < 0)) tmc_clear_otpw(stepperY2, TMC_Y2);
112
+      #if M91x_USE(Y) || M91x_USE(Y2)
113
+        const int8_t yval = int8_t(parser.byteval(axis_codes[Y_AXIS], 0xFF));
114
+        #if M91x_USE(Y)
115
+          if (hasNone || yval == 1 || (hasY && yval < 0)) tmc_clear_otpw(stepperY);
116
+        #endif
117
+        #if M91x_USE(Y2)
118
+          if (hasNone || yval == 2 || (hasY && yval < 0)) tmc_clear_otpw(stepperY2);
119
+        #endif
118 120
       #endif
119
-    #endif
120 121
 
121
-    #if M91x_USE(Z) || M91x_USE(Z2) || M91x_USE(Z3)
122
-      const int8_t zval = int8_t(parser.byteval(axis_codes[Z_AXIS], 0xFF));
123
-      #if M91x_USE(Z)
124
-        if (hasNone || zval == 1 || (hasZ && zval < 0)) tmc_clear_otpw(stepperZ, TMC_Z);
125
-      #endif
126
-      #if M91x_USE(Z2)
127
-        if (hasNone || zval == 2 || (hasZ && zval < 0)) tmc_clear_otpw(stepperZ2, TMC_Z2);
128
-      #endif
129
-      #if M91x_USE(Z3)
130
-        if (hasNone || zval == 3 || (hasZ && zval < 0)) tmc_clear_otpw(stepperZ3, TMC_Z3);
122
+      #if M91x_USE(Z) || M91x_USE(Z2) || M91x_USE(Z3)
123
+        const int8_t zval = int8_t(parser.byteval(axis_codes[Z_AXIS], 0xFF));
124
+        #if M91x_USE(Z)
125
+          if (hasNone || zval == 1 || (hasZ && zval < 0)) tmc_clear_otpw(stepperZ);
126
+        #endif
127
+        #if M91x_USE(Z2)
128
+          if (hasNone || zval == 2 || (hasZ && zval < 0)) tmc_clear_otpw(stepperZ2);
129
+        #endif
130
+        #if M91x_USE(Z3)
131
+          if (hasNone || zval == 3 || (hasZ && zval < 0)) tmc_clear_otpw(stepperZ3);
132
+        #endif
131 133
       #endif
132
-    #endif
133 134
 
134
-    #if M91x_USE_E(0) || M91x_USE_E(1) || M91x_USE_E(2) || M91x_USE_E(3) || M91x_USE_E(4) || M91x_USE_E(5)
135
-      const uint8_t eval = int8_t(parser.byteval(axis_codes[E_AXIS], 0xFF));
136
-      #if M91x_USE_E(0)
137
-        if (hasNone || eval == 0 || (hasE && eval < 0)) tmc_clear_otpw(stepperE0, TMC_E0);
138
-      #endif
139
-      #if M91x_USE_E(1)
140
-        if (hasNone || eval == 1 || (hasE && eval < 0)) tmc_clear_otpw(stepperE1, TMC_E1);
141
-      #endif
142
-      #if M91x_USE_E(2)
143
-        if (hasNone || eval == 2 || (hasE && eval < 0)) tmc_clear_otpw(stepperE2, TMC_E2);
144
-      #endif
145
-      #if M91x_USE_E(3)
146
-        if (hasNone || eval == 3 || (hasE && eval < 0)) tmc_clear_otpw(stepperE3, TMC_E3);
147
-      #endif
148
-      #if M91x_USE_E(4)
149
-        if (hasNone || eval == 4 || (hasE && eval < 0)) tmc_clear_otpw(stepperE4, TMC_E4);
150
-      #endif
151
-      #if M91x_USE_E(5)
152
-        if (hasNone || eval == 5 || (hasE && eval < 0)) tmc_clear_otpw(stepperE5, TMC_E5);
135
+      #if M91x_USE_E(0) || M91x_USE_E(1) || M91x_USE_E(2) || M91x_USE_E(3) || M91x_USE_E(4) || M91x_USE_E(5)
136
+        const int8_t eval = int8_t(parser.byteval(axis_codes[E_AXIS], 0xFF));
137
+        #if M91x_USE_E(0)
138
+          if (hasNone || eval == 0 || (hasE && eval < 0)) tmc_clear_otpw(stepperE0);
139
+        #endif
140
+        #if M91x_USE_E(1)
141
+          if (hasNone || eval == 1 || (hasE && eval < 0)) tmc_clear_otpw(stepperE1);
142
+        #endif
143
+        #if M91x_USE_E(2)
144
+          if (hasNone || eval == 2 || (hasE && eval < 0)) tmc_clear_otpw(stepperE2);
145
+        #endif
146
+        #if M91x_USE_E(3)
147
+          if (hasNone || eval == 3 || (hasE && eval < 0)) tmc_clear_otpw(stepperE3);
148
+        #endif
149
+        #if M91x_USE_E(4)
150
+          if (hasNone || eval == 4 || (hasE && eval < 0)) tmc_clear_otpw(stepperE4);
151
+        #endif
152
+        #if M91x_USE_E(5)
153
+          if (hasNone || eval == 5 || (hasE && eval < 0)) tmc_clear_otpw(stepperE5);
154
+        #endif
153 155
       #endif
154
-    #endif
155
-}
156
+  }
157
+#endif
156 158
 
157 159
 /**
158 160
  * M913: Set HYBRID_THRESHOLD speed.
159 161
  */
160 162
 #if ENABLED(HYBRID_THRESHOLD)
161 163
   void GcodeSuite::M913() {
162
-    #define TMC_SAY_PWMTHRS(A,Q) tmc_get_pwmthrs(stepper##Q, TMC_##Q, planner.axis_steps_per_mm[_AXIS(A)])
164
+    #define TMC_SAY_PWMTHRS(A,Q) tmc_get_pwmthrs(stepper##Q, planner.axis_steps_per_mm[_AXIS(A)])
163 165
     #define TMC_SET_PWMTHRS(A,Q) tmc_set_pwmthrs(stepper##Q, value, planner.axis_steps_per_mm[_AXIS(A)])
164
-    #define TMC_SAY_PWMTHRS_E(E) do{ constexpr uint8_t extruder = E; tmc_get_pwmthrs(stepperE##E, TMC_E##E, planner.axis_steps_per_mm[E_AXIS_N]); UNUSED(extruder); }while(0)
166
+    #define TMC_SAY_PWMTHRS_E(E) do{ constexpr uint8_t extruder = E; tmc_get_pwmthrs(stepperE##E, planner.axis_steps_per_mm[E_AXIS_N]); UNUSED(extruder); }while(0)
165 167
     #define TMC_SET_PWMTHRS_E(E) do{ constexpr uint8_t extruder = E; tmc_set_pwmthrs(stepperE##E, value, planner.axis_steps_per_mm[E_AXIS_N]); UNUSED(extruder); }while(0)
166 168
 
167 169
     bool report = true;
@@ -271,7 +273,7 @@ void GcodeSuite::M912() {
271 273
  */
272 274
 #if USE_SENSORLESS
273 275
   void GcodeSuite::M914() {
274
-    #define TMC_SAY_SGT(Q) tmc_get_sgt(stepper##Q, TMC_##Q)
276
+    #define TMC_SAY_SGT(Q) tmc_get_sgt(stepper##Q)
275 277
     #define TMC_SET_SGT(Q) tmc_set_sgt(stepper##Q, value)
276 278
 
277 279
     bool report = true;
@@ -362,16 +364,16 @@ void GcodeSuite::M912() {
362 364
     }
363 365
 
364 366
     #if AXIS_IS_TMC(Z)
365
-      const uint16_t Z_current_1 = stepperZ.getCurrent();
366
-      stepperZ.setCurrent(_rms, R_SENSE, HOLD_MULTIPLIER);
367
+      const uint16_t Z_current_1 = stepperZ.getMilliamps();
368
+      stepperZ.rms_current(_rms);
367 369
     #endif
368 370
     #if AXIS_IS_TMC(Z2)
369
-      const uint16_t Z2_current_1 = stepperZ2.getCurrent();
370
-      stepperZ2.setCurrent(_rms, R_SENSE, HOLD_MULTIPLIER);
371
+      const uint16_t Z2_current_1 = stepperZ2.getMilliamps();
372
+      stepperZ2.rms_current(_rms);
371 373
     #endif
372
-    #if Z3_IS_TRINAMIC
373
-      const uint16_t Z3_current_1 = stepperZ3.getCurrent();
374
-      stepperZ3.setCurrent(_rms, R_SENSE, HOLD_MULTIPLIER);
374
+    #if AXIS_IS_TMC(Z3)
375
+      const uint16_t Z3_current_1 = stepperZ3.getMilliamps();
376
+      stepperZ3.rms_current(_rms);
375 377
     #endif
376 378
 
377 379
     SERIAL_ECHOPAIR("\nCalibration current: Z", _rms);
@@ -381,13 +383,13 @@ void GcodeSuite::M912() {
381 383
     do_blocking_move_to_z(Z_MAX_POS+_z);
382 384
 
383 385
     #if AXIS_IS_TMC(Z)
384
-      stepperZ.setCurrent(Z_current_1, R_SENSE, HOLD_MULTIPLIER);
386
+      stepperZ.rms_current(Z_current_1);
385 387
     #endif
386 388
     #if AXIS_IS_TMC(Z2)
387
-      stepperZ2.setCurrent(Z2_current_1, R_SENSE, HOLD_MULTIPLIER);
389
+      stepperZ2.rms_current(Z2_current_1);
388 390
     #endif
389 391
     #if AXIS_IS_TMC(Z3)
390
-      stepperZ3.setCurrent(Z3_current_1, R_SENSE, HOLD_MULTIPLIER);
392
+      stepperZ3.rms_current(Z3_current_1);
391 393
     #endif
392 394
 
393 395
     do_blocking_move_to_z(Z_MAX_POS);

+ 4
- 2
Marlin/src/gcode/gcode.cpp Ver arquivo

@@ -632,8 +632,10 @@ void GcodeSuite::process_parsed_command(
632 632
           case 122: M122(); break;
633 633
         #endif
634 634
         case 906: M906(); break;                                  // M906: Set motor current in milliamps using axis codes X, Y, Z, E
635
-        case 911: M911(); break;                                  // M911: Report TMC2130 prewarn triggered flags
636
-        case 912: M912(); break;                                  // M912: Clear TMC2130 prewarn triggered flags
635
+        #if ENABLED(MONITOR_DRIVER_STATUS)
636
+          case 911: M911(); break;                                  // M911: Report TMC2130 prewarn triggered flags
637
+          case 912: M912(); break;                                  // M912: Clear TMC2130 prewarn triggered flags
638
+        #endif
637 639
         #if ENABLED(HYBRID_THRESHOLD)
638 640
           case 913: M913(); break;                                // M913: Set HYBRID_THRESHOLD speed.
639 641
         #endif

+ 4
- 2
Marlin/src/gcode/gcode.h Ver arquivo

@@ -775,8 +775,10 @@ private:
775 775
       static void M122();
776 776
     #endif
777 777
     static void M906();
778
-    static void M911();
779
-    static void M912();
778
+    #if ENABLED(MONITOR_DRIVER_STATUS)
779
+        static void M911();
780
+        static void M912();
781
+    #endif
780 782
     #if ENABLED(HYBRID_THRESHOLD)
781 783
       static void M913();
782 784
     #endif

+ 6
- 3
Marlin/src/inc/Conditionals_post.h Ver arquivo

@@ -460,6 +460,9 @@
460 460
  * NOTE: Driver timing order is longest-to-shortest duration.
461 461
  *       Preserve this ordering when adding new drivers.
462 462
  */
463
+
464
+#define TRINAMICS (HAS_TRINAMIC || HAS_DRIVER(TMC2660) || HAS_DRIVER(TMC2130_STANDALONE) || HAS_DRIVER(TMC2208_STANDALONE) || HAS_DRIVER(TMC26X_STANDALONE) || HAS_DRIVER(TMC2660_STANDALONE))
465
+
463 466
 #ifndef MINIMUM_STEPPER_DIR_DELAY
464 467
   #if HAS_DRIVER(TB6560)
465 468
     #define MINIMUM_STEPPER_DIR_DELAY 15000
@@ -473,7 +476,7 @@
473 476
     #define MINIMUM_STEPPER_DIR_DELAY 400
474 477
   #elif HAS_DRIVER(A4988)
475 478
     #define MINIMUM_STEPPER_DIR_DELAY 200
476
-  #elif HAS_TRINAMIC || HAS_DRIVER(TMC2660) || HAS_DRIVER(TMC2130_STANDALONE) || HAS_DRIVER(TMC2208_STANDALONE) || HAS_DRIVER(TMC26X_STANDALONE) || HAS_DRIVER(TMC2660_STANDALONE)
479
+  #elif TRINAMICS
477 480
     #define MINIMUM_STEPPER_DIR_DELAY 20
478 481
   #else
479 482
     #define MINIMUM_STEPPER_DIR_DELAY 0   // Expect at least 10µS since one Stepper ISR must transpire
@@ -489,7 +492,7 @@
489 492
     #define MINIMUM_STEPPER_PULSE 2
490 493
   #elif HAS_DRIVER(A4988) || HAS_DRIVER(LV8729) || HAS_DRIVER(A5984)
491 494
     #define MINIMUM_STEPPER_PULSE 1
492
-  #elif HAS_TRINAMIC || HAS_DRIVER(TMC2660) || HAS_DRIVER(TMC2130_STANDALONE) || HAS_DRIVER(TMC2208_STANDALONE) || HAS_DRIVER(TMC26X_STANDALONE) || HAS_DRIVER(TMC2660_STANDALONE)
495
+  #elif TRINAMICS
493 496
     #define MINIMUM_STEPPER_PULSE 0
494 497
   #else
495 498
     #define MINIMUM_STEPPER_PULSE 2
@@ -505,7 +508,7 @@
505 508
     #define MAXIMUM_STEPPER_RATE 150000
506 509
   #elif HAS_DRIVER(DRV8825)
507 510
     #define MAXIMUM_STEPPER_RATE 250000
508
-  #elif HAS_TRINAMIC || HAS_DRIVER(TMC2660) || HAS_DRIVER(TMC2130_STANDALONE) || HAS_DRIVER(TMC2208_STANDALONE) || HAS_DRIVER(TMC26X_STANDALONE) || HAS_DRIVER(TMC2660_STANDALONE)
511
+  #elif TRINAMICS
509 512
     #define MAXIMUM_STEPPER_RATE 400000
510 513
   #elif HAS_DRIVER(A4988)
511 514
     #define MAXIMUM_STEPPER_RATE 500000

+ 192
- 258
Marlin/src/module/configuration_store.cpp Ver arquivo

@@ -83,6 +83,9 @@
83 83
   #include "../feature/tmc_util.h"
84 84
   #define TMC_GET_PWMTHRS(A,Q) _tmc_thrs(stepper##Q.microsteps(), stepper##Q.TPWMTHRS(), planner.axis_steps_per_mm[_AXIS(A)])
85 85
 #endif
86
+typedef struct { uint16_t X, Y, Z, X2, Y2, Z2, Z3, E0, E1, E2, E3, E4, E5; } tmc_stepper_current_t;
87
+typedef struct { uint32_t X, Y, Z, X2, Y2, Z2, Z3, E0, E1, E2, E3, E4, E5; } tmc_hybrid_threshold_t;
88
+typedef struct {  int16_t X, Y, Z;                                         } tmc_sgt_t;
86 89
 
87 90
 #if ENABLED(FWRETRACT)
88 91
   #include "../feature/fwretract.h"
@@ -98,7 +101,7 @@
98 101
 
99 102
 #pragma pack(push, 1) // No padding between variables
100 103
 
101
-typedef struct PID { float Kp, Ki, Kd; } PID;
104
+typedef struct PID  { float Kp, Ki, Kd;     } PID;
102 105
 typedef struct PIDC { float Kp, Ki, Kd, Kc; } PIDC;
103 106
 
104 107
 /**
@@ -251,9 +254,9 @@ typedef struct SettingsDataStruct {
251 254
   // HAS_TRINAMIC
252 255
   //
253 256
   #define TMC_AXES (MAX_EXTRUDERS + 7)
254
-  uint16_t tmc_stepper_current[TMC_AXES];               // M906 X Y Z X2 Y2 Z2 Z3 E0 E1 E2 E3 E4 E5
255
-  uint32_t tmc_hybrid_threshold[TMC_AXES];              // M913 X Y Z X2 Y2 Z2 Z3 E0 E1 E2 E3 E4 E5
256
-  int16_t tmc_sgt[XYZ];                                 // M914 X Y Z
257
+  tmc_stepper_current_t tmc_stepper_current;            // M906 X Y Z X2 Y2 Z2 Z3 E0 E1 E2 E3 E4 E5
258
+  tmc_hybrid_threshold_t tmc_hybrid_threshold;          // M913 X Y Z X2 Y2 Z2 Z3 E0 E1 E2 E3 E4 E5
259
+  tmc_sgt_t tmc_sgt;                                    // M914 X Y Z
257 260
 
258 261
   //
259 262
   // LIN_ADVANCE
@@ -300,7 +303,7 @@ uint16_t MarlinSettings::datasize() { return sizeof(SettingsData); }
300 303
 #endif
301 304
 
302 305
 void MarlinSettings::postprocess() {
303
-  const float oldpos[] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] };
306
+  const float oldpos[XYZE] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS] };
304 307
 
305 308
   // steps per s2 needs to be updated to agree with units per s2
306 309
   planner.reset_acceleration_rates();
@@ -436,7 +439,7 @@ void MarlinSettings::postprocess() {
436 439
         EEPROM_WRITE(dummy);
437 440
       #endif
438 441
     #else
439
-      const float planner_max_jerk[] = { float(DEFAULT_XJERK), float(DEFAULT_YJERK), float(DEFAULT_ZJERK), float(DEFAULT_EJERK) };
442
+      const float planner_max_jerk[XYZE] = { float(DEFAULT_XJERK), float(DEFAULT_YJERK), float(DEFAULT_ZJERK), float(DEFAULT_EJERK) };
440 443
       EEPROM_WRITE(planner_max_jerk);
441 444
     #endif
442 445
 
@@ -464,11 +467,13 @@ void MarlinSettings::postprocess() {
464 467
     // Global Leveling
465 468
     //
466 469
 
467
-    #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
468
-      const float zfh = planner.z_fade_height;
469
-    #else
470
-      const float zfh = 10.0;
471
-    #endif
470
+    const float zfh = (
471
+      #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
472
+        planner.z_fade_height
473
+      #else
474
+        10.0
475
+      #endif
476
+    );
472 477
     EEPROM_WRITE(zfh);
473 478
 
474 479
     //
@@ -478,7 +483,7 @@ void MarlinSettings::postprocess() {
478 483
     #if ENABLED(MESH_BED_LEVELING)
479 484
       // Compile time test that sizeof(mbl.z_values) is as expected
480 485
       static_assert(
481
-        sizeof(mbl.z_values) == GRID_MAX_POINTS * sizeof(mbl.z_values[0][0]),
486
+        sizeof(mbl.z_values) == (GRID_MAX_POINTS) * sizeof(mbl.z_values[0][0]),
482 487
         "MBL Z array is the wrong size."
483 488
       );
484 489
       const uint8_t mesh_num_x = GRID_MAX_POINTS_X, mesh_num_y = GRID_MAX_POINTS_Y;
@@ -520,7 +525,7 @@ void MarlinSettings::postprocess() {
520 525
     #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
521 526
       // Compile time test that sizeof(z_values) is as expected
522 527
       static_assert(
523
-        sizeof(z_values) == GRID_MAX_POINTS * sizeof(z_values[0][0]),
528
+        sizeof(z_values) == (GRID_MAX_POINTS) * sizeof(z_values[0][0]),
524 529
         "Bilinear Z array is the wrong size."
525 530
       );
526 531
       const uint8_t grid_max_x = GRID_MAX_POINTS_X, grid_max_y = GRID_MAX_POINTS_Y;
@@ -719,230 +724,154 @@ void MarlinSettings::postprocess() {
719 724
     #endif
720 725
 
721 726
     //
722
-    // Save TMC2130 or TMC2208 Configuration, and placeholder values
727
+    // Save TMC Configuration, and placeholder values
723 728
     //
724 729
 
725 730
     _FIELD_TEST(tmc_stepper_current);
726 731
 
727
-    uint16_t tmc_stepper_current[TMC_AXES] = {
728
-      #if HAS_TRINAMIC
729
-        #if AXIS_IS_TMC(X)
730
-          stepperX.getCurrent(),
731
-        #else
732
-          0,
733
-        #endif
734
-        #if AXIS_IS_TMC(Y)
735
-          stepperY.getCurrent(),
736
-        #else
737
-          0,
738
-        #endif
739
-        #if AXIS_IS_TMC(Z)
740
-          stepperZ.getCurrent(),
741
-        #else
742
-          0,
743
-        #endif
744
-        #if AXIS_IS_TMC(X2)
745
-          stepperX2.getCurrent(),
746
-        #else
747
-          0,
748
-        #endif
749
-        #if AXIS_IS_TMC(Y2)
750
-          stepperY2.getCurrent(),
751
-        #else
752
-          0,
753
-        #endif
754
-        #if AXIS_IS_TMC(Z2)
755
-          stepperZ2.getCurrent(),
756
-        #else
757
-          0,
758
-        #endif
759
-        #if AXIS_IS_TMC(Z3)
760
-          stepperZ3.getCurrent(),
761
-        #else
762
-          0,
732
+    tmc_stepper_current_t tmc_stepper_current = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
733
+
734
+    #if HAS_TRINAMIC
735
+      #if AXIS_IS_TMC(X)
736
+        tmc_stepper_current.X = stepperX.getMilliamps();
737
+      #endif
738
+      #if AXIS_IS_TMC(Y)
739
+        tmc_stepper_current.Y = stepperY.getMilliamps();
740
+      #endif
741
+      #if AXIS_IS_TMC(Z)
742
+        tmc_stepper_current.Z = stepperZ.getMilliamps();
743
+      #endif
744
+      #if AXIS_IS_TMC(X2)
745
+        tmc_stepper_current.X2 = stepperX2.getMilliamps();
746
+      #endif
747
+      #if AXIS_IS_TMC(Y2)
748
+        tmc_stepper_current.Y2 = stepperY2.getMilliamps();
749
+      #endif
750
+      #if AXIS_IS_TMC(Z2)
751
+        tmc_stepper_current.Z2 = stepperZ2.getMilliamps();
752
+      #endif
753
+      #if AXIS_IS_TMC(Z3)
754
+        tmc_stepper_current.Z3 = stepperZ3.getMilliamps();
755
+      #endif
756
+      #if MAX_EXTRUDERS
757
+        #if AXIS_IS_TMC(E0)
758
+          tmc_stepper_current.E0 = stepperE0.getMilliamps();
763 759
         #endif
764
-        #if MAX_EXTRUDERS
765
-          #if AXIS_IS_TMC(E0)
766
-            stepperE0.getCurrent(),
767
-          #else
768
-            0,
760
+        #if MAX_EXTRUDERS > 1
761
+          #if AXIS_IS_TMC(E1)
762
+            tmc_stepper_current.E1 = stepperE1.getMilliamps();
769 763
           #endif
770
-          #if MAX_EXTRUDERS > 1
771
-            #if AXIS_IS_TMC(E1)
772
-              stepperE1.getCurrent(),
773
-            #else
774
-              0,
764
+          #if MAX_EXTRUDERS > 2
765
+            #if AXIS_IS_TMC(E2)
766
+              tmc_stepper_current.E2 = stepperE2.getMilliamps();
775 767
             #endif
776
-            #if MAX_EXTRUDERS > 2
777
-              #if AXIS_IS_TMC(E2)
778
-                stepperE2.getCurrent(),
779
-              #else
780
-                0,
768
+            #if MAX_EXTRUDERS > 3
769
+              #if AXIS_IS_TMC(E3)
770
+                tmc_stepper_current.E3 = stepperE3.getMilliamps();
781 771
               #endif
782
-              #if MAX_EXTRUDERS > 3
783
-                #if AXIS_IS_TMC(E3)
784
-                  stepperE3.getCurrent(),
785
-                #else
786
-                  0,
772
+              #if MAX_EXTRUDERS > 4
773
+                #if AXIS_IS_TMC(E4)
774
+                  tmc_stepper_current.E4 = stepperE4.getMilliamps();
787 775
                 #endif
788
-                #if MAX_EXTRUDERS > 4
789
-                  #if AXIS_IS_TMC(E4)
790
-                    stepperE4.getCurrent()
791
-                  #else
792
-                    0
776
+                #if MAX_EXTRUDERS > 5
777
+                  #if AXIS_IS_TMC(E5)
778
+                    tmc_stepper_current.E5 = stepperE5.getMilliamps();
793 779
                   #endif
794
-                  #if MAX_EXTRUDERS > 5
795
-                    #if AXIS_IS_TMC(E5)
796
-                      stepperE5.getCurrent()
797
-                    #else
798
-                      0
799
-                    #endif
800
-                  #endif // MAX_EXTRUDERS > 5
801
-                #endif // MAX_EXTRUDERS > 4
802
-              #endif // MAX_EXTRUDERS > 3
803
-            #endif // MAX_EXTRUDERS > 2
804
-          #endif // MAX_EXTRUDERS > 1
805
-        #endif // MAX_EXTRUDERS
806
-      #else
807
-        0
808
-      #endif
809
-    };
780
+                #endif // MAX_EXTRUDERS > 5
781
+              #endif // MAX_EXTRUDERS > 4
782
+            #endif // MAX_EXTRUDERS > 3
783
+          #endif // MAX_EXTRUDERS > 2
784
+        #endif // MAX_EXTRUDERS > 1
785
+      #endif // MAX_EXTRUDERS
786
+    #endif
810 787
     EEPROM_WRITE(tmc_stepper_current);
811 788
 
812 789
     //
813
-    // Save TMC2130 or TMC2208 Hybrid Threshold, and placeholder values
790
+    // Save TMC Hybrid Threshold, and placeholder values
814 791
     //
815 792
 
816 793
     _FIELD_TEST(tmc_hybrid_threshold);
817 794
 
818
-    uint32_t tmc_hybrid_threshold[TMC_AXES] = {
819
-      #if ENABLED(HYBRID_THRESHOLD)
820
-        #if AXIS_HAS_STEALTHCHOP(X)
821
-          TMC_GET_PWMTHRS(X, X),
822
-        #else
823
-          X_HYBRID_THRESHOLD,
824
-        #endif
825
-        #if AXIS_HAS_STEALTHCHOP(Y)
826
-          TMC_GET_PWMTHRS(Y, Y),
827
-        #else
828
-          Y_HYBRID_THRESHOLD,
829
-        #endif
830
-        #if AXIS_HAS_STEALTHCHOP(Z)
831
-          TMC_GET_PWMTHRS(Z, Z),
832
-        #else
833
-          Z_HYBRID_THRESHOLD,
834
-        #endif
835
-        #if AXIS_HAS_STEALTHCHOP(X2)
836
-          TMC_GET_PWMTHRS(X, X2),
837
-        #else
838
-          X2_HYBRID_THRESHOLD,
839
-        #endif
840
-        #if AXIS_HAS_STEALTHCHOP(Y2)
841
-          TMC_GET_PWMTHRS(Y, Y2),
842
-        #else
843
-          Y2_HYBRID_THRESHOLD,
844
-        #endif
845
-        #if AXIS_HAS_STEALTHCHOP(Z2)
846
-          TMC_GET_PWMTHRS(Z, Z2),
847
-        #else
848
-          Z2_HYBRID_THRESHOLD,
849
-        #endif
850
-        #if AXIS_HAS_STEALTHCHOP(Z3)
851
-          TMC_GET_PWMTHRS(Z, Z3),
852
-        #else
853
-          Z3_HYBRID_THRESHOLD,
795
+    #if ENABLED(HYBRID_THRESHOLD)
796
+     tmc_hybrid_threshold_t tmc_hybrid_threshold = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
797
+     #if AXIS_HAS_STEALTHCHOP(X)
798
+        tmc_hybrid_threshold.X = TMC_GET_PWMTHRS(X, X);
799
+      #endif
800
+      #if AXIS_HAS_STEALTHCHOP(Y)
801
+        tmc_hybrid_threshold.Y = TMC_GET_PWMTHRS(Y, Y);
802
+      #endif
803
+      #if AXIS_HAS_STEALTHCHOP(Z)
804
+        tmc_hybrid_threshold.Z = TMC_GET_PWMTHRS(Z, Z);
805
+      #endif
806
+      #if AXIS_HAS_STEALTHCHOP(X2)
807
+        tmc_hybrid_threshold.X2 = TMC_GET_PWMTHRS(X, X2);
808
+      #endif
809
+      #if AXIS_HAS_STEALTHCHOP(Y2)
810
+        tmc_hybrid_threshold.Y2 = TMC_GET_PWMTHRS(Y, Y2);
811
+      #endif
812
+      #if AXIS_HAS_STEALTHCHOP(Z2)
813
+        tmc_hybrid_threshold.Z2 = TMC_GET_PWMTHRS(Z, Z2);
814
+      #endif
815
+      #if AXIS_HAS_STEALTHCHOP(Z3)
816
+        tmc_hybrid_threshold.Z3 = TMC_GET_PWMTHRS(Z, Z3);
817
+      #endif
818
+      #if MAX_EXTRUDERS
819
+        #if AXIS_HAS_STEALTHCHOP(E0)
820
+          tmc_hybrid_threshold.E0 = TMC_GET_PWMTHRS(E, E0);
854 821
         #endif
855
-        #if MAX_EXTRUDERS
856
-          #if AXIS_HAS_STEALTHCHOP(E0)
857
-            TMC_GET_PWMTHRS(E, E0),
858
-          #else
859
-            E0_HYBRID_THRESHOLD,
822
+        #if MAX_EXTRUDERS > 1
823
+          #if AXIS_HAS_STEALTHCHOP(E1)
824
+            tmc_hybrid_threshold.E1 = TMC_GET_PWMTHRS(E, E1);
860 825
           #endif
861
-          #if MAX_EXTRUDERS > 1
862
-            #if AXIS_HAS_STEALTHCHOP(E1)
863
-              TMC_GET_PWMTHRS(E, E1),
864
-            #else
865
-              E1_HYBRID_THRESHOLD,
826
+          #if MAX_EXTRUDERS > 2
827
+            #if AXIS_HAS_STEALTHCHOP(E2)
828
+              tmc_hybrid_threshold.E2 = TMC_GET_PWMTHRS(E, E2);
866 829
             #endif
867
-            #if MAX_EXTRUDERS > 2
868
-              #if AXIS_HAS_STEALTHCHOP(E2)
869
-                TMC_GET_PWMTHRS(E, E2),
870
-              #else
871
-                E2_HYBRID_THRESHOLD,
830
+            #if MAX_EXTRUDERS > 3
831
+              #if AXIS_HAS_STEALTHCHOP(E3)
832
+                tmc_hybrid_threshold.E3 = TMC_GET_PWMTHRS(E, E3);
872 833
               #endif
873
-              #if MAX_EXTRUDERS > 3
874
-                #if AXIS_HAS_STEALTHCHOP(E3)
875
-                  TMC_GET_PWMTHRS(E, E3),
876
-                #else
877
-                  E3_HYBRID_THRESHOLD,
834
+              #if MAX_EXTRUDERS > 4
835
+                #if AXIS_HAS_STEALTHCHOP(E4)
836
+                  tmc_hybrid_threshold.E4 = TMC_GET_PWMTHRS(E, E4);
878 837
                 #endif
879
-                #if MAX_EXTRUDERS > 4
880
-                  #if AXIS_HAS_STEALTHCHOP(E4)
881
-                    TMC_GET_PWMTHRS(E, E4)
882
-                  #else
883
-                    E4_HYBRID_THRESHOLD
884
-                  #endif
885
-                  #if MAX_EXTRUDERS > 5
886
-                    #if AXIS_HAS_STEALTHCHOP(E5)
887
-                      TMC_GET_PWMTHRS(E, E5)
888
-                    #else
889
-                      E5_HYBRID_THRESHOLD
890
-                    #endif
891
-                  #endif // MAX_EXTRUDERS > 5
892
-                #endif // MAX_EXTRUDERS > 4
893
-              #endif // MAX_EXTRUDERS > 3
894
-            #endif // MAX_EXTRUDERS > 2
895
-          #endif // MAX_EXTRUDERS > 1
896
-        #endif // MAX_EXTRUDERS
897
-      #else
898
-        100, 100, 3,            // X, Y, Z
899
-        100, 100, 3, 3          // X2, Y2, Z2, Z3
900
-        #if MAX_EXTRUDERS
901
-          , 30                  // E0
902
-          #if MAX_EXTRUDERS > 1
903
-            , 30                // E1
904
-            #if MAX_EXTRUDERS > 2
905
-              , 30              // E2
906
-              #if MAX_EXTRUDERS > 3
907
-                , 30            // E3
908
-                #if MAX_EXTRUDERS > 4
909
-                  , 30          // E4
910
-                  #if MAX_EXTRUDERS > 5
911
-                    , 30        // E5
838
+                #if MAX_EXTRUDERS > 5
839
+                  #if AXIS_HAS_STEALTHCHOP(E5)
840
+                    tmc_hybrid_threshold.E5 = TMC_GET_PWMTHRS(E, E5);
912 841
                   #endif
913
-                #endif
914
-              #endif
915
-            #endif
916
-          #endif
917
-        #endif
918
-      #endif
919
-    };
842
+                #endif // MAX_EXTRUDERS > 5
843
+              #endif // MAX_EXTRUDERS > 4
844
+            #endif // MAX_EXTRUDERS > 3
845
+          #endif // MAX_EXTRUDERS > 2
846
+        #endif // MAX_EXTRUDERS > 1
847
+      #endif // MAX_EXTRUDERS
848
+    #else
849
+      const tmc_hybrid_threshold_t tmc_hybrid_threshold = {
850
+        .X  = 100, .Y  = 100, .Z  =   3,
851
+        .X2 = 100, .Y2 = 100, .Z2 =   3, .Z3 =   3,
852
+        .E0 =  30, .E1 =  30, .E2 =  30,
853
+        .E3 =  30, .E4 =  30, .E5 =  30
854
+      };
855
+    #endif
920 856
     EEPROM_WRITE(tmc_hybrid_threshold);
921 857
 
922 858
     //
923
-    // TMC2130 StallGuard threshold
859
+    // TMC StallGuard threshold
924 860
     //
925
-    int16_t tmc_sgt[XYZ] = {
926
-      #if USE_SENSORLESS
927
-        #if X_SENSORLESS
928
-          stepperX.sgt(),
929
-        #else
930
-          0,
931
-        #endif
932
-        #if Y_SENSORLESS
933
-          stepperY.sgt(),
934
-        #else
935
-          0,
936
-        #endif
937
-        #if Z_SENSORLESS
938
-          stepperZ.sgt()
939
-        #else
940
-          0
941
-        #endif
942
-      #else
943
-        0
861
+
862
+    tmc_sgt_t tmc_sgt = { 0, 0, 0 };
863
+
864
+    #if USE_SENSORLESS
865
+      #if X_SENSORLESS
866
+        tmc_sgt.X = stepperX.sgt();
944 867
       #endif
945
-    };
868
+      #if Y_SENSORLESS
869
+        tmc_sgt.Y = stepperY.sgt();
870
+      #endif
871
+      #if Z_SENSORLESS
872
+        tmc_sgt.Z = stepperZ.sgt();
873
+      #endif
874
+    #endif
946 875
     EEPROM_WRITE(tmc_sgt);
947 876
 
948 877
     //
@@ -1423,15 +1352,15 @@ void MarlinSettings::postprocess() {
1423 1352
       if (!validating) reset_stepper_drivers();
1424 1353
 
1425 1354
       //
1426
-      // TMC2130 Stepper Settings
1355
+      // TMC Stepper Settings
1427 1356
       //
1428 1357
 
1429 1358
       _FIELD_TEST(tmc_stepper_current);
1430 1359
 
1431 1360
       #if HAS_TRINAMIC
1432 1361
 
1433
-        #define SET_CURR(Q) stepper##Q.setCurrent(currents[TMC_##Q] ? currents[TMC_##Q] : Q##_CURRENT, R_SENSE, HOLD_MULTIPLIER)
1434
-        uint16_t currents[TMC_AXES];
1362
+        #define SET_CURR(Q) stepper##Q.rms_current(currents.Q ? currents.Q : Q##_CURRENT)
1363
+        tmc_stepper_current_t currents;
1435 1364
         EEPROM_READ(currents);
1436 1365
         if (!validating) {
1437 1366
           #if AXIS_IS_TMC(X)
@@ -1480,8 +1409,8 @@ void MarlinSettings::postprocess() {
1480 1409
       #endif
1481 1410
 
1482 1411
       #if ENABLED(HYBRID_THRESHOLD)
1483
-        #define TMC_SET_PWMTHRS(A,Q) tmc_set_pwmthrs(stepper##Q, tmc_hybrid_threshold[TMC_##Q], planner.axis_steps_per_mm[_AXIS(A)])
1484
-        uint32_t tmc_hybrid_threshold[TMC_AXES];
1412
+        #define TMC_SET_PWMTHRS(A,Q) tmc_set_pwmthrs(stepper##Q, tmc_hybrid_threshold.Q, planner.axis_steps_per_mm[_AXIS(A)])
1413
+        tmc_hybrid_threshold_t tmc_hybrid_threshold;
1485 1414
         EEPROM_READ(tmc_hybrid_threshold);
1486 1415
         if (!validating) {
1487 1416
           #if AXIS_HAS_STEALTHCHOP(X)
@@ -1530,40 +1459,40 @@ void MarlinSettings::postprocess() {
1530 1459
       #endif
1531 1460
 
1532 1461
       /*
1533
-       * TMC2130 StallGuard threshold.
1462
+       * TMC StallGuard threshold.
1534 1463
        * X and X2 use the same value
1535 1464
        * Y and Y2 use the same value
1536 1465
        * Z, Z2 and Z3 use the same value
1537 1466
        */
1538
-      int16_t tmc_sgt[XYZ];
1467
+      tmc_sgt_t tmc_sgt;
1539 1468
       EEPROM_READ(tmc_sgt);
1540 1469
       #if USE_SENSORLESS
1541 1470
         if (!validating) {
1542 1471
           #ifdef X_STALL_SENSITIVITY
1543 1472
             #if AXIS_HAS_STALLGUARD(X)
1544
-              stepperX.sgt(tmc_sgt[0]);
1473
+              stepperX.sgt(tmc_sgt.X);
1545 1474
             #endif
1546 1475
             #if AXIS_HAS_STALLGUARD(X2)
1547
-              stepperX2.sgt(tmc_sgt[0]);
1476
+              stepperX2.sgt(tmc_sgt.X);
1548 1477
             #endif
1549 1478
           #endif
1550 1479
           #ifdef Y_STALL_SENSITIVITY
1551 1480
             #if AXIS_HAS_STALLGUARD(Y)
1552
-              stepperY.sgt(tmc_sgt[1]);
1481
+              stepperY.sgt(tmc_sgt.Y);
1553 1482
             #endif
1554 1483
             #if AXIS_HAS_STALLGUARD(Y2)
1555
-              stepperY2.sgt(tmc_sgt[1]);
1484
+              stepperY2.sgt(tmc_sgt.Y);
1556 1485
             #endif
1557 1486
           #endif
1558 1487
           #ifdef Z_STALL_SENSITIVITY
1559 1488
             #if AXIS_HAS_STALLGUARD(Z)
1560
-              stepperZ.sgt(tmc_sgt[2]);
1489
+              stepperZ.sgt(tmc_sgt.Z);
1561 1490
             #endif
1562 1491
             #if AXIS_HAS_STALLGUARD(Z2)
1563
-              stepperZ2.sgt(tmc_sgt[2]);
1492
+              stepperZ2.sgt(tmc_sgt.Z);
1564 1493
             #endif
1565 1494
             #if AXIS_HAS_STALLGUARD(Z3)
1566
-              stepperZ3.sgt(tmc_sgt[2]);
1495
+              stepperZ3.sgt(tmc_sgt.Z);
1567 1496
             #endif
1568 1497
           #endif
1569 1498
         }
@@ -1957,8 +1886,7 @@ void MarlinSettings::reset(PORTARG_SOLO) {
1957 1886
   #endif // HAS_SERVOS && EDITABLE_SERVO_ANGLES
1958 1887
 
1959 1888
   #if ENABLED(DELTA)
1960
-    const float adj[ABC] = DELTA_ENDSTOP_ADJ,
1961
-                dta[ABC] = DELTA_TOWER_ANGLE_TRIM;
1889
+    const float adj[ABC] = DELTA_ENDSTOP_ADJ, dta[ABC] = DELTA_TOWER_ANGLE_TRIM;
1962 1890
     delta_height = DELTA_HEIGHT;
1963 1891
     COPY(delta_endstop_adj, adj);
1964 1892
     delta_radius = DELTA_RADIUS;
@@ -2683,7 +2611,7 @@ void MarlinSettings::reset(PORTARG_SOLO) {
2683 2611
     #if HAS_TRINAMIC
2684 2612
 
2685 2613
       /**
2686
-       * TMC2130 / TMC2208 stepper driver current
2614
+       * TMC stepper driver current
2687 2615
        */
2688 2616
       if (!forReplay) {
2689 2617
         CONFIG_ECHO_START;
@@ -2694,65 +2622,68 @@ void MarlinSettings::reset(PORTARG_SOLO) {
2694 2622
         say_M906(PORTVAR_SOLO);
2695 2623
       #endif
2696 2624
       #if AXIS_IS_TMC(X)
2697
-        SERIAL_ECHOPAIR_P(port, " X", stepperX.getCurrent());
2625
+        SERIAL_ECHOPAIR_P(port, " X", stepperX.getMilliamps());
2698 2626
       #endif
2699 2627
       #if AXIS_IS_TMC(Y)
2700
-        SERIAL_ECHOPAIR_P(port, " Y", stepperY.getCurrent());
2628
+        SERIAL_ECHOPAIR_P(port, " Y", stepperY.getMilliamps());
2701 2629
       #endif
2702 2630
       #if AXIS_IS_TMC(Z)
2703
-        SERIAL_ECHOPAIR_P(port, " Z", stepperZ.getCurrent());
2631
+        SERIAL_ECHOPAIR_P(port, " Z", stepperZ.getMilliamps());
2704 2632
       #endif
2705 2633
       #if AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z)
2706 2634
         SERIAL_EOL_P(port);
2707 2635
       #endif
2636
+
2708 2637
       #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2)
2709 2638
         say_M906(PORTVAR_SOLO);
2710 2639
         SERIAL_ECHOPGM_P(port, " I1");
2711 2640
       #endif
2712 2641
       #if AXIS_IS_TMC(X2)
2713
-        SERIAL_ECHOPAIR_P(port, " X", stepperX2.getCurrent());
2642
+        SERIAL_ECHOPAIR_P(port, " X", stepperX2.getMilliamps());
2714 2643
       #endif
2715 2644
       #if AXIS_IS_TMC(Y2)
2716
-        SERIAL_ECHOPAIR_P(port, " Y", stepperY2.getCurrent());
2645
+        SERIAL_ECHOPAIR_P(port, " Y", stepperY2.getMilliamps());
2717 2646
       #endif
2718 2647
       #if AXIS_IS_TMC(Z2)
2719
-        SERIAL_ECHOPAIR_P(port, " Z", stepperZ2.getCurrent());
2648
+        SERIAL_ECHOPAIR_P(port, " Z", stepperZ2.getMilliamps());
2720 2649
       #endif
2721 2650
       #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2)
2722 2651
         SERIAL_EOL_P(port);
2723 2652
       #endif
2653
+
2724 2654
       #if AXIS_IS_TMC(Z3)
2725 2655
         say_M906(PORTVAR_SOLO);
2726
-        SERIAL_ECHOLNPAIR_P(port, " I2 Z", stepperZ3.getCurrent());
2656
+        SERIAL_ECHOLNPAIR_P(port, " I2 Z", stepperZ3.getMilliamps());
2727 2657
       #endif
2658
+
2728 2659
       #if AXIS_IS_TMC(E0)
2729 2660
         say_M906(PORTVAR_SOLO);
2730
-        SERIAL_ECHOLNPAIR_P(port, " T0 E", stepperE0.getCurrent());
2661
+        SERIAL_ECHOLNPAIR_P(port, " T0 E", stepperE0.getMilliamps());
2731 2662
       #endif
2732 2663
       #if AXIS_IS_TMC(E1)
2733 2664
         say_M906(PORTVAR_SOLO);
2734
-        SERIAL_ECHOLNPAIR_P(port, " T1 E", stepperE1.getCurrent());
2665
+        SERIAL_ECHOLNPAIR_P(port, " T1 E", stepperE1.getMilliamps());
2735 2666
       #endif
2736 2667
       #if AXIS_IS_TMC(E2)
2737 2668
         say_M906(PORTVAR_SOLO);
2738
-        SERIAL_ECHOLNPAIR_P(port, " T2 E", stepperE2.getCurrent());
2669
+        SERIAL_ECHOLNPAIR_P(port, " T2 E", stepperE2.getMilliamps());
2739 2670
       #endif
2740 2671
       #if AXIS_IS_TMC(E3)
2741 2672
         say_M906(PORTVAR_SOLO);
2742
-        SERIAL_ECHOLNPAIR_P(port, " T3 E", stepperE3.getCurrent());
2673
+        SERIAL_ECHOLNPAIR_P(port, " T3 E", stepperE3.getMilliamps());
2743 2674
       #endif
2744 2675
       #if AXIS_IS_TMC(E4)
2745 2676
         say_M906(PORTVAR_SOLO);
2746
-        SERIAL_ECHOLNPAIR_P(port, " T4 E", stepperE4.getCurrent());
2677
+        SERIAL_ECHOLNPAIR_P(port, " T4 E", stepperE4.getMilliamps());
2747 2678
       #endif
2748 2679
       #if AXIS_IS_TMC(E5)
2749 2680
         say_M906(PORTVAR_SOLO);
2750
-        SERIAL_ECHOLNPAIR_P(port, " T5 E", stepperE5.getCurrent());
2681
+        SERIAL_ECHOLNPAIR_P(port, " T5 E", stepperE5.getMilliamps());
2751 2682
       #endif
2752 2683
       SERIAL_EOL_P(port);
2753 2684
 
2754 2685
       /**
2755
-       * TMC2130 / TMC2208 / TRAMS Hybrid Threshold
2686
+       * TMC Hybrid Threshold
2756 2687
        */
2757 2688
       #if ENABLED(HYBRID_THRESHOLD)
2758 2689
         if (!forReplay) {
@@ -2760,63 +2691,66 @@ void MarlinSettings::reset(PORTARG_SOLO) {
2760 2691
           SERIAL_ECHOLNPGM_P(port, "Hybrid Threshold:");
2761 2692
         }
2762 2693
         CONFIG_ECHO_START;
2763
-        #if AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z)
2694
+        #if AXIS_HAS_STEALTHCHOP(X) || AXIS_HAS_STEALTHCHOP(Y) || AXIS_HAS_STEALTHCHOP(Z)
2764 2695
           say_M913(PORTVAR_SOLO);
2765 2696
         #endif
2766
-        #if AXIS_IS_TMC(X)
2697
+        #if AXIS_HAS_STEALTHCHOP(X)
2767 2698
           SERIAL_ECHOPAIR_P(port, " X", TMC_GET_PWMTHRS(X, X));
2768 2699
         #endif
2769
-        #if AXIS_IS_TMC(Y)
2700
+        #if AXIS_HAS_STEALTHCHOP(Y)
2770 2701
           SERIAL_ECHOPAIR_P(port, " Y", TMC_GET_PWMTHRS(Y, Y));
2771 2702
         #endif
2772
-        #if AXIS_IS_TMC(Z)
2703
+        #if AXIS_HAS_STEALTHCHOP(Z)
2773 2704
           SERIAL_ECHOPAIR_P(port, " Z", TMC_GET_PWMTHRS(Z, Z));
2774 2705
         #endif
2775
-        #if AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z)
2706
+        #if AXIS_HAS_STEALTHCHOP(X) || AXIS_HAS_STEALTHCHOP(Y) || AXIS_HAS_STEALTHCHOP(Z)
2776 2707
           SERIAL_EOL_P(port);
2777 2708
         #endif
2778
-        #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2)
2709
+
2710
+        #if AXIS_HAS_STEALTHCHOP(X2) || AXIS_HAS_STEALTHCHOP(Y2) || AXIS_HAS_STEALTHCHOP(Z2)
2779 2711
           say_M913(PORTVAR_SOLO);
2780 2712
           SERIAL_ECHOPGM_P(port, " I1");
2781 2713
         #endif
2782
-        #if AXIS_IS_TMC(X2)
2714
+        #if AXIS_HAS_STEALTHCHOP(X2)
2783 2715
           SERIAL_ECHOPAIR_P(port, " X", TMC_GET_PWMTHRS(X, X2));
2784 2716
         #endif
2785
-        #if AXIS_IS_TMC(Y2)
2717
+        #if AXIS_HAS_STEALTHCHOP(Y2)
2786 2718
           SERIAL_ECHOPAIR_P(port, " Y", TMC_GET_PWMTHRS(Y, Y2));
2787 2719
         #endif
2788
-        #if AXIS_IS_TMC(Z2)
2720
+        #if AXIS_HAS_STEALTHCHOP(Z2)
2789 2721
           SERIAL_ECHOPAIR_P(port, " Z", TMC_GET_PWMTHRS(Z, Z2));
2790 2722
         #endif
2791
-        #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2)
2723
+        #if AXIS_HAS_STEALTHCHOP(X2) || AXIS_HAS_STEALTHCHOP(Y2) || AXIS_HAS_STEALTHCHOP(Z2)
2792 2724
           SERIAL_EOL_P(port);
2793 2725
         #endif
2794
-        #if AXIS_IS_TMC(Z3)
2726
+
2727
+        #if AXIS_HAS_STEALTHCHOP(Z3)
2795 2728
           say_M913(PORTVAR_SOLO);
2796 2729
           SERIAL_ECHOPGM_P(port, " I2");
2797 2730
           SERIAL_ECHOLNPAIR_P(port, " Z", TMC_GET_PWMTHRS(Z, Z3));
2798 2731
         #endif
2799
-        #if AXIS_IS_TMC(E0)
2732
+
2733
+        #if AXIS_HAS_STEALTHCHOP(E0)
2800 2734
           say_M913(PORTVAR_SOLO);
2801 2735
           SERIAL_ECHOLNPAIR_P(port, " T0 E", TMC_GET_PWMTHRS(E, E0));
2802 2736
         #endif
2803
-        #if AXIS_IS_TMC(E1)
2737
+        #if AXIS_HAS_STEALTHCHOP(E1)
2804 2738
           say_M913(PORTVAR_SOLO);
2805 2739
           SERIAL_ECHOLNPAIR_P(port, " T1 E", TMC_GET_PWMTHRS(E, E1));
2806 2740
         #endif
2807
-        #if AXIS_IS_TMC(E2)
2741
+        #if AXIS_HAS_STEALTHCHOP(E2)
2808 2742
           say_M913(PORTVAR_SOLO);
2809 2743
           SERIAL_ECHOLNPAIR_P(port, " T2 E", TMC_GET_PWMTHRS(E, E2));
2810 2744
         #endif
2811
-        #if AXIS_IS_TMC(E3)
2745
+        #if AXIS_HAS_STEALTHCHOP(E3)
2812 2746
           say_M913(PORTVAR_SOLO);
2813 2747
           SERIAL_ECHOLNPAIR_P(port, " T3 E", TMC_GET_PWMTHRS(E, E3));
2814 2748
         #endif
2815
-        #if AXIS_IS_TMC(E4)
2749
+        #if AXIS_HAS_STEALTHCHOP(E4)
2816 2750
           say_M913(PORTVAR_SOLO);
2817 2751
           SERIAL_ECHOLNPAIR_P(port, " T4 E", TMC_GET_PWMTHRS(E, E4));
2818 2752
         #endif
2819
-        #if AXIS_IS_TMC(E5)
2753
+        #if AXIS_HAS_STEALTHCHOP(E5)
2820 2754
           say_M913(PORTVAR_SOLO);
2821 2755
           SERIAL_ECHOLNPAIR_P(port, " T5 E", TMC_GET_PWMTHRS(E, E5));
2822 2756
         #endif
@@ -2824,7 +2758,7 @@ void MarlinSettings::reset(PORTARG_SOLO) {
2824 2758
       #endif // HYBRID_THRESHOLD
2825 2759
 
2826 2760
       /**
2827
-     * TMC2130 Sensorless homing thresholds
2761
+       * TMC Sensorless homing thresholds
2828 2762
        */
2829 2763
       #if USE_SENSORLESS
2830 2764
         if (!forReplay) {

+ 184
- 222
Marlin/src/module/stepper_indirection.cpp Ver arquivo

@@ -139,170 +139,103 @@
139 139
   }
140 140
 #endif // TMC26X
141 141
 
142
+#if HAS_TRINAMIC
143
+  #define _TMC_INIT(ST, SPMM) tmc_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, SPMM)
144
+#endif
145
+
142 146
 //
143 147
 // TMC2130 Driver objects and inits
144 148
 //
145 149
 #if HAS_DRIVER(TMC2130)
146 150
 
147 151
   #include <SPI.h>
148
-  #include <TMC2130Stepper.h>
149 152
   #include "planner.h"
150 153
   #include "../core/enum.h"
151 154
 
152
-  #if TMC2130STEPPER_VERSION < 0x020201
153
-    #error "Update TMC2130Stepper library to 2.2.1 or newer."
154
-  #endif
155
-
156 155
   #if ENABLED(TMC_USE_SW_SPI)
157
-    #define _TMC2130_DEFINE(ST) TMC2130Stepper stepper##ST(ST##_ENABLE_PIN, ST##_DIR_PIN, ST##_STEP_PIN, ST##_CS_PIN, TMC_SW_MOSI, TMC_SW_MISO, TMC_SW_SCK)
156
+    #define _TMC2130_DEFINE(ST, L) TMCMarlin<TMC2130Stepper, L> stepper##ST(ST##_CS_PIN, R_SENSE, TMC_SW_MOSI, TMC_SW_MISO, TMC_SW_SCK)
157
+    #define TMC2130_DEFINE(ST) _TMC2130_DEFINE(ST, TMC_##ST##_LABEL)
158 158
   #else
159
-    #define _TMC2130_DEFINE(ST) TMC2130Stepper stepper##ST(ST##_ENABLE_PIN, ST##_DIR_PIN, ST##_STEP_PIN, ST##_CS_PIN)
159
+    #define _TMC2130_DEFINE(ST, L) TMCMarlin<TMC2130Stepper, L> stepper##ST(ST##_CS_PIN, R_SENSE)
160
+    #define TMC2130_DEFINE(ST) _TMC2130_DEFINE(ST, TMC_##ST##_LABEL)
160 161
   #endif
161
-
162 162
   // Stepper objects of TMC2130 steppers used
163 163
   #if AXIS_DRIVER_TYPE(X, TMC2130)
164
-    _TMC2130_DEFINE(X);
164
+    TMC2130_DEFINE(X);
165 165
   #endif
166 166
   #if AXIS_DRIVER_TYPE(X2, TMC2130)
167
-    _TMC2130_DEFINE(X2);
167
+    TMC2130_DEFINE(X2);
168 168
   #endif
169 169
   #if AXIS_DRIVER_TYPE(Y, TMC2130)
170
-    _TMC2130_DEFINE(Y);
170
+    TMC2130_DEFINE(Y);
171 171
   #endif
172 172
   #if AXIS_DRIVER_TYPE(Y2, TMC2130)
173
-    _TMC2130_DEFINE(Y2);
173
+    TMC2130_DEFINE(Y2);
174 174
   #endif
175 175
   #if AXIS_DRIVER_TYPE(Z, TMC2130)
176
-    _TMC2130_DEFINE(Z);
176
+    TMC2130_DEFINE(Z);
177 177
   #endif
178 178
   #if AXIS_DRIVER_TYPE(Z2, TMC2130)
179
-    _TMC2130_DEFINE(Z2);
179
+    TMC2130_DEFINE(Z2);
180 180
   #endif
181 181
   #if AXIS_DRIVER_TYPE(Z3, TMC2130)
182
-    _TMC2130_DEFINE(Z3);
182
+    TMC2130_DEFINE(Z3);
183 183
   #endif
184 184
   #if AXIS_DRIVER_TYPE(E0, TMC2130)
185
-    _TMC2130_DEFINE(E0);
185
+    TMC2130_DEFINE(E0);
186 186
   #endif
187 187
   #if AXIS_DRIVER_TYPE(E1, TMC2130)
188
-    _TMC2130_DEFINE(E1);
188
+    TMC2130_DEFINE(E1);
189 189
   #endif
190 190
   #if AXIS_DRIVER_TYPE(E2, TMC2130)
191
-    _TMC2130_DEFINE(E2);
191
+    TMC2130_DEFINE(E2);
192 192
   #endif
193 193
   #if AXIS_DRIVER_TYPE(E3, TMC2130)
194
-    _TMC2130_DEFINE(E3);
194
+    TMC2130_DEFINE(E3);
195 195
   #endif
196 196
   #if AXIS_DRIVER_TYPE(E4, TMC2130)
197
-    _TMC2130_DEFINE(E4);
197
+    TMC2130_DEFINE(E4);
198 198
   #endif
199 199
   #if AXIS_DRIVER_TYPE(E5, TMC2130)
200
-    _TMC2130_DEFINE(E5);
200
+    TMC2130_DEFINE(E5);
201 201
   #endif
202 202
 
203
-  // Use internal reference voltage for current calculations. This is the default.
204
-  // Following values from Trinamic's spreadsheet with values for a NEMA17 (42BYGHW609)
205
-  // https://www.trinamic.com/products/integrated-circuits/details/tmc2130/
206
-  void tmc2130_init(TMC2130Stepper &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const float spmm) {
203
+  template<char AXIS_LETTER, char DRIVER_ID>
204
+  void tmc_init(TMCMarlin<TMC2130Stepper, AXIS_LETTER, DRIVER_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const float spmm) {
207 205
     #if DISABLED(STEALTHCHOP) || DISABLED(HYBRID_THRESHOLD)
208 206
       UNUSED(thrs);
209 207
       UNUSED(spmm);
210 208
     #endif
211 209
     st.begin();
212
-    st.setCurrent(mA, R_SENSE, HOLD_MULTIPLIER);
210
+
211
+    CHOPCONF_t chopconf{0};
212
+    chopconf.tbl = 1;
213
+    chopconf.toff = 3;
214
+    chopconf.intpol = INTERPOLATE;
215
+    chopconf.hstrt = 2;
216
+    chopconf.hend = 5;
217
+    st.CHOPCONF(chopconf.sr);
218
+
219
+    st.rms_current(mA, HOLD_MULTIPLIER);
213 220
     st.microsteps(microsteps);
214
-    st.blank_time(24);
215
-    st.off_time(5); // Only enables the driver if used with stealthChop
216
-    st.interpolate(INTERPOLATE);
217
-    st.power_down_delay(128); // ~2s until driver lowers to hold current
218
-    st.hysteresis_start(3);
219
-    st.hysteresis_end(2);
221
+    st.iholddelay(10);
222
+    st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
223
+
220 224
     #if ENABLED(STEALTHCHOP)
221
-      st.stealth_freq(1); // f_pwm = 2/683 f_clk
222
-      st.stealth_autoscale(1);
223
-      st.stealth_gradient(5);
224
-      st.stealth_amplitude(255);
225
-      st.stealthChop(1);
226
-      #if ENABLED(HYBRID_THRESHOLD)
227
-        st.stealth_max_speed(12650000UL*microsteps/(256*thrs*spmm));
228
-      #endif
229
-    #endif
230
-    st.GSTAT(); // Clear GSTAT
231
-  }
225
+      st.en_pwm_mode(true);
232 226
 
233
-  #define _TMC2130_INIT(ST, SPMM) tmc2130_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, SPMM)
227
+      PWMCONF_t pwmconf{0};
228
+      pwmconf.pwm_freq = 0b01; // f_pwm = 2/683 f_clk
229
+      pwmconf.pwm_autoscale = true;
230
+      pwmconf.pwm_grad = 5;
231
+      pwmconf.pwm_ampl = 180;
232
+      st.PWMCONF(pwmconf.sr);
234 233
 
235
-  void tmc2130_init_to_defaults() {
236
-    #if AXIS_DRIVER_TYPE(X, TMC2130)
237
-      _TMC2130_INIT( X, planner.axis_steps_per_mm[X_AXIS]);
238
-    #endif
239
-    #if AXIS_DRIVER_TYPE(X2, TMC2130)
240
-      _TMC2130_INIT(X2, planner.axis_steps_per_mm[X_AXIS]);
241
-    #endif
242
-    #if AXIS_DRIVER_TYPE(Y, TMC2130)
243
-      _TMC2130_INIT( Y, planner.axis_steps_per_mm[Y_AXIS]);
244
-    #endif
245
-    #if AXIS_DRIVER_TYPE(Y2, TMC2130)
246
-      _TMC2130_INIT(Y2, planner.axis_steps_per_mm[Y_AXIS]);
247
-    #endif
248
-    #if AXIS_DRIVER_TYPE(Z, TMC2130)
249
-      _TMC2130_INIT( Z, planner.axis_steps_per_mm[Z_AXIS]);
250
-    #endif
251
-    #if AXIS_DRIVER_TYPE(Z2, TMC2130)
252
-      _TMC2130_INIT(Z2, planner.axis_steps_per_mm[Z_AXIS]);
253
-    #endif
254
-    #if AXIS_DRIVER_TYPE(Z3, TMC2130)
255
-      _TMC2130_INIT(Z3, planner.axis_steps_per_mm[Z_AXIS]);
256
-    #endif
257
-    #if AXIS_DRIVER_TYPE(E0, TMC2130)
258
-      _TMC2130_INIT(E0, planner.axis_steps_per_mm[E_AXIS]);
259
-    #endif
260
-    #if AXIS_DRIVER_TYPE(E1, TMC2130)
261
-      { constexpr uint8_t extruder = 1; _TMC2130_INIT(E1, planner.axis_steps_per_mm[E_AXIS_N]); UNUSED(extruder); }
262
-    #endif
263
-    #if AXIS_DRIVER_TYPE(E2, TMC2130)
264
-      { constexpr uint8_t extruder = 2; _TMC2130_INIT(E2, planner.axis_steps_per_mm[E_AXIS_N]); UNUSED(extruder); }
265
-    #endif
266
-    #if AXIS_DRIVER_TYPE(E3, TMC2130)
267
-      { constexpr uint8_t extruder = 3; _TMC2130_INIT(E3, planner.axis_steps_per_mm[E_AXIS_N]); UNUSED(extruder); }
268
-    #endif
269
-    #if AXIS_DRIVER_TYPE(E4, TMC2130)
270
-      { constexpr uint8_t extruder = 4; _TMC2130_INIT(E4, planner.axis_steps_per_mm[E_AXIS_N]); UNUSED(extruder); }
271
-    #endif
272
-    #if AXIS_DRIVER_TYPE(E5, TMC2130)
273
-      { constexpr uint8_t extruder = 5; _TMC2130_INIT(E5, planner.axis_steps_per_mm[E_AXIS_N]); UNUSED(extruder); }
274
-    #endif
275
-
276
-    #if USE_SENSORLESS
277
-      #define TMC_INIT_SGT(P,Q) stepper##Q.sgt(P##_STALL_SENSITIVITY);
278
-      #if X_SENSORLESS
279
-        #if AXIS_DRIVER_TYPE(X, TMC2130)
280
-          stepperX.sgt(X_STALL_SENSITIVITY);
281
-        #endif
282
-        #if AXIS_DRIVER_TYPE(X2, TMC2130)
283
-          stepperX2.sgt(X_STALL_SENSITIVITY);
284
-        #endif
285
-      #endif
286
-      #if Y_SENSORLESS
287
-        #if AXIS_DRIVER_TYPE(Y, TMC2130)
288
-          stepperY.sgt(Y_STALL_SENSITIVITY);
289
-        #endif
290
-        #if AXIS_DRIVER_TYPE(Y2, TMC2130)
291
-          stepperY2.sgt(Y_STALL_SENSITIVITY);
292
-        #endif
293
-      #endif
294
-      #if Z_SENSORLESS
295
-        #if AXIS_DRIVER_TYPE(Z, TMC2130)
296
-          stepperZ.sgt(Z_STALL_SENSITIVITY);
297
-        #endif
298
-        #if AXIS_DRIVER_TYPE(Z2, TMC2130)
299
-          stepperZ2.sgt(Z_STALL_SENSITIVITY);
300
-        #endif
301
-        #if ENABLED(Z3_IS_TMC2130)
302
-          stepperZ3.sgt(Z_STALL_SENSITIVITY);
303
-        #endif
234
+      #if ENABLED(HYBRID_THRESHOLD)
235
+        st.TPWMTHRS(12650000UL*microsteps/(256*thrs*spmm));
304 236
       #endif
305 237
     #endif
238
+    st.GSTAT(); // Clear GSTAT
306 239
   }
307 240
 #endif // TMC2130
308 241
 
@@ -311,106 +244,104 @@
311 244
 //
312 245
 #if HAS_DRIVER(TMC2208)
313 246
   #include <HardwareSerial.h>
314
-  #include <TMC2208Stepper.h>
315 247
   #include "planner.h"
316 248
 
317
-  #if TMC2208STEPPER_VERSION < 0x000101
318
-    #error "Update TMC2208Stepper library to 0.1.1 or newer."
319
-  #endif
249
+  #define _TMC2208_DEFINE_HARDWARE(ST, L) TMCMarlin<TMC2208Stepper, L> stepper##ST(&ST##_HARDWARE_SERIAL, R_SENSE)
250
+  #define TMC2208_DEFINE_HARDWARE(ST) _TMC2208_DEFINE_HARDWARE(ST, TMC_##ST##_LABEL)
320 251
 
321
-  #define _TMC2208_DEFINE_HARDWARE(ST) TMC2208Stepper stepper##ST(&ST##_HARDWARE_SERIAL)
322
-  #define _TMC2208_DEFINE_SOFTWARE(ST) TMC2208Stepper stepper##ST(ST##_SERIAL_RX_PIN, ST##_SERIAL_TX_PIN, ST##_SERIAL_RX_PIN > -1)
252
+  #define _TMC2208_DEFINE_SOFTWARE(ST, L) TMCMarlin<TMC2208Stepper, L> stepper##ST(ST##_SERIAL_RX_PIN, ST##_SERIAL_TX_PIN, R_SENSE, ST##_SERIAL_RX_PIN > -1)
253
+  #define TMC2208_DEFINE_SOFTWARE(ST) _TMC2208_DEFINE_SOFTWARE(ST, TMC_##ST##_LABEL)
323 254
 
324 255
   // Stepper objects of TMC2208 steppers used
325 256
   #if AXIS_DRIVER_TYPE(X, TMC2208)
326 257
     #ifdef X_HARDWARE_SERIAL
327
-      _TMC2208_DEFINE_HARDWARE(X);
258
+      TMC2208_DEFINE_HARDWARE(X);
328 259
     #else
329
-      _TMC2208_DEFINE_SOFTWARE(X);
260
+      TMC2208_DEFINE_SOFTWARE(X);
330 261
     #endif
331 262
   #endif
332 263
   #if AXIS_DRIVER_TYPE(X2, TMC2208)
333 264
     #ifdef X2_HARDWARE_SERIAL
334
-      _TMC2208_DEFINE_HARDWARE(X2);
265
+      TMC2208_DEFINE_HARDWARE(X2);
335 266
     #else
336
-      _TMC2208_DEFINE_SOFTWARE(X2);
267
+      TMC2208_DEFINE_SOFTWARE(X2);
337 268
     #endif
338 269
   #endif
339 270
   #if AXIS_DRIVER_TYPE(Y, TMC2208)
340 271
     #ifdef Y_HARDWARE_SERIAL
341
-      _TMC2208_DEFINE_HARDWARE(Y);
272
+      TMC2208_DEFINE_HARDWARE(Y);
342 273
     #else
343
-      _TMC2208_DEFINE_SOFTWARE(Y);
274
+      TMC2208_DEFINE_SOFTWARE(Y);
344 275
     #endif
345 276
   #endif
346 277
   #if AXIS_DRIVER_TYPE(Y2, TMC2208)
347 278
     #ifdef Y2_HARDWARE_SERIAL
348
-      _TMC2208_DEFINE_HARDWARE(Y2);
279
+      TMC2208_DEFINE_HARDWARE(Y2);
349 280
     #else
350
-      _TMC2208_DEFINE_SOFTWARE(Y2);
281
+      TMC2208_DEFINE_SOFTWARE(Y2);
351 282
     #endif
352 283
   #endif
353 284
   #if AXIS_DRIVER_TYPE(Z, TMC2208)
354 285
     #ifdef Z_HARDWARE_SERIAL
355
-      _TMC2208_DEFINE_HARDWARE(Z);
286
+      TMC2208_DEFINE_HARDWARE(Z);
356 287
     #else
357
-      _TMC2208_DEFINE_SOFTWARE(Z);
288
+      TMC2208_DEFINE_SOFTWARE(Z);
358 289
     #endif
359 290
   #endif
360 291
   #if AXIS_DRIVER_TYPE(Z2, TMC2208)
361 292
     #ifdef Z2_HARDWARE_SERIAL
362
-      _TMC2208_DEFINE_HARDWARE(Z2);
293
+      TMC2208_DEFINE_HARDWARE(Z2);
363 294
     #else
364
-      _TMC2208_DEFINE_SOFTWARE(Z2);
295
+      TMC2208_DEFINE_SOFTWARE(Z2);
365 296
     #endif
366 297
   #endif
367 298
   #if AXIS_DRIVER_TYPE(Z3, TMC2208)
368 299
     #ifdef Z3_HARDWARE_SERIAL
369
-      _TMC2208_DEFINE_HARDWARE(Z3);
300
+      TMC2208_DEFINE_HARDWARE(Z3);
370 301
     #else
371
-      _TMC2208_DEFINE_SOFTWARE(Z3);
302
+      TMC2208_DEFINE_SOFTWARE(Z3);
372 303
     #endif
373 304
   #endif
374 305
   #if AXIS_DRIVER_TYPE(E0, TMC2208)
375 306
     #ifdef E0_HARDWARE_SERIAL
376
-      _TMC2208_DEFINE_HARDWARE(E0);
307
+      TMC2208_DEFINE_HARDWARE(E0);
377 308
     #else
378
-      _TMC2208_DEFINE_SOFTWARE(E0);
309
+      TMC2208_DEFINE_SOFTWARE(E0);
379 310
     #endif
380 311
   #endif
381 312
   #if AXIS_DRIVER_TYPE(E1, TMC2208)
382 313
     #ifdef E1_HARDWARE_SERIAL
383
-      _TMC2208_DEFINE_HARDWARE(E1);
314
+      TMC2208_DEFINE_HARDWARE(E1);
384 315
     #else
385
-      _TMC2208_DEFINE_SOFTWARE(E1);
316
+      TMC2208_DEFINE_SOFTWARE(E1);
386 317
     #endif
387 318
   #endif
388 319
   #if AXIS_DRIVER_TYPE(E2, TMC2208)
389 320
     #ifdef E2_HARDWARE_SERIAL
390
-      _TMC2208_DEFINE_HARDWARE(E2);
321
+      TMC2208_DEFINE_HARDWARE(E2);
391 322
     #else
392
-      _TMC2208_DEFINE_SOFTWARE(E2);
323
+      TMC2208_DEFINE_SOFTWARE(E2);
393 324
     #endif
394 325
   #endif
395 326
   #if AXIS_DRIVER_TYPE(E3, TMC2208)
396 327
     #ifdef E3_HARDWARE_SERIAL
397
-      _TMC2208_DEFINE_HARDWARE(E3);
328
+      TMC2208_DEFINE_HARDWARE(E3);
398 329
     #else
399
-      _TMC2208_DEFINE_SOFTWARE(E3);
330
+      TMC2208_DEFINE_SOFTWARE(E3);
400 331
     #endif
401 332
   #endif
402 333
   #if AXIS_DRIVER_TYPE(E4, TMC2208)
403 334
     #ifdef E4_HARDWARE_SERIAL
404
-      _TMC2208_DEFINE_HARDWARE(E4);
335
+      TMC2208_DEFINE_HARDWARE(E4);
405 336
     #else
406
-      _TMC2208_DEFINE_SOFTWARE(E4);
337
+      TMC2208_DEFINE_SOFTWARE(E4);
407 338
     #endif
408 339
   #endif
409 340
   #if AXIS_DRIVER_TYPE(E5, TMC2208)
410 341
     #ifdef E5_HARDWARE_SERIAL
411
-      _TMC2208_DEFINE_HARDWARE(E5);
342
+      TMC2208_DEFINE_HARDWARE(E5);
412 343
     #else
413
-      _TMC2208_DEFINE_SOFTWARE(E5);
344
+      TMC2208_DEFINE_SOFTWARE(E5);
414 345
     #endif
415 346
   #endif
416 347
 
@@ -508,85 +439,52 @@
508 439
     #endif
509 440
   }
510 441
 
511
-  // Use internal reference voltage for current calculations. This is the default.
512
-  // Following values from Trinamic's spreadsheet with values for a NEMA17 (42BYGHW609)
513
-  void tmc2208_init(TMC2208Stepper &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const float spmm) {
514
-    st.pdn_disable(true); // Use UART
515
-    st.mstep_reg_select(true); // Select microsteps with UART
516
-    st.I_scale_analog(false);
517
-    st.rms_current(mA, HOLD_MULTIPLIER, R_SENSE);
442
+  template<char AXIS_LETTER, char DRIVER_ID>
443
+  void tmc_init(TMCMarlin<TMC2208Stepper, AXIS_LETTER, DRIVER_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const float spmm) {
444
+    #if DISABLED(STEALTHCHOP) || DISABLED(HYBRID_THRESHOLD)
445
+      UNUSED(thrs);
446
+      UNUSED(spmm);
447
+    #endif
448
+
449
+    TMC2208_n::GCONF_t gconf{0};
450
+    gconf.pdn_disable = true; // Use UART
451
+    gconf.mstep_reg_select = true; // Select microsteps with UART
452
+    gconf.i_scale_analog = false;
453
+
454
+    TMC2208_n::CHOPCONF_t chopconf{0};
455
+    chopconf.tbl = 0b01; // blank_time = 24
456
+    chopconf.toff = 5;
457
+    chopconf.intpol = INTERPOLATE;
458
+    chopconf.hstrt = 2;
459
+    chopconf.hend = 5;
460
+    st.CHOPCONF(chopconf.sr);
461
+
462
+    st.rms_current(mA, HOLD_MULTIPLIER);
518 463
     st.microsteps(microsteps);
519
-    st.blank_time(24);
520
-    st.toff(5);
521
-    st.intpol(INTERPOLATE);
464
+    st.iholddelay(10);
522 465
     st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
523
-    st.hysteresis_start(3);
524
-    st.hysteresis_end(2);
525 466
     #if ENABLED(STEALTHCHOP)
526
-      st.pwm_lim(12);
527
-      st.pwm_reg(8);
528
-      st.pwm_autograd(1);
529
-      st.pwm_autoscale(1);
530
-      st.pwm_freq(1);
531
-      st.pwm_grad(14);
532
-      st.pwm_ofs(36);
533
-      st.en_spreadCycle(false);
467
+      gconf.en_spreadcycle = false;
468
+
469
+      TMC2208_n::PWMCONF_t pwmconf{0};
470
+      pwmconf.pwm_lim = 12;
471
+      pwmconf.pwm_reg = 8;
472
+      pwmconf.pwm_autograd = true;
473
+      pwmconf.pwm_autoscale = true;
474
+      pwmconf.pwm_freq = 0b01;
475
+      pwmconf.pwm_grad = 14;
476
+      pwmconf.pwm_ofs = 36;
477
+      st.PWMCONF(pwmconf.sr);
534 478
       #if ENABLED(HYBRID_THRESHOLD)
535 479
         st.TPWMTHRS(12650000UL*microsteps/(256*thrs*spmm));
536
-      #else
537
-        UNUSED(thrs);
538
-        UNUSED(spmm);
539 480
       #endif
540 481
     #else
541
-      st.en_spreadCycle(true);
482
+      gconf.en_spreadcycle = true;
542 483
     #endif
484
+    st.GCONF(gconf.sr);
543 485
     st.GSTAT(0b111); // Clear
544 486
     delay(200);
545 487
   }
546
-
547
-  #define _TMC2208_INIT(ST, SPMM) tmc2208_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, SPMM)
548
-
549
-  void tmc2208_init_to_defaults() {
550
-    #if AXIS_DRIVER_TYPE(X, TMC2208)
551
-      _TMC2208_INIT(X, planner.axis_steps_per_mm[X_AXIS]);
552
-    #endif
553
-    #if AXIS_DRIVER_TYPE(X2, TMC2208)
554
-      _TMC2208_INIT(X2, planner.axis_steps_per_mm[X_AXIS]);
555
-    #endif
556
-    #if AXIS_DRIVER_TYPE(Y, TMC2208)
557
-      _TMC2208_INIT(Y, planner.axis_steps_per_mm[Y_AXIS]);
558
-    #endif
559
-    #if AXIS_DRIVER_TYPE(Y2, TMC2208)
560
-      _TMC2208_INIT(Y2, planner.axis_steps_per_mm[Y_AXIS]);
561
-    #endif
562
-    #if AXIS_DRIVER_TYPE(Z, TMC2208)
563
-      _TMC2208_INIT(Z, planner.axis_steps_per_mm[Z_AXIS]);
564
-    #endif
565
-    #if AXIS_DRIVER_TYPE(Z2, TMC2208)
566
-      _TMC2208_INIT(Z2, planner.axis_steps_per_mm[Z_AXIS]);
567
-    #endif
568
-    #if AXIS_DRIVER_TYPE(Z3, TMC2208)
569
-      _TMC2208_INIT(Z3, planner.axis_steps_per_mm[Z_AXIS]);
570
-    #endif
571
-    #if AXIS_DRIVER_TYPE(E0, TMC2208)
572
-      _TMC2208_INIT(E0, planner.axis_steps_per_mm[E_AXIS]);
573
-    #endif
574
-    #if AXIS_DRIVER_TYPE(E1, TMC2208)
575
-      { constexpr int extruder = 1; _TMC2208_INIT(E1, planner.axis_steps_per_mm[E_AXIS_N]); }
576
-    #endif
577
-    #if AXIS_DRIVER_TYPE(E2, TMC2208)
578
-      { constexpr int extruder = 2; _TMC2208_INIT(E2, planner.axis_steps_per_mm[E_AXIS_N]); }
579
-    #endif
580
-    #if AXIS_DRIVER_TYPE(E3, TMC2208)
581
-      { constexpr int extruder = 3; _TMC2208_INIT(E3, planner.axis_steps_per_mm[E_AXIS_N]); }
582
-    #endif
583
-    #if AXIS_DRIVER_TYPE(E4, TMC2208)
584
-      { constexpr int extruder = 4; _TMC2208_INIT(E4, planner.axis_steps_per_mm[E_AXIS_N]); }
585
-    #endif
586
-    #if AXIS_DRIVER_TYPE(E5, TMC2208)
587
-      { constexpr int extruder = 5; _TMC2208_INIT(E5, planner.axis_steps_per_mm[E_AXIS_N]); }
588
-    #endif
589
-  }
590 488
 #endif // TMC2208
591 489
 
592 490
 void restore_stepper_drivers() {
@@ -635,20 +533,84 @@ void reset_stepper_drivers() {
635 533
   #if HAS_DRIVER(TMC26X)
636 534
     tmc26x_init_to_defaults();
637 535
   #endif
638
-  #if HAS_DRIVER(TMC2130)
639
-    delay(100);
640
-    tmc2130_init_to_defaults();
536
+  #if ENABLED(HAVE_L6470DRIVER)
537
+    L6470_init_to_defaults();
538
+  #endif
539
+
540
+  #if AXIS_IS_TMC(X)
541
+    _TMC_INIT(X, planner.axis_steps_per_mm[X_AXIS]);
542
+  #endif
543
+  #if AXIS_IS_TMC(X2)
544
+    _TMC_INIT(X2, planner.axis_steps_per_mm[X_AXIS]);
545
+  #endif
546
+  #if AXIS_IS_TMC(Y)
547
+    _TMC_INIT(Y, planner.axis_steps_per_mm[Y_AXIS]);
548
+  #endif
549
+  #if AXIS_IS_TMC(Y2)
550
+    _TMC_INIT(Y2, planner.axis_steps_per_mm[Y_AXIS]);
551
+  #endif
552
+  #if AXIS_IS_TMC(Z)
553
+    _TMC_INIT(Z, planner.axis_steps_per_mm[Z_AXIS]);
554
+  #endif
555
+  #if AXIS_IS_TMC(Z2)
556
+    _TMC_INIT(Z2, planner.axis_steps_per_mm[Z_AXIS]);
557
+  #endif
558
+  #if AXIS_IS_TMC(Z3)
559
+    _TMC_INIT(Z3, planner.axis_steps_per_mm[Z_AXIS]);
560
+  #endif
561
+  #if AXIS_IS_TMC(E0)
562
+    _TMC_INIT(E0, planner.axis_steps_per_mm[E_AXIS]);
563
+  #endif
564
+  #if AXIS_IS_TMC(E1)
565
+    { constexpr uint8_t extruder = 1; _TMC_INIT(E1, planner.axis_steps_per_mm[E_AXIS_N]); UNUSED(extruder); }
566
+  #endif
567
+  #if AXIS_IS_TMC(E2)
568
+    { constexpr uint8_t extruder = 2; _TMC_INIT(E2, planner.axis_steps_per_mm[E_AXIS_N]); UNUSED(extruder); }
641 569
   #endif
642
-  #if HAS_DRIVER(TMC2208)
643
-    delay(100);
644
-    tmc2208_init_to_defaults();
570
+  #if AXIS_IS_TMC(E3)
571
+    { constexpr uint8_t extruder = 3; _TMC_INIT(E3, planner.axis_steps_per_mm[E_AXIS_N]); UNUSED(extruder); }
572
+  #endif
573
+  #if AXIS_IS_TMC(E4)
574
+    { constexpr uint8_t extruder = 4; _TMC_INIT(E4, planner.axis_steps_per_mm[E_AXIS_N]); UNUSED(extruder); }
575
+  #endif
576
+  #if AXIS_IS_TMC(E5)
577
+    { constexpr uint8_t extruder = 5; _TMC_INIT(E5, planner.axis_steps_per_mm[E_AXIS_N]); UNUSED(extruder); }
578
+  #endif
579
+
580
+  #if ENABLED(SENSORLESS_HOMING)
581
+    #if X_SENSORLESS
582
+      #if AXIS_HAS_STALLGUARD(X)
583
+        stepperX.sgt(X_STALL_SENSITIVITY);
584
+      #endif
585
+      #if AXIS_HAS_STALLGUARD(X2)
586
+        stepperX2.sgt(X_STALL_SENSITIVITY);
587
+      #endif
588
+    #endif
589
+    #if Y_SENSORLESS
590
+      #if AXIS_HAS_STALLGUARD(Y)
591
+        stepperY.sgt(Y_STALL_SENSITIVITY);
592
+      #endif
593
+      #if AXIS_HAS_STALLGUARD(Y2)
594
+        stepperY2.sgt(Y_STALL_SENSITIVITY);
595
+      #endif
596
+    #endif
597
+    #if Z_SENSORLESS
598
+      #if AXIS_HAS_STALLGUARD(Z)
599
+        stepperZ.sgt(Z_STALL_SENSITIVITY);
600
+      #endif
601
+      #if AXIS_HAS_STALLGUARD(Z2)
602
+        stepperZ2.sgt(Z_STALL_SENSITIVITY);
603
+      #endif
604
+      #if AXIS_HAS_STALLGUARD(Z3)
605
+        stepperZ3.sgt(Z_STALL_SENSITIVITY);
606
+      #endif
607
+    #endif
645 608
   #endif
609
+
646 610
   #ifdef TMC_ADV
647 611
     TMC_ADV()
648 612
   #endif
649
-  #if HAS_DRIVER(L6470)
650
-    L6470_init_to_defaults();
651
-  #endif
613
+
652 614
   stepper.set_directions();
653 615
 }
654 616
 

+ 52
- 73
Marlin/src/module/stepper_indirection.h Ver arquivo

@@ -57,15 +57,20 @@
57 57
   void tmc26x_init_to_defaults();
58 58
 #endif
59 59
 
60
-#if HAS_DRIVER(TMC2130)
61
-  #include <TMC2130Stepper.h>
62
-  void tmc2130_init_to_defaults();
63
-#endif
60
+#if HAS_TRINAMIC
61
+  #include <TMCStepper.h>
62
+  #include "../feature/tmc_util.h"
63
+  #if TMCSTEPPER_VERSION < 0x000001
64
+    #error "Update TMCStepper library to 0.0.1 or newer."
65
+  #endif
64 66
 
65
-#if HAS_DRIVER(TMC2208)
66
-  #include <TMC2208Stepper.h>
67
-  void tmc2208_serial_begin();
68
-  void tmc2208_init_to_defaults();
67
+  #define __TMC_CLASS(MODEL, A, I) TMCMarlin<TMC##MODEL##Stepper, A, I>
68
+  #define _TMC_CLASS(MODEL, L) __TMC_CLASS(MODEL, L)
69
+  #define TMC_CLASS(ST) _TMC_CLASS(ST##_DRIVER_TYPE, TMC_##ST##_LABEL)
70
+
71
+  #if HAS_DRIVER(TMC2208)
72
+    void tmc2208_serial_begin();
73
+  #endif
69 74
 #endif
70 75
 
71 76
 // L6470 has STEP on normal pins, but DIR/ENABLE via SPI
@@ -88,17 +93,15 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
88 93
   #define X_DIR_WRITE(STATE) stepperX.Step_Clock(STATE)
89 94
   #define X_DIR_READ (stepperX.getStatus() & STATUS_DIR)
90 95
 #else
96
+  #if AXIS_IS_TMC(X)
97
+    extern TMC_CLASS(X) stepperX;
98
+  #endif
91 99
   #if AXIS_DRIVER_TYPE(X, TMC26X)
92 100
     extern TMC26XStepper stepperX;
93 101
     #define X_ENABLE_INIT NOOP
94 102
     #define X_ENABLE_WRITE(STATE) stepperX.setEnabled(STATE)
95 103
     #define X_ENABLE_READ stepperX.isEnabled()
96 104
   #else
97
-    #if AXIS_DRIVER_TYPE(X, TMC2130)
98
-      extern TMC2130Stepper stepperX;
99
-    #elif AXIS_DRIVER_TYPE(X, TMC2208)
100
-      extern TMC2208Stepper stepperX;
101
-    #endif
102 105
     #define X_ENABLE_INIT SET_OUTPUT(X_ENABLE_PIN)
103 106
     #define X_ENABLE_WRITE(STATE) WRITE(X_ENABLE_PIN,STATE)
104 107
     #define X_ENABLE_READ READ(X_ENABLE_PIN)
@@ -121,17 +124,15 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
121 124
   #define Y_DIR_WRITE(STATE) stepperY.Step_Clock(STATE)
122 125
   #define Y_DIR_READ (stepperY.getStatus() & STATUS_DIR)
123 126
 #else
127
+  #if AXIS_IS_TMC(Y)
128
+    extern TMC_CLASS(Y) stepperY;
129
+  #endif
124 130
   #if AXIS_DRIVER_TYPE(Y, TMC26X)
125 131
     extern TMC26XStepper stepperY;
126 132
     #define Y_ENABLE_INIT NOOP
127 133
     #define Y_ENABLE_WRITE(STATE) stepperY.setEnabled(STATE)
128 134
     #define Y_ENABLE_READ stepperY.isEnabled()
129 135
   #else
130
-    #if AXIS_DRIVER_TYPE(Y, TMC2130)
131
-      extern TMC2130Stepper stepperY;
132
-    #elif AXIS_DRIVER_TYPE(Y, TMC2208)
133
-      extern TMC2208Stepper stepperY;
134
-    #endif
135 136
     #define Y_ENABLE_INIT SET_OUTPUT(Y_ENABLE_PIN)
136 137
     #define Y_ENABLE_WRITE(STATE) WRITE(Y_ENABLE_PIN,STATE)
137 138
     #define Y_ENABLE_READ READ(Y_ENABLE_PIN)
@@ -154,17 +155,15 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
154 155
   #define Z_DIR_WRITE(STATE) stepperZ.Step_Clock(STATE)
155 156
   #define Z_DIR_READ (stepperZ.getStatus() & STATUS_DIR)
156 157
 #else
158
+  #if AXIS_IS_TMC(Z)
159
+    extern TMC_CLASS(Z) stepperZ;
160
+  #endif
157 161
   #if AXIS_DRIVER_TYPE(Z, TMC26X)
158 162
     extern TMC26XStepper stepperZ;
159 163
     #define Z_ENABLE_INIT NOOP
160 164
     #define Z_ENABLE_WRITE(STATE) stepperZ.setEnabled(STATE)
161 165
     #define Z_ENABLE_READ stepperZ.isEnabled()
162 166
   #else
163
-    #if AXIS_DRIVER_TYPE(Z, TMC2130)
164
-      extern TMC2130Stepper stepperZ;
165
-    #elif AXIS_DRIVER_TYPE(Z, TMC2208)
166
-      extern TMC2208Stepper stepperZ;
167
-    #endif
168 167
     #define Z_ENABLE_INIT SET_OUTPUT(Z_ENABLE_PIN)
169 168
     #define Z_ENABLE_WRITE(STATE) WRITE(Z_ENABLE_PIN,STATE)
170 169
     #define Z_ENABLE_READ READ(Z_ENABLE_PIN)
@@ -188,17 +187,15 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
188 187
     #define X2_DIR_WRITE(STATE) stepperX2.Step_Clock(STATE)
189 188
     #define X2_DIR_READ (stepperX2.getStatus() & STATUS_DIR)
190 189
   #else
190
+    #if AXIS_IS_TMC(X2)
191
+      extern TMC_CLASS(X2) stepperX2;
192
+    #endif
191 193
     #if AXIS_DRIVER_TYPE(X2, TMC26X)
192 194
       extern TMC26XStepper stepperX2;
193 195
       #define X2_ENABLE_INIT NOOP
194 196
       #define X2_ENABLE_WRITE(STATE) stepperX2.setEnabled(STATE)
195 197
       #define X2_ENABLE_READ stepperX2.isEnabled()
196 198
     #else
197
-      #if AXIS_DRIVER_TYPE(X2, TMC2130)
198
-        extern TMC2130Stepper stepperX2;
199
-      #elif AXIS_DRIVER_TYPE(X2, TMC2208)
200
-        extern TMC2208Stepper stepperX2;
201
-      #endif
202 199
       #define X2_ENABLE_INIT SET_OUTPUT(X2_ENABLE_PIN)
203 200
       #define X2_ENABLE_WRITE(STATE) WRITE(X2_ENABLE_PIN,STATE)
204 201
       #define X2_ENABLE_READ READ(X2_ENABLE_PIN)
@@ -223,17 +220,15 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
223 220
     #define Y2_DIR_WRITE(STATE) stepperY2.Step_Clock(STATE)
224 221
     #define Y2_DIR_READ (stepperY2.getStatus() & STATUS_DIR)
225 222
   #else
223
+    #if AXIS_IS_TMC(Y2)
224
+      extern TMC_CLASS(Y2) stepperY2;
225
+    #endif
226 226
     #if AXIS_DRIVER_TYPE(Y2, TMC26X)
227 227
       extern TMC26XStepper stepperY2;
228 228
       #define Y2_ENABLE_INIT NOOP
229 229
       #define Y2_ENABLE_WRITE(STATE) stepperY2.setEnabled(STATE)
230 230
       #define Y2_ENABLE_READ stepperY2.isEnabled()
231 231
     #else
232
-      #if AXIS_DRIVER_TYPE(Y2, TMC2130)
233
-        extern TMC2130Stepper stepperY2;
234
-      #elif AXIS_DRIVER_TYPE(Y2, TMC2208)
235
-        extern TMC2208Stepper stepperY2;
236
-      #endif
237 232
       #define Y2_ENABLE_INIT SET_OUTPUT(Y2_ENABLE_PIN)
238 233
       #define Y2_ENABLE_WRITE(STATE) WRITE(Y2_ENABLE_PIN,STATE)
239 234
       #define Y2_ENABLE_READ READ(Y2_ENABLE_PIN)
@@ -258,17 +253,15 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
258 253
     #define Z2_DIR_WRITE(STATE) stepperZ2.Step_Clock(STATE)
259 254
     #define Z2_DIR_READ (stepperZ2.getStatus() & STATUS_DIR)
260 255
   #else
256
+    #if AXIS_IS_TMC(Z2)
257
+      extern TMC_CLASS(Z2) stepperZ2;
258
+    #endif
261 259
     #if AXIS_DRIVER_TYPE(Z2, TMC26X)
262 260
       extern TMC26XStepper stepperZ2;
263 261
       #define Z2_ENABLE_INIT NOOP
264 262
       #define Z2_ENABLE_WRITE(STATE) stepperZ2.setEnabled(STATE)
265 263
       #define Z2_ENABLE_READ stepperZ2.isEnabled()
266 264
     #else
267
-      #if AXIS_DRIVER_TYPE(Z2, TMC2130)
268
-        extern TMC2130Stepper stepperZ2;
269
-      #elif AXIS_DRIVER_TYPE(Z2, TMC2208)
270
-        extern TMC2208Stepper stepperZ2;
271
-      #endif
272 265
       #define Z2_ENABLE_INIT SET_OUTPUT(Z2_ENABLE_PIN)
273 266
       #define Z2_ENABLE_WRITE(STATE) WRITE(Z2_ENABLE_PIN,STATE)
274 267
       #define Z2_ENABLE_READ READ(Z2_ENABLE_PIN)
@@ -293,17 +286,15 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
293 286
     #define Z3_DIR_WRITE(STATE) stepperZ3.Step_Clock(STATE)
294 287
     #define Z3_DIR_READ (stepperZ3.getStatus() & STATUS_DIR)
295 288
   #else
289
+    #if AXIS_IS_TMC(Z3)
290
+      extern TMC_CLASS(Z3) stepperZ3;
291
+    #endif
296 292
     #if ENABLED(Z3_IS_TMC26X)
297 293
       extern TMC26XStepper stepperZ3;
298 294
       #define Z3_ENABLE_INIT NOOP
299 295
       #define Z3_ENABLE_WRITE(STATE) stepperZ3.setEnabled(STATE)
300 296
       #define Z3_ENABLE_READ stepperZ3.isEnabled()
301 297
     #else
302
-      #if ENABLED(Z3_IS_TMC2130)
303
-        extern TMC2130Stepper stepperZ3;
304
-      #elif ENABLED(Z3_IS_TMC2208)
305
-        extern TMC2208Stepper stepperZ3;
306
-      #endif
307 298
       #define Z3_ENABLE_INIT SET_OUTPUT(Z3_ENABLE_PIN)
308 299
       #define Z3_ENABLE_WRITE(STATE) WRITE(Z3_ENABLE_PIN,STATE)
309 300
       #define Z3_ENABLE_READ READ(Z3_ENABLE_PIN)
@@ -327,17 +318,15 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
327 318
   #define E0_DIR_WRITE(STATE) stepperE0.Step_Clock(STATE)
328 319
   #define E0_DIR_READ (stepperE0.getStatus() & STATUS_DIR)
329 320
 #else
321
+  #if AXIS_IS_TMC(E0)
322
+    extern TMC_CLASS(E0) stepperE0;
323
+  #endif
330 324
   #if AXIS_DRIVER_TYPE(E0, TMC26X)
331 325
     extern TMC26XStepper stepperE0;
332 326
     #define E0_ENABLE_INIT NOOP
333 327
     #define E0_ENABLE_WRITE(STATE) stepperE0.setEnabled(STATE)
334 328
     #define E0_ENABLE_READ stepperE0.isEnabled()
335 329
   #else
336
-    #if AXIS_DRIVER_TYPE(E0, TMC2130)
337
-      extern TMC2130Stepper stepperE0;
338
-    #elif AXIS_DRIVER_TYPE(E0, TMC2208)
339
-      extern TMC2208Stepper stepperE0;
340
-    #endif
341 330
     #define E0_ENABLE_INIT SET_OUTPUT(E0_ENABLE_PIN)
342 331
     #define E0_ENABLE_WRITE(STATE) WRITE(E0_ENABLE_PIN,STATE)
343 332
     #define E0_ENABLE_READ READ(E0_ENABLE_PIN)
@@ -360,17 +349,15 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
360 349
   #define E1_DIR_WRITE(STATE) stepperE1.Step_Clock(STATE)
361 350
   #define E1_DIR_READ (stepperE1.getStatus() & STATUS_DIR)
362 351
 #else
352
+  #if AXIS_IS_TMC(E1)
353
+    extern TMC_CLASS(E1) stepperE1;
354
+  #endif
363 355
   #if AXIS_DRIVER_TYPE(E1, TMC26X)
364 356
     extern TMC26XStepper stepperE1;
365 357
     #define E1_ENABLE_INIT NOOP
366 358
     #define E1_ENABLE_WRITE(STATE) stepperE1.setEnabled(STATE)
367 359
     #define E1_ENABLE_READ stepperE1.isEnabled()
368 360
   #else
369
-    #if AXIS_DRIVER_TYPE(E1, TMC2130)
370
-      extern TMC2130Stepper stepperE1;
371
-    #elif AXIS_DRIVER_TYPE(E1, TMC2208)
372
-      extern TMC2208Stepper stepperE1;
373
-    #endif
374 361
     #define E1_ENABLE_INIT SET_OUTPUT(E1_ENABLE_PIN)
375 362
     #define E1_ENABLE_WRITE(STATE) WRITE(E1_ENABLE_PIN,STATE)
376 363
     #define E1_ENABLE_READ READ(E1_ENABLE_PIN)
@@ -393,17 +380,15 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
393 380
   #define E2_DIR_WRITE(STATE) stepperE2.Step_Clock(STATE)
394 381
   #define E2_DIR_READ (stepperE2.getStatus() & STATUS_DIR)
395 382
 #else
383
+  #if AXIS_IS_TMC(E2)
384
+    extern TMC_CLASS(E2) stepperE2;
385
+  #endif
396 386
   #if AXIS_DRIVER_TYPE(E2, TMC26X)
397 387
     extern TMC26XStepper stepperE2;
398 388
     #define E2_ENABLE_INIT NOOP
399 389
     #define E2_ENABLE_WRITE(STATE) stepperE2.setEnabled(STATE)
400 390
     #define E2_ENABLE_READ stepperE2.isEnabled()
401 391
   #else
402
-    #if AXIS_DRIVER_TYPE(E2, TMC2130)
403
-      extern TMC2130Stepper stepperE2;
404
-    #elif AXIS_DRIVER_TYPE(E2, TMC2208)
405
-      extern TMC2208Stepper stepperE2;
406
-    #endif
407 392
     #define E2_ENABLE_INIT SET_OUTPUT(E2_ENABLE_PIN)
408 393
     #define E2_ENABLE_WRITE(STATE) WRITE(E2_ENABLE_PIN,STATE)
409 394
     #define E2_ENABLE_READ READ(E2_ENABLE_PIN)
@@ -426,17 +411,15 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
426 411
   #define E3_DIR_WRITE(STATE) stepperE3.Step_Clock(STATE)
427 412
   #define E3_DIR_READ (stepperE3.getStatus() & STATUS_DIR)
428 413
 #else
414
+  #if AXIS_IS_TMC(E3)
415
+    extern TMC_CLASS(E3) stepperE3;
416
+  #endif
429 417
   #if AXIS_DRIVER_TYPE(E3, TMC26X)
430 418
     extern TMC26XStepper stepperE3;
431 419
     #define E3_ENABLE_INIT NOOP
432 420
     #define E3_ENABLE_WRITE(STATE) stepperE3.setEnabled(STATE)
433 421
     #define E3_ENABLE_READ stepperE3.isEnabled()
434 422
   #else
435
-    #if AXIS_DRIVER_TYPE(E3, TMC2130)
436
-      extern TMC2130Stepper stepperE3;
437
-    #elif AXIS_DRIVER_TYPE(E3, TMC2208)
438
-      extern TMC2208Stepper stepperE3;
439
-    #endif
440 423
     #define E3_ENABLE_INIT SET_OUTPUT(E3_ENABLE_PIN)
441 424
     #define E3_ENABLE_WRITE(STATE) WRITE(E3_ENABLE_PIN,STATE)
442 425
     #define E3_ENABLE_READ READ(E3_ENABLE_PIN)
@@ -459,17 +442,15 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
459 442
   #define E4_DIR_WRITE(STATE) stepperE4.Step_Clock(STATE)
460 443
   #define E4_DIR_READ (stepperE4.getStatus() & STATUS_DIR)
461 444
 #else
445
+  #if AXIS_IS_TMC(E4)
446
+    extern TMC_CLASS(E4) stepperE4;
447
+  #endif
462 448
   #if AXIS_DRIVER_TYPE(E4, TMC26X)
463 449
     extern TMC26XStepper stepperE4;
464 450
     #define E4_ENABLE_INIT NOOP
465 451
     #define E4_ENABLE_WRITE(STATE) stepperE4.setEnabled(STATE)
466 452
     #define E4_ENABLE_READ stepperE4.isEnabled()
467 453
   #else
468
-    #if AXIS_DRIVER_TYPE(E4, TMC2130)
469
-      extern TMC2130Stepper stepperE4;
470
-    #elif AXIS_DRIVER_TYPE(E4, TMC2208)
471
-      extern TMC2208Stepper stepperE4;
472
-    #endif
473 454
     #define E4_ENABLE_INIT SET_OUTPUT(E4_ENABLE_PIN)
474 455
     #define E4_ENABLE_WRITE(STATE) WRITE(E4_ENABLE_PIN,STATE)
475 456
     #define E4_ENABLE_READ READ(E4_ENABLE_PIN)
@@ -492,17 +473,15 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
492 473
   #define E5_DIR_WRITE(STATE) stepperE5.Step_Clock(STATE)
493 474
   #define E5_DIR_READ (stepperE5.getStatus() & STATUS_DIR)
494 475
 #else
476
+  #if AXIS_IS_TMC(E5)
477
+    extern TMC_CLASS(E5) stepperE5;
478
+  #endif
495 479
   #if AXIS_DRIVER_TYPE(E5, TMC26X)
496 480
     extern TMC26XStepper stepperE5;
497 481
     #define E5_ENABLE_INIT NOOP
498 482
     #define E5_ENABLE_WRITE(STATE) stepperE5.setEnabled(STATE)
499 483
     #define E5_ENABLE_READ stepperE5.isEnabled()
500 484
   #else
501
-    #if AXIS_DRIVER_TYPE(E5, TMC2130)
502
-      extern TMC2130Stepper stepperE5;
503
-    #elif AXIS_DRIVER_TYPE(E5, TMC2208)
504
-      extern TMC2208Stepper stepperE5;
505
-    #endif
506 485
     #define E5_ENABLE_INIT SET_OUTPUT(E5_ENABLE_PIN)
507 486
     #define E5_ENABLE_WRITE(STATE) WRITE(E5_ENABLE_PIN,STATE)
508 487
     #define E5_ENABLE_READ READ(E5_ENABLE_PIN)

+ 4
- 6
platformio.ini Ver arquivo

@@ -31,8 +31,7 @@ build_flags = -fmax-errors=5
31 31
 lib_deps =
32 32
   https://github.com/MarlinFirmware/U8glib-HAL/archive/dev.zip
33 33
   LiquidCrystal@1.3.4
34
-  TMC2130Stepper
35
-  https://github.com/teemuatlut/TMC2208Stepper/archive/v0.2.5.zip
34
+  https://github.com/teemuatlut/TMCStepper.git
36 35
   Adafruit NeoPixel@1.1.3
37 36
   https://github.com/lincomatic/LiquidTWI2/archive/30aa480.zip
38 37
   https://github.com/ameyer/Arduino-L6470/archive/master.zip
@@ -162,7 +161,7 @@ lib_ldf_mode      = off
162 161
 lib_extra_dirs    = frameworks
163 162
 lib_deps          = CMSIS-LPC1768
164 163
   https://github.com/MarlinFirmware/U8glib-HAL/archive/dev.zip
165
-  TMC2130Stepper@>=2.2.1
164
+  https://github.com/teemuatlut/TMCStepper.git
166 165
 extra_scripts     = Marlin/src/HAL/HAL_LPC1768/debug_extra_script.py, Marlin/src/HAL/HAL_LPC1768/lpc1768_flag_script.py, Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py
167 166
 src_filter        = ${common.default_src_filter} +<src/HAL/HAL_LPC1768>
168 167
 monitor_speed     = 250000
@@ -270,7 +269,7 @@ framework     = arduino
270 269
 board         = disco_f407vg
271 270
 build_flags   = ${common.build_flags} -DUSE_STM32GENERIC -DSTM32GENERIC -DMENU_USB_SERIAL -DMENU_SERIAL=SerialUSB
272 271
 lib_deps      = ${common.lib_deps}
273
-lib_ignore    = Adafruit NeoPixel, c1921b4, TMC2130Stepper
272
+lib_ignore    = Adafruit NeoPixel, c1921b4, TMCStepper
274 273
 src_filter    = ${common.default_src_filter} +<src/HAL/HAL_STM32F4>
275 274
 monitor_speed = 250000
276 275
 
@@ -301,11 +300,10 @@ lib_ignore  =
301 300
   NewliquidCrystal
302 301
   LiquidTWI2
303 302
   Adafruit NeoPixel
304
-  TMC2130Stepper
303
+  TMCStepper
305 304
   Servo(STM32F1)
306 305
   TMC26XStepper
307 306
   U8glib-HAL
308
-  TMC2208Stepper
309 307
   c1921b4
310 308
 
311 309
 #

Carregando…
Cancelar
Salvar