🧑‍💻 Some TMC2240 updates (#27901)

This commit is contained in:
Scott Lahteine 2025-06-13 22:13:09 -05:00 committed by GitHub
parent 7ac308fe4d
commit 1e03f696f5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 163 additions and 123 deletions

View file

@ -148,9 +148,9 @@
* Options: A4988, A5984, DRV8825, LV8729, TB6560, TB6600, TMC2100, * Options: A4988, A5984, DRV8825, LV8729, TB6560, TB6600, TMC2100,
* TMC2130, TMC2130_STANDALONE, TMC2160, TMC2160_STANDALONE, * TMC2130, TMC2130_STANDALONE, TMC2160, TMC2160_STANDALONE,
* TMC2208, TMC2208_STANDALONE, TMC2209, TMC2209_STANDALONE, * TMC2208, TMC2208_STANDALONE, TMC2209, TMC2209_STANDALONE,
* TMC2240, TMC2240_STANDALONE, TMC2660, TMC2660_STANDALONE, * TMC2240, TMC2660, TMC2660_STANDALONE,
* TMC5130, TMC5130_STANDALONE, TMC5160, TMC5160_STANDALONE * TMC5130, TMC5130_STANDALONE, TMC5160, TMC5160_STANDALONE
* :['A4988', 'A5984', 'DRV8825', 'LV8729', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC2240', 'TMC2240_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE'] * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC2240', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE']
*/ */
#define X_DRIVER_TYPE A4988 #define X_DRIVER_TYPE A4988
#define Y_DRIVER_TYPE A4988 #define Y_DRIVER_TYPE A4988

View file

@ -1394,7 +1394,7 @@
* Multi-stepping sends steps in bursts to reduce MCU usage for high step-rates. * Multi-stepping sends steps in bursts to reduce MCU usage for high step-rates.
* This allows higher feedrates than the MCU could otherwise support. * This allows higher feedrates than the MCU could otherwise support.
*/ */
#define MULTISTEPPING_LIMIT 16 //: [1, 2, 4, 8, 16, 32, 64, 128] #define MULTISTEPPING_LIMIT 16 // :[1, 2, 4, 8, 16, 32, 64, 128]
/** /**
* Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies
@ -3031,12 +3031,11 @@
#define INTERPOLATE true #define INTERPOLATE true
#if HAS_DRIVER(TMC2240) #if HAS_DRIVER(TMC2240)
#define TMC2240_CURRENT_RANGE 1 // RMS: { 0:'690mA', 1:'1410mA', 2:'2120mA', 3:'2110mA' } #define TMC2240_RREF 12000 // (Ω) 12000 .. 60000. (FLY TMC2240 = 12300)
// PEAK:{ 0:'1A', 1:'2A', 2:'3A', 3:'3A' } // Max Current. Lower for more internal resolution. Raise to run cooler.
// Determines max current. Lower is more internal current resolution. Higher runs cooler. #define TMC2240_CURRENT_RANGE 1 // :{ 0:'RMS=690mA PEAK=1A', 1:'RMS=1410mA PEAK=2A', 2:'RMS=2120mA PEAK=3A', 3:'RMS=2110mA PEAK=3A' }
#define TMC2240_Rref 12000 // ('rref', 12000, minval=12000, maxval=60000) // Slope Control: Lower is more silent. Higher runs cooler.
#define TMC2240_SLOPE_CONTROL 0 // :{ 0:'100V/us', 1:'200V/us', 2:'400V/us', 3:'800V/us' } #define TMC2240_SLOPE_CONTROL 0 // :{ 0:'100V/µs', 1:'200V/µs', 2:'400V/µs', 3:'800V/µs' }
// Lower is more silent. Higher runs cooler.
#endif #endif
#if AXIS_IS_TMC_CONFIG(X) #if AXIS_IS_TMC_CONFIG(X)
@ -3467,7 +3466,7 @@
* X/Y/Z_STALL_SENSITIVITY is the default stall threshold. * X/Y/Z_STALL_SENSITIVITY is the default stall threshold.
* Use M914 X Y Z to set the stall threshold at runtime: * Use M914 X Y Z to set the stall threshold at runtime:
* *
* Sensitivity TMC2209/2240 Others * Sensitivity TMC2209 Others
* HIGHEST 255 -64 (Too sensitive => False positive) * HIGHEST 255 -64 (Too sensitive => False positive)
* LOWEST 0 63 (Too insensitive => No trigger) * LOWEST 0 63 (Too insensitive => No trigger)
* *
@ -3486,7 +3485,7 @@
//#define SENSORLESS_HOMING // StallGuard capable drivers only //#define SENSORLESS_HOMING // StallGuard capable drivers only
#if ANY(SENSORLESS_HOMING, SENSORLESS_PROBING) #if ANY(SENSORLESS_HOMING, SENSORLESS_PROBING)
// TMC2209/2240: 0...255. TMC2130: -64...63 // TMC2209: 0...255. TMC2130: -64...63
#define X_STALL_SENSITIVITY 8 #define X_STALL_SENSITIVITY 8
#define X2_STALL_SENSITIVITY X_STALL_SENSITIVITY #define X2_STALL_SENSITIVITY X_STALL_SENSITIVITY
#define Y_STALL_SENSITIVITY 8 #define Y_STALL_SENSITIVITY 8
@ -3503,6 +3502,7 @@
//#define W_STALL_SENSITIVITY 8 //#define W_STALL_SENSITIVITY 8
//#define SPI_ENDSTOPS // TMC2130, TMC2240, and TMC5160 //#define SPI_ENDSTOPS // TMC2130, TMC2240, and TMC5160
//#define IMPROVE_HOMING_RELIABILITY //#define IMPROVE_HOMING_RELIABILITY
//#define PREFER_STALLGUARD4 // TMC2240
#endif #endif
// @section tmc/config // @section tmc/config

View file

@ -39,7 +39,7 @@
#endif #endif
#ifndef F #ifndef F
class __FlashStringHelper; class __FlashStringHelper;
#define F(str) (reinterpret_cast<const __FlashStringHelper *>(PSTR(str))) #define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))
#endif #endif
#ifndef _SFR_BYTE #ifndef _SFR_BYTE
#define _SFR_BYTE(n) (n) #define _SFR_BYTE(n) (n)

View file

@ -42,7 +42,6 @@
#define _TMC2209 0x2209A #define _TMC2209 0x2209A
#define _TMC2209_STANDALONE 0x2209B #define _TMC2209_STANDALONE 0x2209B
#define _TMC2240 0x2240A #define _TMC2240 0x2240A
#define _TMC2240_STANDALONE 0x2240B
#define _TMC2660 0x2660A #define _TMC2660 0x2660A
#define _TMC2660_STANDALONE 0x2660B #define _TMC2660_STANDALONE 0x2660B
#define _TMC5130 0x5130A #define _TMC5130 0x5130A
@ -108,7 +107,7 @@
#if ( HAS_DRIVER(TMC2100) \ #if ( HAS_DRIVER(TMC2100) \
|| HAS_DRIVER(TMC2130_STANDALONE) || HAS_DRIVER(TMC2160_STANDALONE) \ || HAS_DRIVER(TMC2130_STANDALONE) || HAS_DRIVER(TMC2160_STANDALONE) \
|| HAS_DRIVER(TMC2208_STANDALONE) || HAS_DRIVER(TMC2209_STANDALONE) \ || HAS_DRIVER(TMC2208_STANDALONE) || HAS_DRIVER(TMC2209_STANDALONE) \
|| HAS_DRIVER(TMC2240_STANDALONE) || HAS_DRIVER(TMC2660_STANDALONE) \ || HAS_DRIVER(TMC2660_STANDALONE) \
|| HAS_DRIVER(TMC5130_STANDALONE) || HAS_DRIVER(TMC5160_STANDALONE) ) || HAS_DRIVER(TMC5130_STANDALONE) || HAS_DRIVER(TMC5160_STANDALONE) )
#define HAS_TRINAMIC_STANDALONE 1 #define HAS_TRINAMIC_STANDALONE 1
#endif #endif

View file

@ -83,9 +83,7 @@
#if HAS_TMCX1X0 #if HAS_TMCX1X0
#if ENABLED(TMC_DEBUG)
static uint32_t get_pwm_scale(TMC2130Stepper &st) { return st.PWM_SCALE(); } static uint32_t get_pwm_scale(TMC2130Stepper &st) { return st.PWM_SCALE(); }
#endif
static TMC_driver_data get_driver_data(TMC2130Stepper &st) { static TMC_driver_data get_driver_data(TMC2130Stepper &st) {
constexpr uint8_t OT_bp = 25, OTPW_bp = 26; constexpr uint8_t OT_bp = 25, OTPW_bp = 26;
@ -144,9 +142,7 @@
#if HAS_DRIVER(TMC2240) #if HAS_DRIVER(TMC2240)
#if ENABLED(TMC_DEBUG)
static uint32_t get_pwm_scale(TMC2240Stepper &st) { return st.PWM_SCALE(); } static uint32_t get_pwm_scale(TMC2240Stepper &st) { return st.PWM_SCALE(); }
#endif
static TMC_driver_data get_driver_data(TMC2240Stepper &st) { static TMC_driver_data get_driver_data(TMC2240Stepper &st) {
constexpr uint8_t OT_bp = 25, OTPW_bp = 26; constexpr uint8_t OT_bp = 25, OTPW_bp = 26;
@ -205,9 +201,7 @@
#if HAS_TMC220x #if HAS_TMC220x
#if ENABLED(TMC_DEBUG)
static uint32_t get_pwm_scale(TMC2208Stepper &st) { return st.pwm_scale_sum(); } static uint32_t get_pwm_scale(TMC2208Stepper &st) { return st.pwm_scale_sum(); }
#endif
static TMC_driver_data get_driver_data(TMC2208Stepper &st) { static TMC_driver_data get_driver_data(TMC2208Stepper &st) {
constexpr uint8_t OTPW_bp = 0, OT_bp = 1; constexpr uint8_t OTPW_bp = 0, OT_bp = 1;
@ -242,9 +236,7 @@
#if HAS_DRIVER(TMC2660) #if HAS_DRIVER(TMC2660)
#if ENABLED(TMC_DEBUG)
static uint32_t get_pwm_scale(TMC2660Stepper) { return 0; } static uint32_t get_pwm_scale(TMC2660Stepper) { return 0; }
#endif
static TMC_driver_data get_driver_data(TMC2660Stepper &st) { static TMC_driver_data get_driver_data(TMC2660Stepper &st) {
constexpr uint8_t OT_bp = 1, OTPW_bp = 2; constexpr uint8_t OT_bp = 1, OTPW_bp = 2;
@ -383,9 +375,9 @@
else if (st.otpw_count > 0) st.otpw_count = 0; else if (st.otpw_count > 0) st.otpw_count = 0;
} }
#if ENABLED(TMC_DEBUG) if (need_debug_reporting) {
if (need_debug_reporting) report_polled_driver_data(st, data); TERN_(TMC_DEBUG, report_polled_driver_data(st, data));
#endif }
return should_step_down; return should_step_down;
} }
@ -518,7 +510,7 @@
TMC_TSTEP, TMC_TSTEP,
TMC_TPWMTHRS, TMC_TPWMTHRS,
TMC_TPWMTHRS_MMS, TMC_TPWMTHRS_MMS,
TMC_OTPW, TMC_DEBUG_OTPW,
TMC_OTPW_TRIGGERED, TMC_OTPW_TRIGGERED,
TMC_TOFF, TMC_TOFF,
TMC_TBL, TMC_TBL,
@ -575,7 +567,9 @@
TMC_GET_DRVCTRL, TMC_GET_DRVCTRL,
TMC_GET_DRVSTATUS, TMC_GET_DRVSTATUS,
TMC_GET_SGCSCONF, TMC_GET_SGCSCONF,
TMC_GET_SMARTEN TMC_GET_SMARTEN,
TMC_GET_SG4_THRS,
TMC_GET_SG4_RESULT
}; };
template<class TMC> template<class TMC>
@ -603,6 +597,7 @@
static void print_true_or_false(const bool tf) { SERIAL_ECHO(TRUE_FALSE(tf)); } static void print_true_or_false(const bool tf) { SERIAL_ECHO(TRUE_FALSE(tf)); }
#if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC5130) #if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC5130)
// Additional tmc_status fields for 2130/5130 and related drivers
static void _tmc_status(TMC2130Stepper &st, const TMC_debug_enum i) { static void _tmc_status(TMC2130Stepper &st, const TMC_debug_enum i) {
switch (i) { switch (i) {
case TMC_PWM_SCALE: SERIAL_ECHO(st.PWM_SCALE()); break; case TMC_PWM_SCALE: SERIAL_ECHO(st.PWM_SCALE()); break;
@ -614,6 +609,7 @@
} }
#endif #endif
#if HAS_TMCX1X0 #if HAS_TMCX1X0
// Additional tmc_parse_drv_status fields for 2130 and related drivers
static void _tmc_parse_drv_status(TMC2130Stepper &st, const TMC_drv_status_enum i) { static void _tmc_parse_drv_status(TMC2130Stepper &st, const TMC_drv_status_enum i) {
switch (i) { switch (i) {
case TMC_STALLGUARD: if (st.stallguard()) SERIAL_CHAR('*'); break; case TMC_STALLGUARD: if (st.stallguard()) SERIAL_CHAR('*'); break;
@ -626,18 +622,17 @@
#endif #endif
#if HAS_DRIVER(TMC2160) || HAS_DRIVER(TMC5160) #if HAS_DRIVER(TMC2160) || HAS_DRIVER(TMC5160)
// Additional tmc_status fields for 2160/5160 and related drivers
static void _tmc_status(TMC2160Stepper &st, const TMC_debug_enum i) { static void _tmc_status(TMC2160Stepper &st, const TMC_debug_enum i) {
switch (i) { switch (i) {
case TMC_PWM_SCALE: SERIAL_ECHO(st.PWM_SCALE()); break; case TMC_PWM_SCALE: SERIAL_ECHO(st.PWM_SCALE()); break;
case TMC_SGT: SERIAL_ECHO(st.sgt()); break; case TMC_SGT: SERIAL_ECHO(st.sgt()); break;
case TMC_STEALTHCHOP: print_true_or_false(st.en_pwm_mode()); break; case TMC_STEALTHCHOP: print_true_or_false(st.en_pwm_mode()); break;
case TMC_GLOBAL_SCALER: case TMC_GLOBAL_SCALER: {
{
const uint16_t value = st.GLOBAL_SCALER(); const uint16_t value = st.GLOBAL_SCALER();
SERIAL_ECHO(value ?: 256); SERIAL_ECHO(value ?: 256);
SERIAL_ECHOPGM("/256"); SERIAL_ECHOPGM("/256");
} } break;
break;
case TMC_INTERPOLATE: print_true_or_false(st.intpol()); break; case TMC_INTERPOLATE: print_true_or_false(st.intpol()); break;
default: break; default: break;
} }
@ -646,12 +641,16 @@
#if HAS_TMC220x #if HAS_TMC220x
// Additional tmc_status fields for 2208/2224/2209 drivers
static void _tmc_status(TMC2208Stepper &st, const TMC_debug_enum i) { static void _tmc_status(TMC2208Stepper &st, const TMC_debug_enum i) {
switch (i) { switch (i) {
// PWM_SCALE
case TMC_PWM_SCALE_SUM: SERIAL_ECHO(st.pwm_scale_sum()); break; case TMC_PWM_SCALE_SUM: SERIAL_ECHO(st.pwm_scale_sum()); break;
case TMC_PWM_SCALE_AUTO: SERIAL_ECHO(st.pwm_scale_auto()); break; case TMC_PWM_SCALE_AUTO: SERIAL_ECHO(st.pwm_scale_auto()); break;
// PWM_AUTO
case TMC_PWM_OFS_AUTO: SERIAL_ECHO(st.pwm_ofs_auto()); break; case TMC_PWM_OFS_AUTO: SERIAL_ECHO(st.pwm_ofs_auto()); break;
case TMC_PWM_GRAD_AUTO: SERIAL_ECHO(st.pwm_grad_auto()); break; case TMC_PWM_GRAD_AUTO: SERIAL_ECHO(st.pwm_grad_auto()); break;
// CHOPCONF
case TMC_STEALTHCHOP: print_true_or_false(st.stealth()); break; case TMC_STEALTHCHOP: print_true_or_false(st.stealth()); break;
case TMC_INTERPOLATE: print_true_or_false(st.intpol()); break; case TMC_INTERPOLATE: print_true_or_false(st.intpol()); break;
default: break; default: break;
@ -659,19 +658,20 @@
} }
#if HAS_DRIVER(TMC2209) #if HAS_DRIVER(TMC2209)
// Additional tmc_status fields for 2209 drivers
template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID> template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
static void _tmc_status(TMCMarlin<TMC2209Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st, const TMC_debug_enum i) { static void _tmc_status(TMCMarlin<TMC2209Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st, const TMC_debug_enum i) {
switch (i) { switch (i) {
case TMC_SGT: SERIAL_ECHO(st.SGTHRS()); break; case TMC_SGT: SERIAL_ECHO(st.SGTHRS()); break;
case TMC_UART_ADDR: SERIAL_ECHO(st.get_address()); break; case TMC_UART_ADDR: SERIAL_ECHO(st.get_address()); break;
default: default:
TMC2208Stepper *parent = &st; _tmc_status(static_cast<TMC2208Stepper &>(st), i);
_tmc_status(*parent, i);
break; break;
} }
} }
#endif #endif
// Additional tmc_parse_drv_status fields for 2208/2224/2209 drivers
static void _tmc_parse_drv_status(TMC2208Stepper &st, const TMC_drv_status_enum i) { static void _tmc_parse_drv_status(TMC2208Stepper &st, const TMC_drv_status_enum i) {
switch (i) { switch (i) {
case TMC_T157: if (st.t157()) SERIAL_CHAR('*'); break; case TMC_T157: if (st.t157()) SERIAL_CHAR('*'); break;
@ -686,10 +686,13 @@
} }
#if HAS_DRIVER(TMC2209) #if HAS_DRIVER(TMC2209)
// Additional tmc_parse_drv_status fields for 2209 drivers
static void _tmc_parse_drv_status(TMC2209Stepper &st, const TMC_drv_status_enum i) { static void _tmc_parse_drv_status(TMC2209Stepper &st, const TMC_drv_status_enum i) {
switch (i) { switch (i) {
case TMC_SG_RESULT: SERIAL_ECHO(st.SG_RESULT()); break; case TMC_SG_RESULT: SERIAL_ECHO(st.SG_RESULT()); break;
default: _tmc_parse_drv_status(static_cast<TMC2208Stepper &>(st), i); break; default:
_tmc_parse_drv_status(static_cast<TMC2208Stepper &>(st), i);
break;
} }
} }
#endif #endif
@ -697,13 +700,38 @@
#endif // HAS_TMC220x #endif // HAS_TMC220x
#if HAS_DRIVER(TMC2240) #if HAS_DRIVER(TMC2240)
static void _tmc_parse_drv_status(TMC2240Stepper, const TMC_drv_status_enum) { }
// Additional tmc_parse_drv_status fields for 2240 drivers
static void _tmc_parse_drv_status(TMC2240Stepper &st, const TMC_drv_status_enum i) {
switch (i) {
case TMC_S2VSA: if (st.s2vsa()) SERIAL_CHAR('*'); break;
case TMC_S2VSB: if (st.s2vsb()) SERIAL_CHAR('*'); break;
case TMC_STEALTHCHOP: print_true_or_false(st.stealth()); break;
case TMC_FSACTIVE: if (st.fsactive()) SERIAL_CHAR('*'); break;
case TMC_DRV_CS_ACTUAL: if (st.CS_ACTUAL()) SERIAL_CHAR('*'); break;
case TMC_STALLGUARD: if (st.stallguard()) SERIAL_CHAR('*'); break;
//case TMC_OT: if (st.ot()) SERIAL_CHAR('*'); break;
case TMC_DEBUG_OTPW: print_true_or_false(st.otpw()); break;
//case TMC_S2GA: if (st.s2ga()) SERIAL_CHAR('*'); break;
//case TMC_S2GB: if (st.s2gb()) SERIAL_CHAR('*'); break;
//case TMC_OLA: if (st.ola()) SERIAL_CHAR('*'); break;
//case TMC_OLB: if (st.olb()) SERIAL_CHAR('*'); break;
case TMC_SG_RESULT: SERIAL_ECHO(st.SG_RESULT()); break;
case TMC_STST: if (!st.stst()) SERIAL_CHAR('*'); break;
default: break; // other...
}
}
// Additional tmc_status fields for 2240 drivers
static void _tmc_status(TMC2240Stepper &st, const TMC_debug_enum i) { static void _tmc_status(TMC2240Stepper &st, const TMC_debug_enum i) {
switch (i) { switch (i) {
// PWM_SCALE
case TMC_PWM_SCALE_SUM: SERIAL_ECHO(st.pwm_scale_sum()); break; case TMC_PWM_SCALE_SUM: SERIAL_ECHO(st.pwm_scale_sum()); break;
case TMC_PWM_SCALE_AUTO: SERIAL_ECHO(st.pwm_scale_auto()); break; case TMC_PWM_SCALE_AUTO: SERIAL_ECHO(st.pwm_scale_auto()); break;
// PWM_AUTO
case TMC_PWM_OFS_AUTO: SERIAL_ECHO(st.pwm_ofs_auto()); break; case TMC_PWM_OFS_AUTO: SERIAL_ECHO(st.pwm_ofs_auto()); break;
case TMC_PWM_GRAD_AUTO: SERIAL_ECHO(st.pwm_grad_auto()); break; case TMC_PWM_GRAD_AUTO: SERIAL_ECHO(st.pwm_grad_auto()); break;
// CHOPCONF
case TMC_STEALTHCHOP: print_true_or_false(st.stealth()); break; case TMC_STEALTHCHOP: print_true_or_false(st.stealth()); break;
case TMC_INTERPOLATE: print_true_or_false(st.intpol()); break; case TMC_INTERPOLATE: print_true_or_false(st.intpol()); break;
case TMC_VAIN: SERIAL_ECHO(st.get_ain_voltage()); break; case TMC_VAIN: SERIAL_ECHO(st.get_ain_voltage()); break;
@ -714,7 +742,8 @@
default: break; default: break;
} }
} }
#endif
#endif // TMC2240
#if HAS_DRIVER(TMC2660) #if HAS_DRIVER(TMC2660)
static void _tmc_parse_drv_status(TMC2660Stepper, const TMC_drv_status_enum) { } static void _tmc_parse_drv_status(TMC2660Stepper, const TMC_drv_status_enum) { }
@ -750,14 +779,8 @@
case TMC_CURRENT: SERIAL_ECHO(st.getMilliamps()); break; case TMC_CURRENT: SERIAL_ECHO(st.getMilliamps()); break;
case TMC_RMS_CURRENT: SERIAL_ECHO(st.rms_current()); break; case TMC_RMS_CURRENT: SERIAL_ECHO(st.rms_current()); break;
case TMC_MAX_CURRENT: SERIAL_ECHO(p_float_t(st.rms_current() * 1.41, 0)); break; case TMC_MAX_CURRENT: SERIAL_ECHO(p_float_t(st.rms_current() * 1.41, 0)); break;
case TMC_IRUN: case TMC_IRUN: SERIAL_ECHO(st.irun()); SERIAL_ECHOPGM("/31"); break;
SERIAL_ECHO(st.irun()); case TMC_IHOLD: SERIAL_ECHO(st.ihold()); SERIAL_ECHOPGM("/31"); break;
SERIAL_ECHOPGM("/31");
break;
case TMC_IHOLD:
SERIAL_ECHO(st.ihold());
SERIAL_ECHOPGM("/31");
break;
case TMC_CS_ACTUAL: print_cs_actual(st); break; case TMC_CS_ACTUAL: print_cs_actual(st); break;
case TMC_VSENSE: print_vsense(st); break; case TMC_VSENSE: print_vsense(st); break;
case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break; case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break;
@ -769,7 +792,7 @@
if (tpwmthrs_val) SERIAL_ECHO(tpwmthrs_val); else SERIAL_CHAR('-'); if (tpwmthrs_val) SERIAL_ECHO(tpwmthrs_val); else SERIAL_CHAR('-');
} break; } break;
#endif #endif
case TMC_OTPW: print_true_or_false(st.otpw()); break; case TMC_DEBUG_OTPW: print_true_or_false(st.otpw()); break;
#if ENABLED(MONITOR_DRIVER_STATUS) #if ENABLED(MONITOR_DRIVER_STATUS)
case TMC_OTPW_TRIGGERED: print_true_or_false(st.getOTPW()); break; case TMC_OTPW_TRIGGERED: print_true_or_false(st.getOTPW()); break;
#endif #endif
@ -792,13 +815,10 @@
case TMC_CURRENT: SERIAL_ECHO(st.getMilliamps()); break; case TMC_CURRENT: SERIAL_ECHO(st.getMilliamps()); break;
case TMC_RMS_CURRENT: SERIAL_ECHO(st.rms_current()); break; case TMC_RMS_CURRENT: SERIAL_ECHO(st.rms_current()); break;
case TMC_MAX_CURRENT: SERIAL_ECHO(p_float_t(st.rms_current() * 1.41, 0)); break; case TMC_MAX_CURRENT: SERIAL_ECHO(p_float_t(st.rms_current() * 1.41, 0)); break;
case TMC_IRUN: case TMC_IRUN: SERIAL_ECHO(st.cs()); SERIAL_ECHOPGM("/31"); break;
SERIAL_ECHO(st.cs());
SERIAL_ECHOPGM("/31");
break;
case TMC_VSENSE: SERIAL_ECHO(st.vsense() ? F("1=.165") : F("0=.310")); break; case TMC_VSENSE: SERIAL_ECHO(st.vsense() ? F("1=.165") : F("0=.310")); break;
case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break; case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break;
//case TMC_OTPW: print_true_or_false(st.otpw()); break; //case TMC_DEBUG_OTPW: print_true_or_false(st.otpw()); break;
//case TMC_OTPW_TRIGGERED: print_true_or_false(st.getOTPW()); break; //case TMC_OTPW_TRIGGERED: print_true_or_false(st.getOTPW()); break;
case TMC_SGT: SERIAL_ECHO(st.sgt()); break; case TMC_SGT: SERIAL_ECHO(st.sgt()); break;
case TMC_TOFF: SERIAL_ECHO(st.toff()); break; case TMC_TOFF: SERIAL_ECHO(st.toff()); break;
@ -808,7 +828,7 @@
default: _tmc_status(st, i); break; default: _tmc_status(st, i); break;
} }
} }
#endif #endif // TMC2660
template <typename TMC> template <typename TMC>
static void tmc_parse_drv_status(TMC &st, const TMC_drv_status_enum i) { static void tmc_parse_drv_status(TMC &st, const TMC_drv_status_enum i) {
@ -824,14 +844,10 @@
case TMC_OT: if (st.ot()) SERIAL_CHAR('*'); break; case TMC_OT: if (st.ot()) SERIAL_CHAR('*'); break;
case TMC_DRV_STATUS_HEX: { case TMC_DRV_STATUS_HEX: {
const uint32_t drv_status = st.DRV_STATUS(); const uint32_t drv_status = st.DRV_STATUS();
SERIAL_CHAR('\t'); SERIAL_CHAR('\t'); st.printLabel(); SERIAL_CHAR('\t'); print_hex_long(drv_status, ':', true);
st.printLabel();
SERIAL_CHAR('\t');
print_hex_long(drv_status, ':', true);
if (drv_status == 0xFFFFFFFF || drv_status == 0) SERIAL_ECHOPGM("\t Bad response!"); if (drv_status == 0xFFFFFFFF || drv_status == 0) SERIAL_ECHOPGM("\t Bad response!");
SERIAL_EOL(); SERIAL_EOL();
break; } break;
}
default: _tmc_parse_drv_status(st, i); break; default: _tmc_parse_drv_status(st, i); break;
} }
} }
@ -946,7 +962,7 @@
TMC_REPORT("tstep\t", TMC_TSTEP); TMC_REPORT("tstep\t", TMC_TSTEP);
TMC_REPORT("PWM thresh.", TMC_TPWMTHRS); TMC_REPORT("PWM thresh.", TMC_TPWMTHRS);
TMC_REPORT("[mm/s]\t", TMC_TPWMTHRS_MMS); TMC_REPORT("[mm/s]\t", TMC_TPWMTHRS_MMS);
TMC_REPORT("OT prewarn", TMC_OTPW); TMC_REPORT("OT prewarn", TMC_DEBUG_OTPW);
#if ENABLED(MONITOR_DRIVER_STATUS) #if ENABLED(MONITOR_DRIVER_STATUS)
TMC_REPORT("triggered\n OTP\t", TMC_OTPW_TRIGGERED); TMC_REPORT("triggered\n OTP\t", TMC_OTPW_TRIGGERED);
#endif #endif
@ -964,6 +980,7 @@
TMC_REPORT(" -start\t", TMC_HSTRT); TMC_REPORT(" -start\t", TMC_HSTRT);
TMC_REPORT("Stallguard thrs", TMC_SGT); TMC_REPORT("Stallguard thrs", TMC_SGT);
TMC_REPORT("uStep count", TMC_MSCNT); TMC_REPORT("uStep count", TMC_MSCNT);
DRV_REPORT("DRVSTATUS", TMC_DRV_CODES); DRV_REPORT("DRVSTATUS", TMC_DRV_CODES);
#if HAS_TMCX1X0_OR_2240 || HAS_TMC220x #if HAS_TMCX1X0_OR_2240 || HAS_TMC220x
DRV_REPORT("sg_result", TMC_SG_RESULT); DRV_REPORT("sg_result", TMC_SG_RESULT);
@ -984,10 +1001,12 @@
DRV_REPORT("150C\t", TMC_T150); DRV_REPORT("150C\t", TMC_T150);
DRV_REPORT("143C\t", TMC_T143); DRV_REPORT("143C\t", TMC_T143);
DRV_REPORT("120C\t", TMC_T120); DRV_REPORT("120C\t", TMC_T120);
#endif
#if HAS_TMC220x || HAS_DRIVER(TMC2240)
DRV_REPORT("s2vsa\t", TMC_S2VSA); DRV_REPORT("s2vsa\t", TMC_S2VSA);
DRV_REPORT("s2vsb\t", TMC_S2VSB); DRV_REPORT("s2vsb\t", TMC_S2VSB);
#endif #endif
DRV_REPORT("Driver registers:\n",TMC_DRV_STATUS_HEX); DRV_REPORT("Driver registers:\n", TMC_DRV_STATUS_HEX);
#if HAS_DRIVER(TMC2240) #if HAS_DRIVER(TMC2240)
TMC_REPORT("Analog in (v)", TMC_VAIN); TMC_REPORT("Analog in (v)", TMC_VAIN);
TMC_REPORT("Supply (v)", TMC_VSUPPLY); TMC_REPORT("Supply (v)", TMC_VSUPPLY);
@ -1035,6 +1054,7 @@
} }
SERIAL_CHAR('\t'); SERIAL_CHAR('\t');
} }
#endif // HAS_TRINAMIC_CONFIG #endif // HAS_TRINAMIC_CONFIG
#if HAS_DRIVER(TMC2660) #if HAS_DRIVER(TMC2660)

View file

@ -32,9 +32,6 @@
#include "trinamic.h" #include "trinamic.h"
#include "../stepper.h" #include "../stepper.h"
#include <HardwareSerial.h>
#include <SPI.h>
enum StealthIndex : uint8_t { enum StealthIndex : uint8_t {
LOGICAL_AXIS_LIST(STEALTH_AXIS_E, STEALTH_AXIS_X, STEALTH_AXIS_Y, STEALTH_AXIS_Z, STEALTH_AXIS_I, STEALTH_AXIS_J, STEALTH_AXIS_K, STEALTH_AXIS_U, STEALTH_AXIS_V, STEALTH_AXIS_W) LOGICAL_AXIS_LIST(STEALTH_AXIS_E, STEALTH_AXIS_X, STEALTH_AXIS_Y, STEALTH_AXIS_Z, STEALTH_AXIS_I, STEALTH_AXIS_J, STEALTH_AXIS_K, STEALTH_AXIS_U, STEALTH_AXIS_V, STEALTH_AXIS_W)
}; };
@ -247,7 +244,7 @@ enum StealthIndex : uint8_t {
chopconf.intpol = interpolate; chopconf.intpol = interpolate;
chopconf.hend = chop_init.hend + 3; chopconf.hend = chop_init.hend + 3;
chopconf.hstrt = chop_init.hstrt - 1; chopconf.hstrt = chop_init.hstrt - 1;
TERN_(EDGE_STEPPING, chopconf.dedge = true); chopconf.dedge = ENABLED(EDGE_STEPPING);
st.CHOPCONF(chopconf.sr); st.CHOPCONF(chopconf.sr);
st.rms_current(mA, hold_multiplier); st.rms_current(mA, hold_multiplier);
@ -285,7 +282,7 @@ enum StealthIndex : uint8_t {
chopconf.intpol = interpolate; chopconf.intpol = interpolate;
chopconf.hend = chop_init.hend + 3; chopconf.hend = chop_init.hend + 3;
chopconf.hstrt = chop_init.hstrt - 1; chopconf.hstrt = chop_init.hstrt - 1;
TERN_(EDGE_STEPPING, chopconf.dedge = true); chopconf.dedge = ENABLED(EDGE_STEPPING);
st.CHOPCONF(chopconf.sr); st.CHOPCONF(chopconf.sr);
st.rms_current(mA, hold_multiplier); st.rms_current(mA, hold_multiplier);
@ -710,7 +707,7 @@ enum StealthIndex : uint8_t {
chopconf.intpol = interpolate; chopconf.intpol = interpolate;
chopconf.hend = chop_init.hend + 3; chopconf.hend = chop_init.hend + 3;
chopconf.hstrt = chop_init.hstrt - 1; chopconf.hstrt = chop_init.hstrt - 1;
TERN_(EDGE_STEPPING, chopconf.dedge = true); chopconf.dedge = ENABLED(EDGE_STEPPING);
st.CHOPCONF(chopconf.sr); st.CHOPCONF(chopconf.sr);
st.rms_current(mA, hold_multiplier); st.rms_current(mA, hold_multiplier);
@ -755,7 +752,7 @@ enum StealthIndex : uint8_t {
chopconf.intpol = interpolate; chopconf.intpol = interpolate;
chopconf.hend = chop_init.hend + 3; chopconf.hend = chop_init.hend + 3;
chopconf.hstrt = chop_init.hstrt - 1; chopconf.hstrt = chop_init.hstrt - 1;
TERN_(EDGE_STEPPING, chopconf.dedge = true); chopconf.dedge = ENABLED(EDGE_STEPPING);
st.CHOPCONF(chopconf.sr); st.CHOPCONF(chopconf.sr);
st.rms_current(mA, hold_multiplier); st.rms_current(mA, hold_multiplier);
@ -788,44 +785,68 @@ enum StealthIndex : uint8_t {
) { ) {
st.begin(); st.begin();
st.Rref = TMC2240_Rref; st.Rref = TMC2240_RREF; // Minimum: 12000 ; FLY TMC2240: 12300
TMC2240_n::GCONF_t gconf{0};
gconf.en_pwm_mode = !stealth;
st.GCONF(gconf.sr);
TMC2240_n::DRV_CONF_t drv_conf{0}; TMC2240_n::DRV_CONF_t drv_conf{0};
drv_conf.current_range = TMC2240_CURRENT_RANGE; drv_conf.current_range = TMC2240_CURRENT_RANGE;
drv_conf.slope_control = TMC2240_SLOPE_CONTROL; drv_conf.slope_control = TMC2240_SLOPE_CONTROL;
st.DRV_CONF(drv_conf.sr); st.DRV_CONF(drv_conf.sr);
CHOPCONF_t chopconf{0}; // Adjust based on user experience
chopconf.tbl = 0b01; TMC2240_n::CHOPCONF_t chopconf{0};
chopconf.toff = chop_init.toff; chopconf.toff = chop_init.toff; // 3 (3)
chopconf.intpol = interpolate; chopconf.intpol = interpolate; // true
chopconf.hend = chop_init.hend + 3; chopconf.hend = chop_init.hend + 3; // 2 (-1)
chopconf.hstrt = chop_init.hstrt - 1; chopconf.hstrt = chop_init.hstrt - 1; // 5 (6)
TERN_(EDGE_STEPPING, chopconf.dedge = true); chopconf.TBL = 0b10; // 36 tCLK
chopconf.tpfd = 4; // 512 NCLK
chopconf.dedge = ENABLED(EDGE_STEPPING);
st.CHOPCONF(chopconf.sr); st.CHOPCONF(chopconf.sr);
st.rms_current(mA, hold_multiplier); st.rms_current(mA, hold_multiplier);
st.microsteps(microsteps); st.microsteps(microsteps);
st.iholddelay(10); st.iholddelay(6);
st.irundelay(4);
// (from Makerbase)
//st.TPOWERDOWN(10);
st.TPOWERDOWN(128); // ~2s until driver lowers to hold current st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
st.en_pwm_mode(stealth); st.en_pwm_mode(stealth);
st.stored.stealthChop_enabled = stealth; st.stored.stealthChop_enabled = stealth;
// Adjust based on user experience
TMC2240_n::PWMCONF_t pwmconf{0}; TMC2240_n::PWMCONF_t pwmconf{0};
pwmconf.pwm_lim = 12; pwmconf.pwm_ofs = 29;
pwmconf.pwm_reg = 8; pwmconf.pwm_grad = 0;
pwmconf.pwm_freq = 0b00; // fPWM = 2/1024 fCLK | 16MHz clock -> 31.3kHz PWM
pwmconf.pwm_autograd = true; pwmconf.pwm_autograd = true;
pwmconf.pwm_autoscale = true; pwmconf.pwm_autoscale = true;
pwmconf.pwm_freq = 0b01; pwmconf.freewheel = 0;
pwmconf.pwm_grad = 14; pwmconf.pwm_meas_sd_enable = false;
pwmconf.pwm_ofs = 36; pwmconf.pwm_dis_reg_stst = false;
pwmconf.pwm_reg = 4;
pwmconf.pwm_lim = 12;
st.PWMCONF(pwmconf.sr); st.PWMCONF(pwmconf.sr);
TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs)); TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs));
// (from Makerbase)
//st.GCONF(0x00);
//st.IHOLD_IRUN(0x04071f03);
//st.GSTAT(0x07);
//st.GSTAT(0x00);
st.diag0_pushpull(true); st.diag0_pushpull(true);
st.GSTAT(); // Clear GSTAT st.GSTAT(); // Clear GSTAT
} }
#endif // TMC2240 #endif // TMC2240
#if HAS_DRIVER(TMC2660) #if HAS_DRIVER(TMC2660)
@ -867,7 +888,7 @@ enum StealthIndex : uint8_t {
chopconf.intpol = interpolate; chopconf.intpol = interpolate;
chopconf.hend = chop_init.hend + 3; chopconf.hend = chop_init.hend + 3;
chopconf.hstrt = chop_init.hstrt - 1; chopconf.hstrt = chop_init.hstrt - 1;
TERN_(EDGE_STEPPING, chopconf.dedge = true); chopconf.dedge = ENABLED(EDGE_STEPPING);
st.CHOPCONF(chopconf.sr); st.CHOPCONF(chopconf.sr);
st.rms_current(mA, hold_multiplier); st.rms_current(mA, hold_multiplier);
@ -905,7 +926,7 @@ enum StealthIndex : uint8_t {
chopconf.intpol = interpolate; chopconf.intpol = interpolate;
chopconf.hend = chop_init.hend + 3; chopconf.hend = chop_init.hend + 3;
chopconf.hstrt = chop_init.hstrt - 1; chopconf.hstrt = chop_init.hstrt - 1;
TERN_(EDGE_STEPPING, chopconf.dedge = true); chopconf.dedge = ENABLED(EDGE_STEPPING);
st.CHOPCONF(chopconf.sr); st.CHOPCONF(chopconf.sr);
st.rms_current(mA, hold_multiplier); st.rms_current(mA, hold_multiplier);

BIN
docs/TMC2240_Datasheet.pdf Normal file

Binary file not shown.