瀏覽代碼

Add support for TMC2660 (#11998)

teemuatlut 6 年之前
父節點
當前提交
c447d75916

+ 1
- 1
Marlin/src/Marlin.cpp 查看文件

@@ -739,7 +739,7 @@ void setup() {
739 739
   SERIAL_PROTOCOLLNPGM("start");
740 740
   SERIAL_ECHO_START();
741 741
 
742
-  #if HAS_DRIVER(TMC2130)
742
+  #if TMC_HAS_SPI
743 743
     #if DISABLED(TMC_USE_SW_SPI)
744 744
       SPI.begin();
745 745
     #endif

+ 5
- 4
Marlin/src/core/drivers.h 查看文件

@@ -37,10 +37,10 @@
37 37
 #define TMC2208_STANDALONE  0x00A
38 38
 #define TMC26X              0x10B
39 39
 #define TMC26X_STANDALONE   0x00B
40
-#define TMC2660             0x10C
40
+#define TMC2660             2660
41 41
 #define TMC2660_STANDALONE  0x00C
42 42
 
43
-#define _AXIS_DRIVER_TYPE(A,T) ( defined(A##_DRIVER_TYPE) && (A##_DRIVER_TYPE == T) )
43
+#define _AXIS_DRIVER_TYPE(A,T) (defined(A##_DRIVER_TYPE) && (A##_DRIVER_TYPE == T))
44 44
 
45 45
 #define AXIS_DRIVER_TYPE_X(T) _AXIS_DRIVER_TYPE(X,T)
46 46
 #define AXIS_DRIVER_TYPE_Y(T) _AXIS_DRIVER_TYPE(Y,T)
@@ -67,7 +67,8 @@
67 67
 
68 68
 // Test for supported TMC drivers that require advanced configuration
69 69
 // Does not match standalone configurations
70
-#define HAS_TRINAMIC (HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2208))
70
+#define HAS_TRINAMIC (HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2208) || HAS_DRIVER(TMC2660))
71 71
 
72 72
 #define AXIS_IS_TMC(A) ( AXIS_DRIVER_TYPE_##A(TMC2130) || \
73
-                         AXIS_DRIVER_TYPE_##A(TMC2208) )
73
+                         AXIS_DRIVER_TYPE_##A(TMC2208) || \
74
+                         AXIS_DRIVER_TYPE_##A(TMC2660) )

+ 1
- 1
Marlin/src/feature/pause.cpp 查看文件

@@ -310,7 +310,7 @@ bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/,
310 310
   #endif
311 311
 
312 312
   // Disable extruders steppers for manual filament changing (only on boards that have separate ENABLE_PINS)
313
-  #if E0_ENABLE_PIN != X_ENABLE_PIN && E1_ENABLE_PIN != Y_ENABLE_PIN
313
+  #if (E0_ENABLE_PIN != X_ENABLE_PIN && E1_ENABLE_PIN != Y_ENABLE_PIN) || AXIS_DRIVER_TYPE(E0, TMC2660) || AXIS_DRIVER_TYPE(E1, TMC2660) || AXIS_DRIVER_TYPE(E2, TMC2660) || AXIS_DRIVER_TYPE(E3, TMC2660) || AXIS_DRIVER_TYPE(E4, TMC2660) || AXIS_DRIVER_TYPE(E5, TMC2660)
314 314
     disable_e_stepper(active_extruder);
315 315
     safe_delay(100);
316 316
   #endif

+ 104
- 36
Marlin/src/feature/tmc_util.cpp 查看文件

@@ -53,8 +53,10 @@
53 53
     bool is_error;
54 54
   };
55 55
   #if HAS_DRIVER(TMC2130)
56
-    static uint32_t get_pwm_scale(TMC2130Stepper &st) { return st.PWM_SCALE(); }
57
-    static uint8_t get_status_response(TMC2130Stepper &st) { return st.status_response & 0xF; }
56
+    #if ENABLED(TMC_DEBUG)
57
+      static uint32_t get_pwm_scale(TMC2130Stepper &st) { return st.PWM_SCALE(); }
58
+      static uint8_t get_status_response(TMC2130Stepper &st) { return st.status_response & 0xF; }
59
+    #endif
58 60
     static TMC_driver_data get_driver_data(TMC2130Stepper &st) {
59 61
       constexpr uint32_t OTPW_bm = 0x4000000UL;
60 62
       constexpr uint8_t OTPW_bp = 26;
@@ -71,15 +73,17 @@
71 73
     }
72 74
   #endif
73 75
   #if HAS_DRIVER(TMC2208)
74
-    static uint32_t get_pwm_scale(TMC2208Stepper &st) { return st.pwm_scale_sum(); }
75
-    static uint8_t get_status_response(TMC2208Stepper &st) {
76
-      uint32_t drv_status = st.DRV_STATUS();
77
-      uint8_t gstat = st.GSTAT();
78
-      uint8_t response = 0;
79
-      response |= (drv_status >> (31-3)) & 0b1000;
80
-      response |= gstat & 0b11;
81
-      return response;
82
-    }
76
+    #if ENABLED(TMC_DEBUG)
77
+      static uint32_t get_pwm_scale(TMC2208Stepper &st) { return st.pwm_scale_sum(); }
78
+      static uint8_t get_status_response(TMC2208Stepper &st) {
79
+        uint32_t drv_status = st.DRV_STATUS();
80
+        uint8_t gstat = st.GSTAT();
81
+        uint8_t response = 0;
82
+        response |= (drv_status >> (31-3)) & 0b1000;
83
+        response |= gstat & 0b11;
84
+        return response;
85
+      }
86
+    #endif
83 87
     static TMC_driver_data get_driver_data(TMC2208Stepper &st) {
84 88
       constexpr uint32_t OTPW_bm = 0b1ul;
85 89
       constexpr uint8_t OTPW_bp = 0;
@@ -93,6 +97,25 @@
93 97
       return data;
94 98
     }
95 99
   #endif
100
+  #if HAS_DRIVER(TMC2660)
101
+    #if ENABLED(TMC_DEBUG)
102
+      static uint32_t get_pwm_scale(TMC2660Stepper) { return 0; }
103
+      static uint8_t get_status_response(TMC2660Stepper) { return 0; }
104
+    #endif
105
+    static TMC_driver_data get_driver_data(TMC2660Stepper &st) {
106
+      constexpr uint32_t OTPW_bm = 0x4UL;
107
+      constexpr uint8_t OTPW_bp = 2;
108
+      constexpr uint32_t OT_bm = 0x2UL;
109
+      constexpr uint8_t OT_bp = 1;
110
+      constexpr uint8_t DRIVER_ERROR_bm = 0x1EUL;
111
+      TMC_driver_data data;
112
+      data.drv_status = st.DRVSTATUS();
113
+      data.is_otpw = (data.drv_status & OTPW_bm) >> OTPW_bp;
114
+      data.is_ot = (data.drv_status & OT_bm) >> OT_bp;
115
+      data.is_error = data.drv_status & DRIVER_ERROR_bm;
116
+      return data;
117
+    }
118
+  #endif
96 119
 
97 120
   template<typename TMC>
98 121
   void monitor_tmc_driver(TMC &st) {
@@ -161,7 +184,7 @@
161 184
     #endif
162 185
   }
163 186
 
164
-  #define HAS_HW_COMMS(ST) AXIS_DRIVER_TYPE(ST, TMC2130) || (AXIS_DRIVER_TYPE(ST, TMC2208) && defined(ST##_HARDWARE_SERIAL))
187
+  #define HAS_HW_COMMS(ST) AXIS_DRIVER_TYPE(ST, TMC2130) || AXIS_DRIVER_TYPE(ST, TMC2660) || (AXIS_DRIVER_TYPE(ST, TMC2208) && defined(ST##_HARDWARE_SERIAL))
165 188
 
166 189
   void monitor_tmc_driver() {
167 190
     static millis_t next_cOT = 0;
@@ -217,6 +240,16 @@
217 240
 
218 241
 #if ENABLED(TMC_DEBUG)
219 242
 
243
+  /**
244
+   * M122 S[1,0] Enable periodic status reports
245
+   */
246
+  #if ENABLED(MONITOR_DRIVER_STATUS)
247
+    void tmc_set_report_status(const bool status) {
248
+      if ((report_tmc_status = status))
249
+        SERIAL_ECHOLNPGM("axis:pwm_scale |status_response|");
250
+    }
251
+  #endif
252
+
220 253
   enum TMC_debug_enum : char {
221 254
     TMC_CODES,
222 255
     TMC_ENABLED,
@@ -291,6 +324,7 @@
291 324
         case TMC_STALLGUARD: if (st.stallguard()) SERIAL_CHAR('X'); break;
292 325
         case TMC_SG_RESULT:  SERIAL_PRINT(st.sg_result(), DEC);   break;
293 326
         case TMC_FSACTIVE:   if (st.fsactive())   SERIAL_CHAR('X'); break;
327
+        case TMC_DRV_CS_ACTUAL: SERIAL_PRINT(st.cs_actual(), DEC); break;
294 328
         default: break;
295 329
       }
296 330
     }
@@ -312,11 +346,16 @@
312 346
         case TMC_T150: if (st.t150()) SERIAL_CHAR('X'); break;
313 347
         case TMC_T143: if (st.t143()) SERIAL_CHAR('X'); break;
314 348
         case TMC_T120: if (st.t120()) SERIAL_CHAR('X'); break;
349
+        case TMC_DRV_CS_ACTUAL: SERIAL_PRINT(st.cs_actual(), DEC); break;
315 350
         default: break;
316 351
       }
