diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index f6c48eae95..5cb5682991 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -148,9 +148,9 @@ * Options: 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, + * TMC2240, 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', '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 Y_DRIVER_TYPE A4988 diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index f7ab7abd94..ebea2a2faf 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1394,7 +1394,7 @@ * Multi-stepping sends steps in bursts to reduce MCU usage for high step-rates. * 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 @@ -3031,12 +3031,11 @@ #define INTERPOLATE true #if HAS_DRIVER(TMC2240) - #define TMC2240_CURRENT_RANGE 1 // RMS: { 0:'690mA', 1:'1410mA', 2:'2120mA', 3:'2110mA' } - // PEAK:{ 0:'1A', 1:'2A', 2:'3A', 3:'3A' } - // Determines max current. Lower is more internal current resolution. Higher runs cooler. - #define TMC2240_Rref 12000 // ('rref', 12000, minval=12000, maxval=60000) - #define TMC2240_SLOPE_CONTROL 0 // :{ 0:'100V/us', 1:'200V/us', 2:'400V/us', 3:'800V/us' } - // Lower is more silent. Higher runs cooler. + #define TMC2240_RREF 12000 // (Ω) 12000 .. 60000. (FLY TMC2240 = 12300) + // Max Current. Lower for more internal resolution. Raise to run 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' } + // Slope Control: Lower is more silent. Higher runs cooler. + #define TMC2240_SLOPE_CONTROL 0 // :{ 0:'100V/µs', 1:'200V/µs', 2:'400V/µs', 3:'800V/µs' } #endif #if AXIS_IS_TMC_CONFIG(X) @@ -3467,7 +3466,7 @@ * X/Y/Z_STALL_SENSITIVITY is the default stall threshold. * 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) * LOWEST 0 63 (Too insensitive => No trigger) * @@ -3486,7 +3485,7 @@ //#define SENSORLESS_HOMING // StallGuard capable drivers only #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 X2_STALL_SENSITIVITY X_STALL_SENSITIVITY #define Y_STALL_SENSITIVITY 8 @@ -3503,6 +3502,7 @@ //#define W_STALL_SENSITIVITY 8 //#define SPI_ENDSTOPS // TMC2130, TMC2240, and TMC5160 //#define IMPROVE_HOMING_RELIABILITY + //#define PREFER_STALLGUARD4 // TMC2240 #endif // @section tmc/config diff --git a/Marlin/src/HAL/shared/progmem.h b/Marlin/src/HAL/shared/progmem.h index 4cd7663df9..b3bd5c32fd 100644 --- a/Marlin/src/HAL/shared/progmem.h +++ b/Marlin/src/HAL/shared/progmem.h @@ -39,7 +39,7 @@ #endif #ifndef F class __FlashStringHelper; -#define F(str) (reinterpret_cast(PSTR(str))) +#define F(string_literal) (reinterpret_cast(PSTR(string_literal))) #endif #ifndef _SFR_BYTE #define _SFR_BYTE(n) (n) diff --git a/Marlin/src/core/drivers.h b/Marlin/src/core/drivers.h index 3a53360e26..80980380a5 100644 --- a/Marlin/src/core/drivers.h +++ b/Marlin/src/core/drivers.h @@ -42,7 +42,6 @@ #define _TMC2209 0x2209A #define _TMC2209_STANDALONE 0x2209B #define _TMC2240 0x2240A -#define _TMC2240_STANDALONE 0x2240B #define _TMC2660 0x2660A #define _TMC2660_STANDALONE 0x2660B #define _TMC5130 0x5130A @@ -108,7 +107,7 @@ #if ( HAS_DRIVER(TMC2100) \ || HAS_DRIVER(TMC2130_STANDALONE) || HAS_DRIVER(TMC2160_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) ) #define HAS_TRINAMIC_STANDALONE 1 #endif diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp index 6f53e1943c..84014e697b 100644 --- a/Marlin/src/feature/tmc_util.cpp +++ b/Marlin/src/feature/tmc_util.cpp @@ -83,9 +83,7 @@ #if HAS_TMCX1X0 - #if ENABLED(TMC_DEBUG) - static uint32_t get_pwm_scale(TMC2130Stepper &st) { return st.PWM_SCALE(); } - #endif + static uint32_t get_pwm_scale(TMC2130Stepper &st) { return st.PWM_SCALE(); } static TMC_driver_data get_driver_data(TMC2130Stepper &st) { constexpr uint8_t OT_bp = 25, OTPW_bp = 26; @@ -144,9 +142,7 @@ #if HAS_DRIVER(TMC2240) - #if ENABLED(TMC_DEBUG) - static uint32_t get_pwm_scale(TMC2240Stepper &st) { return st.PWM_SCALE(); } - #endif + static uint32_t get_pwm_scale(TMC2240Stepper &st) { return st.PWM_SCALE(); } static TMC_driver_data get_driver_data(TMC2240Stepper &st) { constexpr uint8_t OT_bp = 25, OTPW_bp = 26; @@ -205,9 +201,7 @@ #if HAS_TMC220x - #if ENABLED(TMC_DEBUG) - static uint32_t get_pwm_scale(TMC2208Stepper &st) { return st.pwm_scale_sum(); } - #endif + static uint32_t get_pwm_scale(TMC2208Stepper &st) { return st.pwm_scale_sum(); } static TMC_driver_data get_driver_data(TMC2208Stepper &st) { constexpr uint8_t OTPW_bp = 0, OT_bp = 1; @@ -242,9 +236,7 @@ #if HAS_DRIVER(TMC2660) - #if ENABLED(TMC_DEBUG) - static uint32_t get_pwm_scale(TMC2660Stepper) { return 0; } - #endif + static uint32_t get_pwm_scale(TMC2660Stepper) { return 0; } static TMC_driver_data get_driver_data(TMC2660Stepper &st) { constexpr uint8_t OT_bp = 1, OTPW_bp = 2; @@ -383,9 +375,9 @@ else if (st.otpw_count > 0) st.otpw_count = 0; } - #if ENABLED(TMC_DEBUG) - if (need_debug_reporting) report_polled_driver_data(st, data); - #endif + if (need_debug_reporting) { + TERN_(TMC_DEBUG, report_polled_driver_data(st, data)); + } return should_step_down; } @@ -518,7 +510,7 @@ TMC_TSTEP, TMC_TPWMTHRS, TMC_TPWMTHRS_MMS, - TMC_OTPW, + TMC_DEBUG_OTPW, TMC_OTPW_TRIGGERED, TMC_TOFF, TMC_TBL, @@ -575,7 +567,9 @@ TMC_GET_DRVCTRL, TMC_GET_DRVSTATUS, TMC_GET_SGCSCONF, - TMC_GET_SMARTEN + TMC_GET_SMARTEN, + TMC_GET_SG4_THRS, + TMC_GET_SG4_RESULT }; template @@ -603,6 +597,7 @@ static void print_true_or_false(const bool tf) { SERIAL_ECHO(TRUE_FALSE(tf)); } #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) { switch (i) { case TMC_PWM_SCALE: SERIAL_ECHO(st.PWM_SCALE()); break; @@ -614,6 +609,7 @@ } #endif #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) { switch (i) { case TMC_STALLGUARD: if (st.stallguard()) SERIAL_CHAR('*'); break; @@ -626,18 +622,17 @@ #endif #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) { switch (i) { case TMC_PWM_SCALE: SERIAL_ECHO(st.PWM_SCALE()); break; case TMC_SGT: SERIAL_ECHO(st.sgt()); break; case TMC_STEALTHCHOP: print_true_or_false(st.en_pwm_mode()); break; - case TMC_GLOBAL_SCALER: - { - const uint16_t value = st.GLOBAL_SCALER(); - SERIAL_ECHO(value ?: 256); - SERIAL_ECHOPGM("/256"); - } - break; + case TMC_GLOBAL_SCALER: { + const uint16_t value = st.GLOBAL_SCALER(); + SERIAL_ECHO(value ?: 256); + SERIAL_ECHOPGM("/256"); + } break; case TMC_INTERPOLATE: print_true_or_false(st.intpol()); break; default: break; } @@ -646,12 +641,16 @@ #if HAS_TMC220x + // Additional tmc_status fields for 2208/2224/2209 drivers static void _tmc_status(TMC2208Stepper &st, const TMC_debug_enum i) { switch (i) { + // PWM_SCALE case TMC_PWM_SCALE_SUM: SERIAL_ECHO(st.pwm_scale_sum()); 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_GRAD_AUTO: SERIAL_ECHO(st.pwm_grad_auto()); break; + // CHOPCONF case TMC_STEALTHCHOP: print_true_or_false(st.stealth()); break; case TMC_INTERPOLATE: print_true_or_false(st.intpol()); break; default: break; @@ -659,19 +658,20 @@ } #if HAS_DRIVER(TMC2209) + // Additional tmc_status fields for 2209 drivers template static void _tmc_status(TMCMarlin &st, const TMC_debug_enum i) { switch (i) { case TMC_SGT: SERIAL_ECHO(st.SGTHRS()); break; case TMC_UART_ADDR: SERIAL_ECHO(st.get_address()); break; default: - TMC2208Stepper *parent = &st; - _tmc_status(*parent, i); + _tmc_status(static_cast(st), i); break; } } #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) { switch (i) { case TMC_T157: if (st.t157()) SERIAL_CHAR('*'); break; @@ -686,10 +686,13 @@ } #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) { switch (i) { case TMC_SG_RESULT: SERIAL_ECHO(st.SG_RESULT()); break; - default: _tmc_parse_drv_status(static_cast(st), i); break; + default: + _tmc_parse_drv_status(static_cast(st), i); + break; } } #endif @@ -697,13 +700,38 @@ #endif // HAS_TMC220x #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) { switch (i) { + // PWM_SCALE case TMC_PWM_SCALE_SUM: SERIAL_ECHO(st.pwm_scale_sum()); 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_GRAD_AUTO: SERIAL_ECHO(st.pwm_grad_auto()); break; + // CHOPCONF case TMC_STEALTHCHOP: print_true_or_false(st.stealth()); break; case TMC_INTERPOLATE: print_true_or_false(st.intpol()); break; case TMC_VAIN: SERIAL_ECHO(st.get_ain_voltage()); break; @@ -714,7 +742,8 @@ default: break; } } - #endif + + #endif // TMC2240 #if HAS_DRIVER(TMC2660) 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_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_IRUN: - SERIAL_ECHO(st.irun()); - SERIAL_ECHOPGM("/31"); - break; - case TMC_IHOLD: - SERIAL_ECHO(st.ihold()); - SERIAL_ECHOPGM("/31"); - break; + case TMC_IRUN: SERIAL_ECHO(st.irun()); 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_VSENSE: print_vsense(st); break; case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break; @@ -769,7 +792,7 @@ if (tpwmthrs_val) SERIAL_ECHO(tpwmthrs_val); else SERIAL_CHAR('-'); } break; #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) case TMC_OTPW_TRIGGERED: print_true_or_false(st.getOTPW()); break; #endif @@ -792,13 +815,10 @@ case TMC_CURRENT: SERIAL_ECHO(st.getMilliamps()); 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_IRUN: - SERIAL_ECHO(st.cs()); - SERIAL_ECHOPGM("/31"); - break; + case TMC_IRUN: SERIAL_ECHO(st.cs()); SERIAL_ECHOPGM("/31"); 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_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_SGT: SERIAL_ECHO(st.sgt()); break; case TMC_TOFF: SERIAL_ECHO(st.toff()); break; @@ -808,30 +828,26 @@ default: _tmc_status(st, i); break; } } - #endif + #endif // TMC2660 template static void tmc_parse_drv_status(TMC &st, const TMC_drv_status_enum i) { SERIAL_CHAR('\t'); switch (i) { - case TMC_DRV_CODES: st.printLabel(); break; - case TMC_STST: if (!st.stst()) SERIAL_CHAR('*'); break; - case TMC_OLB: if (st.olb()) SERIAL_CHAR('*'); break; - case TMC_OLA: if (st.ola()) SERIAL_CHAR('*'); break; - case TMC_S2GB: if (st.s2gb()) SERIAL_CHAR('*'); break; - case TMC_S2GA: if (st.s2ga()) SERIAL_CHAR('*'); break; - case TMC_DRV_OTPW: if (st.otpw()) SERIAL_CHAR('*'); break; - case TMC_OT: if (st.ot()) SERIAL_CHAR('*'); break; + case TMC_DRV_CODES: st.printLabel(); break; + case TMC_STST: if (!st.stst()) SERIAL_CHAR('*'); break; + case TMC_OLB: if (st.olb()) SERIAL_CHAR('*'); break; + case TMC_OLA: if (st.ola()) SERIAL_CHAR('*'); break; + case TMC_S2GB: if (st.s2gb()) SERIAL_CHAR('*'); break; + case TMC_S2GA: if (st.s2ga()) SERIAL_CHAR('*'); break; + case TMC_DRV_OTPW: if (st.otpw()) SERIAL_CHAR('*'); break; + case TMC_OT: if (st.ot()) SERIAL_CHAR('*'); break; case TMC_DRV_STATUS_HEX: { const uint32_t drv_status = st.DRV_STATUS(); - SERIAL_CHAR('\t'); - st.printLabel(); - SERIAL_CHAR('\t'); - print_hex_long(drv_status, ':', true); + SERIAL_CHAR('\t'); st.printLabel(); SERIAL_CHAR('\t'); print_hex_long(drv_status, ':', true); if (drv_status == 0xFFFFFFFF || drv_status == 0) SERIAL_ECHOPGM("\t Bad response!"); SERIAL_EOL(); - break; - } + } break; default: _tmc_parse_drv_status(st, i); break; } } @@ -946,7 +962,7 @@ TMC_REPORT("tstep\t", TMC_TSTEP); TMC_REPORT("PWM thresh.", TMC_TPWMTHRS); 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) TMC_REPORT("triggered\n OTP\t", TMC_OTPW_TRIGGERED); #endif @@ -964,6 +980,7 @@ TMC_REPORT(" -start\t", TMC_HSTRT); TMC_REPORT("Stallguard thrs", TMC_SGT); TMC_REPORT("uStep count", TMC_MSCNT); + DRV_REPORT("DRVSTATUS", TMC_DRV_CODES); #if HAS_TMCX1X0_OR_2240 || HAS_TMC220x DRV_REPORT("sg_result", TMC_SG_RESULT); @@ -984,10 +1001,12 @@ DRV_REPORT("150C\t", TMC_T150); DRV_REPORT("143C\t", TMC_T143); DRV_REPORT("120C\t", TMC_T120); + #endif + #if HAS_TMC220x || HAS_DRIVER(TMC2240) DRV_REPORT("s2vsa\t", TMC_S2VSA); DRV_REPORT("s2vsb\t", TMC_S2VSB); #endif - DRV_REPORT("Driver registers:\n",TMC_DRV_STATUS_HEX); + DRV_REPORT("Driver registers:\n", TMC_DRV_STATUS_HEX); #if HAS_DRIVER(TMC2240) TMC_REPORT("Analog in (v)", TMC_VAIN); TMC_REPORT("Supply (v)", TMC_VSUPPLY); @@ -1035,6 +1054,7 @@ } SERIAL_CHAR('\t'); } + #endif // HAS_TRINAMIC_CONFIG #if HAS_DRIVER(TMC2660) diff --git a/Marlin/src/module/stepper/trinamic.cpp b/Marlin/src/module/stepper/trinamic.cpp index 240adc9f4c..ea123c5392 100644 --- a/Marlin/src/module/stepper/trinamic.cpp +++ b/Marlin/src/module/stepper/trinamic.cpp @@ -32,9 +32,6 @@ #include "trinamic.h" #include "../stepper.h" -#include -#include - 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) }; @@ -242,12 +239,12 @@ enum StealthIndex : uint8_t { st.begin(); CHOPCONF_t chopconf{0}; - chopconf.tbl = 0b01; - chopconf.toff = chop_init.toff; + chopconf.tbl = 0b01; + chopconf.toff = chop_init.toff; chopconf.intpol = interpolate; - chopconf.hend = chop_init.hend + 3; - chopconf.hstrt = chop_init.hstrt - 1; - TERN_(EDGE_STEPPING, chopconf.dedge = true); + chopconf.hend = chop_init.hend + 3; + chopconf.hstrt = chop_init.hstrt - 1; + chopconf.dedge = ENABLED(EDGE_STEPPING); st.CHOPCONF(chopconf.sr); st.rms_current(mA, hold_multiplier); @@ -280,12 +277,12 @@ enum StealthIndex : uint8_t { st.begin(); CHOPCONF_t chopconf{0}; - chopconf.tbl = 0b01; - chopconf.toff = chop_init.toff; + chopconf.tbl = 0b01; + chopconf.toff = chop_init.toff; chopconf.intpol = interpolate; - chopconf.hend = chop_init.hend + 3; - chopconf.hstrt = chop_init.hstrt - 1; - TERN_(EDGE_STEPPING, chopconf.dedge = true); + chopconf.hend = chop_init.hend + 3; + chopconf.hstrt = chop_init.hstrt - 1; + chopconf.dedge = ENABLED(EDGE_STEPPING); st.CHOPCONF(chopconf.sr); st.rms_current(mA, hold_multiplier); @@ -705,12 +702,12 @@ enum StealthIndex : uint8_t { st.stored.stealthChop_enabled = stealth; TMC2208_n::CHOPCONF_t chopconf{0}; - chopconf.tbl = 0b01; // blank_time = 24 - chopconf.toff = chop_init.toff; + chopconf.tbl = 0b01; // blank_time = 24 + chopconf.toff = chop_init.toff; chopconf.intpol = interpolate; - chopconf.hend = chop_init.hend + 3; - chopconf.hstrt = chop_init.hstrt - 1; - TERN_(EDGE_STEPPING, chopconf.dedge = true); + chopconf.hend = chop_init.hend + 3; + chopconf.hstrt = chop_init.hstrt - 1; + chopconf.dedge = ENABLED(EDGE_STEPPING); st.CHOPCONF(chopconf.sr); st.rms_current(mA, hold_multiplier); @@ -750,12 +747,12 @@ enum StealthIndex : uint8_t { st.stored.stealthChop_enabled = stealth; TMC2208_n::CHOPCONF_t chopconf{0}; - chopconf.tbl = 0b01; // blank_time = 24 - chopconf.toff = chop_init.toff; + chopconf.tbl = 0b01; // blank_time = 24 + chopconf.toff = chop_init.toff; chopconf.intpol = interpolate; - chopconf.hend = chop_init.hend + 3; - chopconf.hstrt = chop_init.hstrt - 1; - TERN_(EDGE_STEPPING, chopconf.dedge = true); + chopconf.hend = chop_init.hend + 3; + chopconf.hstrt = chop_init.hstrt - 1; + chopconf.dedge = ENABLED(EDGE_STEPPING); st.CHOPCONF(chopconf.sr); st.rms_current(mA, hold_multiplier); @@ -788,44 +785,68 @@ enum StealthIndex : uint8_t { ) { 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}; drv_conf.current_range = TMC2240_CURRENT_RANGE; drv_conf.slope_control = TMC2240_SLOPE_CONTROL; st.DRV_CONF(drv_conf.sr); - CHOPCONF_t chopconf{0}; - chopconf.tbl = 0b01; - chopconf.toff = chop_init.toff; - chopconf.intpol = interpolate; - chopconf.hend = chop_init.hend + 3; - chopconf.hstrt = chop_init.hstrt - 1; - TERN_(EDGE_STEPPING, chopconf.dedge = true); + // Adjust based on user experience + TMC2240_n::CHOPCONF_t chopconf{0}; + chopconf.toff = chop_init.toff; // 3 (3) + chopconf.intpol = interpolate; // true + chopconf.hend = chop_init.hend + 3; // 2 (-1) + chopconf.hstrt = chop_init.hstrt - 1; // 5 (6) + chopconf.TBL = 0b10; // 36 tCLK + chopconf.tpfd = 4; // 512 NCLK + chopconf.dedge = ENABLED(EDGE_STEPPING); st.CHOPCONF(chopconf.sr); st.rms_current(mA, hold_multiplier); 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.en_pwm_mode(stealth); st.stored.stealthChop_enabled = stealth; + // Adjust based on user experience TMC2240_n::PWMCONF_t pwmconf{0}; - pwmconf.pwm_lim = 12; - pwmconf.pwm_reg = 8; - pwmconf.pwm_autograd = true; - pwmconf.pwm_autoscale = true; - pwmconf.pwm_freq = 0b01; - pwmconf.pwm_grad = 14; - pwmconf.pwm_ofs = 36; + pwmconf.pwm_ofs = 29; + pwmconf.pwm_grad = 0; + pwmconf.pwm_freq = 0b00; // fPWM = 2/1024 fCLK | 16MHz clock -> 31.3kHz PWM + pwmconf.pwm_autograd = true; + pwmconf.pwm_autoscale = true; + pwmconf.freewheel = 0; + pwmconf.pwm_meas_sd_enable = false; + pwmconf.pwm_dis_reg_stst = false; + pwmconf.pwm_reg = 4; + pwmconf.pwm_lim = 12; st.PWMCONF(pwmconf.sr); 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.GSTAT(); // Clear GSTAT } + #endif // TMC2240 #if HAS_DRIVER(TMC2660) @@ -862,12 +883,12 @@ enum StealthIndex : uint8_t { st.begin(); CHOPCONF_t chopconf{0}; - chopconf.tbl = 0b01; - chopconf.toff = chop_init.toff; + chopconf.tbl = 0b01; + chopconf.toff = chop_init.toff; chopconf.intpol = interpolate; - chopconf.hend = chop_init.hend + 3; - chopconf.hstrt = chop_init.hstrt - 1; - TERN_(EDGE_STEPPING, chopconf.dedge = true); + chopconf.hend = chop_init.hend + 3; + chopconf.hstrt = chop_init.hstrt - 1; + chopconf.dedge = ENABLED(EDGE_STEPPING); st.CHOPCONF(chopconf.sr); st.rms_current(mA, hold_multiplier); @@ -900,12 +921,12 @@ enum StealthIndex : uint8_t { st.begin(); CHOPCONF_t chopconf{0}; - chopconf.tbl = 0b01; - chopconf.toff = chop_init.toff; + chopconf.tbl = 0b01; + chopconf.toff = chop_init.toff; chopconf.intpol = interpolate; - chopconf.hend = chop_init.hend + 3; - chopconf.hstrt = chop_init.hstrt - 1; - TERN_(EDGE_STEPPING, chopconf.dedge = true); + chopconf.hend = chop_init.hend + 3; + chopconf.hstrt = chop_init.hstrt - 1; + chopconf.dedge = ENABLED(EDGE_STEPPING); st.CHOPCONF(chopconf.sr); st.rms_current(mA, hold_multiplier); diff --git a/docs/TMC2240_Datasheet.pdf b/docs/TMC2240_Datasheet.pdf new file mode 100644 index 0000000000..89c9cf817e Binary files /dev/null and b/docs/TMC2240_Datasheet.pdf differ