Subversion Repositories Tronxy-X3A-Marlin

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 ron 1
/**
2
 * Marlin 3D Printer Firmware
3
 * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
 *
5
 * Based on Sprinter and grbl.
6
 * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
7
 *
8
 * This program is free software: you can redistribute it and/or modify
9
 * it under the terms of the GNU General Public License as published by
10
 * the Free Software Foundation, either version 3 of the License, or
11
 * (at your option) any later version.
12
 *
13
 * This program is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 * GNU General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU General Public License
19
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
 *
21
 */
22
 
23
/**
24
 * stepper_indirection.cpp
25
 *
26
 * Stepper motor driver indirection to allow some stepper functions to
27
 * be done via SPI/I2c instead of direct pin manipulation.
28
 *
29
 * Part of Marlin
30
 *
31
 * Copyright (c) 2015 Dominik Wenger
32
 */
33
 
34
#include "stepper_indirection.h"
35
 
36
#include "MarlinConfig.h"
37
 
38
#include "stepper.h"
39
 
40
//
41
// TMC26X Driver objects and inits
42
//
43
#if HAS_DRIVER(TMC26X)
44
  #include <SPI.h>
45
  #include <TMC26XStepper.h>
46
 
47
  #define _TMC26X_DEFINE(ST) TMC26XStepper stepper##ST(200, ST##_CS_PIN, ST##_STEP_PIN, ST##_DIR_PIN, ST##_MAX_CURRENT, ST##_SENSE_RESISTOR)
48
 
49
  #if AXIS_DRIVER_TYPE(X, TMC26X)
50
    _TMC26X_DEFINE(X);
51
  #endif
52
  #if AXIS_DRIVER_TYPE(X2, TMC26X)
53
    _TMC26X_DEFINE(X2);
54
  #endif
55
  #if AXIS_DRIVER_TYPE(Y, TMC26X)
56
    _TMC26X_DEFINE(Y);
57
  #endif
58
  #if AXIS_DRIVER_TYPE(Y2, TMC26X)
59
    _TMC26X_DEFINE(Y2);
60
  #endif
61
  #if AXIS_DRIVER_TYPE(Z, TMC26X)
62
    _TMC26X_DEFINE(Z);
63
  #endif
64
  #if AXIS_DRIVER_TYPE(Z2, TMC26X)
65
    _TMC26X_DEFINE(Z2);
66
  #endif
67
  #if AXIS_DRIVER_TYPE(E0, TMC26X)
68
    _TMC26X_DEFINE(E0);
69
  #endif
70
  #if AXIS_DRIVER_TYPE(E1, TMC26X)
71
    _TMC26X_DEFINE(E1);
72
  #endif
73
  #if AXIS_DRIVER_TYPE(E2, TMC26X)
74
    _TMC26X_DEFINE(E2);
75
  #endif
76
  #if AXIS_DRIVER_TYPE(E3, TMC26X)
77
    _TMC26X_DEFINE(E3);
78
  #endif
79
  #if AXIS_DRIVER_TYPE(E4, TMC26X)
80
    _TMC26X_DEFINE(E4);
81
  #endif
82
 
83
  #define _TMC26X_INIT(A) do{ \
84
    stepper##A.setMicrosteps(A##_MICROSTEPS); \
85
    stepper##A.start(); \
86
  }while(0)
87
 
88
  void tmc26x_init_to_defaults() {
89
    #if AXIS_DRIVER_TYPE(X, TMC26X)
90
      _TMC26X_INIT(X);
91
    #endif
92
    #if AXIS_DRIVER_TYPE(X2, TMC26X)
93
      _TMC26X_INIT(X2);
94
    #endif
95
    #if AXIS_DRIVER_TYPE(Y, TMC26X)
96
      _TMC26X_INIT(Y);
97
    #endif
98
    #if AXIS_DRIVER_TYPE(Y2, TMC26X)
99
      _TMC26X_INIT(Y2);
100
    #endif
101
    #if AXIS_DRIVER_TYPE(Z, TMC26X)
102
      _TMC26X_INIT(Z);
103
    #endif
104
    #if AXIS_DRIVER_TYPE(Z2, TMC26X)
105
      _TMC26X_INIT(Z2);
106
    #endif
107
    #if AXIS_DRIVER_TYPE(E0, TMC26X)
108
      _TMC26X_INIT(E0);
109
    #endif
110
    #if AXIS_DRIVER_TYPE(E1, TMC26X)
111
      _TMC26X_INIT(E1);
112
    #endif
113
    #if AXIS_DRIVER_TYPE(E2, TMC26X)
114
      _TMC26X_INIT(E2);
115
    #endif
116
    #if AXIS_DRIVER_TYPE(E3, TMC26X)
117
      _TMC26X_INIT(E3);
118
    #endif
119
    #if AXIS_DRIVER_TYPE(E4, TMC26X)
120
      _TMC26X_INIT(E4);
121
    #endif
122
  }