317 352
     }
318 353
   #endif
319 354
 
355
+  #if HAS_DRIVER(TMC2660)
356
+    static void _tmc_parse_drv_status(TMC2660Stepper, const TMC_drv_status_enum) { }
357
+  #endif
358
+
320 359
   template <typename TMC>
321 360
   static void tmc_status(TMC &st, const TMC_debug_enum i, const float spmm) {
322 361
     SERIAL_ECHO('\t');
@@ -355,7 +394,9 @@
355 394
         }
356 395
         break;
357 396
       case TMC_OTPW: serialprintPGM(st.otpw() ? PSTR("true") : PSTR("false")); break;
358
-      case TMC_OTPW_TRIGGERED: serialprintPGM(st.getOTPW() ? PSTR("true") : PSTR("false")); break;
397
+      #if ENABLED(MONITOR_DRIVER_STATUS)
398
+        case TMC_OTPW_TRIGGERED: serialprintPGM(st.getOTPW() ? PSTR("true") : PSTR("false")); break;
399
+      #endif
359 400
       case TMC_TOFF: SERIAL_PRINT(st.toff(), DEC); break;
360 401
       case TMC_TBL: SERIAL_PRINT(st.blank_time(), DEC); break;
361 402
       case TMC_HEND: SERIAL_PRINT(st.hysteresis_end(), DEC); break;
