Browse Source

Migrate to a new TMC library (#11943)

teemuatlut 6 years ago
parent
commit
c3229e1b34

+ 3
- 0
Marlin/src/Marlin.cpp View File

736
   SERIAL_ECHO_START();
736
   SERIAL_ECHO_START();
737
 
737
 
738
   #if HAS_DRIVER(TMC2130)
738
   #if HAS_DRIVER(TMC2130)
739
+    #if DISABLED(TMC_USE_SW_SPI)
740
+      SPI.begin();
741
+    #endif
739
     tmc_init_cs_pins();
742
     tmc_init_cs_pins();
740
   #endif
743
   #endif
741
   #if HAS_DRIVER(TMC2208)
744
   #if HAS_DRIVER(TMC2208)

+ 3
- 3
Marlin/src/core/drivers.h View File

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

+ 5
- 0
Marlin/src/core/language.h View File

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

+ 92
- 196
Marlin/src/feature/tmc_util.cpp View File

36
   #include "../module/planner.h"
36
   #include "../module/planner.h"
37
 #endif
37
 #endif
38
 
38
 
39
-bool report_tmc_status = false;
40
-
41
 /**
39
 /**
42
  * Check for over temperature or short to ground error flags.
40
  * Check for over temperature or short to ground error flags.
43
  * Report and log warning of overtemperature condition.
41
  * Report and log warning of overtemperature condition.
46
  * and so we don't repeatedly report warning before the condition is cleared.
44
  * and so we don't repeatedly report warning before the condition is cleared.
47
  */
45
  */
48
 #if ENABLED(MONITOR_DRIVER_STATUS)
46
 #if ENABLED(MONITOR_DRIVER_STATUS)
47
+  static bool report_tmc_status = false;
48
+
49
   struct TMC_driver_data {
49
   struct TMC_driver_data {
50
     uint32_t drv_status;
50
     uint32_t drv_status;
51
     bool is_otpw;
51
     bool is_otpw;
95
   #endif
95
   #endif
96
 
96
 
97
   template<typename TMC>
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
     TMC_driver_data data = get_driver_data(st);
99
     TMC_driver_data data = get_driver_data(st);
100
 
100
 
101
     #if ENABLED(STOP_ON_ERROR)
101
     #if ENABLED(STOP_ON_ERROR)
102
       if (data.is_error) {
102
       if (data.is_error) {
103
         SERIAL_EOL();
103
         SERIAL_EOL();
104
-        _tmc_say_axis(axis);
104
+        st.printLabel();
105
         SERIAL_ECHOLNPGM(" driver error detected:");
105
         SERIAL_ECHOLNPGM(" driver error detected:");
106
         if (data.is_ot) SERIAL_ECHOLNPGM("overtemperature");
106
         if (data.is_ot) SERIAL_ECHOLNPGM("overtemperature");
107
         if (st.s2ga()) SERIAL_ECHOLNPGM("short to ground (coil A)");
107
         if (st.s2ga()) SERIAL_ECHOLNPGM("short to ground (coil A)");
114
     #endif
114
     #endif
115
 
115
 
116
     // Report if a warning was triggered
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
       char timestamp[10];
118
       char timestamp[10];
119
       duration_t elapsed = print_job_timer.duration();
119
       duration_t elapsed = print_job_timer.duration();
120
       const bool has_days = (elapsed.value > 60*60*24L);
120
       const bool has_days = (elapsed.value > 60*60*24L);
122
       SERIAL_EOL();
122
       SERIAL_EOL();
123
       SERIAL_ECHO(timestamp);
123
       SERIAL_ECHO(timestamp);
124
       SERIAL_ECHOPGM(": ");
124
       SERIAL_ECHOPGM(": ");
125
-      _tmc_say_axis(axis);
125
+      st.printLabel();
126
       SERIAL_ECHOPGM(" driver overtemperature warning! (");
126
       SERIAL_ECHOPGM(" driver overtemperature warning! (");
127
-      SERIAL_ECHO(st.getCurrent());
127
+      SERIAL_ECHO(st.getMilliamps());
128
       SERIAL_ECHOLNPGM("mA)");
128
       SERIAL_ECHOLNPGM("mA)");
129
     }
129
     }
130
     #if CURRENT_STEP_DOWN > 0
130
     #if CURRENT_STEP_DOWN > 0
131
       // Decrease current if is_otpw is true and driver is enabled and there's been more than 4 warnings
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
         #if ENABLED(REPORT_CURRENT_CHANGE)
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
         #endif
137
         #endif
138
       }
138
       }
139
     #endif
139
     #endif
140
 
140
 
141
     if (data.is_otpw) {
141
     if (data.is_otpw) {
142
-      otpw_cnt++;
142
+      st.otpw_count++;
143
       st.flag_otpw = true;
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
     if (report_tmc_status) {
147
     if (report_tmc_status) {
148
       const uint32_t pwm_scale = get_pwm_scale(st);
148
       const uint32_t pwm_scale = get_pwm_scale(st);
149
-      _tmc_say_axis(axis);
149
+      st.printLabel();
150
       SERIAL_ECHOPAIR(":", pwm_scale);
150
       SERIAL_ECHOPAIR(":", pwm_scale);
151
       SERIAL_ECHOPGM(" |0b"); SERIAL_PRINT(get_status_response(st), BIN);
151
       SERIAL_ECHOPGM(" |0b"); SERIAL_PRINT(get_status_response(st), BIN);
152
       SERIAL_ECHOPGM("| ");
152
       SERIAL_ECHOPGM("| ");
153
       if (data.is_error) SERIAL_CHAR('E');
153
       if (data.is_error) SERIAL_CHAR('E');
154
       else if (data.is_ot) SERIAL_CHAR('O');
154
       else if (data.is_ot) SERIAL_CHAR('O');
155
       else if (data.is_otpw) SERIAL_CHAR('W');
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
       else if (st.flag_otpw) SERIAL_CHAR('F');
157
       else if (st.flag_otpw) SERIAL_CHAR('F');
158
       SERIAL_CHAR('\t');
158
       SERIAL_CHAR('\t');
159
     }
159
     }
166
     if (ELAPSED(millis(), next_cOT)) {
166
     if (ELAPSED(millis(), next_cOT)) {
167
       next_cOT = millis() + 500;
167
       next_cOT = millis() + 500;
168
       #if HAS_HW_COMMS(X)
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
       #endif
170
       #endif
172
       #if HAS_HW_COMMS(Y)
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
       #endif
173
       #endif
176
       #if HAS_HW_COMMS(Z)
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
       #endif
176
       #endif
180
       #if HAS_HW_COMMS(X2)
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
       #endif
179
       #endif
184
       #if HAS_HW_COMMS(Y2)
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
       #endif
182
       #endif
188
       #if HAS_HW_COMMS(Z2)
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
       #endif
185
       #endif
192
       #if HAS_HW_COMMS(Z3)
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
       #endif
188
       #endif
196
       #if HAS_HW_COMMS(E0)
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
       #endif
191
       #endif
200
       #if HAS_HW_COMMS(E1)
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
       #endif
194
       #endif
204
       #if HAS_HW_COMMS(E2)
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
       #endif
197
       #endif
208
       #if HAS_HW_COMMS(E3)
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
       #endif
200
       #endif
212
       #if HAS_HW_COMMS(E4)
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
       #endif
203
       #endif
216
       #if HAS_HW_COMMS(E5)
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
       #endif
206
       #endif
220
 
207
 
221
       if (report_tmc_status) SERIAL_EOL();
208
       if (report_tmc_status) SERIAL_EOL();
224
 
211
 
225
 #endif // MONITOR_DRIVER_STATUS
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
 #if ENABLED(TMC_DEBUG)
214
 #if ENABLED(TMC_DEBUG)
322
 
215
 
323
   enum TMC_debug_enum : char {
216
   enum TMC_debug_enum : char {
366
     TMC_S2VSB,
259
     TMC_S2VSB,
367
     TMC_S2VSA
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
     for (int B = 24; B >= 8; B -= 8){
263
     for (int B = 24; B >= 8; B -= 8){
373
       SERIAL_PRINT((drv_status >> (B + 4)) & 0xF, HEX);
264
       SERIAL_PRINT((drv_status >> (B + 4)) & 0xF, HEX);
374
       SERIAL_PRINT((drv_status >> B) & 0xF, HEX);
265
       SERIAL_PRINT((drv_status >> B) & 0xF, HEX);
379
     SERIAL_EOL();
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
   #if HAS_DRIVER(TMC2130)
276
   #if HAS_DRIVER(TMC2130)
383
     static void tmc_status(TMC2130Stepper &st, const TMC_debug_enum i) {
277
     static void tmc_status(TMC2130Stepper &st, const TMC_debug_enum i) {
384
       switch (i) {
278
       switch (i) {
385
         case TMC_PWM_SCALE: SERIAL_PRINT(st.PWM_SCALE(), DEC); break;
279
         case TMC_PWM_SCALE: SERIAL_PRINT(st.PWM_SCALE(), DEC); break;
386
-        case TMC_TSTEP: SERIAL_ECHO(st.TSTEP()); break;
387
         case TMC_SGT: SERIAL_PRINT(st.sgt(), DEC); break;
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
         default: break;
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
       switch (i) {
286
       switch (i) {
394
         case TMC_STALLGUARD: if (st.stallguard()) SERIAL_CHAR('X'); break;
287
         case TMC_STALLGUARD: if (st.stallguard()) SERIAL_CHAR('X'); break;
395
         case TMC_SG_RESULT:  SERIAL_PRINT(st.sg_result(), DEC);   break;
288
         case TMC_SG_RESULT:  SERIAL_PRINT(st.sg_result(), DEC);   break;
402
   #if HAS_DRIVER(TMC2208)
295
   #if HAS_DRIVER(TMC2208)
403
     static void tmc_status(TMC2208Stepper &st, const TMC_debug_enum i) {
296
     static void tmc_status(TMC2208Stepper &st, const TMC_debug_enum i) {
404
       switch (i) {
297
       switch (i) {
405
-        case TMC_TSTEP: { uint32_t data = 0; st.TSTEP(&data); SERIAL_PROTOCOL(data); break; }
406
         case TMC_PWM_SCALE: SERIAL_PRINT(st.pwm_scale_sum(), DEC); break;
298
         case TMC_PWM_SCALE: SERIAL_PRINT(st.pwm_scale_sum(), DEC); break;
407
         case TMC_STEALTHCHOP: serialprintPGM(st.stealth() ? PSTR("true") : PSTR("false")); break;
299
         case TMC_STEALTHCHOP: serialprintPGM(st.stealth() ? PSTR("true") : PSTR("false")); break;
408
         case TMC_S2VSA: if (st.s2vsa()) SERIAL_CHAR('X'); break;
300
         case TMC_S2VSA: if (st.s2vsa()) SERIAL_CHAR('X'); break;
410
         default: break;
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
       switch (i) {
306
       switch (i) {
415
         case TMC_T157: if (st.t157()) SERIAL_CHAR('X'); break;
307
         case TMC_T157: if (st.t157()) SERIAL_CHAR('X'); break;
416
         case TMC_T150: if (st.t150()) SERIAL_CHAR('X'); break;
308
         case TMC_T150: if (st.t150()) SERIAL_CHAR('X'); break;
422
   #endif
314
   #endif
423
 
315
 
424
   template <typename TMC>
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
     SERIAL_ECHO('\t');
318
     SERIAL_ECHO('\t');
427
     switch (i) {
319
     switch (i) {
428
-      case TMC_CODES: _tmc_say_axis(axis); break;
320
+      case TMC_CODES: st.printLabel(); break;
429
       case TMC_ENABLED: serialprintPGM(st.isEnabled() ? PSTR("true") : PSTR("false")); break;
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
       case TMC_RMS_CURRENT: SERIAL_PROTOCOL(st.rms_current()); break;
323
       case TMC_RMS_CURRENT: SERIAL_PROTOCOL(st.rms_current()); break;
432
       case TMC_MAX_CURRENT: SERIAL_PRINT((float)st.rms_current() * 1.41, 0); break;
324
       case TMC_MAX_CURRENT: SERIAL_PRINT((float)st.rms_current() * 1.41, 0); break;
433
       case TMC_IRUN:
325
       case TMC_IRUN:
442
         SERIAL_PRINT(st.cs_actual(), DEC);
334
         SERIAL_PRINT(st.cs_actual(), DEC);
443
         SERIAL_ECHOPGM("/31");
335
         SERIAL_ECHOPGM("/31");
444
         break;
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
       case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break;
338
       case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break;
339
+      case TMC_TSTEP: SERIAL_ECHO(st.TSTEP()); break;
449
       case TMC_TPWMTHRS: {
340
       case TMC_TPWMTHRS: {
450
           uint32_t tpwmthrs_val = st.TPWMTHRS();
341
           uint32_t tpwmthrs_val = st.TPWMTHRS();
451
           SERIAL_ECHO(tpwmthrs_val);
342
           SERIAL_ECHO(tpwmthrs_val);
470
   }
361
   }
471
 
362
 
472
   template <typename TMC>
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
     SERIAL_CHAR('\t');
365
     SERIAL_CHAR('\t');
475
     switch (i) {
366
     switch (i) {
476
-      case TMC_DRV_CODES:     _tmc_say_axis(axis);  break;
367
+      case TMC_DRV_CODES:     st.printLabel();  break;
477
       case TMC_STST:          if (st.stst())         SERIAL_CHAR('X'); break;
368
       case TMC_STST:          if (st.stst())         SERIAL_CHAR('X'); break;
478
       case TMC_OLB:           if (st.olb())          SERIAL_CHAR('X'); break;
369
       case TMC_OLB:           if (st.olb())          SERIAL_CHAR('X'); break;
479
       case TMC_OLA:           if (st.ola())          SERIAL_CHAR('X'); break;
370
       case TMC_OLA:           if (st.ola())          SERIAL_CHAR('X'); break;
482
       case TMC_DRV_OTPW:      if (st.otpw())         SERIAL_CHAR('X'); break;
373
       case TMC_DRV_OTPW:      if (st.otpw())         SERIAL_CHAR('X'); break;
483
       case TMC_OT:            if (st.ot())           SERIAL_CHAR('X'); break;
374
       case TMC_OT:            if (st.ot())           SERIAL_CHAR('X'); break;
484
       case TMC_DRV_CS_ACTUAL: SERIAL_PRINT(st.cs_actual(), DEC);       break;
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
   static void tmc_debug_loop(const TMC_debug_enum i) {
385
   static void tmc_debug_loop(const TMC_debug_enum i) {
491
     #if AXIS_IS_TMC(X)
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
     #endif
388
     #endif
494
     #if AXIS_IS_TMC(X2)
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
     #endif
391
     #endif
497
 
392
 
498
     #if AXIS_IS_TMC(Y)
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
     #endif
395
     #endif
501
     #if AXIS_IS_TMC(Y2)
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
     #endif
398
     #endif
504
 
399
 
505
     #if AXIS_IS_TMC(Z)
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
     #endif
402
     #endif
508
     #if AXIS_IS_TMC(Z2)
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
     #endif
405
     #endif
511
     #if AXIS_IS_TMC(Z3)
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
     #endif
408
     #endif
514
 
409
 
515
     #if AXIS_IS_TMC(E0)
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
     #endif
412
     #endif
518
     #if AXIS_IS_TMC(E1)
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
         #if ENABLED(DISTINCT_E_FACTORS)
415
         #if ENABLED(DISTINCT_E_FACTORS)
521
           + 1
416
           + 1
522
         #endif
417
         #endif
523
       ]);
418
       ]);
524
     #endif
419
     #endif
525
     #if AXIS_IS_TMC(E2)
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
         #if ENABLED(DISTINCT_E_FACTORS)
422
         #if ENABLED(DISTINCT_E_FACTORS)
528
           + 2
423
           + 2
529
         #endif
424
         #endif
530
       ]);
425
       ]);
531
     #endif
426
     #endif
532
     #if AXIS_IS_TMC(E3)
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
         #if ENABLED(DISTINCT_E_FACTORS)
429
         #if ENABLED(DISTINCT_E_FACTORS)
535
           + 3
430
           + 3
536
         #endif
431
         #endif
537
       ]);
432
       ]);
538
     #endif
433
     #endif
539
     #if AXIS_IS_TMC(E4)
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
         #if ENABLED(DISTINCT_E_FACTORS)
436
         #if ENABLED(DISTINCT_E_FACTORS)
542
           + 4
437
           + 4
543
         #endif
438
         #endif
544
       ]);
439
       ]);
545
     #endif
440
     #endif
546
     #if AXIS_IS_TMC(E5)
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
         #if ENABLED(DISTINCT_E_FACTORS)
443
         #if ENABLED(DISTINCT_E_FACTORS)
549
           + 5
444
           + 5
550
         #endif
445
         #endif
556
 
451
 
557
   static void drv_status_loop(const TMC_drv_status_enum i) {
452
   static void drv_status_loop(const TMC_drv_status_enum i) {
558
     #if AXIS_IS_TMC(X)
453
     #if AXIS_IS_TMC(X)
559
-      tmc_parse_drv_status(stepperX, TMC_X, i);
454
+      tmc_parse_drv_status(stepperX, i);
560
     #endif
455
     #endif
561
     #if AXIS_IS_TMC(X2)
456
     #if AXIS_IS_TMC(X2)
562
-      tmc_parse_drv_status(stepperX2, TMC_X2, i);
457
+      tmc_parse_drv_status(stepperX2, i);
563
     #endif
458
     #endif
564
 
459
 
565
     #if AXIS_IS_TMC(Y)
460
     #if AXIS_IS_TMC(Y)
566
-      tmc_parse_drv_status(stepperY, TMC_Y, i);
461
+      tmc_parse_drv_status(stepperY, i);
567
     #endif
462
     #endif
568
     #if AXIS_IS_TMC(Y2)
463
     #if AXIS_IS_TMC(Y2)
569
-      tmc_parse_drv_status(stepperY2, TMC_Y2, i);
464
+      tmc_parse_drv_status(stepperY2, i);
570
     #endif
465
     #endif
571
 
466
 
572
     #if AXIS_IS_TMC(Z)
467
     #if AXIS_IS_TMC(Z)
573
-      tmc_parse_drv_status(stepperZ, TMC_Z, i);
468
+      tmc_parse_drv_status(stepperZ, i);
574
     #endif
469
     #endif
575
     #if AXIS_IS_TMC(Z2)
470
     #if AXIS_IS_TMC(Z2)
576
-      tmc_parse_drv_status(stepperZ2, TMC_Z2, i);
471
+      tmc_parse_drv_status(stepperZ2, i);
577
     #endif
472
     #endif
578
     #if AXIS_IS_TMC(Z3)
473
     #if AXIS_IS_TMC(Z3)
579
-      tmc_parse_drv_status(stepperZ3, TMC_Z3, i);
474
+      tmc_parse_drv_status(stepperZ3, i);
580
     #endif
475
     #endif
581
 
476
 
582
     #if AXIS_IS_TMC(E0)
477
     #if AXIS_IS_TMC(E0)
583
-      tmc_parse_drv_status(stepperE0, TMC_E0, i);
478
+      tmc_parse_drv_status(stepperE0, i);
584
     #endif
479
     #endif
585
     #if AXIS_IS_TMC(E1)
480
     #if AXIS_IS_TMC(E1)
586
-      tmc_parse_drv_status(stepperE1, TMC_E1, i);
481
+      tmc_parse_drv_status(stepperE1, i);
587
     #endif
482
     #endif
588
     #if AXIS_IS_TMC(E2)
483
     #if AXIS_IS_TMC(E2)
589
-      tmc_parse_drv_status(stepperE2, TMC_E2, i);
484
+      tmc_parse_drv_status(stepperE2, i);
590
     #endif
485
     #endif
591
     #if AXIS_IS_TMC(E3)
486
     #if AXIS_IS_TMC(E3)
592
-      tmc_parse_drv_status(stepperE3, TMC_E3, i);
487
+      tmc_parse_drv_status(stepperE3, i);
593
     #endif
488
     #endif
594
     #if AXIS_IS_TMC(E4)
489
     #if AXIS_IS_TMC(E4)
595
-      tmc_parse_drv_status(stepperE4, TMC_E4, i);
490
+      tmc_parse_drv_status(stepperE4, i);
596
     #endif
491
     #endif
597
     #if AXIS_IS_TMC(E5)
492
     #if AXIS_IS_TMC(E5)
598
-      tmc_parse_drv_status(stepperE5, TMC_E5, i);
493
+      tmc_parse_drv_status(stepperE5, i);
599
     #endif
494
     #endif
600
 
495
 
601
     SERIAL_EOL();
496
     SERIAL_EOL();
620
     TMC_REPORT("Run current",        TMC_IRUN);
515
     TMC_REPORT("Run current",        TMC_IRUN);
621
     TMC_REPORT("Hold current",       TMC_IHOLD);
516
     TMC_REPORT("Hold current",       TMC_IHOLD);
622
     TMC_REPORT("CS actual\t",        TMC_CS_ACTUAL);
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
     TMC_REPORT("vsense\t",           TMC_VSENSE);
519
     TMC_REPORT("vsense\t",           TMC_VSENSE);
625
     TMC_REPORT("stealthChop",        TMC_STEALTHCHOP);
520
     TMC_REPORT("stealthChop",        TMC_STEALTHCHOP);
626
     TMC_REPORT("msteps\t",           TMC_MICROSTEPS);
521
     TMC_REPORT("msteps\t",           TMC_MICROSTEPS);
657
       DRV_REPORT("s2vsa\t",          TMC_S2VSA);
552
       DRV_REPORT("s2vsa\t",          TMC_S2VSA);
658
       DRV_REPORT("s2vsb\t",          TMC_S2VSB);
553
       DRV_REPORT("s2vsb\t",          TMC_S2VSB);
659
     #endif
554
     #endif
660
-    DRV_REPORT("Driver registers:",  TMC_DRV_STATUS_HEX);
555
+    DRV_REPORT("Driver registers:\n",TMC_DRV_STATUS_HEX);
661
     SERIAL_EOL();
556
     SERIAL_EOL();
662
   }
557
   }
663
 
558
 
666
 #if USE_SENSORLESS
561
 #if USE_SENSORLESS
667
 
562
 
668
   void tmc_stallguard(TMC2130Stepper &st, const bool enable/*=true*/) {
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
     #if ENABLED(STEALTHCHOP)
565
     #if ENABLED(STEALTHCHOP)
671
-      st.stealthChop(!enable);
566
+      st.en_pwm_mode(!enable);
672
     #endif
567
     #endif
673
     st.diag1_stall(enable ? 1 : 0);
568
     st.diag1_stall(enable ? 1 : 0);
674
   }
569
   }
676
 #endif // USE_SENSORLESS
571
 #endif // USE_SENSORLESS
677
 
572
 
678
 #if HAS_DRIVER(TMC2130)
573
 #if HAS_DRIVER(TMC2130)
574
+  #define IS_TMC_SPI(ST) AXIS_DRIVER_TYPE(ST, TMC2130)
679
   #define SET_CS_PIN(st) OUT_WRITE(st##_CS_PIN, HIGH)
575
   #define SET_CS_PIN(st) OUT_WRITE(st##_CS_PIN, HIGH)
680
   void tmc_init_cs_pins() {
576
   void tmc_init_cs_pins() {
681
-    #if AXIS_DRIVER_TYPE(X, TMC2130)
577
+    #if IS_TMC_SPI(X)
682
       SET_CS_PIN(X);
578
       SET_CS_PIN(X);
683
     #endif
579
     #endif
684
-    #if AXIS_DRIVER_TYPE(Y, TMC2130)
580
+    #if IS_TMC_SPI(Y)
685
       SET_CS_PIN(Y);
581
       SET_CS_PIN(Y);
686
     #endif
582
     #endif
687
-    #if AXIS_DRIVER_TYPE(Z, TMC2130)
583
+    #if IS_TMC_SPI(Z)
688
       SET_CS_PIN(Z);
584
       SET_CS_PIN(Z);
689
     #endif
585
     #endif
690
-    #if AXIS_DRIVER_TYPE(X2, TMC2130)
586
+    #if IS_TMC_SPI(X2)
691
       SET_CS_PIN(X2);
587
       SET_CS_PIN(X2);
692
     #endif
588
     #endif
693
-    #if AXIS_DRIVER_TYPE(Y2, TMC2130)
589
+    #if IS_TMC_SPI(Y2)
694
       SET_CS_PIN(Y2);
590
       SET_CS_PIN(Y2);
695
     #endif
591
     #endif
696
-    #if AXIS_DRIVER_TYPE(Z2, TMC2130)
592
+    #if IS_TMC_SPI(Z2)
697
       SET_CS_PIN(Z2);
593
       SET_CS_PIN(Z2);
698
     #endif
594
     #endif
699
-    #if AXIS_DRIVER_TYPE(Z3, TMC2130)
595
+    #if IS_TMC_SPI(Z3)
700
       SET_CS_PIN(Z3);
596
       SET_CS_PIN(Z3);
701
     #endif
597
     #endif
702
-    #if AXIS_DRIVER_TYPE(E0, TMC2130)
598
+    #if IS_TMC_SPI(E0)
703
       SET_CS_PIN(E0);
599
       SET_CS_PIN(E0);
704
     #endif
600
     #endif
705
-    #if AXIS_DRIVER_TYPE(E1, TMC2130)
601
+    #if IS_TMC_SPI(E1)
706
       SET_CS_PIN(E1);
602
       SET_CS_PIN(E1);
707
     #endif
603
     #endif
708
-    #if AXIS_DRIVER_TYPE(E2, TMC2130)
604
+    #if IS_TMC_SPI(E2)
709
       SET_CS_PIN(E2);
605
       SET_CS_PIN(E2);
710
     #endif
606
     #endif
711
-    #if AXIS_DRIVER_TYPE(E3, TMC2130)
607
+    #if IS_TMC_SPI(E3)
712
       SET_CS_PIN(E3);
608
       SET_CS_PIN(E3);
713
     #endif
609
     #endif
714
-    #if AXIS_DRIVER_TYPE(E4, TMC2130)
610
+    #if IS_TMC_SPI(E4)
715
       SET_CS_PIN(E4);
611
       SET_CS_PIN(E4);
716
     #endif
612
     #endif
717
-    #if AXIS_DRIVER_TYPE(E5, TMC2130)
613
+    #if IS_TMC_SPI(E5)
718
       SET_CS_PIN(E5);
614
       SET_CS_PIN(E5);
719
     #endif
615
     #endif
720
   }
616
   }

+ 105
- 64
Marlin/src/feature/tmc_util.h View File

23
 #ifndef _TMC_UTIL_H_
23
 #ifndef _TMC_UTIL_H_
24
 #define _TMC_UTIL_H_
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
 #endif
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
 constexpr uint32_t _tmc_thrs(const uint16_t msteps, const int32_t thrs, const uint32_t spmm) {
110
 constexpr uint32_t _tmc_thrs(const uint16_t msteps, const int32_t thrs, const uint32_t spmm) {
73
   return 12650000UL * msteps / (256 * thrs * spmm);
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
 template<typename TMC>
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
 template<typename TMC>
119
 template<typename TMC>
88
 void tmc_set_current(TMC &st, const int mA) {
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
 template<typename TMC>
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
 template<typename TMC>
143
 template<typename TMC>
105
 void tmc_set_pwmthrs(TMC &st, const int32_t thrs, const uint32_t spmm) {
144
 void tmc_set_pwmthrs(TMC &st, const int32_t thrs, const uint32_t spmm) {
106
   st.TPWMTHRS(_tmc_thrs(st.microsteps(), thrs, spmm));
145
   st.TPWMTHRS(_tmc_thrs(st.microsteps(), thrs, spmm));
107
 }
146
 }
108
 template<typename TMC>
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
 template<typename TMC>
153
 template<typename TMC>
113
 void tmc_set_sgt(TMC &st, const int8_t sgt_val) {
154
 void tmc_set_sgt(TMC &st, const int8_t sgt_val) {

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

33
  * Report driver currents when no axis specified
33
  * Report driver currents when no axis specified
34
  */
34
  */
35
 void GcodeSuite::M906() {
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
   #define TMC_SET_CURRENT(Q) tmc_set_current(stepper##Q, value)
37
   #define TMC_SET_CURRENT(Q) tmc_set_current(stepper##Q, value)
38
 
38
 
39
   bool report = true;
39
   bool report = true;

+ 126
- 124
Marlin/src/gcode/feature/trinamic/M911-M915.cpp View File

33
 #define M91x_USE(ST) (AXIS_DRIVER_TYPE(ST, TMC2130) || (AXIS_DRIVER_TYPE(ST, TMC2208) && PIN_EXISTS(ST##_SERIAL_RX)))
33
 #define M91x_USE(ST) (AXIS_DRIVER_TYPE(ST, TMC2130) || (AXIS_DRIVER_TYPE(ST, TMC2208) && PIN_EXISTS(ST##_SERIAL_RX)))
34
 #define M91x_USE_E(N) (E_STEPPERS > N && M91x_USE(E##N))
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
       #endif
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
       #endif
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
       #endif
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
       #endif
155
       #endif
154
-    #endif
155
-}
156
+  }
157
+#endif
156
 
158
 
157
 /**
159
 /**
158
  * M913: Set HYBRID_THRESHOLD speed.
160
  * M913: Set HYBRID_THRESHOLD speed.
159
  */
161
  */
160
 #if ENABLED(HYBRID_THRESHOLD)
162
 #if ENABLED(HYBRID_THRESHOLD)
161
   void GcodeSuite::M913() {
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
     #define TMC_SET_PWMTHRS(A,Q) tmc_set_pwmthrs(stepper##Q, value, planner.axis_steps_per_mm[_AXIS(A)])
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
     #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)
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
     bool report = true;
169
     bool report = true;
271
  */
273
  */
272
 #if USE_SENSORLESS
274
 #if USE_SENSORLESS
273
   void GcodeSuite::M914() {
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
     #define TMC_SET_SGT(Q) tmc_set_sgt(stepper##Q, value)
277
     #define TMC_SET_SGT(Q) tmc_set_sgt(stepper##Q, value)
276
 
278
 
277
     bool report = true;
279
     bool report = true;
362
     }
364
     }
363
 
365
 
364
     #if AXIS_IS_TMC(Z)
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
     #endif
369
     #endif
368
     #if AXIS_IS_TMC(Z2)
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
     #endif
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
     #endif
377
     #endif
376
 
378
 
377
     SERIAL_ECHOPAIR("\nCalibration current: Z", _rms);
379
     SERIAL_ECHOPAIR("\nCalibration current: Z", _rms);
381
     do_blocking_move_to_z(Z_MAX_POS+_z);
383
     do_blocking_move_to_z(Z_MAX_POS+_z);
382
 
384
 
383
     #if AXIS_IS_TMC(Z)
385
     #if AXIS_IS_TMC(Z)
384
-      stepperZ.setCurrent(Z_current_1, R_SENSE, HOLD_MULTIPLIER);
386
+      stepperZ.rms_current(Z_current_1);
385
     #endif
387
     #endif
386
     #if AXIS_IS_TMC(Z2)
388
     #if AXIS_IS_TMC(Z2)
387
-      stepperZ2.setCurrent(Z2_current_1, R_SENSE, HOLD_MULTIPLIER);
389
+      stepperZ2.rms_current(Z2_current_1);
388
     #endif
390
     #endif
389
     #if AXIS_IS_TMC(Z3)
391
     #if AXIS_IS_TMC(Z3)
390
-      stepperZ3.setCurrent(Z3_current_1, R_SENSE, HOLD_MULTIPLIER);
392
+      stepperZ3.rms_current(Z3_current_1);
391
     #endif
393
     #endif
392
 
394
 
393
     do_blocking_move_to_z(Z_MAX_POS);
395
     do_blocking_move_to_z(Z_MAX_POS);

+ 4
- 2
Marlin/src/gcode/gcode.cpp View File

632
           case 122: M122(); break;
632
           case 122: M122(); break;
633
         #endif
633
         #endif
634
         case 906: M906(); break;                                  // M906: Set motor current in milliamps using axis codes X, Y, Z, E
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
         #if ENABLED(HYBRID_THRESHOLD)
639
         #if ENABLED(HYBRID_THRESHOLD)
638
           case 913: M913(); break;                                // M913: Set HYBRID_THRESHOLD speed.
640
           case 913: M913(); break;                                // M913: Set HYBRID_THRESHOLD speed.
639
         #endif
641
         #endif

+ 4
- 2
Marlin/src/gcode/gcode.h View File

775
       static void M122();
775
       static void M122();
776
     #endif
776
     #endif
777
     static void M906();
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
     #if ENABLED(HYBRID_THRESHOLD)
782
     #if ENABLED(HYBRID_THRESHOLD)
781
       static void M913();
783
       static void M913();
782
     #endif
784
     #endif

+ 6
- 3
Marlin/src/inc/Conditionals_post.h View File

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

+ 192
- 258
Marlin/src/module/configuration_store.cpp View File

83
   #include "../feature/tmc_util.h"
83
   #include "../feature/tmc_util.h"
84
   #define TMC_GET_PWMTHRS(A,Q) _tmc_thrs(stepper##Q.microsteps(), stepper##Q.TPWMTHRS(), planner.axis_steps_per_mm[_AXIS(A)])
84
   #define TMC_GET_PWMTHRS(A,Q) _tmc_thrs(stepper##Q.microsteps(), stepper##Q.TPWMTHRS(), planner.axis_steps_per_mm[_AXIS(A)])
85
 #endif
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
 #if ENABLED(FWRETRACT)
90
 #if ENABLED(FWRETRACT)
88
   #include "../feature/fwretract.h"
91
   #include "../feature/fwretract.h"
98
 
101
 
99
 #pragma pack(push, 1) // No padding between variables
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
 typedef struct PIDC { float Kp, Ki, Kd, Kc; } PIDC;
105
 typedef struct PIDC { float Kp, Ki, Kd, Kc; } PIDC;
103
 
106
 
104
 /**
107
 /**
251
   // HAS_TRINAMIC
254
   // HAS_TRINAMIC
252
   //
255
   //
253
   #define TMC_AXES (MAX_EXTRUDERS + 7)
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
   // LIN_ADVANCE
262
   // LIN_ADVANCE
300
 #endif
303
 #endif
301
 
304
 
302
 void MarlinSettings::postprocess() {
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
   // steps per s2 needs to be updated to agree with units per s2
308
   // steps per s2 needs to be updated to agree with units per s2
306
   planner.reset_acceleration_rates();
309
   planner.reset_acceleration_rates();
436
         EEPROM_WRITE(dummy);
439
         EEPROM_WRITE(dummy);
437
       #endif
440
       #endif
438
     #else
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
       EEPROM_WRITE(planner_max_jerk);
443
       EEPROM_WRITE(planner_max_jerk);
441
     #endif
444
     #endif
442
 
445
 
464
     // Global Leveling
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
     EEPROM_WRITE(zfh);
477
     EEPROM_WRITE(zfh);
473
 
478
 
474
     //
479
     //
478
     #if ENABLED(MESH_BED_LEVELING)
483
     #if ENABLED(MESH_BED_LEVELING)
479
       // Compile time test that sizeof(mbl.z_values) is as expected
484
       // Compile time test that sizeof(mbl.z_values) is as expected
480
       static_assert(
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
         "MBL Z array is the wrong size."
487
         "MBL Z array is the wrong size."
483
       );
488
       );
484
       const uint8_t mesh_num_x = GRID_MAX_POINTS_X, mesh_num_y = GRID_MAX_POINTS_Y;
489
       const uint8_t mesh_num_x = GRID_MAX_POINTS_X, mesh_num_y = GRID_MAX_POINTS_Y;
520
     #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
525
     #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
521
       // Compile time test that sizeof(z_values) is as expected
526
       // Compile time test that sizeof(z_values) is as expected
522
       static_assert(
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
         "Bilinear Z array is the wrong size."
529
         "Bilinear Z array is the wrong size."
525
       );
530
       );
526
       const uint8_t grid_max_x = GRID_MAX_POINTS_X, grid_max_y = GRID_MAX_POINTS_Y;
531
       const uint8_t grid_max_x = GRID_MAX_POINTS_X, grid_max_y = GRID_MAX_POINTS_Y;
719
     #endif
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
     _FIELD_TEST(tmc_stepper_current);
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
         #endif
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
           #endif
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
             #endif
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
               #endif
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
                 #endif
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
                   #endif
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
     EEPROM_WRITE(tmc_stepper_current);
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
     _FIELD_TEST(tmc_hybrid_threshold);
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
         #endif
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
           #endif
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
             #endif
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
               #endif
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
                 #endif
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
                   #endif
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
     EEPROM_WRITE(tmc_hybrid_threshold);
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
       #endif
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
     EEPROM_WRITE(tmc_sgt);
875
     EEPROM_WRITE(tmc_sgt);
947
 
876
 
948
     //
877
     //
1423
       if (!validating) reset_stepper_drivers();
1352
       if (!validating) reset_stepper_drivers();
1424
 
1353
 
1425
       //
1354
       //
1426
-      // TMC2130 Stepper Settings
1355
+      // TMC Stepper Settings
1427
       //
1356
       //
1428
 
1357
 
1429
       _FIELD_TEST(tmc_stepper_current);
1358
       _FIELD_TEST(tmc_stepper_current);
1430
 
1359
 
1431
       #if HAS_TRINAMIC
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
         EEPROM_READ(currents);
1364
         EEPROM_READ(currents);
1436
         if (!validating) {
1365
         if (!validating) {
1437
           #if AXIS_IS_TMC(X)
1366
           #if AXIS_IS_TMC(X)
1480
       #endif
1409
       #endif
1481
 
1410
 
1482
       #if ENABLED(HYBRID_THRESHOLD)
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
         EEPROM_READ(tmc_hybrid_threshold);
1414
         EEPROM_READ(tmc_hybrid_threshold);
1486
         if (!validating) {
1415
         if (!validating) {
1487
           #if AXIS_HAS_STEALTHCHOP(X)
1416
           #if AXIS_HAS_STEALTHCHOP(X)
1530
       #endif
1459
       #endif
1531
 
1460
 
1532
       /*
1461
       /*
1533
-       * TMC2130 StallGuard threshold.
1462
+       * TMC StallGuard threshold.
1534
        * X and X2 use the same value
1463
        * X and X2 use the same value
1535
        * Y and Y2 use the same value
1464
        * Y and Y2 use the same value
1536
        * Z, Z2 and Z3 use the same value
1465
        * Z, Z2 and Z3 use the same value
1537
        */
1466
        */
1538
-      int16_t tmc_sgt[XYZ];
1467
+      tmc_sgt_t tmc_sgt;
1539
       EEPROM_READ(tmc_sgt);
1468
       EEPROM_READ(tmc_sgt);
1540
       #if USE_SENSORLESS
1469
       #if USE_SENSORLESS
1541
         if (!validating) {
1470
         if (!validating) {
1542
           #ifdef X_STALL_SENSITIVITY
1471
           #ifdef X_STALL_SENSITIVITY
1543
             #if AXIS_HAS_STALLGUARD(X)
1472
             #if AXIS_HAS_STALLGUARD(X)
1544
-              stepperX.sgt(tmc_sgt[0]);
1473
+              stepperX.sgt(tmc_sgt.X);
1545
             #endif
1474
             #endif
1546
             #if AXIS_HAS_STALLGUARD(X2)
1475
             #if AXIS_HAS_STALLGUARD(X2)
1547
-              stepperX2.sgt(tmc_sgt[0]);
1476
+              stepperX2.sgt(tmc_sgt.X);
1548
             #endif
1477
             #endif
1549
           #endif
1478
           #endif
1550
           #ifdef Y_STALL_SENSITIVITY
1479
           #ifdef Y_STALL_SENSITIVITY
1551
             #if AXIS_HAS_STALLGUARD(Y)
1480
             #if AXIS_HAS_STALLGUARD(Y)
1552
-              stepperY.sgt(tmc_sgt[1]);
1481
+              stepperY.sgt(tmc_sgt.Y);
1553
             #endif
1482
             #endif
1554
             #if AXIS_HAS_STALLGUARD(Y2)
1483
             #if AXIS_HAS_STALLGUARD(Y2)
1555
-              stepperY2.sgt(tmc_sgt[1]);
1484
+              stepperY2.sgt(tmc_sgt.Y);
1556
             #endif
1485
             #endif
1557
           #endif
1486
           #endif
1558
           #ifdef Z_STALL_SENSITIVITY
1487
           #ifdef Z_STALL_SENSITIVITY
1559
             #if AXIS_HAS_STALLGUARD(Z)
1488
             #if AXIS_HAS_STALLGUARD(Z)
1560
-              stepperZ.sgt(tmc_sgt[2]);
1489
+              stepperZ.sgt(tmc_sgt.Z);
1561
             #endif
1490
             #endif
1562
             #if AXIS_HAS_STALLGUARD(Z2)
1491
             #if AXIS_HAS_STALLGUARD(Z2)
1563
-              stepperZ2.sgt(tmc_sgt[2]);
1492
+              stepperZ2.sgt(tmc_sgt.Z);
1564
             #endif
1493
             #endif
1565
             #if AXIS_HAS_STALLGUARD(Z3)
1494
             #if AXIS_HAS_STALLGUARD(Z3)
1566
-              stepperZ3.sgt(tmc_sgt[2]);
1495
+              stepperZ3.sgt(tmc_sgt.Z);
1567
             #endif
1496
             #endif
1568
           #endif
1497
           #endif
1569
         }
1498
         }
1957
   #endif // HAS_SERVOS && EDITABLE_SERVO_ANGLES
1886
   #endif // HAS_SERVOS && EDITABLE_SERVO_ANGLES
1958
 
1887
 
1959
   #if ENABLED(DELTA)
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
     delta_height = DELTA_HEIGHT;
1890
     delta_height = DELTA_HEIGHT;
1963
     COPY(delta_endstop_adj, adj);
1891
     COPY(delta_endstop_adj, adj);
1964
     delta_radius = DELTA_RADIUS;
1892
     delta_radius = DELTA_RADIUS;
2683
     #if HAS_TRINAMIC
2611
     #if HAS_TRINAMIC
2684
 
2612
 
2685
       /**
2613
       /**
2686
-       * TMC2130 / TMC2208 stepper driver current
2614
+       * TMC stepper driver current
2687
        */
2615
        */
2688
       if (!forReplay) {
2616
       if (!forReplay) {
2689
         CONFIG_ECHO_START;
2617
         CONFIG_ECHO_START;
2694
         say_M906(PORTVAR_SOLO);
2622
         say_M906(PORTVAR_SOLO);
2695
       #endif
2623
       #endif
2696
       #if AXIS_IS_TMC(X)
2624
       #if AXIS_IS_TMC(X)
2697
-        SERIAL_ECHOPAIR_P(port, " X", stepperX.getCurrent());
2625
+        SERIAL_ECHOPAIR_P(port, " X", stepperX.getMilliamps());
2698
       #endif
2626
       #endif
2699
       #if AXIS_IS_TMC(Y)
2627
       #if AXIS_IS_TMC(Y)
2700
-        SERIAL_ECHOPAIR_P(port, " Y", stepperY.getCurrent());
2628
+        SERIAL_ECHOPAIR_P(port, " Y", stepperY.getMilliamps());
2701
       #endif
2629
       #endif
2702
       #if AXIS_IS_TMC(Z)
2630
       #if AXIS_IS_TMC(Z)
2703
-        SERIAL_ECHOPAIR_P(port, " Z", stepperZ.getCurrent());
2631
+        SERIAL_ECHOPAIR_P(port, " Z", stepperZ.getMilliamps());
2704
       #endif
2632
       #endif
2705
       #if AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z)
2633
       #if AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z)
2706
         SERIAL_EOL_P(port);
2634
         SERIAL_EOL_P(port);
2707
       #endif
2635
       #endif
2636
+
2708
       #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2)
2637
       #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2)
2709
         say_M906(PORTVAR_SOLO);
2638
         say_M906(PORTVAR_SOLO);
2710
         SERIAL_ECHOPGM_P(port, " I1");
2639
         SERIAL_ECHOPGM_P(port, " I1");
2711
       #endif
2640
       #endif
2712
       #if AXIS_IS_TMC(X2)
2641
       #if AXIS_IS_TMC(X2)
2713
-        SERIAL_ECHOPAIR_P(port, " X", stepperX2.getCurrent());
2642
+        SERIAL_ECHOPAIR_P(port, " X", stepperX2.getMilliamps());
2714
       #endif
2643
       #endif
2715
       #if AXIS_IS_TMC(Y2)
2644
       #if AXIS_IS_TMC(Y2)
2716
-        SERIAL_ECHOPAIR_P(port, " Y", stepperY2.getCurrent());
2645
+        SERIAL_ECHOPAIR_P(port, " Y", stepperY2.getMilliamps());
2717
       #endif
2646
       #endif
2718
       #if AXIS_IS_TMC(Z2)
2647
       #if AXIS_IS_TMC(Z2)
2719
-        SERIAL_ECHOPAIR_P(port, " Z", stepperZ2.getCurrent());
2648
+        SERIAL_ECHOPAIR_P(port, " Z", stepperZ2.getMilliamps());
2720
       #endif
2649
       #endif
2721
       #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2)
2650
       #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2)
2722
         SERIAL_EOL_P(port);
2651
         SERIAL_EOL_P(port);
2723
       #endif
2652
       #endif
2653
+
2724
       #if AXIS_IS_TMC(Z3)
2654
       #if AXIS_IS_TMC(Z3)
2725
         say_M906(PORTVAR_SOLO);
2655
         say_M906(PORTVAR_SOLO);
2726
-        SERIAL_ECHOLNPAIR_P(port, " I2 Z", stepperZ3.getCurrent());
2656
+        SERIAL_ECHOLNPAIR_P(port, " I2 Z", stepperZ3.getMilliamps());
2727
       #endif
2657
       #endif
2658
+
2728
       #if AXIS_IS_TMC(E0)
2659
       #if AXIS_IS_TMC(E0)
2729
         say_M906(PORTVAR_SOLO);
2660
         say_M906(PORTVAR_SOLO);
2730
-        SERIAL_ECHOLNPAIR_P(port, " T0 E", stepperE0.getCurrent());
2661
+        SERIAL_ECHOLNPAIR_P(port, " T0 E", stepperE0.getMilliamps());
2731
       #endif
2662
       #endif
2732
       #if AXIS_IS_TMC(E1)
2663
       #if AXIS_IS_TMC(E1)
2733
         say_M906(PORTVAR_SOLO);
2664
         say_M906(PORTVAR_SOLO);
2734
-        SERIAL_ECHOLNPAIR_P(port, " T1 E", stepperE1.getCurrent());
2665
+        SERIAL_ECHOLNPAIR_P(port, " T1 E", stepperE1.getMilliamps());
2735
       #endif
2666
       #endif
2736
       #if AXIS_IS_TMC(E2)
2667
       #if AXIS_IS_TMC(E2)
2737
         say_M906(PORTVAR_SOLO);
2668
         say_M906(PORTVAR_SOLO);
2738
-        SERIAL_ECHOLNPAIR_P(port, " T2 E", stepperE2.getCurrent());
2669
+        SERIAL_ECHOLNPAIR_P(port, " T2 E", stepperE2.getMilliamps());
2739
       #endif
2670
       #endif
2740
       #if AXIS_IS_TMC(E3)
2671
       #if AXIS_IS_TMC(E3)
2741
         say_M906(PORTVAR_SOLO);
2672
         say_M906(PORTVAR_SOLO);
2742
-        SERIAL_ECHOLNPAIR_P(port, " T3 E", stepperE3.getCurrent());
2673
+        SERIAL_ECHOLNPAIR_P(port, " T3 E", stepperE3.getMilliamps());
2743
       #endif
2674
       #endif
2744
       #if AXIS_IS_TMC(E4)
2675
       #if AXIS_IS_TMC(E4)
2745
         say_M906(PORTVAR_SOLO);
2676
         say_M906(PORTVAR_SOLO);
2746
-        SERIAL_ECHOLNPAIR_P(port, " T4 E", stepperE4.getCurrent());
2677
+        SERIAL_ECHOLNPAIR_P(port, " T4 E", stepperE4.getMilliamps());
2747
       #endif
2678
       #endif
2748
       #if AXIS_IS_TMC(E5)
2679
       #if AXIS_IS_TMC(E5)
2749
         say_M906(PORTVAR_SOLO);
2680
         say_M906(PORTVAR_SOLO);
2750
-        SERIAL_ECHOLNPAIR_P(port, " T5 E", stepperE5.getCurrent());
2681
+        SERIAL_ECHOLNPAIR_P(port, " T5 E", stepperE5.getMilliamps());
2751
       #endif
2682
       #endif
2752
       SERIAL_EOL_P(port);
2683
       SERIAL_EOL_P(port);
2753
 
2684
 
2754
       /**
2685
       /**
2755
-       * TMC2130 / TMC2208 / TRAMS Hybrid Threshold
2686
+       * TMC Hybrid Threshold
2756
        */
2687
        */
2757
       #if ENABLED(HYBRID_THRESHOLD)
2688
       #if ENABLED(HYBRID_THRESHOLD)
2758
         if (!forReplay) {
2689
         if (!forReplay) {
2760
           SERIAL_ECHOLNPGM_P(port, "Hybrid Threshold:");
2691
           SERIAL_ECHOLNPGM_P(port, "Hybrid Threshold:");
2761
         }
2692
         }
2762
         CONFIG_ECHO_START;
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
           say_M913(PORTVAR_SOLO);
2695
           say_M913(PORTVAR_SOLO);
2765
         #endif
2696
         #endif
2766
-        #if AXIS_IS_TMC(X)
2697
+        #if AXIS_HAS_STEALTHCHOP(X)
2767
           SERIAL_ECHOPAIR_P(port, " X", TMC_GET_PWMTHRS(X, X));
2698
           SERIAL_ECHOPAIR_P(port, " X", TMC_GET_PWMTHRS(X, X));
2768
         #endif
2699
         #endif
2769
-        #if AXIS_IS_TMC(Y)
2700
+        #if AXIS_HAS_STEALTHCHOP(Y)
2770
           SERIAL_ECHOPAIR_P(port, " Y", TMC_GET_PWMTHRS(Y, Y));
2701
           SERIAL_ECHOPAIR_P(port, " Y", TMC_GET_PWMTHRS(Y, Y));
2771
         #endif
2702
         #endif
2772
-        #if AXIS_IS_TMC(Z)
2703
+        #if AXIS_HAS_STEALTHCHOP(Z)
2773
           SERIAL_ECHOPAIR_P(port, " Z", TMC_GET_PWMTHRS(Z, Z));
2704
           SERIAL_ECHOPAIR_P(port, " Z", TMC_GET_PWMTHRS(Z, Z));
2774
         #endif
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
           SERIAL_EOL_P(port);
2707
           SERIAL_EOL_P(port);
2777
         #endif
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
           say_M913(PORTVAR_SOLO);
2711
           say_M913(PORTVAR_SOLO);
2780
           SERIAL_ECHOPGM_P(port, " I1");
2712
           SERIAL_ECHOPGM_P(port, " I1");
2781
         #endif
2713
         #endif
2782
-        #if AXIS_IS_TMC(X2)
2714
+        #if AXIS_HAS_STEALTHCHOP(X2)
2783
           SERIAL_ECHOPAIR_P(port, " X", TMC_GET_PWMTHRS(X, X2));
2715
           SERIAL_ECHOPAIR_P(port, " X", TMC_GET_PWMTHRS(X, X2));
2784
         #endif
2716
         #endif
2785
-        #if AXIS_IS_TMC(Y2)
2717
+        #if AXIS_HAS_STEALTHCHOP(Y2)
2786
           SERIAL_ECHOPAIR_P(port, " Y", TMC_GET_PWMTHRS(Y, Y2));
2718
           SERIAL_ECHOPAIR_P(port, " Y", TMC_GET_PWMTHRS(Y, Y2));
2787
         #endif
2719
         #endif
2788
-        #if AXIS_IS_TMC(Z2)
2720
+        #if AXIS_HAS_STEALTHCHOP(Z2)
2789
           SERIAL_ECHOPAIR_P(port, " Z", TMC_GET_PWMTHRS(Z, Z2));
2721
           SERIAL_ECHOPAIR_P(port, " Z", TMC_GET_PWMTHRS(Z, Z2));
2790
         #endif
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
           SERIAL_EOL_P(port);
2724
           SERIAL_EOL_P(port);
2793
         #endif
2725
         #endif
2794
-        #if AXIS_IS_TMC(Z3)
2726
+
2727
+        #if AXIS_HAS_STEALTHCHOP(Z3)
2795
           say_M913(PORTVAR_SOLO);
2728
           say_M913(PORTVAR_SOLO);
2796
           SERIAL_ECHOPGM_P(port, " I2");
2729
           SERIAL_ECHOPGM_P(port, " I2");
2797
           SERIAL_ECHOLNPAIR_P(port, " Z", TMC_GET_PWMTHRS(Z, Z3));
2730
           SERIAL_ECHOLNPAIR_P(port, " Z", TMC_GET_PWMTHRS(Z, Z3));
2798
         #endif
2731
         #endif
2799
-        #if AXIS_IS_TMC(E0)
2732
+
2733
+        #if AXIS_HAS_STEALTHCHOP(E0)
2800
           say_M913(PORTVAR_SOLO);
2734
           say_M913(PORTVAR_SOLO);
2801
           SERIAL_ECHOLNPAIR_P(port, " T0 E", TMC_GET_PWMTHRS(E, E0));
2735
           SERIAL_ECHOLNPAIR_P(port, " T0 E", TMC_GET_PWMTHRS(E, E0));
2802
         #endif
2736
         #endif
2803
-        #if AXIS_IS_TMC(E1)
2737
+        #if AXIS_HAS_STEALTHCHOP(E1)
2804
           say_M913(PORTVAR_SOLO);
2738
           say_M913(PORTVAR_SOLO);
2805
           SERIAL_ECHOLNPAIR_P(port, " T1 E", TMC_GET_PWMTHRS(E, E1));
2739
           SERIAL_ECHOLNPAIR_P(port, " T1 E", TMC_GET_PWMTHRS(E, E1));
2806
         #endif
2740
         #endif
2807
-        #if AXIS_IS_TMC(E2)
2741
+        #if AXIS_HAS_STEALTHCHOP(E2)
2808
           say_M913(PORTVAR_SOLO);
2742
           say_M913(PORTVAR_SOLO);
2809
           SERIAL_ECHOLNPAIR_P(port, " T2 E", TMC_GET_PWMTHRS(E, E2));
2743
           SERIAL_ECHOLNPAIR_P(port, " T2 E", TMC_GET_PWMTHRS(E, E2));
2810
         #endif
2744
         #endif
2811
-        #if AXIS_IS_TMC(E3)
2745
+        #if AXIS_HAS_STEALTHCHOP(E3)
2812
           say_M913(PORTVAR_SOLO);
2746
           say_M913(PORTVAR_SOLO);
2813
           SERIAL_ECHOLNPAIR_P(port, " T3 E", TMC_GET_PWMTHRS(E, E3));
2747
           SERIAL_ECHOLNPAIR_P(port, " T3 E", TMC_GET_PWMTHRS(E, E3));
2814
         #endif
2748
         #endif
2815
-        #if AXIS_IS_TMC(E4)
2749
+        #if AXIS_HAS_STEALTHCHOP(E4)
2816
           say_M913(PORTVAR_SOLO);
2750
           say_M913(PORTVAR_SOLO);
2817
           SERIAL_ECHOLNPAIR_P(port, " T4 E", TMC_GET_PWMTHRS(E, E4));
2751
           SERIAL_ECHOLNPAIR_P(port, " T4 E", TMC_GET_PWMTHRS(E, E4));
2818
         #endif
2752
         #endif
2819
-        #if AXIS_IS_TMC(E5)
2753
+        #if AXIS_HAS_STEALTHCHOP(E5)
2820
           say_M913(PORTVAR_SOLO);
2754
           say_M913(PORTVAR_SOLO);
2821
           SERIAL_ECHOLNPAIR_P(port, " T5 E", TMC_GET_PWMTHRS(E, E5));
2755
           SERIAL_ECHOLNPAIR_P(port, " T5 E", TMC_GET_PWMTHRS(E, E5));
2822
         #endif
2756
         #endif
2824
       #endif // HYBRID_THRESHOLD
2758
       #endif // HYBRID_THRESHOLD
2825
 
2759
 
2826
       /**
2760
       /**
2827
-     * TMC2130 Sensorless homing thresholds
2761
+       * TMC Sensorless homing thresholds
2828
        */
2762
        */
2829
       #if USE_SENSORLESS
2763
       #if USE_SENSORLESS
2830
         if (!forReplay) {
2764
         if (!forReplay) {

+ 184
- 222
Marlin/src/module/stepper_indirection.cpp View File

139
   }
139
   }
140
 #endif // TMC26X
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
 // TMC2130 Driver objects and inits
147
 // TMC2130 Driver objects and inits
144
 //
148
 //
145
 #if HAS_DRIVER(TMC2130)
149
 #if HAS_DRIVER(TMC2130)
146
 
150
 
147
   #include <SPI.h>
151
   #include <SPI.h>
148
-  #include <TMC2130Stepper.h>
149
   #include "planner.h"
152
   #include "planner.h"
150
   #include "../core/enum.h"
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
   #if ENABLED(TMC_USE_SW_SPI)
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
   #else
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
   #endif
161
   #endif
161
-
162
   // Stepper objects of TMC2130 steppers used
162
   // Stepper objects of TMC2130 steppers used
163
   #if AXIS_DRIVER_TYPE(X, TMC2130)
163
   #if AXIS_DRIVER_TYPE(X, TMC2130)
164
-    _TMC2130_DEFINE(X);
164
+    TMC2130_DEFINE(X);
165
   #endif
165
   #endif
166
   #if AXIS_DRIVER_TYPE(X2, TMC2130)
166
   #if AXIS_DRIVER_TYPE(X2, TMC2130)
167
-    _TMC2130_DEFINE(X2);
167
+    TMC2130_DEFINE(X2);
168
   #endif
168
   #endif
169
   #if AXIS_DRIVER_TYPE(Y, TMC2130)
169
   #if AXIS_DRIVER_TYPE(Y, TMC2130)
170
-    _TMC2130_DEFINE(Y);
170
+    TMC2130_DEFINE(Y);
171
   #endif
171
   #endif
172
   #if AXIS_DRIVER_TYPE(Y2, TMC2130)
172
   #if AXIS_DRIVER_TYPE(Y2, TMC2130)
173
-    _TMC2130_DEFINE(Y2);
173
+    TMC2130_DEFINE(Y2);
174
   #endif
174
   #endif
175
   #if AXIS_DRIVER_TYPE(Z, TMC2130)
175
   #if AXIS_DRIVER_TYPE(Z, TMC2130)
176
-    _TMC2130_DEFINE(Z);
176
+    TMC2130_DEFINE(Z);
177
   #endif
177
   #endif
178
   #if AXIS_DRIVER_TYPE(Z2, TMC2130)
178
   #if AXIS_DRIVER_TYPE(Z2, TMC2130)
179
-    _TMC2130_DEFINE(Z2);
179
+    TMC2130_DEFINE(Z2);
180
   #endif
180
   #endif
181
   #if AXIS_DRIVER_TYPE(Z3, TMC2130)
181
   #if AXIS_DRIVER_TYPE(Z3, TMC2130)
182
-    _TMC2130_DEFINE(Z3);
182
+    TMC2130_DEFINE(Z3);
183
   #endif
183
   #endif
184
   #if AXIS_DRIVER_TYPE(E0, TMC2130)
184
   #if AXIS_DRIVER_TYPE(E0, TMC2130)
185
-    _TMC2130_DEFINE(E0);
185
+    TMC2130_DEFINE(E0);
186
   #endif
186
   #endif
187
   #if AXIS_DRIVER_TYPE(E1, TMC2130)
187
   #if AXIS_DRIVER_TYPE(E1, TMC2130)
188
-    _TMC2130_DEFINE(E1);
188
+    TMC2130_DEFINE(E1);
189
   #endif
189
   #endif
190
   #if AXIS_DRIVER_TYPE(E2, TMC2130)
190
   #if AXIS_DRIVER_TYPE(E2, TMC2130)
191
-    _TMC2130_DEFINE(E2);
191
+    TMC2130_DEFINE(E2);
192
   #endif
192
   #endif
193
   #if AXIS_DRIVER_TYPE(E3, TMC2130)
193
   #if AXIS_DRIVER_TYPE(E3, TMC2130)
194
-    _TMC2130_DEFINE(E3);
194
+    TMC2130_DEFINE(E3);
195
   #endif
195
   #endif
196
   #if AXIS_DRIVER_TYPE(E4, TMC2130)
196
   #if AXIS_DRIVER_TYPE(E4, TMC2130)
197
-    _TMC2130_DEFINE(E4);
197
+    TMC2130_DEFINE(E4);
198
   #endif
198
   #endif
199
   #if AXIS_DRIVER_TYPE(E5, TMC2130)
199
   #if AXIS_DRIVER_TYPE(E5, TMC2130)
200
-    _TMC2130_DEFINE(E5);
200
+    TMC2130_DEFINE(E5);
201
   #endif
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
     #if DISABLED(STEALTHCHOP) || DISABLED(HYBRID_THRESHOLD)
205
     #if DISABLED(STEALTHCHOP) || DISABLED(HYBRID_THRESHOLD)
208
       UNUSED(thrs);
206
       UNUSED(thrs);
209
       UNUSED(spmm);
207
       UNUSED(spmm);
210
     #endif
208
     #endif
211
     st.begin();
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
     st.microsteps(microsteps);
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
     #if ENABLED(STEALTHCHOP)
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
       #endif
236
       #endif
305
     #endif
237
     #endif
238
+    st.GSTAT(); // Clear GSTAT
306
   }
239
   }
307
 #endif // TMC2130
240
 #endif // TMC2130
308
 
241
 
311
 //
244
 //
312
 #if HAS_DRIVER(TMC2208)
245
 #if HAS_DRIVER(TMC2208)
313
   #include <HardwareSerial.h>
246
   #include <HardwareSerial.h>
314
-  #include <TMC2208Stepper.h>
315
   #include "planner.h"
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
   // Stepper objects of TMC2208 steppers used
255
   // Stepper objects of TMC2208 steppers used
325
   #if AXIS_DRIVER_TYPE(X, TMC2208)
256
   #if AXIS_DRIVER_TYPE(X, TMC2208)
326
     #ifdef X_HARDWARE_SERIAL
257
     #ifdef X_HARDWARE_SERIAL
327
-      _TMC2208_DEFINE_HARDWARE(X);
258
+      TMC2208_DEFINE_HARDWARE(X);
328
     #else
259
     #else
329
-      _TMC2208_DEFINE_SOFTWARE(X);
260
+      TMC2208_DEFINE_SOFTWARE(X);
330
     #endif
261
     #endif
331
   #endif
262
   #endif
332
   #if AXIS_DRIVER_TYPE(X2, TMC2208)
263
   #if AXIS_DRIVER_TYPE(X2, TMC2208)
333
     #ifdef X2_HARDWARE_SERIAL
264
     #ifdef X2_HARDWARE_SERIAL
334
-      _TMC2208_DEFINE_HARDWARE(X2);
265
+      TMC2208_DEFINE_HARDWARE(X2);
335
     #else
266
     #else
336
-      _TMC2208_DEFINE_SOFTWARE(X2);
267
+      TMC2208_DEFINE_SOFTWARE(X2);
337
     #endif
268
     #endif
338
   #endif
269
   #endif
339
   #if AXIS_DRIVER_TYPE(Y, TMC2208)
270
   #if AXIS_DRIVER_TYPE(Y, TMC2208)
340
     #ifdef Y_HARDWARE_SERIAL
271
     #ifdef Y_HARDWARE_SERIAL
341
-      _TMC2208_DEFINE_HARDWARE(Y);
272
+      TMC2208_DEFINE_HARDWARE(Y);
342
     #else
273
     #else
343
-      _TMC2208_DEFINE_SOFTWARE(Y);
274
+      TMC2208_DEFINE_SOFTWARE(Y);
344
     #endif
275
     #endif
345
   #endif
276
   #endif
346
   #if AXIS_DRIVER_TYPE(Y2, TMC2208)
277
   #if AXIS_DRIVER_TYPE(Y2, TMC2208)
347
     #ifdef Y2_HARDWARE_SERIAL
278
     #ifdef Y2_HARDWARE_SERIAL
348
-      _TMC2208_DEFINE_HARDWARE(Y2);
279
+      TMC2208_DEFINE_HARDWARE(Y2);
349
     #else
280
     #else
350
-      _TMC2208_DEFINE_SOFTWARE(Y2);
281
+      TMC2208_DEFINE_SOFTWARE(Y2);
351
     #endif
282
     #endif
352
   #endif
283
   #endif
353
   #if AXIS_DRIVER_TYPE(Z, TMC2208)
284
   #if AXIS_DRIVER_TYPE(Z, TMC2208)
354
     #ifdef Z_HARDWARE_SERIAL
285
     #ifdef Z_HARDWARE_SERIAL
355
-      _TMC2208_DEFINE_HARDWARE(Z);
286
+      TMC2208_DEFINE_HARDWARE(Z);
356
     #else
287
     #else
357
-      _TMC2208_DEFINE_SOFTWARE(Z);
288
+      TMC2208_DEFINE_SOFTWARE(Z);
358
     #endif
289
     #endif
359
   #endif
290
   #endif
360
   #if AXIS_DRIVER_TYPE(Z2, TMC2208)
291
   #if AXIS_DRIVER_TYPE(Z2, TMC2208)
361
     #ifdef Z2_HARDWARE_SERIAL
292
     #ifdef Z2_HARDWARE_SERIAL
362
-      _TMC2208_DEFINE_HARDWARE(Z2);
293
+      TMC2208_DEFINE_HARDWARE(Z2);
363
     #else
294
     #else
364
-      _TMC2208_DEFINE_SOFTWARE(Z2);
295
+      TMC2208_DEFINE_SOFTWARE(Z2);
365
     #endif
296
     #endif
366
   #endif
297
   #endif
367
   #if AXIS_DRIVER_TYPE(Z3, TMC2208)
298
   #if AXIS_DRIVER_TYPE(Z3, TMC2208)
368
     #ifdef Z3_HARDWARE_SERIAL
299
     #ifdef Z3_HARDWARE_SERIAL
369
-      _TMC2208_DEFINE_HARDWARE(Z3);
300
+      TMC2208_DEFINE_HARDWARE(Z3);
370
     #else
301
     #else
371
-      _TMC2208_DEFINE_SOFTWARE(Z3);
302
+      TMC2208_DEFINE_SOFTWARE(Z3);
372
     #endif
303
     #endif
373
   #endif
304
   #endif
374
   #if AXIS_DRIVER_TYPE(E0, TMC2208)
305
   #if AXIS_DRIVER_TYPE(E0, TMC2208)
375
     #ifdef E0_HARDWARE_SERIAL
306
     #ifdef E0_HARDWARE_SERIAL
376
-      _TMC2208_DEFINE_HARDWARE(E0);
307
+      TMC2208_DEFINE_HARDWARE(E0);
377
     #else
308
     #else
378
-      _TMC2208_DEFINE_SOFTWARE(E0);
309
+      TMC2208_DEFINE_SOFTWARE(E0);
379
     #endif
310
     #endif
380
   #endif
311
   #endif
381
   #if AXIS_DRIVER_TYPE(E1, TMC2208)
312
   #if AXIS_DRIVER_TYPE(E1, TMC2208)
382
     #ifdef E1_HARDWARE_SERIAL
313
     #ifdef E1_HARDWARE_SERIAL
383
-      _TMC2208_DEFINE_HARDWARE(E1);
314
+      TMC2208_DEFINE_HARDWARE(E1);
384
     #else
315
     #else
385
-      _TMC2208_DEFINE_SOFTWARE(E1);
316
+      TMC2208_DEFINE_SOFTWARE(E1);
386
     #endif
317
     #endif
387
   #endif
318
   #endif
388
   #if AXIS_DRIVER_TYPE(E2, TMC2208)
319
   #if AXIS_DRIVER_TYPE(E2, TMC2208)
389
     #ifdef E2_HARDWARE_SERIAL
320
     #ifdef E2_HARDWARE_SERIAL
390
-      _TMC2208_DEFINE_HARDWARE(E2);
321
+      TMC2208_DEFINE_HARDWARE(E2);
391
     #else
322
     #else
392
-      _TMC2208_DEFINE_SOFTWARE(E2);
323
+      TMC2208_DEFINE_SOFTWARE(E2);
393
     #endif
324
     #endif
394
   #endif
325
   #endif
395
   #if AXIS_DRIVER_TYPE(E3, TMC2208)
326
   #if AXIS_DRIVER_TYPE(E3, TMC2208)
396
     #ifdef E3_HARDWARE_SERIAL
327
     #ifdef E3_HARDWARE_SERIAL
397
-      _TMC2208_DEFINE_HARDWARE(E3);
328
+      TMC2208_DEFINE_HARDWARE(E3);
398
     #else
329
     #else
399
-      _TMC2208_DEFINE_SOFTWARE(E3);
330
+      TMC2208_DEFINE_SOFTWARE(E3);
400
     #endif
331
     #endif
401
   #endif
332
   #endif
402
   #if AXIS_DRIVER_TYPE(E4, TMC2208)
333
   #if AXIS_DRIVER_TYPE(E4, TMC2208)
403
     #ifdef E4_HARDWARE_SERIAL
334
     #ifdef E4_HARDWARE_SERIAL
404
-      _TMC2208_DEFINE_HARDWARE(E4);
335
+      TMC2208_DEFINE_HARDWARE(E4);
405
     #else
336
     #else
406
-      _TMC2208_DEFINE_SOFTWARE(E4);
337
+      TMC2208_DEFINE_SOFTWARE(E4);
407
     #endif
338
     #endif
408
   #endif
339
   #endif
409
   #if AXIS_DRIVER_TYPE(E5, TMC2208)
340
   #if AXIS_DRIVER_TYPE(E5, TMC2208)
410
     #ifdef E5_HARDWARE_SERIAL
341
     #ifdef E5_HARDWARE_SERIAL
411
-      _TMC2208_DEFINE_HARDWARE(E5);
342
+      TMC2208_DEFINE_HARDWARE(E5);
412
     #else
343
     #else
413
-      _TMC2208_DEFINE_SOFTWARE(E5);
344
+      TMC2208_DEFINE_SOFTWARE(E5);
414
     #endif
345
     #endif
415
   #endif
346
   #endif
416
 
347
 
508
     #endif
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
     st.microsteps(microsteps);
463
     st.microsteps(microsteps);
519
-    st.blank_time(24);
520
-    st.toff(5);
521
-    st.intpol(INTERPOLATE);
464
+    st.iholddelay(10);
522
     st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
465
     st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
523
-    st.hysteresis_start(3);
524
-    st.hysteresis_end(2);
525
     #if ENABLED(STEALTHCHOP)
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
       #if ENABLED(HYBRID_THRESHOLD)
478
       #if ENABLED(HYBRID_THRESHOLD)
535
         st.TPWMTHRS(12650000UL*microsteps/(256*thrs*spmm));
479
         st.TPWMTHRS(12650000UL*microsteps/(256*thrs*spmm));
536
-      #else
537
-        UNUSED(thrs);
538
-        UNUSED(spmm);
539
       #endif
480
       #endif
540
     #else
481
     #else
541
-      st.en_spreadCycle(true);
482
+      gconf.en_spreadcycle = true;
542
     #endif
483
     #endif
484
+    st.GCONF(gconf.sr);
543
     st.GSTAT(0b111); // Clear
485
     st.GSTAT(0b111); // Clear
544
     delay(200);
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
 #endif // TMC2208
488
 #endif // TMC2208
591
 
489
 
592
 void restore_stepper_drivers() {
490
 void restore_stepper_drivers() {
635
   #if HAS_DRIVER(TMC26X)
533
   #if HAS_DRIVER(TMC26X)
636
     tmc26x_init_to_defaults();
534
     tmc26x_init_to_defaults();
637
   #endif
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
   #endif
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
   #endif
608
   #endif
609
+
646
   #ifdef TMC_ADV
610
   #ifdef TMC_ADV
647
     TMC_ADV()
611
     TMC_ADV()
648
   #endif
612
   #endif
649
-  #if HAS_DRIVER(L6470)
650
-    L6470_init_to_defaults();
651
-  #endif
613
+
652
   stepper.set_directions();
614
   stepper.set_directions();
653
 }
615
 }
654
 
616
 

+ 52
- 73
Marlin/src/module/stepper_indirection.h View File

57
   void tmc26x_init_to_defaults();
57
   void tmc26x_init_to_defaults();
58
 #endif
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
 #endif
74
 #endif
70
 
75
 
71
 // L6470 has STEP on normal pins, but DIR/ENABLE via SPI
76
 // L6470 has STEP on normal pins, but DIR/ENABLE via SPI
88
   #define X_DIR_WRITE(STATE) stepperX.Step_Clock(STATE)
93
   #define X_DIR_WRITE(STATE) stepperX.Step_Clock(STATE)
89
   #define X_DIR_READ (stepperX.getStatus() & STATUS_DIR)
94
   #define X_DIR_READ (stepperX.getStatus() & STATUS_DIR)
90
 #else
95
 #else
96
+  #if AXIS_IS_TMC(X)
97
+    extern TMC_CLASS(X) stepperX;
98
+  #endif
91
   #if AXIS_DRIVER_TYPE(X, TMC26X)
99
   #if AXIS_DRIVER_TYPE(X, TMC26X)
92
     extern TMC26XStepper stepperX;
100
     extern TMC26XStepper stepperX;
93
     #define X_ENABLE_INIT NOOP
101
     #define X_ENABLE_INIT NOOP
94
     #define X_ENABLE_WRITE(STATE) stepperX.setEnabled(STATE)
102
     #define X_ENABLE_WRITE(STATE) stepperX.setEnabled(STATE)
95
     #define X_ENABLE_READ stepperX.isEnabled()
103
     #define X_ENABLE_READ stepperX.isEnabled()
96
   #else
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
     #define X_ENABLE_INIT SET_OUTPUT(X_ENABLE_PIN)
105
     #define X_ENABLE_INIT SET_OUTPUT(X_ENABLE_PIN)
103
     #define X_ENABLE_WRITE(STATE) WRITE(X_ENABLE_PIN,STATE)
106
     #define X_ENABLE_WRITE(STATE) WRITE(X_ENABLE_PIN,STATE)
104
     #define X_ENABLE_READ READ(X_ENABLE_PIN)
107
     #define X_ENABLE_READ READ(X_ENABLE_PIN)
121
   #define Y_DIR_WRITE(STATE) stepperY.Step_Clock(STATE)
124
   #define Y_DIR_WRITE(STATE) stepperY.Step_Clock(STATE)
122
   #define Y_DIR_READ (stepperY.getStatus() & STATUS_DIR)
125
   #define Y_DIR_READ (stepperY.getStatus() & STATUS_DIR)
123
 #else
126
 #else
127
+  #if AXIS_IS_TMC(Y)
128
+    extern TMC_CLASS(Y) stepperY;
129
+  #endif
124
   #if AXIS_DRIVER_TYPE(Y, TMC26X)
130
   #if AXIS_DRIVER_TYPE(Y, TMC26X)
125
     extern TMC26XStepper stepperY;
131
     extern TMC26XStepper stepperY;
126
     #define Y_ENABLE_INIT NOOP
132
     #define Y_ENABLE_INIT NOOP
127
     #define Y_ENABLE_WRITE(STATE) stepperY.setEnabled(STATE)
133
     #define Y_ENABLE_WRITE(STATE) stepperY.setEnabled(STATE)
128
     #define Y_ENABLE_READ stepperY.isEnabled()
134
     #define Y_ENABLE_READ stepperY.isEnabled()
129
   #else
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
     #define Y_ENABLE_INIT SET_OUTPUT(Y_ENABLE_PIN)
136
     #define Y_ENABLE_INIT SET_OUTPUT(Y_ENABLE_PIN)
136
     #define Y_ENABLE_WRITE(STATE) WRITE(Y_ENABLE_PIN,STATE)
137
     #define Y_ENABLE_WRITE(STATE) WRITE(Y_ENABLE_PIN,STATE)
137
     #define Y_ENABLE_READ READ(Y_ENABLE_PIN)
138
     #define Y_ENABLE_READ READ(Y_ENABLE_PIN)
154
   #define Z_DIR_WRITE(STATE) stepperZ.Step_Clock(STATE)
155
   #define Z_DIR_WRITE(STATE) stepperZ.Step_Clock(STATE)
155
   #define Z_DIR_READ (stepperZ.getStatus() & STATUS_DIR)
156
   #define Z_DIR_READ (stepperZ.getStatus() & STATUS_DIR)
156
 #else
157
 #else
158
+  #if AXIS_IS_TMC(Z)
159
+    extern TMC_CLASS(Z) stepperZ;
160
+  #endif
157
   #if AXIS_DRIVER_TYPE(Z, TMC26X)
161
   #if AXIS_DRIVER_TYPE(Z, TMC26X)
158
     extern TMC26XStepper stepperZ;
162
     extern TMC26XStepper stepperZ;
159
     #define Z_ENABLE_INIT NOOP
163
     #define Z_ENABLE_INIT NOOP
160
     #define Z_ENABLE_WRITE(STATE) stepperZ.setEnabled(STATE)
164
     #define Z_ENABLE_WRITE(STATE) stepperZ.setEnabled(STATE)
161
     #define Z_ENABLE_READ stepperZ.isEnabled()
165
     #define Z_ENABLE_READ stepperZ.isEnabled()
162
   #else
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
     #define Z_ENABLE_INIT SET_OUTPUT(Z_ENABLE_PIN)
167
     #define Z_ENABLE_INIT SET_OUTPUT(Z_ENABLE_PIN)
169
     #define Z_ENABLE_WRITE(STATE) WRITE(Z_ENABLE_PIN,STATE)
168
     #define Z_ENABLE_WRITE(STATE) WRITE(Z_ENABLE_PIN,STATE)
170
     #define Z_ENABLE_READ READ(Z_ENABLE_PIN)
169
     #define Z_ENABLE_READ READ(Z_ENABLE_PIN)
188
     #define X2_DIR_WRITE(STATE) stepperX2.Step_Clock(STATE)
187
     #define X2_DIR_WRITE(STATE) stepperX2.Step_Clock(STATE)
189
     #define X2_DIR_READ (stepperX2.getStatus() & STATUS_DIR)
188
     #define X2_DIR_READ (stepperX2.getStatus() & STATUS_DIR)
190
   #else
189
   #else
190
+    #if AXIS_IS_TMC(X2)
191
+      extern TMC_CLASS(X2) stepperX2;
192
+    #endif
191
     #if AXIS_DRIVER_TYPE(X2, TMC26X)
193
     #if AXIS_DRIVER_TYPE(X2, TMC26X)
192
       extern TMC26XStepper stepperX2;
194
       extern TMC26XStepper stepperX2;
193
       #define X2_ENABLE_INIT NOOP
195
       #define X2_ENABLE_INIT NOOP
194
       #define X2_ENABLE_WRITE(STATE) stepperX2.setEnabled(STATE)
196
       #define X2_ENABLE_WRITE(STATE) stepperX2.setEnabled(STATE)
195
       #define X2_ENABLE_READ stepperX2.isEnabled()
197
       #define X2_ENABLE_READ stepperX2.isEnabled()
196
     #else
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
       #define X2_ENABLE_INIT SET_OUTPUT(X2_ENABLE_PIN)
199
       #define X2_ENABLE_INIT SET_OUTPUT(X2_ENABLE_PIN)
203
       #define X2_ENABLE_WRITE(STATE) WRITE(X2_ENABLE_PIN,STATE)
200
       #define X2_ENABLE_WRITE(STATE) WRITE(X2_ENABLE_PIN,STATE)
204
       #define X2_ENABLE_READ READ(X2_ENABLE_PIN)
201
       #define X2_ENABLE_READ READ(X2_ENABLE_PIN)
223
     #define Y2_DIR_WRITE(STATE) stepperY2.Step_Clock(STATE)
220
     #define Y2_DIR_WRITE(STATE) stepperY2.Step_Clock(STATE)
224
     #define Y2_DIR_READ (stepperY2.getStatus() & STATUS_DIR)
221
     #define Y2_DIR_READ (stepperY2.getStatus() & STATUS_DIR)
225
   #else
222
   #else
223
+    #if AXIS_IS_TMC(Y2)
224
+      extern TMC_CLASS(Y2) stepperY2;
225
+    #endif
226
     #if AXIS_DRIVER_TYPE(Y2, TMC26X)
226
     #if AXIS_DRIVER_TYPE(Y2, TMC26X)
227
       extern TMC26XStepper stepperY2;
227
       extern TMC26XStepper stepperY2;
228
       #define Y2_ENABLE_INIT NOOP
228
       #define Y2_ENABLE_INIT NOOP
229
       #define Y2_ENABLE_WRITE(STATE) stepperY2.setEnabled(STATE)
229
       #define Y2_ENABLE_WRITE(STATE) stepperY2.setEnabled(STATE)
230
       #define Y2_ENABLE_READ stepperY2.isEnabled()
230
       #define Y2_ENABLE_READ stepperY2.isEnabled()
231
     #else
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
       #define Y2_ENABLE_INIT SET_OUTPUT(Y2_ENABLE_PIN)
232
       #define Y2_ENABLE_INIT SET_OUTPUT(Y2_ENABLE_PIN)
238
       #define Y2_ENABLE_WRITE(STATE) WRITE(Y2_ENABLE_PIN,STATE)
233
       #define Y2_ENABLE_WRITE(STATE) WRITE(Y2_ENABLE_PIN,STATE)
239
       #define Y2_ENABLE_READ READ(Y2_ENABLE_PIN)
234
       #define Y2_ENABLE_READ READ(Y2_ENABLE_PIN)
258
     #define Z2_DIR_WRITE(STATE) stepperZ2.Step_Clock(STATE)
253
     #define Z2_DIR_WRITE(STATE) stepperZ2.Step_Clock(STATE)
259
     #define Z2_DIR_READ (stepperZ2.getStatus() & STATUS_DIR)
254
     #define Z2_DIR_READ (stepperZ2.getStatus() & STATUS_DIR)
260
   #else
255
   #else
256
+    #if AXIS_IS_TMC(Z2)
257
+      extern TMC_CLASS(Z2) stepperZ2;
258
+    #endif
261
     #if AXIS_DRIVER_TYPE(Z2, TMC26X)
259
     #if AXIS_DRIVER_TYPE(Z2, TMC26X)
262
       extern TMC26XStepper stepperZ2;
260
       extern TMC26XStepper stepperZ2;
263
       #define Z2_ENABLE_INIT NOOP
261
       #define Z2_ENABLE_INIT NOOP
264
       #define Z2_ENABLE_WRITE(STATE) stepperZ2.setEnabled(STATE)
262
       #define Z2_ENABLE_WRITE(STATE) stepperZ2.setEnabled(STATE)
265
       #define Z2_ENABLE_READ stepperZ2.isEnabled()
263
       #define Z2_ENABLE_READ stepperZ2.isEnabled()
266
     #else
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
       #define Z2_ENABLE_INIT SET_OUTPUT(Z2_ENABLE_PIN)
265
       #define Z2_ENABLE_INIT SET_OUTPUT(Z2_ENABLE_PIN)
273
       #define Z2_ENABLE_WRITE(STATE) WRITE(Z2_ENABLE_PIN,STATE)
266
       #define Z2_ENABLE_WRITE(STATE) WRITE(Z2_ENABLE_PIN,STATE)
274
       #define Z2_ENABLE_READ READ(Z2_ENABLE_PIN)
267
       #define Z2_ENABLE_READ READ(Z2_ENABLE_PIN)
293
     #define Z3_DIR_WRITE(STATE) stepperZ3.Step_Clock(STATE)
286
     #define Z3_DIR_WRITE(STATE) stepperZ3.Step_Clock(STATE)
294
     #define Z3_DIR_READ (stepperZ3.getStatus() & STATUS_DIR)
287
     #define Z3_DIR_READ (stepperZ3.getStatus() & STATUS_DIR)
295
   #else
288
   #else
289
+    #if AXIS_IS_TMC(Z3)
290
+      extern TMC_CLASS(Z3) stepperZ3;
291
+    #endif
296
     #if ENABLED(Z3_IS_TMC26X)
292
     #if ENABLED(Z3_IS_TMC26X)
297
       extern TMC26XStepper stepperZ3;
293
       extern TMC26XStepper stepperZ3;
298
       #define Z3_ENABLE_INIT NOOP
294
       #define Z3_ENABLE_INIT NOOP
299
       #define Z3_ENABLE_WRITE(STATE) stepperZ3.setEnabled(STATE)
295
       #define Z3_ENABLE_WRITE(STATE) stepperZ3.setEnabled(STATE)
300
       #define Z3_ENABLE_READ stepperZ3.isEnabled()
296
       #define Z3_ENABLE_READ stepperZ3.isEnabled()
301
     #else
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
       #define Z3_ENABLE_INIT SET_OUTPUT(Z3_ENABLE_PIN)
298
       #define Z3_ENABLE_INIT SET_OUTPUT(Z3_ENABLE_PIN)
308
       #define Z3_ENABLE_WRITE(STATE) WRITE(Z3_ENABLE_PIN,STATE)
299
       #define Z3_ENABLE_WRITE(STATE) WRITE(Z3_ENABLE_PIN,STATE)
309
       #define Z3_ENABLE_READ READ(Z3_ENABLE_PIN)
300
       #define Z3_ENABLE_READ READ(Z3_ENABLE_PIN)
327
   #define E0_DIR_WRITE(STATE) stepperE0.Step_Clock(STATE)
318
   #define E0_DIR_WRITE(STATE) stepperE0.Step_Clock(STATE)
328
   #define E0_DIR_READ (stepperE0.getStatus() & STATUS_DIR)
319
   #define E0_DIR_READ (stepperE0.getStatus() & STATUS_DIR)
329
 #else
320
 #else
321
+  #if AXIS_IS_TMC(E0)
322
+    extern TMC_CLASS(E0) stepperE0;
323
+  #endif
330
   #if AXIS_DRIVER_TYPE(E0, TMC26X)
324
   #if AXIS_DRIVER_TYPE(E0, TMC26X)
331
     extern TMC26XStepper stepperE0;
325
     extern TMC26XStepper stepperE0;
332
     #define E0_ENABLE_INIT NOOP
326
     #define E0_ENABLE_INIT NOOP
333
     #define E0_ENABLE_WRITE(STATE) stepperE0.setEnabled(STATE)
327
     #define E0_ENABLE_WRITE(STATE) stepperE0.setEnabled(STATE)
334
     #define E0_ENABLE_READ stepperE0.isEnabled()
328
     #define E0_ENABLE_READ stepperE0.isEnabled()
335
   #else
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
     #define E0_ENABLE_INIT SET_OUTPUT(E0_ENABLE_PIN)
330
     #define E0_ENABLE_INIT SET_OUTPUT(E0_ENABLE_PIN)
342
     #define E0_ENABLE_WRITE(STATE) WRITE(E0_ENABLE_PIN,STATE)
331
     #define E0_ENABLE_WRITE(STATE) WRITE(E0_ENABLE_PIN,STATE)
343
     #define E0_ENABLE_READ READ(E0_ENABLE_PIN)
332
     #define E0_ENABLE_READ READ(E0_ENABLE_PIN)
360
   #define E1_DIR_WRITE(STATE) stepperE1.Step_Clock(STATE)
349
   #define E1_DIR_WRITE(STATE) stepperE1.Step_Clock(STATE)
361
   #define E1_DIR_READ (stepperE1.getStatus() & STATUS_DIR)
350
   #define E1_DIR_READ (stepperE1.getStatus() & STATUS_DIR)
362
 #else
351
 #else
352
+  #if AXIS_IS_TMC(E1)
353
+    extern TMC_CLASS(E1) stepperE1;
354
+  #endif
363
   #if AXIS_DRIVER_TYPE(E1, TMC26X)
355
   #if AXIS_DRIVER_TYPE(E1, TMC26X)
364
     extern TMC26XStepper stepperE1;
356
     extern TMC26XStepper stepperE1;
365
     #define E1_ENABLE_INIT NOOP
357
     #define E1_ENABLE_INIT NOOP
366
     #define E1_ENABLE_WRITE(STATE) stepperE1.setEnabled(STATE)
358
     #define E1_ENABLE_WRITE(STATE) stepperE1.setEnabled(STATE)
367
     #define E1_ENABLE_READ stepperE1.isEnabled()
359
     #define E1_ENABLE_READ stepperE1.isEnabled()
368
   #else
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
     #define E1_ENABLE_INIT SET_OUTPUT(E1_ENABLE_PIN)
361
     #define E1_ENABLE_INIT SET_OUTPUT(E1_ENABLE_PIN)
375
     #define E1_ENABLE_WRITE(STATE) WRITE(E1_ENABLE_PIN,STATE)
362
     #define E1_ENABLE_WRITE(STATE) WRITE(E1_ENABLE_PIN,STATE)
376
     #define E1_ENABLE_READ READ(E1_ENABLE_PIN)
363
     #define E1_ENABLE_READ READ(E1_ENABLE_PIN)
393
   #define E2_DIR_WRITE(STATE) stepperE2.Step_Clock(STATE)
380
   #define E2_DIR_WRITE(STATE) stepperE2.Step_Clock(STATE)
394
   #define E2_DIR_READ (stepperE2.getStatus() & STATUS_DIR)
381
   #define E2_DIR_READ (stepperE2.getStatus() & STATUS_DIR)
395
 #else
382
 #else
383
+  #if AXIS_IS_TMC(E2)
384
+    extern TMC_CLASS(E2) stepperE2;
385
+  #endif
396
   #if AXIS_DRIVER_TYPE(E2, TMC26X)
386
   #if AXIS_DRIVER_TYPE(E2, TMC26X)
397
     extern TMC26XStepper stepperE2;
387
     extern TMC26XStepper stepperE2;
398
     #define E2_ENABLE_INIT NOOP
388
     #define E2_ENABLE_INIT NOOP
399
     #define E2_ENABLE_WRITE(STATE) stepperE2.setEnabled(STATE)
389
     #define E2_ENABLE_WRITE(STATE) stepperE2.setEnabled(STATE)
400
     #define E2_ENABLE_READ stepperE2.isEnabled()
390
     #define E2_ENABLE_READ stepperE2.isEnabled()
401
   #else
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
     #define E2_ENABLE_INIT SET_OUTPUT(E2_ENABLE_PIN)
392
     #define E2_ENABLE_INIT SET_OUTPUT(E2_ENABLE_PIN)
408
     #define E2_ENABLE_WRITE(STATE) WRITE(E2_ENABLE_PIN,STATE)
393
     #define E2_ENABLE_WRITE(STATE) WRITE(E2_ENABLE_PIN,STATE)
409
     #define E2_ENABLE_READ READ(E2_ENABLE_PIN)
394
     #define E2_ENABLE_READ READ(E2_ENABLE_PIN)
426
   #define E3_DIR_WRITE(STATE) stepperE3.Step_Clock(STATE)
411
   #define E3_DIR_WRITE(STATE) stepperE3.Step_Clock(STATE)
427
   #define E3_DIR_READ (stepperE3.getStatus() & STATUS_DIR)
412
   #define E3_DIR_READ (stepperE3.getStatus() & STATUS_DIR)
428
 #else
413
 #else
414
+  #if AXIS_IS_TMC(E3)
415
+    extern TMC_CLASS(E3) stepperE3;
416
+  #endif
429
   #if AXIS_DRIVER_TYPE(E3, TMC26X)
417
   #if AXIS_DRIVER_TYPE(E3, TMC26X)
430
     extern TMC26XStepper stepperE3;
418
     extern TMC26XStepper stepperE3;
431
     #define E3_ENABLE_INIT NOOP
419
     #define E3_ENABLE_INIT NOOP
432
     #define E3_ENABLE_WRITE(STATE) stepperE3.setEnabled(STATE)
420
     #define E3_ENABLE_WRITE(STATE) stepperE3.setEnabled(STATE)
433
     #define E3_ENABLE_READ stepperE3.isEnabled()
421
     #define E3_ENABLE_READ stepperE3.isEnabled()
434
   #else
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
     #define E3_ENABLE_INIT SET_OUTPUT(E3_ENABLE_PIN)
423
     #define E3_ENABLE_INIT SET_OUTPUT(E3_ENABLE_PIN)
441
     #define E3_ENABLE_WRITE(STATE) WRITE(E3_ENABLE_PIN,STATE)
424
     #define E3_ENABLE_WRITE(STATE) WRITE(E3_ENABLE_PIN,STATE)
442
     #define E3_ENABLE_READ READ(E3_ENABLE_PIN)
425
     #define E3_ENABLE_READ READ(E3_ENABLE_PIN)
459
   #define E4_DIR_WRITE(STATE) stepperE4.Step_Clock(STATE)
442
   #define E4_DIR_WRITE(STATE) stepperE4.Step_Clock(STATE)
460
   #define E4_DIR_READ (stepperE4.getStatus() & STATUS_DIR)
443
   #define E4_DIR_READ (stepperE4.getStatus() & STATUS_DIR)
461
 #else
444
 #else
445
+  #if AXIS_IS_TMC(E4)
446
+    extern TMC_CLASS(E4) stepperE4;
447
+  #endif
462
   #if AXIS_DRIVER_TYPE(E4, TMC26X)
448
   #if AXIS_DRIVER_TYPE(E4, TMC26X)
463
     extern TMC26XStepper stepperE4;
449
     extern TMC26XStepper stepperE4;
464
     #define E4_ENABLE_INIT NOOP
450
     #define E4_ENABLE_INIT NOOP
465
     #define E4_ENABLE_WRITE(STATE) stepperE4.setEnabled(STATE)
451
     #define E4_ENABLE_WRITE(STATE) stepperE4.setEnabled(STATE)
466
     #define E4_ENABLE_READ stepperE4.isEnabled()
452
     #define E4_ENABLE_READ stepperE4.isEnabled()
467
   #else
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
     #define E4_ENABLE_INIT SET_OUTPUT(E4_ENABLE_PIN)
454
     #define E4_ENABLE_INIT SET_OUTPUT(E4_ENABLE_PIN)
474
     #define E4_ENABLE_WRITE(STATE) WRITE(E4_ENABLE_PIN,STATE)
455
     #define E4_ENABLE_WRITE(STATE) WRITE(E4_ENABLE_PIN,STATE)
475
     #define E4_ENABLE_READ READ(E4_ENABLE_PIN)
456
     #define E4_ENABLE_READ READ(E4_ENABLE_PIN)
492
   #define E5_DIR_WRITE(STATE) stepperE5.Step_Clock(STATE)
473
   #define E5_DIR_WRITE(STATE) stepperE5.Step_Clock(STATE)
493
   #define E5_DIR_READ (stepperE5.getStatus() & STATUS_DIR)
474
   #define E5_DIR_READ (stepperE5.getStatus() & STATUS_DIR)
494
 #else
475
 #else
476
+  #if AXIS_IS_TMC(E5)
477
+    extern TMC_CLASS(E5) stepperE5;
478
+  #endif
495
   #if AXIS_DRIVER_TYPE(E5, TMC26X)
479
   #if AXIS_DRIVER_TYPE(E5, TMC26X)
496
     extern TMC26XStepper stepperE5;
480
     extern TMC26XStepper stepperE5;
497
     #define E5_ENABLE_INIT NOOP
481
     #define E5_ENABLE_INIT NOOP
498
     #define E5_ENABLE_WRITE(STATE) stepperE5.setEnabled(STATE)
482
     #define E5_ENABLE_WRITE(STATE) stepperE5.setEnabled(STATE)
499
     #define E5_ENABLE_READ stepperE5.isEnabled()
483
     #define E5_ENABLE_READ stepperE5.isEnabled()
500
   #else
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
     #define E5_ENABLE_INIT SET_OUTPUT(E5_ENABLE_PIN)
485
     #define E5_ENABLE_INIT SET_OUTPUT(E5_ENABLE_PIN)
507
     #define E5_ENABLE_WRITE(STATE) WRITE(E5_ENABLE_PIN,STATE)
486
     #define E5_ENABLE_WRITE(STATE) WRITE(E5_ENABLE_PIN,STATE)
508
     #define E5_ENABLE_READ READ(E5_ENABLE_PIN)
487
     #define E5_ENABLE_READ READ(E5_ENABLE_PIN)

+ 4
- 6
platformio.ini View File

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

Loading…
Cancel
Save