123
#endif // TMC26X
124
 
125
//
126
// TMC2130 Driver objects and inits
127
//
128
#if HAS_DRIVER(TMC2130)
129
 
130
  #include <SPI.h>
131
  #include <TMC2130Stepper.h>
132
  #include "planner.h"
133
  #include "enum.h"
134
 
135
  #if TMC2130STEPPER_VERSION < 0x020201
136
    #error "Update TMC2130Stepper library to 2.2.1 or newer."
137
  #endif
138
 
139
  #if ENABLED(TMC_USE_SW_SPI)
140
    #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)
141
  #else
142
    #define _TMC2130_DEFINE(ST) TMC2130Stepper stepper##ST(ST##_ENABLE_PIN, ST##_DIR_PIN, ST##_STEP_PIN, ST##_CS_PIN)
143
  #endif
144
 
145
  // Stepper objects of TMC2130 steppers used
146
  #if AXIS_DRIVER_TYPE(X, TMC2130)
147
    _TMC2130_DEFINE(X);
148
  #endif
149
  #if AXIS_DRIVER_TYPE(X2, TMC2130)
150
    _TMC2130_DEFINE(X2);
151
  #endif
152
  #if AXIS_DRIVER_TYPE(Y, TMC2130)
153
    _TMC2130_DEFINE(Y);
154
  #endif
155
  #if AXIS_DRIVER_TYPE(Y2, TMC2130)
156
    _TMC2130_DEFINE(Y2);
157
  #endif
158
  #if AXIS_DRIVER_TYPE(Z, TMC2130)
159
    _TMC2130_DEFINE(Z);
160
  #endif
161
  #if AXIS_DRIVER_TYPE(Z2, TMC2130)
162
    _TMC2130_DEFINE(Z2);
163
  #endif
164
  #if AXIS_DRIVER_TYPE(E0, TMC2130)
165
    _TMC2130_DEFINE(E0);
166
  #endif
167
  #if AXIS_DRIVER_TYPE(E1, TMC2130)
168
    _TMC2130_DEFINE(E1);
169
  #endif
170
  #if AXIS_DRIVER_TYPE(E2, TMC2130)
171
    _TMC2130_DEFINE(E2);
172
  #endif
173
  #if AXIS_DRIVER_TYPE(E3, TMC2130)
174
    _TMC2130_DEFINE(E3);
175
  #endif
176
  #if AXIS_DRIVER_TYPE(E4, TMC2130)
177
    _TMC2130_DEFINE(E4);
178
  #endif
179
 
180
  // Use internal reference voltage for current calculations. This is the default.
181
  // Following values from Trinamic's spreadsheet with values for a NEMA17 (42BYGHW609)
182
  // https://www.trinamic.com/products/integrated-circuits/details/tmc2130/
183
  void tmc2130_init(TMC2130Stepper &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const float spmm) {
184
    #if DISABLED(STEALTHCHOP) || DISABLED(HYBRID_THRESHOLD)
185
      UNUSED(thrs);
186
      UNUSED(spmm);
187
    #endif
188
    st.begin();
189
    st.setCurrent(mA, R_SENSE, HOLD_MULTIPLIER);
190
    st.microsteps(microsteps);
191
    st.blank_time(24);
192
    st.off_time(5); // Only enables the driver if used with stealthChop
193
    st.interpolate(INTERPOLATE);
194
    st.power_down_delay(128); // ~2s until driver lowers to hold current
195
    st.hysteresis_start(3);
196
    st.hysteresis_end(2);
197
    #if ENABLED(STEALTHCHOP)
198
      st.stealth_freq(1); // f_pwm = 2/683 f_clk
199
      st.stealth_autoscale(1);
200
      st.stealth_gradient(5);
201
      st.stealth_amplitude(255);
202
      st.stealthChop(1);
203
      #if ENABLED(HYBRID_THRESHOLD)
204
        st.stealth_max_speed(12650000UL*microsteps/(256*thrs*spmm));
205
      #endif
206
    #endif
207
    st.GSTAT(); // Clear GSTAT
208
  }