@@ -364,6 +405,34 @@
364 405
     }
365 406
   }
366 407
 
408
+  #if HAS_DRIVER(TMC2660)
409
+    template<char AXIS_LETTER, char DRIVER_ID>
410
+    void tmc_status(TMCMarlin<TMC2660Stepper, AXIS_LETTER, DRIVER_ID> &st, const TMC_debug_enum i, const float) {
411
+      SERIAL_ECHO('\t');
412
+      switch (i) {
413
+        case TMC_CODES: st.printLabel(); break;
414
+        case TMC_ENABLED: serialprintPGM(st.isEnabled() ? PSTR("true") : PSTR("false")); break;
415
+        case TMC_CURRENT: SERIAL_ECHO(st.getMilliamps()); break;
416
+        case TMC_RMS_CURRENT: SERIAL_PROTOCOL(st.rms_current()); break;
417
+        case TMC_MAX_CURRENT: SERIAL_PRINT((float)st.rms_current() * 1.41, 0); break;
418
+        case TMC_IRUN:
419
+          SERIAL_PRINT(st.cs(), DEC);
420
+          SERIAL_ECHOPGM("/31");
421
+          break;
422
+        case TMC_VSENSE: serialprintPGM(st.vsense() ? PSTR("1=.165") : PSTR("0=.310")); break;
423
+        case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break;
424
+        //case TMC_OTPW: serialprintPGM(st.otpw() ? PSTR("true") : PSTR("false")); break;
425
+        //case TMC_OTPW_TRIGGERED: serialprintPGM(st.getOTPW() ? PSTR("true") : PSTR("false")); break;
426
+        case TMC_SGT: SERIAL_PRINT(st.sgt(), DEC); break;
427
+        case TMC_TOFF: SERIAL_PRINT(st.toff(), DEC); break;
428
+        case TMC_TBL: SERIAL_PRINT(st.blank_time(), DEC); break;
429
+        case TMC_HEND: SERIAL_PRINT(st.hysteresis_end(), DEC); break;
430
+        case TMC_HSTRT: SERIAL_PRINT(st.hysteresis_start(), DEC); break;
431
+        default: break;
432
+      }
433
+    }
434
+  #endif
435
+
367 436
   template <typename TMC>
