Skip to content

Commit

Permalink
Coolstep for TMC2130, 2209, 5130, 5160 (#16790)
Browse files Browse the repository at this point in the history
  • Loading branch information
Fabi0San authored Feb 9, 2020
1 parent f0cbc85 commit 8947622
Show file tree
Hide file tree
Showing 25 changed files with 473 additions and 86 deletions.
5 changes: 0 additions & 5 deletions Marlin/Configuration.h
Original file line number Diff line number Diff line change
Expand Up @@ -674,11 +674,6 @@
//#define X_DRIVER_TYPE A4988
//#define Y_DRIVER_TYPE A4988
//#define Z_DRIVER_TYPE A4988
//#define X2_DRIVER_TYPE A4988
//#define Y2_DRIVER_TYPE A4988
//#define Z2_DRIVER_TYPE A4988
//#define Z3_DRIVER_TYPE A4988
//#define Z4_DRIVER_TYPE A4988
//#define E0_DRIVER_TYPE A4988
//#define E1_DRIVER_TYPE A4988
//#define E2_DRIVER_TYPE A4988
Expand Down
160 changes: 160 additions & 0 deletions Marlin/Configuration_adv.h
Original file line number Diff line number Diff line change
Expand Up @@ -2275,6 +2275,166 @@
#define E6_HYBRID_THRESHOLD 30
#define E7_HYBRID_THRESHOLD 30

/**
* CoolStep. Currently supported for TMC2130, TMC2209, TMC5130 and TMC5160 only.
* This mode allows for cooler steppers and energy savings.
* The driver will switch to coolStep when stepper speed is over COOLSTEP_THRESHOLD mm/s.
*
* If SG_RESULT goes below COOLSTEP_LOWER_LOAD_THRESHOLD * 32 stepper current will be increased.
* Set to 0 to disable CoolStep.
*
* If SG_RESULT goes above (COOLSTEP_LOWER_LOAD_THRESHOLD + COOLSTEP_UPPER_LOAD_THRESHOLD + 1) * 32
* stepper current will be decreased.
*
* SEUP sets the increase step width. Value range is 0..3 and computed as 2^SEUP.
* SEDN sets the decrease delay. Value range is 0..3, 0 being the slowest.
* SEIMIN sets the lower current limit. 0: 1/2 of IRUN, 1:1/4 of IRUN
*/

#if AXIS_HAS_COOLSTEP(X)
#define X_COOLSTEP_SPEED_THRESHOLD 5
#define X_COOLSTEP_LOWER_LOAD_THRESHOLD 7
#define X_COOLSTEP_UPPER_LOAD_THRESHOLD 0
#define X_COOLSTEP_SEUP 2
#define X_COOLSTEP_SEDN 0
#define X_COOLSTEP_SEIMIN 1
#endif

#if AXIS_HAS_COOLSTEP(X2)
#define X2_COOLSTEP_SPEED_THRESHOLD 5
#define X2_COOLSTEP_LOWER_LOAD_THRESHOLD 7
#define X2_COOLSTEP_UPPER_LOAD_THRESHOLD 0
#define X2_COOLSTEP_SEUP 2
#define X2_COOLSTEP_SEDN 0
#define X2_COOLSTEP_SEIMIN 1
#endif

#if AXIS_HAS_COOLSTEP(Y)
#define Y_COOLSTEP_SPEED_THRESHOLD 5
#define Y_COOLSTEP_LOWER_LOAD_THRESHOLD 7
#define Y_COOLSTEP_UPPER_LOAD_THRESHOLD 0
#define Y_COOLSTEP_SEUP 2
#define Y_COOLSTEP_SEDN 0
#define Y_COOLSTEP_SEIMIN 1
#endif

#if AXIS_HAS_COOLSTEP(Y2)
#define Y2_COOLSTEP_SPEED_THRESHOLD 5
#define Y2_COOLSTEP_LOWER_LOAD_THRESHOLD 7
#define Y2_COOLSTEP_UPPER_LOAD_THRESHOLD 0
#define Y2_COOLSTEP_SEUP 2
#define Y2_COOLSTEP_SEDN 0
#define Y2_COOLSTEP_SEIMIN 1
#endif

#if AXIS_HAS_COOLSTEP(Z)
#define Z_COOLSTEP_SPEED_THRESHOLD 5
#define Z_COOLSTEP_LOWER_LOAD_THRESHOLD 7
#define Z_COOLSTEP_UPPER_LOAD_THRESHOLD 0
#define Z_COOLSTEP_SEUP 2
#define Z_COOLSTEP_SEDN 0
#define Z_COOLSTEP_SEIMIN 1
#endif

#if AXIS_HAS_COOLSTEP(Z2)
#define Z2_COOLSTEP_SPEED_THRESHOLD 5
#define Z2_COOLSTEP_LOWER_LOAD_THRESHOLD 7
#define Z2_COOLSTEP_UPPER_LOAD_THRESHOLD 0
#define Z2_COOLSTEP_SEUP 2
#define Z2_COOLSTEP_SEDN 0
#define Z2_COOLSTEP_SEIMIN 1
#endif

#if AXIS_HAS_COOLSTEP(Z3)
#define Z3_COOLSTEP_SPEED_THRESHOLD 5
#define Z3_COOLSTEP_LOWER_LOAD_THRESHOLD 7
#define Z3_COOLSTEP_UPPER_LOAD_THRESHOLD 0
#define Z3_COOLSTEP_SEUP 2
#define Z3_COOLSTEP_SEDN 0
#define Z3_COOLSTEP_SEIMIN 1
#endif

#if AXIS_HAS_COOLSTEP(Z4)
#define Z4_COOLSTEP_SPEED_THRESHOLD 5
#define Z4_COOLSTEP_LOWER_LOAD_THRESHOLD 7
#define Z4_COOLSTEP_UPPER_LOAD_THRESHOLD 0
#define Z4_COOLSTEP_SEUP 2
#define Z4_COOLSTEP_SEDN 0
#define Z4_COOLSTEP_SEIMIN 1
#endif

#if AXIS_HAS_COOLSTEP(E0)
#define E0_COOLSTEP_SPEED_THRESHOLD 5
#define E0_COOLSTEP_LOWER_LOAD_THRESHOLD 7
#define E0_COOLSTEP_UPPER_LOAD_THRESHOLD 0
#define E0_COOLSTEP_SEUP 2
#define E0_COOLSTEP_SEDN 0
#define E0_COOLSTEP_SEIMIN 1
#endif

#if AXIS_HAS_COOLSTEP(E1)
#define E1_COOLSTEP_SPEED_THRESHOLD 5
#define E1_COOLSTEP_LOWER_LOAD_THRESHOLD 7
#define E1_COOLSTEP_UPPER_LOAD_THRESHOLD 0
#define E1_COOLSTEP_SEUP 2
#define E1_COOLSTEP_SEDN 0
#define E1_COOLSTEP_SEIMIN 1
#endif

#if AXIS_HAS_COOLSTEP(E2)
#define E2_COOLSTEP_SPEED_THRESHOLD 5
#define E2_COOLSTEP_LOWER_LOAD_THRESHOLD 7
#define E2_COOLSTEP_UPPER_LOAD_THRESHOLD 0
#define E2_COOLSTEP_SEUP 2
#define E2_COOLSTEP_SEDN 0
#define E2_COOLSTEP_SEIMIN 1
#endif

#if AXIS_HAS_COOLSTEP(E3)
#define E3_COOLSTEP_SPEED_THRESHOLD 5
#define E3_COOLSTEP_LOWER_LOAD_THRESHOLD 7
#define E3_COOLSTEP_UPPER_LOAD_THRESHOLD 0
#define E3_COOLSTEP_SEUP 2
#define E3_COOLSTEP_SEDN 0
#define E3_COOLSTEP_SEIMIN 1
#endif

#if AXIS_HAS_COOLSTEP(E4)
#define E4_COOLSTEP_SPEED_THRESHOLD 5
#define E4_COOLSTEP_LOWER_LOAD_THRESHOLD 7
#define E4_COOLSTEP_UPPER_LOAD_THRESHOLD 0
#define E4_COOLSTEP_SEUP 2
#define E4_COOLSTEP_SEDN 0
#define E4_COOLSTEP_SEIMIN 1
#endif

#if AXIS_HAS_COOLSTEP(E5)
#define E5_COOLSTEP_SPEED_THRESHOLD 5
#define E5_COOLSTEP_LOWER_LOAD_THRESHOLD 7
#define E5_COOLSTEP_UPPER_LOAD_THRESHOLD 0
#define E5_COOLSTEP_SEUP 2
#define E5_COOLSTEP_SEDN 0
#define E5_COOLSTEP_SEIMIN 1
#endif

#if AXIS_HAS_COOLSTEP(E6)
#define E6_COOLSTEP_SPEED_THRESHOLD 5
#define E6_COOLSTEP_LOWER_LOAD_THRESHOLD 7
#define E6_COOLSTEP_UPPER_LOAD_THRESHOLD 0
#define E6_COOLSTEP_SEUP 2
#define E6_COOLSTEP_SEDN 0
#define E6_COOLSTEP_SEIMIN 1
#endif

#if AXIS_HAS_COOLSTEP(E7)
#define E7_COOLSTEP_SPEED_THRESHOLD 5
#define E7_COOLSTEP_LOWER_LOAD_THRESHOLD 7
#define E7_COOLSTEP_UPPER_LOAD_THRESHOLD 0
#define E7_COOLSTEP_SEUP 2
#define E7_COOLSTEP_SEDN 0
#define E7_COOLSTEP_SEIMIN 1
#endif

/**
* Use StallGuard2 to home / probe X, Y, Z.
*
Expand Down
2 changes: 1 addition & 1 deletion Marlin/src/HAL/HAL_AVR/inc/SanityCheck.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,6 @@
#error "TMCStepper includes SoftwareSerial.h which is incompatible with ENDSTOP_INTERRUPTS_FEATURE. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
#endif

#if TMC_HAS_SW_SERIAL && ENABLED(MONITOR_DRIVER_STATUS)
#if HAS_TMC_SW_SERIAL && ENABLED(MONITOR_DRIVER_STATUS)
#error "MONITOR_DRIVER_STATUS causes performance issues when used with SoftwareSerial-connected drivers. Disable MONITOR_DRIVER_STATUS or use hardware serial to continue."
#endif
2 changes: 1 addition & 1 deletion Marlin/src/HAL/HAL_DUE/inc/SanityCheck.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,6 @@
#error "FAST_PWM_FAN is not yet implemented for this platform."
#endif

#if TMC_HAS_SW_SERIAL
#if HAS_TMC_SW_SERIAL
#error "TMC220x Software Serial is not supported on this platform."
#endif
2 changes: 1 addition & 1 deletion Marlin/src/HAL/HAL_ESP32/inc/SanityCheck.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
#error "FAST_PWM_FAN is not yet implemented for this platform."
#endif

#if TMC_HAS_SW_SERIAL
#if HAS_TMC_SW_SERIAL
#error "TMC220x Software Serial is not supported on this platform."
#endif

Expand Down
2 changes: 1 addition & 1 deletion Marlin/src/HAL/HAL_LINUX/inc/SanityCheck.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,6 @@
#error "FAST_PWM_FAN is not yet implemented for this platform."
#endif

#if TMC_HAS_SW_SERIAL
#if HAS_TMC_SW_SERIAL
#error "TMC220x Software Serial is not supported on this platform."
#endif
2 changes: 1 addition & 1 deletion Marlin/src/HAL/HAL_SAMD51/inc/SanityCheck.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,6 @@
#warning "Did you activate the SmartEEPROM? See https://github.com/GMagician/SAMD51-SmartEEprom-Activator"
#endif

#if TMC_HAS_SW_SERIAL
#if HAS_TMC_SW_SERIAL
#error "TMC220x Software Serial is not supported on this platform."
#endif
4 changes: 2 additions & 2 deletions Marlin/src/HAL/HAL_STM32/HAL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
#include "../../inc/MarlinConfig.h"
#include "../shared/Delay.h"

#if TMC_HAS_SW_SERIAL
#if HAS_TMC_SW_SERIAL
#include "SoftwareSerial.h"
#endif

Expand Down Expand Up @@ -87,7 +87,7 @@ void HAL_init() {
while (!LL_PWR_IsActiveFlag_BRR());
#endif // EEPROM_EMULATED_SRAM

#if TMC_HAS_SW_SERIAL
#if HAS_TMC_SW_SERIAL
SoftwareSerial::setInterruptPriority(SWSERIAL_TIMER_IRQ_PRIO, 0);
#endif
}
Expand Down
2 changes: 1 addition & 1 deletion Marlin/src/HAL/HAL_STM32F1/inc/SanityCheck.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
#error "FAST_PWM_FAN is not yet implemented for this platform."
#endif

#if !defined(HAVE_SW_SERIAL) && TMC_HAS_SW_SERIAL
#if !defined(HAVE_SW_SERIAL) && HAS_TMC_SW_SERIAL
#warning "With TMC2208/9 consider using SoftwareSerialM with HAVE_SW_SERIAL and appropriate SS_TIMER."
#error "Missing SoftwareSerial implementation."
#endif
2 changes: 1 addition & 1 deletion Marlin/src/HAL/HAL_STM32_F4_F7/inc/SanityCheck.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,6 @@
#error "FAST_PWM_FAN is not yet implemented for this platform."
#endif

#if TMC_HAS_SW_SERIAL
#if HAS_TMC_SW_SERIAL
#error "TMC220x Software Serial is not supported on this platform."
#endif
2 changes: 1 addition & 1 deletion Marlin/src/HAL/HAL_TEENSY31_32/inc/SanityCheck.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,6 @@
#error "FAST_PWM_FAN is not yet implemented for this platform."
#endif

#if TMC_HAS_SW_SERIAL
#if HAS_TMC_SW_SERIAL
#error "TMC220x Software Serial is not supported on this platform."
#endif
2 changes: 1 addition & 1 deletion Marlin/src/HAL/HAL_TEENSY35_36/inc/SanityCheck.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,6 @@
#error "FAST_PWM_FAN is not yet implemented for this platform."
#endif

#if TMC_HAS_SW_SERIAL
#if HAS_TMC_SW_SERIAL
#error "TMC220x Software Serial is not supported on this platform."
#endif
2 changes: 1 addition & 1 deletion Marlin/src/MarlinCore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -892,7 +892,7 @@ void setup() {
SERIAL_ECHOLNPGM("start");
SERIAL_ECHO_START();

#if TMC_HAS_SPI
#if HAS_TMC_SPI
#if DISABLED(TMC_USE_SW_SPI)
SPI.begin();
#endif
Expand Down
29 changes: 21 additions & 8 deletions Marlin/src/core/drivers.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
#define _TMC5160_STANDALONE 0x5160B

#define _DRIVER_ID(V) _CAT(_, V)
#define _AXIS_DRIVER_TYPE(A,T) (_DRIVER_ID(A##_DRIVER_TYPE) == _CAT(_, T))
#define _AXIS_DRIVER_TYPE(A,T) (_DRIVER_ID(A##_DRIVER_TYPE) == _DRIVER_ID(T))

#define AXIS_DRIVER_TYPE_X(T) _AXIS_DRIVER_TYPE(X,T)
#define AXIS_DRIVER_TYPE_Y(T) _AXIS_DRIVER_TYPE(Y,T)
Expand Down Expand Up @@ -148,19 +148,32 @@
|| AXIS_DRIVER_TYPE(A,TMC5130) \
|| AXIS_DRIVER_TYPE(A,TMC5160) )

#define AXIS_HAS_SG_RESULT(A) ( AXIS_DRIVER_TYPE(A,TMC2130) \
|| AXIS_DRIVER_TYPE(A,TMC2160) \
|| AXIS_DRIVER_TYPE(A,TMC2208) \
|| AXIS_DRIVER_TYPE(A,TMC2209) )

#define AXIS_HAS_COOLSTEP(A) ( AXIS_DRIVER_TYPE(A,TMC2130) \
|| AXIS_DRIVER_TYPE(A,TMC2209) \
|| AXIS_DRIVER_TYPE(A,TMC5130) \
|| AXIS_DRIVER_TYPE(A,TMC5160) )

#define _OR_EAH(N,T) || AXIS_HAS_##T(E##N)
#define E_AXIS_HAS(T) (0 RREPEAT2(E_STEPPERS, _OR_EAH, T))

#define ANY_AXIS_HAS(T) ( AXIS_HAS_##T(X) || AXIS_HAS_##T(X2) \
|| AXIS_HAS_##T(Y) || AXIS_HAS_##T(Y2) \
|| AXIS_HAS_##T(Z) || AXIS_HAS_##T(Z2) \
|| AXIS_HAS_##T(Z3) \
|| AXIS_HAS_##T(E0) || AXIS_HAS_##T(E1) \
|| AXIS_HAS_##T(E2) || AXIS_HAS_##T(E3) \
|| AXIS_HAS_##T(E4) || AXIS_HAS_##T(E5) \
|| AXIS_HAS_##T(E6) || AXIS_HAS_##T(E7) )
|| AXIS_HAS_##T(Z3) || AXIS_HAS_##T(Z4) \
|| E_AXIS_HAS(T) )

#define HAS_STEALTHCHOP ANY_AXIS_HAS(STEALTHCHOP)
#define HAS_STALLGUARD ANY_AXIS_HAS(STALLGUARD)
#define TMC_HAS_SPI ANY_AXIS_HAS(SPI)
#define TMC_HAS_SW_SERIAL ANY_AXIS_HAS(SW_SERIAL)
#define HAS_SG_RESULT ANY_AXIS_HAS(SG_RESULT)
#define HAS_COOLSTEP ANY_AXIS_HAS(COOLSTEP)
#define HAS_TMC_UART ANY_AXIS_HAS(UART)
#define HAS_TMC_SPI ANY_AXIS_HAS(SPI)
#define HAS_TMC_SW_SERIAL ANY_AXIS_HAS(SW_SERIAL)

//
// Stretching 'drivers.h' to include LPC/SAMD51 SD options
Expand Down
31 changes: 20 additions & 11 deletions Marlin/src/feature/tmc_util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -629,6 +629,15 @@
default: break;
}
}

#if HAS_DRIVER(TMC2209)
static void _tmc_parse_drv_status(TMC2209Stepper &st, const TMC_drv_status_enum i) {
switch (i) {
case TMC_SG_RESULT: SERIAL_PRINT(st.SG_RESULT(), DEC); break;
default: _tmc_parse_drv_status(static_cast<TMC2208Stepper &>(st), i); break;
}
}
#endif
#endif

#if HAS_DRIVER(TMC2660)
Expand Down Expand Up @@ -891,24 +900,24 @@
TMC_REPORT("stealthChop", TMC_STEALTHCHOP);
TMC_REPORT("msteps\t", TMC_MICROSTEPS);
TMC_REPORT("tstep\t", TMC_TSTEP);
TMC_REPORT("pwm\nthreshold", TMC_TPWMTHRS);
TMC_REPORT("PWM thresh.", TMC_TPWMTHRS);
TMC_REPORT("[mm/s]\t", TMC_TPWMTHRS_MMS);
TMC_REPORT("OT prewarn", TMC_OTPW);
#if ENABLED(MONITOR_DRIVER_STATUS)
TMC_REPORT("OT prewarn has\n"
"been triggered", TMC_OTPW_TRIGGERED);
TMC_REPORT("triggered\n OTP\t", TMC_OTPW_TRIGGERED);
#endif
TMC_REPORT("off time", TMC_TOFF);
TMC_REPORT("blank time", TMC_TBL);
TMC_REPORT("hysteresis\n-end\t", TMC_HEND);
TMC_REPORT("-start\t", TMC_HSTRT);
TMC_REPORT("hysteresis\n -end\t", TMC_HEND);
TMC_REPORT(" -start\t", TMC_HSTRT);
TMC_REPORT("Stallguard thrs", TMC_SGT);

DRV_REPORT("DRVSTATUS", TMC_DRV_CODES);
#if HAS_TMCX1X0
DRV_REPORT("stallguard\t", TMC_STALLGUARD);
#if HAS_TMCX1X0 || HAS_TMC220x
DRV_REPORT("sg_result", TMC_SG_RESULT);
DRV_REPORT("fsactive\t", TMC_FSACTIVE);
#endif
#if HAS_TMCX1X0
DRV_REPORT("stallguard", TMC_STALLGUARD);
DRV_REPORT("fsactive", TMC_FSACTIVE);
#endif
DRV_REPORT("stst\t", TMC_STST);
DRV_REPORT("olb\t", TMC_OLB);
Expand Down Expand Up @@ -1103,7 +1112,7 @@

#endif // USE_SENSORLESS

#if TMC_HAS_SPI
#if HAS_TMC_SPI
#define SET_CS_PIN(st) OUT_WRITE(st##_CS_PIN, HIGH)
void tmc_init_cs_pins() {
#if AXIS_HAS_SPI(X)
Expand Down Expand Up @@ -1155,7 +1164,7 @@
SET_CS_PIN(E7);
#endif
}
#endif // TMC_HAS_SPI
#endif // HAS_TMC_SPI

template<typename TMC>
static bool test_connection(TMC &st) {
Expand Down
Loading

0 comments on commit 8947622

Please sign in to comment.