209
 
210
  #define _TMC2130_INIT(ST, SPMM) tmc2130_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, SPMM)
211
 
212
  void tmc2130_init_to_defaults() {
213
    #if AXIS_DRIVER_TYPE(X, TMC2130)
214
      _TMC2130_INIT( X, planner.axis_steps_per_mm[X_AXIS]);
215
    #endif
216
    #if AXIS_DRIVER_TYPE(X2, TMC2130)
217
      _TMC2130_INIT(X2, planner.axis_steps_per_mm[X_AXIS]);
218
    #endif
219
    #if AXIS_DRIVER_TYPE(Y, TMC2130)
220
      _TMC2130_INIT( Y, planner.axis_steps_per_mm[Y_AXIS]);
221
    #endif
222
    #if AXIS_DRIVER_TYPE(Y2, TMC2130)
223
      _TMC2130_INIT(Y2, planner.axis_steps_per_mm[Y_AXIS]);
224
    #endif
225
    #if AXIS_DRIVER_TYPE(Z, TMC2130)
226
      _TMC2130_INIT( Z, planner.axis_steps_per_mm[Z_AXIS]);
227
    #endif
228
    #if AXIS_DRIVER_TYPE(Z2, TMC2130)
229
      _TMC2130_INIT(Z2, planner.axis_steps_per_mm[Z_AXIS]);
230
    #endif
231
    #if AXIS_DRIVER_TYPE(E0, TMC2130)
232
      _TMC2130_INIT(E0, planner.axis_steps_per_mm[E_AXIS]);
233
    #endif
234
    #if AXIS_DRIVER_TYPE(E1, TMC2130)
235
      { constexpr int extruder = 1; _TMC2130_INIT(E1, planner.axis_steps_per_mm[E_AXIS_N]); }
236
    #endif
237
    #if AXIS_DRIVER_TYPE(E2, TMC2130)
238
      { constexpr int extruder = 2; _TMC2130_INIT(E2, planner.axis_steps_per_mm[E_AXIS_N]); }
239
    #endif
240
    #if AXIS_DRIVER_TYPE(E3, TMC2130)
241
      { constexpr int extruder = 3; _TMC2130_INIT(E3, planner.axis_steps_per_mm[E_AXIS_N]); }
242
    #endif
243
    #if AXIS_DRIVER_TYPE(E4, TMC2130)
244
      { constexpr int extruder = 4; _TMC2130_INIT(E4, planner.axis_steps_per_mm[E_AXIS_N]); }
245
    #endif
246
 
247
    #if ENABLED(SENSORLESS_HOMING)
248
      #define TMC_INIT_SGT(P,Q) stepper##Q.sgt(P##_HOMING_SENSITIVITY);
249
      #if X_SENSORLESS
250
        #if AXIS_DRIVER_TYPE(X, TMC2130)
251
          stepperX.sgt(X_HOMING_SENSITIVITY);
252
        #endif
253
        #if AXIS_DRIVER_TYPE(X2, TMC2130)
254
          stepperX2.sgt(X_HOMING_SENSITIVITY);
255
        #endif
256
      #endif
257
      #if Y_SENSORLESS
258
        #if AXIS_DRIVER_TYPE(Y, TMC2130)
259
          stepperY.sgt(Y_HOMING_SENSITIVITY);
260
        #endif
261
        #if AXIS_DRIVER_TYPE(Y2, TMC2130)
262
          stepperY2.sgt(Y_HOMING_SENSITIVITY);
263
        #endif
264
      #endif
265
      #if Z_SENSORLESS
266
        #if AXIS_DRIVER_TYPE(Z, TMC2130)
267
          stepperZ.sgt(Z_HOMING_SENSITIVITY);
268
        #endif
269
        #if AXIS_DRIVER_TYPE(Z2, TMC2130)
270
          stepperZ2.sgt(Z_HOMING_SENSITIVITY);
271
        #endif
272
      #endif
273
    #endif
274
  }
275
#endif // TMC2130
276
 
277
//
278
// TMC2208 Driver objects and inits
279
//
280
#if HAS_DRIVER(TMC2208)
281
 
282
  #undef HardwareSerial_h // undo Marlin trickery