368 437
   static void tmc_parse_drv_status(TMC &st, const TMC_drv_status_enum i) {
369 438
     SERIAL_CHAR('\t');
@@ -376,7 +445,6 @@
376 445
       case TMC_S2GA:          if (st.s2ga())         SERIAL_CHAR('X'); break;
377 446
       case TMC_DRV_OTPW:      if (st.otpw())         SERIAL_CHAR('X'); break;
378 447
       case TMC_OT:            if (st.ot())           SERIAL_CHAR('X'); break;
379
-      case TMC_DRV_CS_ACTUAL: SERIAL_PRINT(st.cs_actual(), DEC);       break;
380 448
       case TMC_DRV_STATUS_HEX:
381 449
         st.printLabel();
382 450
         SERIAL_ECHOPGM("\t0x");
@@ -503,10 +571,6 @@
503 571
   /**
504 572
    * M122 report functions
505 573
    */
506
-  void tmc_set_report_status(const bool status) {
507
-    if ((report_tmc_status = status))
508
-      SERIAL_ECHOLNPGM("axis:pwm_scale |status_response|");
509
-  }
510 574
 
511 575
   void tmc_report_all() {
512 576
     #define TMC_REPORT(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL);  tmc_debug_loop(ITEM); }while(0)
@@ -527,8 +591,10 @@
527 591
     TMC_REPORT("pwm\nthreshold\t",   TMC_TPWMTHRS);
528 592
     TMC_REPORT("[mm/s]\t",           TMC_TPWMTHRS_MMS);
529 593
     TMC_REPORT("OT prewarn",         TMC_OTPW);
530
-    TMC_REPORT("OT prewarn has\n"
531
-               "been triggered",     TMC_OTPW_TRIGGERED);
594
+    #if ENABLED(MONITOR_DRIVER_STATUS)
595
+      TMC_REPORT("OT prewarn has\n"
596
+                 "been triggered",   TMC_OTPW_TRIGGERED);
597
+    #endif
532 598
     TMC_REPORT("off time\t",         TMC_TOFF);
533 599
     TMC_REPORT("blank time",         TMC_TBL);
534 600
     TMC_REPORT("hysteresis\n-end\t", TMC_HEND);
@@ -571,53 +637,55 @@
571 637
     #endif
572 638
     st.diag1_stall(enable ? 1 : 0);
573 639
   }
640
+  void tmc_sensorless_homing(TMC2660Stepper &st, const bool enable) {
641
+    // TODO
642
+  }
574 643
 
575 644
 #endif // USE_SENSORLESS
576 645
 
577
-#if HAS_DRIVER(TMC2130)
578
-  #define IS_TMC_SPI(ST) AXIS_DRIVER_TYPE(ST, TMC2130)
646
+#if TMC_HAS_SPI
579 647
   #define SET_CS_PIN(st) OUT_WRITE(st##_CS_PIN, HIGH)
580 648
   void tmc_init_cs_pins() {
581
-    #if IS_TMC_SPI(X)
649
+    #if AXIS_HAS_SPI(X)
582 650
       SET_CS_PIN(X);
583 651
     #endif
584
-    #if IS_TMC_SPI(Y)
652
+    #if AXIS_HAS_SPI(Y)
585 653
       SET_CS_PIN(Y);
586 654
     #endif
587
-    #if IS_TMC_SPI(Z)
655
+    #if AXIS_HAS_SPI(Z)
588 656
       SET_CS_PIN(Z);
589 657
     #endif
590
-    #if IS_TMC_SPI(X2)
658
+    #if AXIS_HAS_SPI(X2)
591 659
       SET_CS_PIN(X2);
592 660
     #endif
593
-    #if IS_TMC_SPI(Y2)
661
+    #if AXIS_HAS_SPI(Y2)
594 662
       SET_CS_PIN(Y2);
595 663
     #endif
596
-    #if IS_TMC_SPI(Z2)
664
+    #if AXIS_HAS_SPI(Z2)
597 665
       SET_CS_PIN(Z2);
598 666
     #endif
599
-    #if IS_TMC_SPI(Z3)
667
+    #if AXIS_HAS_SPI(Z3)
600 668
       SET_CS_PIN(Z3);
601 669
     #endif
602
-    #if IS_TMC_SPI(E0)
670
+    #if AXIS_HAS_SPI(E0)
603 671
       SET_CS_PIN(E0);
604 672
     #endif
605
-    #if IS_TMC_SPI(E1)
673
+    #if AXIS_HAS_SPI(E1)
606 674
       SET_CS_PIN(E1);
607 675
     #endif
608
-    #if IS_TMC_SPI(E2)
676
+    #if AXIS_HAS_SPI(E2)
609 677
       SET_CS_PIN(E2);
610 678
     #endif
611
-    #if IS_TMC_SPI(E3)
679
+    #if AXIS_HAS_SPI(E3)
612 680
       SET_CS_PIN(E3);
613 681
     #endif
614
-    #if IS_TMC_SPI(E4)
682
+    #if AXIS_HAS_SPI(E4)
615 683
       SET_CS_PIN(E4);
616 684
     #endif
617
-    #if IS_TMC_SPI(E5)
685
+    #if AXIS_HAS_SPI(E5)
618 686
       SET_CS_PIN(E5);
619 687
     #endif
620 688
   }
621
-#endif // TMC2130
689
+#endif // TMC_HAS_SPI
622 690
 
623 691
 #endif // HAS_TRINAMIC

+ 5
- 2
Marlin/src/feature/tmc_util.h 查看文件

@@ -158,7 +158,9 @@ void tmc_set_sgt(TMC &st, const int8_t sgt_val) {
158 158
 void monitor_tmc_driver();
159 159
 
160 160
 #if ENABLED(TMC_DEBUG)
161
-  void tmc_set_report_status(const bool status);
161
+  #if ENABLED(MONITOR_DRIVER_STATUS)
162
+    void tmc_set_report_status(const bool status);
163
+  #endif
162 164
   void tmc_report_all();
163 165
 #endif
164 166
 
@@ -171,9 +173,10 @@ void monitor_tmc_driver();
171 173
  */
172 174
 #if USE_SENSORLESS
173 175
   void tmc_stallguard(TMC2130Stepper &st, const bool enable=true);
176
+  void tmc_stallguard(TMC2660Stepper &st, const bool enable=true);
174 177
 #endif
175 178
 
176
-#if HAS_DRIVER(TMC2130)
179
+#if TMC_HAS_SPI
177 180
   void tmc_init_cs_pins();
178 181
 #endif
179 182
 

+ 2
- 1
Marlin/src/gcode/control/M17_M18_M84.cpp 查看文件

@@ -54,7 +54,8 @@ void GcodeSuite::M18_M84() {
54 54
       if (parser.seen('X')) disable_X();
55 55
       if (parser.seen('Y')) disable_Y();
56 56
       if (parser.seen('Z')) disable_Z();
57
-      #if E0_ENABLE_PIN != X_ENABLE_PIN && E1_ENABLE_PIN != Y_ENABLE_PIN // Only disable on boards that have separate ENABLE_PINS
57
+      // Only disable on boards that have separate ENABLE_PINS or another method for disabling the driver
58
+      #if (E0_ENABLE_PIN != X_ENABLE_PIN && E1_ENABLE_PIN != Y_ENABLE_PIN) || AXIS_DRIVER_TYPE(E0, TMC2660) || AXIS_DRIVER_TYPE(E1, TMC2660) || AXIS_DRIVER_TYPE(E2, TMC2660) || AXIS_DRIVER_TYPE(E3, TMC2660) || AXIS_DRIVER_TYPE(E4, TMC2660) || AXIS_DRIVER_TYPE(E5, TMC2660)
58 59
         if (parser.seen('E')) disable_e_steppers();
59 60
       #endif
60 61
     }

+ 8
- 4
Marlin/src/gcode/feature/trinamic/M122.cpp 查看文件

@@ -31,10 +31,14 @@
31 31
  * M122: Debug TMC drivers
32 32
  */
33 33
 void GcodeSuite::M122() {
34
-  if (parser.seen('S'))
35
-    tmc_set_report_status(parser.value_bool());
36
-  else
37
-    tmc_report_all();
34
+
35
+  #if ENABLED(MONITOR_DRIVER_STATUS)
36
+    if (parser.seen('S'))
37
+      tmc_set_report_status(parser.value_bool());
38
+    else
39
+  #endif
40
+      tmc_report_all();
41
+
38 42
 }
39 43
 
40 44
 #endif // TMC_DEBUG

+ 19
- 15
Marlin/src/inc/Conditionals_post.h 查看文件

@@ -461,7 +461,7 @@
461 461
  *       Preserve this ordering when adding new drivers.
462 462
  */
463 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))
464
+#define TRINAMICS (HAS_TRINAMIC || HAS_DRIVER(TMC2130_STANDALONE) || HAS_DRIVER(TMC2208_STANDALONE) || HAS_DRIVER(TMC26X_STANDALONE) || HAS_DRIVER(TMC2660_STANDALONE))
465 465
 
