🧑‍💻 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,
* 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

View file

@ -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

View file

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

View file

@ -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

View file

@ -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<class TMC>
@ -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<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) {
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<TMC2208Stepper &>(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<TMC2208Stepper &>(st), i); break;
default:
_tmc_parse_drv_status(static_cast<TMC2208Stepper &>(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 <typename TMC>
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)

View file

@ -32,9 +32,6 @@
#include "trinamic.h"
#include "../stepper.h"
#include <HardwareSerial.h>
#include <SPI.h>
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);

BIN
docs/TMC2240_Datasheet.pdf Normal file

Binary file not shown.