283
  #include <SoftwareSerial.h>
284
  #include <HardwareSerial.h>
285
  #include <TMC2208Stepper.h>
286
  #include "planner.h"
287
 
288
  #if TMC2208STEPPER_VERSION < 0x000101
289
    #error "Update TMC2208Stepper library to 0.1.1 or newer."
290
  #endif
291
 
292
  #define _TMC2208_DEFINE_HARDWARE(ST) TMC2208Stepper stepper##ST(&ST##_HARDWARE_SERIAL)
293
  #define _TMC2208_DEFINE_SOFTWARE(ST) TMC2208Stepper stepper##ST(ST##_SERIAL_RX_PIN, ST##_SERIAL_TX_PIN, ST##_SERIAL_RX_PIN > -1)
294
 
295
  // Stepper objects of TMC2208 steppers used
296
  #if AXIS_DRIVER_TYPE(X, TMC2208)
297
    #ifdef X_HARDWARE_SERIAL
298
      _TMC2208_DEFINE_HARDWARE(X);
299
    #else
300
      _TMC2208_DEFINE_SOFTWARE(X);
301
    #endif
302
  #endif
303
  #if AXIS_DRIVER_TYPE(X2, TMC2208)
304
    #ifdef X2_HARDWARE_SERIAL
305
      _TMC2208_DEFINE_HARDWARE(X2);
306
    #else
307
      _TMC2208_DEFINE_SOFTWARE(X2);
308
    #endif
309
  #endif
310
  #if AXIS_DRIVER_TYPE(Y, TMC2208)
311
    #ifdef Y_HARDWARE_SERIAL
312
      _TMC2208_DEFINE_HARDWARE(Y);
313
    #else
314
      _TMC2208_DEFINE_SOFTWARE(Y);
315
    #endif
316
  #endif
317
  #if AXIS_DRIVER_TYPE(Y2, TMC2208)
318
    #ifdef Y2_HARDWARE_SERIAL
319
      _TMC2208_DEFINE_HARDWARE(Y2);
320
    #else
321
      _TMC2208_DEFINE_SOFTWARE(Y2);
322
    #endif
323
  #endif
324
  #if AXIS_DRIVER_TYPE(Z, TMC2208)
325
    #ifdef Z_HARDWARE_SERIAL
326
      _TMC2208_DEFINE_HARDWARE(Z);
327
    #else
328
      _TMC2208_DEFINE_SOFTWARE(Z);
329
    #endif
330
  #endif
331
  #if AXIS_DRIVER_TYPE(Z2, TMC2208)
332
    #ifdef Z2_HARDWARE_SERIAL
333
      _TMC2208_DEFINE_HARDWARE(Z2);
334
    #else
335
      _TMC2208_DEFINE_SOFTWARE(Z2);
336
    #endif
337
  #endif
338
  #if AXIS_DRIVER_TYPE(E0, TMC2208)
339
    #ifdef E0_HARDWARE_SERIAL
340
      _TMC2208_DEFINE_HARDWARE(E0);
341
    #else
342
      _TMC2208_DEFINE_SOFTWARE(E0);
343
    #endif
344
  #endif
345
  #if AXIS_DRIVER_TYPE(E1, TMC2208)
346
    #ifdef E1_HARDWARE_SERIAL
347
      _TMC2208_DEFINE_HARDWARE(E1);
348
    #else
349
      _TMC2208_DEFINE_SOFTWARE(E1);
350
    #endif
351
  #endif
352
  #if AXIS_DRIVER_TYPE(E2, TMC2208)
353
    #ifdef E2_HARDWARE_SERIAL
354
      _TMC2208_DEFINE_HARDWARE(E2);
355
    #else
356
      _TMC2208_DEFINE_SOFTWARE(E2);
357
    #endif
358
  #endif
359
  #if AXIS_DRIVER_TYPE(E3, TMC2208)
360
    #ifdef E3_HARDWARE_SERIAL
361
      _TMC2208_DEFINE_HARDWARE(E3);
362
    #else
363
      _TMC2208_DEFINE_SOFTWARE(E3);
364
    #endif
365
  #endif
366
  #if AXIS_DRIVER_TYPE(E4, TMC2208)
367
    #ifdef E4_HARDWARE_SERIAL
368
      _TMC2208_DEFINE_HARDWARE(E4);
369
    #else
370
      _TMC2208_DEFINE_SOFTWARE(E4);