466 466
 #ifndef MINIMUM_STEPPER_DIR_DELAY
467 467
   #if HAS_DRIVER(TB6560)
@@ -867,20 +867,24 @@
867 867
 #define HAS_SOLENOID_5    (PIN_EXISTS(SOL5))
868 868
 
869 869
 // Trinamic Stepper Drivers
870
-#define HAS_STEALTHCHOP (HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2208))
871
-#define HAS_STALLGUARD  HAS_DRIVER(TMC2130)
872
-#define AXIS_HAS_STEALTHCHOP(ST) ( AXIS_DRIVER_TYPE(ST, TMC2130) || AXIS_DRIVER_TYPE(ST, TMC2208) )
873
-#define AXIS_HAS_STALLGUARD(ST) AXIS_DRIVER_TYPE(ST, TMC2130)
874
-
875
-#define USE_SENSORLESS (ENABLED(SENSORLESS_HOMING) || ENABLED(SENSORLESS_PROBING))
876
-#if USE_SENSORLESS
877
-  // Disable Z axis sensorless homing if a probe is used to home the Z axis
878
-  #if HOMING_Z_WITH_PROBE
879
-    #undef Z_STALL_SENSITIVITY
880
-  #endif
881
-  #define X_SENSORLESS (AXIS_HAS_STALLGUARD(X) && defined(X_STALL_SENSITIVITY))
882
-  #define Y_SENSORLESS (AXIS_HAS_STALLGUARD(Y) && defined(Y_STALL_SENSITIVITY))
883
-  #define Z_SENSORLESS (AXIS_HAS_STALLGUARD(Z) && defined(Z_STALL_SENSITIVITY))
870
+#if HAS_TRINAMIC
871
+  #define TMC_HAS_SPI     (HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2660))
872
+  #define HAS_STALLGUARD  (HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2660))
873
+  #define HAS_STEALTHCHOP (HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2208))
874
+  #define AXIS_HAS_SPI(ST)         (AXIS_DRIVER_TYPE(ST, TMC2130) || AXIS_DRIVER_TYPE(ST, TMC2660))
875
+  #define AXIS_HAS_STALLGUARD(ST)  (AXIS_DRIVER_TYPE(ST, TMC2130) || AXIS_DRIVER_TYPE(ST, TMC2660))
876
+  #define AXIS_HAS_STEALTHCHOP(ST) (AXIS_DRIVER_TYPE(ST, TMC2130) || AXIS_DRIVER_TYPE(ST, TMC2208))
877
+
878
+  #define USE_SENSORLESS (ENABLED(SENSORLESS_HOMING) || ENABLED(SENSORLESS_PROBING))
879
+  #if USE_SENSORLESS
880
+    // Disable Z axis sensorless homing if a probe is used to home the Z axis
881
+    #if HOMING_Z_WITH_PROBE
882
+      #undef Z_STALL_SENSITIVITY
883
+    #endif
884
+    #define X_SENSORLESS (AXIS_HAS_STALLGUARD(X) && defined(X_STALL_SENSITIVITY))
885
+    #define Y_SENSORLESS (AXIS_HAS_STALLGUARD(Y) && defined(Y_STALL_SENSITIVITY))
886
+    #define Z_SENSORLESS (AXIS_HAS_STALLGUARD(Z) && defined(Z_STALL_SENSITIVITY))
887
+  #endif
884 888
 #endif
885 889
 
886 890
 // Endstops and bed probe

+ 68
- 0
Marlin/src/module/stepper_indirection.cpp 查看文件

@@ -487,6 +487,74 @@
487 487
   }
488 488
 #endif // TMC2208
489 489
 