371
    #endif
372
  #endif
373
 
374
  void tmc2208_serial_begin() {
375
    #if AXIS_DRIVER_TYPE(X, TMC2208)
376
      #ifdef X_HARDWARE_SERIAL
377
        X_HARDWARE_SERIAL.begin(115200);
378
      #else
379
        stepperX.beginSerial(115200);
380
      #endif
381
    #endif
382
    #if AXIS_DRIVER_TYPE(X2, TMC2208)
383
      #ifdef X2_HARDWARE_SERIAL
384
        X2_HARDWARE_SERIAL.begin(115200);
385
      #else
386
        stepperX2.beginSerial(115200);
387
      #endif
388
    #endif
389
    #if AXIS_DRIVER_TYPE(Y, TMC2208)
390
      #ifdef Y_HARDWARE_SERIAL
391
        Y_HARDWARE_SERIAL.begin(115200);
392
      #else
393
        stepperY.beginSerial(115200);
394
      #endif
395
    #endif
396
    #if AXIS_DRIVER_TYPE(Y2, TMC2208)
397
      #ifdef Y2_HARDWARE_SERIAL
398
        Y2_HARDWARE_SERIAL.begin(115200);
399
      #else
400
        stepperY2.beginSerial(115200);
401
      #endif
402
    #endif
403
    #if AXIS_DRIVER_TYPE(Z, TMC2208)
404
      #ifdef Z_HARDWARE_SERIAL
405
        Z_HARDWARE_SERIAL.begin(115200);
406
      #else
407
        stepperZ.beginSerial(115200);
408
      #endif
409
    #endif
410
    #if AXIS_DRIVER_TYPE(Z2, TMC2208)
411
      #ifdef Z2_HARDWARE_SERIAL
412
        Z2_HARDWARE_SERIAL.begin(115200);
413
      #else
414
        stepperZ2.beginSerial(115200);
415
      #endif
416
    #endif
417
    #if AXIS_DRIVER_TYPE(E0, TMC2208)
418
      #ifdef E0_HARDWARE_SERIAL
419
        E0_HARDWARE_SERIAL.begin(115200);
420
      #else
421
        stepperE0.beginSerial(115200);
422
      #endif
423
    #endif
424
    #if AXIS_DRIVER_TYPE(E1, TMC2208)
425
      #ifdef E1_HARDWARE_SERIAL
426
        E1_HARDWARE_SERIAL.begin(115200);
427
      #else
428
        stepperE1.beginSerial(115200);
429
      #endif
430
    #endif
431
    #if AXIS_DRIVER_TYPE(E2, TMC2208)
432
      #ifdef E2_HARDWARE_SERIAL
433
        E2_HARDWARE_SERIAL.begin(115200);
434
      #else
435
        stepperE2.beginSerial(115200);
436
      #endif
437
    #endif
438
    #if AXIS_DRIVER_TYPE(E3, TMC2208)
439
      #ifdef E3_HARDWARE_SERIAL
440
        E3_HARDWARE_SERIAL.begin(115200);
441
      #else
442
        stepperE3.beginSerial(115200);
443
      #endif
444
    #endif
445
    #if AXIS_DRIVER_TYPE(E4, TMC2208)
446
      #ifdef E4_HARDWARE_SERIAL
447
        E4_HARDWARE_SERIAL.begin(115200);
448
      #else
449
        stepperE4.beginSerial(115200);
450
      #endif
451
    #endif
452
  }
453
 
454
  // Use internal reference voltage for current calculations. This is the default.
455
  // Following values from Trinamic's spreadsheet with values for a NEMA17 (42BYGHW609)
456
  void tmc2208_init(TMC2208Stepper &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const float spmm) {
457
    st.pdn_disable(true); // Use UART
458
    st.mstep_reg_select(true); // Select microsteps with UART
459
    st.I_scale_analog(false);
460
    st.rms_current(mA, HOLD_MULTIPLIER, R_SENSE);
461
    st.microsteps(microsteps);
462
    st.blank_time(24);
463
    st.toff(5);
464
    st.intpol(INTERPOLATE);
465
    st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
466
    st.hysteresis_start(3);
467
    st.hysteresis_end(2);
468
    #if ENABLED(STEALTHCHOP)
469
      st.pwm_lim(12);
470
      st.pwm_reg(8);
471
      st.pwm_autograd(1);
472
      st.pwm_autoscale(1);
473
      st.pwm_freq(1);
474
      st.pwm_grad(14);
475
      st.pwm_ofs(36);
476
      st.en_spreadCycle(false);
477
      #if ENABLED(HYBRID_THRESHOLD)
478
        st.TPWMTHRS(12650000UL*microsteps/(256*thrs*spmm));
479
      #else
480
        UNUSED(thrs);
481
        UNUSED(spmm);
482
      #endif
483
    #else
484
      st.en_spreadCycle(true);
485
    #endif
486
    st.GSTAT(0b111); // Clear
487
    delay(200);
488
  }
489
 
490
  #define _TMC2208_INIT(ST, SPMM) tmc2208_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, SPMM)
491
 
492
  void tmc2208_init_to_defaults() {
493
    #if AXIS_DRIVER_TYPE(X, TMC2208)
494
      _TMC2208_INIT(X, planner.axis_steps_per_mm[X_AXIS]);
495
    #endif
496
    #if AXIS_DRIVER_TYPE(X2, TMC2208)
497
      _TMC2208_INIT(X2, planner.axis_steps_per_mm[X_AXIS]);
498
    #endif
499
    #if AXIS_DRIVER_TYPE(Y, TMC2208)
500
      _TMC2208_INIT(Y, planner.axis_steps_per_mm[Y_AXIS]);
501
    #endif
502
    #if AXIS_DRIVER_TYPE(Y2, TMC2208)
503
      _TMC2208_INIT(Y2, planner.axis_steps_per_mm[Y_AXIS]);
504
    #endif
505
    #if AXIS_DRIVER_TYPE(Z, TMC2208)
506
      _TMC2208_INIT(Z, planner.axis_steps_per_mm[Z_AXIS]);
507
    #endif
508
    #if AXIS_DRIVER_TYPE(Z2, TMC2208)
509
      _TMC2208_INIT(Z2, planner.axis_steps_per_mm[Z_AXIS]);
510
    #endif
511
    #if AXIS_DRIVER_TYPE(E0, TMC2208)
512
      _TMC2208_INIT(E0, planner.axis_steps_per_mm[E_AXIS]);
513
    #endif
514
    #if AXIS_DRIVER_TYPE(E1, TMC2208)
515
      { constexpr int extruder = 1; _TMC2208_INIT(E1, planner.axis_steps_per_mm[E_AXIS_N]); }
516
    #endif
517
    #if AXIS_DRIVER_TYPE(E2, TMC2208)
518
      { constexpr int extruder = 2; _TMC2208_INIT(E2, planner.axis_steps_per_mm[E_AXIS_N]); }
519
    #endif
520
    #if AXIS_DRIVER_TYPE(E3, TMC2208)
521
      { constexpr int extruder = 3; _TMC2208_INIT(E3, planner.axis_steps_per_mm[E_AXIS_N]); }
522
    #endif
523
    #if AXIS_DRIVER_TYPE(E4, TMC2208)
524
      { constexpr int extruder = 4; _TMC2208_INIT(E4, planner.axis_steps_per_mm[E_AXIS_N]); }
525
    #endif
526
  }
527
#endif // TMC2208
528
 
529
void restore_stepper_drivers() {
530
  #if AXIS_IS_TMC(X)
531
    stepperX.push();
532
  #endif
533
  #if AXIS_IS_TMC(X2)
534
    stepperX2.push();
535
  #endif
536
  #if AXIS_IS_TMC(Y)
537
    stepperY.push();
538
  #endif
539
  #if AXIS_IS_TMC(Y2)
540
    stepperY2.push();
541
  #endif
542
  #if AXIS_IS_TMC(Z)
543
    stepperZ.push();
544
  #endif
545
  #if AXIS_IS_TMC(Z2)
546
    stepperZ2.push();
547
  #endif
548
  #if AXIS_IS_TMC(E0)
549
    stepperE0.push();
550
  #endif
551
  #if AXIS_IS_TMC(E1)
552
    stepperE1.push();
553
  #endif
554
  #if AXIS_IS_TMC(E2)
555
    stepperE2.push();
556
  #endif
557
  #if AXIS_IS_TMC(E3)
558
    stepperE3.push();
559
  #endif
560
  #if AXIS_IS_TMC(E4)
561
    stepperE4.push();
562
  #endif
563
}
564
 