490
+//
491
+// TMC2660 Driver objects and inits
492
+//
493
+#if HAS_DRIVER(TMC2660)
494
+
495
+  #include <SPI.h>
496
+  #include "planner.h"
497
+  #include "../core/enum.h"
498
+
499
+  #if ENABLED(TMC_USE_SW_SPI)
500
+    #define _TMC2660_DEFINE(ST, L) TMCMarlin<TMC2660Stepper, L> stepper##ST(ST##_CS_PIN, R_SENSE, TMC_SW_MOSI, TMC_SW_MISO, TMC_SW_SCK)
501
+    #define TMC2660_DEFINE(ST) _TMC2660_DEFINE(ST, TMC_##ST##_LABEL)
502
+  #else
503
+    #define _TMC2660_DEFINE(ST, L) TMCMarlin<TMC2660Stepper, L> stepper##ST(ST##_CS_PIN, R_SENSE)
504
+    #define TMC2660_DEFINE(ST) _TMC2660_DEFINE(ST, TMC_##ST##_LABEL)
505
+  #endif
506
+
507
+  // Stepper objects of TMC2660 steppers used
508
+  #if AXIS_DRIVER_TYPE(X, TMC2660)
509
+    TMC2660_DEFINE(X);
510
+  #endif
511
+  #if AXIS_DRIVER_TYPE(X2, TMC2660)
512
+    TMC2660_DEFINE(X2);
513
+  #endif
514
+  #if AXIS_DRIVER_TYPE(Y, TMC2660)
515
+    TMC2660_DEFINE(Y);
516
+  #endif
517
+  #if AXIS_DRIVER_TYPE(Y2, TMC2660)
518
+    TMC2660_DEFINE(Y2);
519
+  #endif
520
+  #if AXIS_DRIVER_TYPE(Z, TMC2660)
521
+    TMC2660_DEFINE(Z);
522
+  #endif
523
+  #if AXIS_DRIVER_TYPE(Z2, TMC2660)
524
+    TMC2660_DEFINE(Z2);
525
+  #endif
526
+  #if AXIS_DRIVER_TYPE(E0, TMC2660)
527
+    TMC2660_DEFINE(E0);
528
+  #endif
529
+  #if AXIS_DRIVER_TYPE(E1, TMC2660)
530
+    TMC2660_DEFINE(E1);
531
+  #endif
532
+  #if AXIS_DRIVER_TYPE(E2, TMC2660)
533
+    TMC2660_DEFINE(E2);
534
+  #endif
535
+  #if AXIS_DRIVER_TYPE(E3, TMC2660)
536
+    TMC2660_DEFINE(E3);
537
+  #endif
538
+  #if AXIS_DRIVER_TYPE(E4, TMC2660)
539
+    TMC2660_DEFINE(E4);
540
+  #endif
541
+  #if AXIS_DRIVER_TYPE(E5, TMC2660)
542
+    TMC2660_DEFINE(E5);
543
+  #endif
544
+
545
+  template<char AXIS_LETTER, char DRIVER_ID>
546
+  void tmc_init(TMCMarlin<TMC2660Stepper, AXIS_LETTER, DRIVER_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t, const float) {
547
+    st.begin();
548
+    st.rms_current(mA);
549
+    st.microsteps(microsteps);
550
+    st.blank_time(24);
551
+    st.toff(5); // Only enables the driver if used with stealthChop
552
+    st.intpol(INTERPOLATE);
553
+    //st.hysteresis_start(3);
554
+    //st.hysteresis_end(2);
555
+  }
556
+#endif // TMC2660
557
+
490 558
 void restore_stepper_drivers() {
491 559
   #if AXIS_IS_TMC(X)
492 560
     stepperX.push();

+ 52
- 0
Marlin/src/module/stepper_indirection.h 查看文件

@@ -101,6 +101,10 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
101 101
     #define X_ENABLE_INIT NOOP
102 102
     #define X_ENABLE_WRITE(STATE) stepperX.setEnabled(STATE)
103 103
     #define X_ENABLE_READ stepperX.isEnabled()
104
+  #elif AXIS_DRIVER_TYPE(X, TMC2660)
105
+    #define X_ENABLE_INIT NOOP
106
+    #define X_ENABLE_WRITE(STATE) stepperX.toff((STATE)==X_ENABLE_ON ? stepperX.savedToff() : 0)
107
+    #define X_ENABLE_READ stepperX.isEnabled()
104 108
   #else
105 109
     #define X_ENABLE_INIT SET_OUTPUT(X_ENABLE_PIN)
106 110
     #define X_ENABLE_WRITE(STATE) WRITE(X_ENABLE_PIN,STATE)
@@ -132,6 +136,10 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
132 136
     #define Y_ENABLE_INIT NOOP
133 137
     #define Y_ENABLE_WRITE(STATE) stepperY.setEnabled(STATE)
134 138
     #define Y_ENABLE_READ stepperY.isEnabled()
139
+  #elif AXIS_DRIVER_TYPE(Y, TMC2660)
140
+    #define Y_ENABLE_INIT NOOP
141
+    #define Y_ENABLE_WRITE(STATE) stepperY.toff((STATE)==Y_ENABLE_ON ? stepperY.savedToff() : 0)
142
+    #define Y_ENABLE_READ stepperY.isEnabled()
135 143
   #else
136 144
     #define Y_ENABLE_INIT SET_OUTPUT(Y_ENABLE_PIN)
137 145
     #define Y_ENABLE_WRITE(STATE) WRITE(Y_ENABLE_PIN,STATE)
@@ -163,6 +171,10 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
163 171
     #define Z_ENABLE_INIT NOOP
164 172
     #define Z_ENABLE_WRITE(STATE) stepperZ.setEnabled(STATE)
165 173
     #define Z_ENABLE_READ stepperZ.isEnabled()
174
+  #elif AXIS_DRIVER_TYPE(Z, TMC2660)
175
+    #define Z_ENABLE_INIT NOOP
176
+    #define Z_ENABLE_WRITE(STATE) stepperZ.toff((STATE)==Z_ENABLE_ON ? stepperZ.savedToff() : 0)
177
+    #define Z_ENABLE_READ stepperZ.isEnabled()
166 178
   #else
167 179
     #define Z_ENABLE_INIT SET_OUTPUT(Z_ENABLE_PIN)
168 180
     #define Z_ENABLE_WRITE(STATE) WRITE(Z_ENABLE_PIN,STATE)
@@ -195,6 +207,10 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
195 207
       #define X2_ENABLE_INIT NOOP
196 208
       #define X2_ENABLE_WRITE(STATE) stepperX2.setEnabled(STATE)
197 209
       #define X2_ENABLE_READ stepperX2.isEnabled()
210
+    #elif AXIS_DRIVER_TYPE(X2, TMC2660)
211
+      #define X2_ENABLE_INIT NOOP
212
+      #define X2_ENABLE_WRITE(STATE) stepperX2.toff((STATE)==X_ENABLE_ON ? stepperX2.savedToff() : 0)
213
+      #define X2_ENABLE_READ stepperX2.isEnabled()
198 214
     #else
199 215
       #define X2_ENABLE_INIT SET_OUTPUT(X2_ENABLE_PIN)
200 216
       #define X2_ENABLE_WRITE(STATE) WRITE(X2_ENABLE_PIN,STATE)
@@ -228,6 +244,10 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
228 244
       #define Y2_ENABLE_INIT NOOP
229 245
       #define Y2_ENABLE_WRITE(STATE) stepperY2.setEnabled(STATE)
230 246
       #define Y2_ENABLE_READ stepperY2.isEnabled()
247
+    #elif AXIS_DRIVER_TYPE(Y2, TMC2660)
248
+      #define Y2_ENABLE_INIT NOOP
249
+      #define Y2_ENABLE_WRITE(STATE) stepperY2.toff((STATE)==Y_ENABLE_ON ? stepperY2.savedToff() : 0)
250
+      #define Y2_ENABLE_READ stepperY2.isEnabled()
231 251
     #else
232 252
       #define Y2_ENABLE_INIT SET_OUTPUT(Y2_ENABLE_PIN)
233 253
       #define Y2_ENABLE_WRITE(STATE) WRITE(Y2_ENABLE_PIN,STATE)
@@ -261,6 +281,10 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
261 281
       #define Z2_ENABLE_INIT NOOP
262 282
       #define Z2_ENABLE_WRITE(STATE) stepperZ2.setEnabled(STATE)
263 283
       #define Z2_ENABLE_READ stepperZ2.isEnabled()
284
+    #elif AXIS_DRIVER_TYPE(Z2, TMC2660)
285
+      #define Z2_ENABLE_INIT NOOP
286
+      #define Z2_ENABLE_WRITE(STATE) stepperZ2.toff((STATE)==Z_ENABLE_ON ? stepperZ2.savedToff() : 0)
287
+      #define Z2_ENABLE_READ stepperZ2.isEnabled()
264 288
     #else
265 289
       #define Z2_ENABLE_INIT SET_OUTPUT(Z2_ENABLE_PIN)
266 290
       #define Z2_ENABLE_WRITE(STATE) WRITE(Z2_ENABLE_PIN,STATE)
@@ -294,6 +318,10 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
294 318
       #define Z3_ENABLE_INIT NOOP
295 319
       #define Z3_ENABLE_WRITE(STATE) stepperZ3.setEnabled(STATE)
296 320
       #define Z3_ENABLE_READ stepperZ3.isEnabled()
321
+    #elif AXIS_DRIVER_TYPE(Z3, TMC2660)
322
+      #define Z3_ENABLE_INIT NOOP
323
+      #define Z3_ENABLE_WRITE(STATE) stepperZ3.toff((STATE)==Z_ENABLE_ON ? stepperZ3.savedToff() : 0)
324
+      #define Z3_ENABLE_READ stepperZ3.isEnabled()
297 325
     #else
298 326
       #define Z3_ENABLE_INIT SET_OUTPUT(Z3_ENABLE_PIN)
299 327
       #define Z3_ENABLE_WRITE(STATE) WRITE(Z3_ENABLE_PIN,STATE)
@@ -326,6 +354,10 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
326 354
     #define E0_ENABLE_INIT NOOP
327 355
     #define E0_ENABLE_WRITE(STATE) stepperE0.setEnabled(STATE)
328 356
     #define E0_ENABLE_READ stepperE0.isEnabled()
357
+  #elif AXIS_DRIVER_TYPE(E0, TMC2660)
358
+    #define E0_ENABLE_INIT NOOP
359
+    #define E0_ENABLE_WRITE(STATE) stepperE0.toff((STATE)==E_ENABLE_ON ? stepperE0.savedToff() : 0)
360
+    #define E0_ENABLE_READ stepperE0.isEnabled()
329 361
   #else
330 362
     #define E0_ENABLE_INIT SET_OUTPUT(E0_ENABLE_PIN)
331 363
     #define E0_ENABLE_WRITE(STATE) WRITE(E0_ENABLE_PIN,STATE)
@@ -357,6 +389,10 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
357 389
     #define E1_ENABLE_INIT NOOP
358 390
     #define E1_ENABLE_WRITE(STATE) stepperE1.setEnabled(STATE)
359 391
     #define E1_ENABLE_READ stepperE1.isEnabled()
392
+  #elif AXIS_DRIVER_TYPE(E1, TMC2660)
393
+    #define E1_ENABLE_INIT NOOP
394
+    #define E1_ENABLE_WRITE(STATE) stepperE1.toff((STATE)==E_ENABLE_ON ? stepperE1.savedToff() : 0)
395
+    #define E1_ENABLE_READ stepperE1.isEnabled()
360 396
   #else
361 397
     #define E1_ENABLE_INIT SET_OUTPUT(E1_ENABLE_PIN)
362 398
     #define E1_ENABLE_WRITE(STATE) WRITE(E1_ENABLE_PIN,STATE)
@@ -388,6 +424,10 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
388 424
     #define E2_ENABLE_INIT NOOP
389 425
     #define E2_ENABLE_WRITE(STATE) stepperE2.setEnabled(STATE)
390 426
     #define E2_ENABLE_READ stepperE2.isEnabled()
427
+  #elif AXIS_DRIVER_TYPE(E2, TMC2660)
428
+    #define E2_ENABLE_INIT NOOP
429
+    #define E2_ENABLE_WRITE(STATE) stepperE2.toff((STATE)==E_ENABLE_ON ? stepperE2.savedToff() : 0)
430
+    #define E2_ENABLE_READ stepperE2.isEnabled()
391 431
   #else
392 432
     #define E2_ENABLE_INIT SET_OUTPUT(E2_ENABLE_PIN)
393 433
     #define E2_ENABLE_WRITE(STATE) WRITE(E2_ENABLE_PIN,STATE)
@@ -419,6 +459,10 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
419 459
     #define E3_ENABLE_INIT NOOP
420 460
     #define E3_ENABLE_WRITE(STATE) stepperE3.setEnabled(STATE)
421 461
     #define E3_ENABLE_READ stepperE3.isEnabled()
462
+  #elif AXIS_DRIVER_TYPE(E3, TMC2660)
463
+    #define E3_ENABLE_INIT NOOP
464
+    #define E3_ENABLE_WRITE(STATE) stepperE3.toff((STATE)==E_ENABLE_ON ? stepperE3.savedToff() : 0)
465
+    #define E3_ENABLE_READ stepperE3.isEnabled()
422 466
   #else
423 467
     #define E3_ENABLE_INIT SET_OUTPUT(E3_ENABLE_PIN)
424 468
     #define E3_ENABLE_WRITE(STATE) WRITE(E3_ENABLE_PIN,STATE)
@@ -450,6 +494,10 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
450 494
     #define E4_ENABLE_INIT NOOP
451 495
     #define E4_ENABLE_WRITE(STATE) stepperE4.setEnabled(STATE)
452 496
     #define E4_ENABLE_READ stepperE4.isEnabled()
497
+  #elif AXIS_DRIVER_TYPE(E4, TMC2660)
498
+    #define E4_ENABLE_INIT NOOP
499
+    #define E4_ENABLE_WRITE(STATE) stepperE4.toff((STATE)==E_ENABLE_ON ? stepperE4.savedToff() : 0)
500
+    #define E4_ENABLE_READ stepperE4.isEnabled()
453 501
   #else
454 502
     #define E4_ENABLE_INIT SET_OUTPUT(E4_ENABLE_PIN)
455 503
     #define E4_ENABLE_WRITE(STATE) WRITE(E4_ENABLE_PIN,STATE)
@@ -481,6 +529,10 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
481 529
     #define E5_ENABLE_INIT NOOP
482 530
     #define E5_ENABLE_WRITE(STATE) stepperE5.setEnabled(STATE)
483 531
     #define E5_ENABLE_READ stepperE5.isEnabled()
532
+  #elif AXIS_DRIVER_TYPE(E5, TMC2660)
533
+    #define E5_ENABLE_INIT NOOP
534
+    #define E5_ENABLE_WRITE(STATE) stepperE5.toff((STATE)==E_ENABLE_ON ? stepperE5.savedToff() : 0)
535
+    #define E5_ENABLE_READ stepperE5.isEnabled()
484 536
   #else
485 537
     #define E5_ENABLE_INIT SET_OUTPUT(E5_ENABLE_PIN)
486 538
     #define E5_ENABLE_WRITE(STATE) WRITE(E5_ENABLE_PIN,STATE)

+ 15
- 0
Marlin/src/pins/pins_AZTEEG_X5_GT.h 查看文件

@@ -58,22 +58,37 @@
58 58
 #define X_STEP_PIN         P2_01
59 59
 #define X_DIR_PIN          P0_11
60 60
 #define X_ENABLE_PIN       P0_10
61
+#ifndef X_CS_PIN
62
+  #define X_CS_PIN         P0_10 // BSD2660 default
63
+#endif
61 64
 
62 65
 #define Y_STEP_PIN         P2_02
63 66
 #define Y_DIR_PIN          P0_20
64 67
 #define Y_ENABLE_PIN       P0_19
68
+#ifndef Y_CS_PIN
69
+  #define Y_CS_PIN         P0_19 // BSD2660 default
70
+#endif
65 71
 
66 72
 #define Z_STEP_PIN         P2_03
67 73
 #define Z_DIR_PIN          P0_22
68 74
 #define Z_ENABLE_PIN       P0_21
75
+#ifndef Z_CS_PIN
76
+  #define Z_CS_PIN         P0_21 // BSD2660 default
77
+#endif
69 78
 
70 79
 #define E0_STEP_PIN        P2_00
71 80
 #define E0_DIR_PIN         P0_05
72 81
 #define E0_ENABLE_PIN      P0_04
82
+#ifndef E0_CS_PIN
83
+  #define E0_CS_PIN        P0_04 // BSD2660 default
84
+#endif
73 85
 
74 86
 #define E1_STEP_PIN        P2_08
75 87
 #define E1_DIR_PIN         P2_13
76 88
 #define E1_ENABLE_PIN      P4_29
89
+#ifndef E1_CS_PIN
90
+  #define E1_CS_PIN        P4_29 // BSD2660 default
91
+#endif
77 92
 
78 93
 //
79 94
 // Temperature Sensors

Loading…
取消
儲存