565
void reset_stepper_drivers() {
566
  #if HAS_DRIVER(TMC26X)
567
    tmc26x_init_to_defaults();
568
  #endif
569
  #if HAS_DRIVER(TMC2130)
570
    delay(100);
571
    tmc2130_init_to_defaults();
572
  #endif
573
  #if HAS_DRIVER(TMC2208)
574
    delay(100);
575
    tmc2208_init_to_defaults();
576
  #endif
577
  #ifdef TMC_ADV
578
    TMC_ADV()
579
  #endif
580
  #if HAS_DRIVER(L6470)
581
    L6470_init_to_defaults();
582
  #endif
583
  stepper.set_directions();
584
}
585
 
586
//
587
// L6470 Driver objects and inits
588
//
589
#if HAS_DRIVER(L6470)
590
 
591
  #include <SPI.h>
592
  #include <L6470.h>
593
 
594
  #define _L6470_DEFINE(ST) L6470 stepper##ST(ST##_ENABLE_PIN)
595
 
596
  // L6470 Stepper objects
597
  #if AXIS_DRIVER_TYPE(X, L6470)
598
    _L6470_DEFINE(X);
599
  #endif
600
  #if AXIS_DRIVER_TYPE(X2, L6470)
601
    _L6470_DEFINE(X2);
602
  #endif
603
  #if AXIS_DRIVER_TYPE(Y, L6470)
604
    _L6470_DEFINE(Y);
605
  #endif
606
  #if AXIS_DRIVER_TYPE(Y2, L6470)
607
    _L6470_DEFINE(Y2);
608
  #endif
609
  #if AXIS_DRIVER_TYPE(Z, L6470)
610
    _L6470_DEFINE(Z);
611
  #endif
612
  #if AXIS_DRIVER_TYPE(Z2, L6470)
613
    _L6470_DEFINE(Z2);
614
  #endif
615
  #if AXIS_DRIVER_TYPE(E0, L6470)
616
    _L6470_DEFINE(E0);
617
  #endif
618
  #if AXIS_DRIVER_TYPE(E1, L6470)
619
    _L6470_DEFINE(E1);
620
  #endif
621
  #if AXIS_DRIVER_TYPE(E2, L6470)
622
    _L6470_DEFINE(E2);
623
  #endif
624
  #if AXIS_DRIVER_TYPE(E3, L6470)
625
    _L6470_DEFINE(E3);
626
  #endif
627
  #if AXIS_DRIVER_TYPE(E4, L6470)
628
    _L6470_DEFINE(E4);
629
  #endif
630
 
631
  #define _L6470_INIT(A) do{ \
632
    stepper##A.init(); \
633
    stepper##A.softFree(); \
634
    stepper##A.setMicroSteps(A##_MICROSTEPS); \
635
    stepper##A.setOverCurrent(A##_OVERCURRENT); \
636
    stepper##A.setStallCurrent(A##_STALLCURRENT); \
637
  }while(0)
638
 
639
  void L6470_init_to_defaults() {
640
    #if AXIS_DRIVER_TYPE(X, L6470)
641
      _L6470_INIT(X);
642
    #endif
643
    #if AXIS_DRIVER_TYPE(X2, L6470)
644
      _L6470_INIT(X2);
645
    #endif
646
    #if AXIS_DRIVER_TYPE(Y, L6470)
647
      _L6470_INIT(Y);
648
    #endif
649
    #if AXIS_DRIVER_TYPE(Y2, L6470)
650
      _L6470_INIT(Y2);
651
    #endif
652
    #if AXIS_DRIVER_TYPE(Z, L6470)
653
      _L6470_INIT(Z);
654
    #endif
655
    #if AXIS_DRIVER_TYPE(Z2, L6470)
656
      _L6470_INIT(Z2);
657
    #endif
658
    #if AXIS_DRIVER_TYPE(E0, L6470)
659
      _L6470_INIT(E0);
660
    #endif
661
    #if AXIS_DRIVER_TYPE(E1, L6470)
662
      _L6470_INIT(E1);
663
    #endif
664
    #if AXIS_DRIVER_TYPE(E2, L6470)
665
      _L6470_INIT(E2);
666
    #endif
667
    #if AXIS_DRIVER_TYPE(E3, L6470)
668
      _L6470_INIT(E3);
669
    #endif
670
    #if AXIS_DRIVER_TYPE(E4, L6470)
671
      _L6470_INIT(E4);
672
    #endif
673
  }
674
 
675
#endif // L6470