diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index bd63e6362b3c..fe6dd5830b62 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 0 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -587,11 +590,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -637,14 +642,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } @@ -652,7 +657,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } @@ -891,6 +896,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 05701ce19ccb..f3818b34d4fb 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/HAL/HAL_AVR/SanityCheck.h b/Marlin/src/HAL/HAL_AVR/SanityCheck.h index 254da910c1e6..a61472cc4449 100644 --- a/Marlin/src/HAL/HAL_AVR/SanityCheck.h +++ b/Marlin/src/HAL/HAL_AVR/SanityCheck.h @@ -78,6 +78,8 @@ #error "SPINDLE_LASER_PWM_PIN is used by E3_AUTO_FAN_PIN." #elif PIN_EXISTS(E4_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E4_AUTO_FAN_PIN #error "SPINDLE_LASER_PWM_PIN is used by E4_AUTO_FAN_PIN." + #elif PIN_EXISTS(E5_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E5_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E5_AUTO_FAN_PIN." #elif PIN_EXISTS(FAN) && SPINDLE_LASER_PWM_PIN == FAN_PIN #error "SPINDLE_LASER_PWM_PIN is used FAN_PIN." #elif PIN_EXISTS(FAN1) && SPINDLE_LASER_PWM_PIN == FAN1_PIN @@ -106,6 +108,7 @@ || defined(Y2_HARDWARE_SERIAL) \ || defined(Z_HARDWARE_SERIAL ) \ || defined(Z2_HARDWARE_SERIAL) \ + || defined(Z3_HARDWARE_SERIAL) \ || defined(E0_HARDWARE_SERIAL) \ || defined(E1_HARDWARE_SERIAL) \ || defined(E2_HARDWARE_SERIAL) \ diff --git a/Marlin/src/HAL/HAL_AVR/endstop_interrupts.h b/Marlin/src/HAL/HAL_AVR/endstop_interrupts.h index 358b97f6ab4e..13b3f16e3b4d 100644 --- a/Marlin/src/HAL/HAL_AVR/endstop_interrupts.h +++ b/Marlin/src/HAL/HAL_AVR/endstop_interrupts.h @@ -225,6 +225,26 @@ void setup_endstop_interrupts( void ) { #endif #endif + #if HAS_Z3_MAX + #if (digitalPinToInterrupt(Z3_MAX_PIN) != NOT_AN_INTERRUPT) + attachInterrupt(digitalPinToInterrupt(Z3_MAX_PIN), endstop_ISR, CHANGE); + #else + // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! + static_assert(digitalPinToPCICR(Z3_MAX_PIN) != NULL, "Z3_MAX_PIN is not interrupt-capable"); + pciSetup(Z3_MAX_PIN); + #endif + #endif + + #if HAS_Z3_MIN + #if (digitalPinToInterrupt(Z3_MIN_PIN) != NOT_AN_INTERRUPT) + attachInterrupt(digitalPinToInterrupt(Z3_MIN_PIN), endstop_ISR, CHANGE); + #else + // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! + static_assert(digitalPinToPCICR(Z3_MIN_PIN) != NULL, "Z3_MIN_PIN is not interrupt-capable"); + pciSetup(Z3_MIN_PIN); + #endif + #endif + #if HAS_Z_MIN_PROBE_PIN #if (digitalPinToInterrupt(Z_MIN_PROBE_PIN) != NOT_AN_INTERRUPT) attachInterrupt(digitalPinToInterrupt(Z_MIN_PROBE_PIN), endstop_ISR, CHANGE); diff --git a/Marlin/src/HAL/HAL_DUE/endstop_interrupts.h b/Marlin/src/HAL/HAL_DUE/endstop_interrupts.h index 42cdba19fcae..a5c0df61bf08 100644 --- a/Marlin/src/HAL/HAL_DUE/endstop_interrupts.h +++ b/Marlin/src/HAL/HAL_DUE/endstop_interrupts.h @@ -72,6 +72,12 @@ void setup_endstop_interrupts(void) { #if HAS_Z2_MIN attachInterrupt(digitalPinToInterrupt(Z2_MIN_PIN), endstop_ISR, CHANGE); #endif + #if HAS_Z3_MAX + attachInterrupt(digitalPinToInterrupt(Z3_MAX_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z3_MIN + attachInterrupt(digitalPinToInterrupt(Z3_MIN_PIN), endstop_ISR, CHANGE); + #endif #if HAS_Z_MIN_PROBE_PIN attachInterrupt(digitalPinToInterrupt(Z_MIN_PROBE_PIN), endstop_ISR, CHANGE); #endif diff --git a/Marlin/src/HAL/HAL_ESP32/endstop_interrupts.h b/Marlin/src/HAL/HAL_ESP32/endstop_interrupts.h index b064f16bf53e..bcc32db19a41 100644 --- a/Marlin/src/HAL/HAL_ESP32/endstop_interrupts.h +++ b/Marlin/src/HAL/HAL_ESP32/endstop_interrupts.h @@ -67,6 +67,12 @@ void setup_endstop_interrupts(void) { #if HAS_Z2_MIN attachInterrupt(digitalPinToInterrupt(Z2_MIN_PIN), endstop_ISR, CHANGE); #endif + #if HAS_Z3_MAX + attachInterrupt(digitalPinToInterrupt(Z3_MAX_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z3_MIN + attachInterrupt(digitalPinToInterrupt(Z3_MIN_PIN), endstop_ISR, CHANGE); + #endif #if HAS_Z_MIN_PROBE_PIN attachInterrupt(digitalPinToInterrupt(Z_MIN_PROBE_PIN), endstop_ISR, CHANGE); #endif diff --git a/Marlin/src/HAL/HAL_LPC1768/endstop_interrupts.h b/Marlin/src/HAL/HAL_LPC1768/endstop_interrupts.h index 48312ccc072e..2dfed2f88402 100644 --- a/Marlin/src/HAL/HAL_LPC1768/endstop_interrupts.h +++ b/Marlin/src/HAL/HAL_LPC1768/endstop_interrupts.h @@ -91,6 +91,12 @@ void setup_endstop_interrupts(void) { #endif attachInterrupt(digitalPinToInterrupt(Z2_MIN_PIN), endstop_ISR, CHANGE); #endif + #if HAS_Z3_MAX + attachInterrupt(digitalPinToInterrupt(Z3_MAX_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z3_MIN + attachInterrupt(digitalPinToInterrupt(Z3_MIN_PIN), endstop_ISR, CHANGE); + #endif #if HAS_Z_MIN_PROBE_PIN #if !LPC1768_PIN_INTERRUPT_M(Z_MIN_PROBE_PIN) #error "Z_MIN_PROBE_PIN is not an INTERRUPT capable pin." diff --git a/Marlin/src/HAL/HAL_STM32F1/endstop_interrupts.h b/Marlin/src/HAL/HAL_STM32F1/endstop_interrupts.h index 27ef0a487c6f..1ffc330d89a1 100644 --- a/Marlin/src/HAL/HAL_STM32F1/endstop_interrupts.h +++ b/Marlin/src/HAL/HAL_STM32F1/endstop_interrupts.h @@ -79,6 +79,12 @@ void setup_endstop_interrupts(void) { #if HAS_Z2_MIN attachInterrupt(Z2_MIN_PIN, endstop_ISR, CHANGE); #endif + #if HAS_Z3_MAX + attachInterrupt(Z3_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z3_MIN + attachInterrupt(Z3_MIN_PIN, endstop_ISR, CHANGE); + #endif #if HAS_Z_MIN_PROBE_PIN attachInterrupt(Z_MIN_PROBE_PIN, endstop_ISR, CHANGE); #endif diff --git a/Marlin/src/HAL/HAL_STM32F4/HAL.h b/Marlin/src/HAL/HAL_STM32F4/HAL.h index bf648a108bcd..c7565e47ab10 100644 --- a/Marlin/src/HAL/HAL_STM32F4/HAL.h +++ b/Marlin/src/HAL/HAL_STM32F4/HAL.h @@ -124,6 +124,8 @@ #define ISRS_ENABLED() (!__get_PRIMASK()) #define ENABLE_ISRS() __enable_irq() #define DISABLE_ISRS() __disable_irq() +#define cli() __disable_irq() +#define sei() __enable_irq() // On AVR this is in math.h? #define square(x) ((x)*(x)) @@ -163,12 +165,6 @@ extern uint16_t HAL_adc_result; // Public functions // -------------------------------------------------------------------------- -// Disable interrupts -#define cli() do { DISABLE_TEMPERATURE_INTERRUPT(); DISABLE_STEPPER_DRIVER_INTERRUPT(); } while(0) - -// Enable interrupts -#define sei() do { ENABLE_TEMPERATURE_INTERRUPT(); ENABLE_STEPPER_DRIVER_INTERRUPT(); } while(0) - // Memory related #define __bss_end __bss_end__ @@ -209,7 +205,6 @@ void spiSend(uint32_t chan, const uint8_t* buf, size_t n); /** Read single byte from specified SPI channel */ uint8_t spiRec(uint32_t chan); - // EEPROM /** diff --git a/Marlin/src/HAL/HAL_STM32F4/endstop_interrupts.h b/Marlin/src/HAL/HAL_STM32F4/endstop_interrupts.h index 2ccfd570663c..e207b720aaba 100644 --- a/Marlin/src/HAL/HAL_STM32F4/endstop_interrupts.h +++ b/Marlin/src/HAL/HAL_STM32F4/endstop_interrupts.h @@ -54,6 +54,12 @@ void setup_endstop_interrupts(void) { #if HAS_Z2_MIN attachInterrupt(Z2_MIN_PIN, endstop_ISR, CHANGE); #endif + #if HAS_Z3_MAX + attachInterrupt(Z3_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z3_MIN + attachInterrupt(Z3_MIN_PIN, endstop_ISR, CHANGE); + #endif #if HAS_Z_MIN_PROBE_PIN attachInterrupt(Z_MIN_PROBE_PIN, endstop_ISR, CHANGE); #endif diff --git a/Marlin/src/HAL/HAL_STM32F7/HAL.h b/Marlin/src/HAL/HAL_STM32F7/HAL.h index 04588057ba50..2eb8f89b7912 100644 --- a/Marlin/src/HAL/HAL_STM32F7/HAL.h +++ b/Marlin/src/HAL/HAL_STM32F7/HAL.h @@ -114,6 +114,8 @@ #define ISRS_ENABLED() (!__get_PRIMASK()) #define ENABLE_ISRS() __enable_irq() #define DISABLE_ISRS() __disable_irq() +#define cli() __disable_irq() +#define sei() __enable_irq() // On AVR this is in math.h? #define square(x) ((x)*(x)) @@ -151,11 +153,7 @@ extern uint16_t HAL_adc_result; // Public functions // -------------------------------------------------------------------------- -// Disable interrupts -#define cli() do { DISABLE_TEMPERATURE_INTERRUPT(); DISABLE_STEPPER_DRIVER_INTERRUPT(); } while(0) -// Enable interrupts -#define sei() do { ENABLE_TEMPERATURE_INTERRUPT(); ENABLE_STEPPER_DRIVER_INTERRUPT(); } while(0) // Memory related #define __bss_end __bss_end__ diff --git a/Marlin/src/HAL/HAL_STM32F7/HAL_spi_STM32F7.cpp b/Marlin/src/HAL/HAL_STM32F7/HAL_spi_STM32F7.cpp index edf889711cbe..094ceda2da51 100644 --- a/Marlin/src/HAL/HAL_STM32F7/HAL_spi_STM32F7.cpp +++ b/Marlin/src/HAL/HAL_STM32F7/HAL_spi_STM32F7.cpp @@ -41,7 +41,7 @@ #include "pins_arduino.h" #include "spi_pins.h" #include "../../core/macros.h" - +#include // -------------------------------------------------------------------------- // Public Variables diff --git a/Marlin/src/HAL/HAL_STM32F7/HAL_timers_STM32F7.cpp b/Marlin/src/HAL/HAL_STM32F7/HAL_timers_STM32F7.cpp index 8aaa1dbab42e..3d48f5c291d8 100644 --- a/Marlin/src/HAL/HAL_STM32F7/HAL_timers_STM32F7.cpp +++ b/Marlin/src/HAL/HAL_STM32F7/HAL_timers_STM32F7.cpp @@ -148,4 +148,9 @@ void HAL_timer_isr_prologue(const uint8_t timer_num) { } } +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + const uint32_t IRQ_Id = uint32_t(timerConfig[timer_num].IRQ_Id); + return NVIC->ISER[IRQ_Id >> 5] & _BV32(IRQ_Id & 0x1F); +} + #endif // STM32F7 diff --git a/Marlin/src/HAL/HAL_STM32F7/HAL_timers_STM32F7.h b/Marlin/src/HAL/HAL_STM32F7/HAL_timers_STM32F7.h index 65bf5700e93c..92f0215fce22 100644 --- a/Marlin/src/HAL/HAL_STM32F7/HAL_timers_STM32F7.h +++ b/Marlin/src/HAL/HAL_STM32F7/HAL_timers_STM32F7.h @@ -61,6 +61,8 @@ #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) +#define TEMP_ISR_ENABLED() HAL_timer_interrupt_enabled(TEMP_TIMER_NUM) // TODO change this @@ -92,6 +94,7 @@ typedef struct { void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); void HAL_timer_enable_interrupt(const uint8_t timer_num); void HAL_timer_disable_interrupt(const uint8_t timer_num); +bool HAL_timer_interrupt_enabled(const uint8_t timer_num); void HAL_timer_set_compare(const uint8_t timer_num, const uint32_t compare); hal_timer_t HAL_timer_get_compare(const uint8_t timer_num); diff --git a/Marlin/src/HAL/HAL_STM32F7/SanityCheck.h b/Marlin/src/HAL/HAL_STM32F7/SanityCheck.h index 5bd0793a4d2f..880f5dfed68d 100644 --- a/Marlin/src/HAL/HAL_STM32F7/SanityCheck.h +++ b/Marlin/src/HAL/HAL_STM32F7/SanityCheck.h @@ -53,6 +53,8 @@ #error "SPINDLE_LASER_PWM_PIN is used by E3_AUTO_FAN_PIN." #elif PIN_EXISTS(E4_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E4_AUTO_FAN_PIN #error "SPINDLE_LASER_PWM_PIN is used by E4_AUTO_FAN_PIN." + #elif PIN_EXISTS(E5_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E5_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E5_AUTO_FAN_PIN." #elif PIN_EXISTS(FAN) && SPINDLE_LASER_PWM_PIN == FAN_PIN #error "SPINDLE_LASER_PWM_PIN is used FAN_PIN." #elif PIN_EXISTS(FAN1) && SPINDLE_LASER_PWM_PIN == FAN1_PIN diff --git a/Marlin/src/HAL/HAL_STM32F7/TMC2660.cpp b/Marlin/src/HAL/HAL_STM32F7/TMC2660.cpp index 71562425b98f..b29480faf807 100644 --- a/Marlin/src/HAL/HAL_STM32F7/TMC2660.cpp +++ b/Marlin/src/HAL/HAL_STM32F7/TMC2660.cpp @@ -33,7 +33,7 @@ #include #include "TMC2660.h" -#include "../../HAL/HAL_STM32F7/HAL_STM32F7.h" +#include "../../HAL/HAL_STM32F7/HAL.h" #include "../../core/serial.h" #include "../../inc/MarlinConfig.h" #include "../../Marlin.h" @@ -448,7 +448,7 @@ void TMC26XStepper::setMicrosteps(int number_of_steps) { /** * returns the effective number of microsteps at the moment */ -int TMC26XStepper::getMicrosteps(void) { return microsteps } +int TMC26XStepper::getMicrosteps(void) { return microsteps; } /** * constant_off_time: The off time setting controls the minimum chopper frequency. diff --git a/Marlin/src/HAL/HAL_STM32F7/endstop_interrupts.h b/Marlin/src/HAL/HAL_STM32F7/endstop_interrupts.h index 5b2cdb3a9e03..c96d713db40a 100644 --- a/Marlin/src/HAL/HAL_STM32F7/endstop_interrupts.h +++ b/Marlin/src/HAL/HAL_STM32F7/endstop_interrupts.h @@ -56,6 +56,12 @@ void setup_endstop_interrupts(void) { #if HAS_Z2_MIN attachInterrupt(Z2_MIN_PIN, endstop_ISR, CHANGE); #endif + #if HAS_Z3_MAX + attachInterrupt(Z3_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z3_MIN + attachInterrupt(Z3_MIN_PIN, endstop_ISR, CHANGE); + #endif #if HAS_Z_MIN_PROBE_PIN attachInterrupt(Z_MIN_PROBE_PIN, endstop_ISR, CHANGE); #endif diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/endstop_interrupts.h b/Marlin/src/HAL/HAL_TEENSY35_36/endstop_interrupts.h index 00e1b8b38ac1..d3f9d102bcc8 100644 --- a/Marlin/src/HAL/HAL_TEENSY35_36/endstop_interrupts.h +++ b/Marlin/src/HAL/HAL_TEENSY35_36/endstop_interrupts.h @@ -43,44 +43,40 @@ void endstop_ISR(void) { endstops.update(); } /** - * Endstop interrupts for Due based targets. - * On Due, all pins support external interrupt capability. + * Endstop interrupts for Due based targets. + * On Due, all pins support external interrupt capability. */ - void setup_endstop_interrupts( void ) { - #if HAS_X_MAX attachInterrupt(digitalPinToInterrupt(X_MAX_PIN), endstop_ISR, CHANGE); // assign it #endif - #if HAS_X_MIN attachInterrupt(digitalPinToInterrupt(X_MIN_PIN), endstop_ISR, CHANGE); #endif - #if HAS_Y_MAX attachInterrupt(digitalPinToInterrupt(Y_MAX_PIN), endstop_ISR, CHANGE); #endif - #if HAS_Y_MIN attachInterrupt(digitalPinToInterrupt(Y_MIN_PIN), endstop_ISR, CHANGE); #endif - #if HAS_Z_MAX attachInterrupt(digitalPinToInterrupt(Z_MAX_PIN), endstop_ISR, CHANGE); #endif - #if HAS_Z_MIN attachInterrupt(digitalPinToInterrupt(Z_MIN_PIN), endstop_ISR, CHANGE); #endif - #if HAS_Z2_MAX attachInterrupt(digitalPinToInterrupt(Z2_MAX_PIN), endstop_ISR, CHANGE); #endif - #if HAS_Z2_MIN attachInterrupt(digitalPinToInterrupt(Z2_MIN_PIN), endstop_ISR, CHANGE); #endif - + #if HAS_Z3_MAX + attachInterrupt(digitalPinToInterrupt(Z3_MAX_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z3_MIN + attachInterrupt(digitalPinToInterrupt(Z3_MIN_PIN), endstop_ISR, CHANGE); + #endif #if HAS_Z_MIN_PROBE_PIN attachInterrupt(digitalPinToInterrupt(Z_MIN_PROBE_PIN), endstop_ISR, CHANGE); #endif diff --git a/Marlin/src/Marlin.cpp b/Marlin/src/Marlin.cpp index 9720d824facf..ba9a0862dabf 100644 --- a/Marlin/src/Marlin.cpp +++ b/Marlin/src/Marlin.cpp @@ -40,6 +40,8 @@ #include "sd/cardreader.h" #include "module/configuration_store.h" #include "module/printcounter.h" // PrintCounter or Stopwatch +#include "feature/closedloop.h" + #ifdef ARDUINO #include #endif @@ -273,7 +275,7 @@ void quickstop_stepper() { planner.quick_stop(); planner.synchronize(); set_current_from_steppers_for_axis(ALL_AXES); - SYNC_PLAN_POSITION_KINEMATIC(); + sync_plan_position(); } void enable_all_steppers() { @@ -288,6 +290,7 @@ void enable_all_steppers() { enable_E2(); enable_E3(); enable_E4(); + enable_E5(); } void disable_e_steppers() { @@ -296,6 +299,7 @@ void disable_e_steppers() { disable_E2(); disable_E3(); disable_E4(); + disable_E5(); } void disable_e_stepper(const uint8_t e) { @@ -305,6 +309,7 @@ void disable_e_stepper(const uint8_t e) { case 2: disable_E2(); break; case 3: disable_E3(); break; case 4: disable_E4(); break; + case 5: disable_E5(); break; } } @@ -438,7 +443,7 @@ void manage_inactivity(const bool ignore_stepper_queue/*=false*/) { #if E_STEPPERS > 1 case 2: case 3: oldstatus = E1_ENABLE_READ; enable_E1(); break; #if E_STEPPERS > 2 - case 4: oldstatus = E2_ENABLE_READ; enable_E2(); break; + case 4: case 5: oldstatus = E2_ENABLE_READ; enable_E2(); break; #endif // E_STEPPERS > 2 #endif // E_STEPPERS > 1 } @@ -454,6 +459,9 @@ void manage_inactivity(const bool ignore_stepper_queue/*=false*/) { case 3: oldstatus = E3_ENABLE_READ; enable_E3(); break; #if E_STEPPERS > 4 case 4: oldstatus = E4_ENABLE_READ; enable_E4(); break; + #if E_STEPPERS > 5 + case 5: oldstatus = E5_ENABLE_READ; enable_E5(); break; + #endif // E_STEPPERS > 5 #endif // E_STEPPERS > 4 #endif // E_STEPPERS > 3 #endif // E_STEPPERS > 2 @@ -463,7 +471,7 @@ void manage_inactivity(const bool ignore_stepper_queue/*=false*/) { const float olde = current_position[E_AXIS]; current_position[E_AXIS] += EXTRUDER_RUNOUT_EXTRUDE; - planner.buffer_line_kinematic(current_position, MMM_TO_MMS(EXTRUDER_RUNOUT_SPEED), active_extruder); + planner.buffer_line(current_position, MMM_TO_MMS(EXTRUDER_RUNOUT_SPEED), active_extruder); current_position[E_AXIS] = olde; planner.set_e_position_mm(olde); planner.synchronize(); @@ -474,7 +482,7 @@ void manage_inactivity(const bool ignore_stepper_queue/*=false*/) { #if E_STEPPERS > 1 case 2: case 3: oldstatus = E1_ENABLE_WRITE(oldstatus); break; #if E_STEPPERS > 2 - case 4: oldstatus = E2_ENABLE_WRITE(oldstatus); break; + case 4: case 5: oldstatus = E2_ENABLE_WRITE(oldstatus); break; #endif // E_STEPPERS > 2 #endif // E_STEPPERS > 1 } @@ -489,6 +497,9 @@ void manage_inactivity(const bool ignore_stepper_queue/*=false*/) { case 3: E3_ENABLE_WRITE(oldstatus); break; #if E_STEPPERS > 4 case 4: E4_ENABLE_WRITE(oldstatus); break; + #if E_STEPPERS > 5 + case 5: E5_ENABLE_WRITE(oldstatus); break; + #endif // E_STEPPERS > 5 #endif // E_STEPPERS > 4 #endif // E_STEPPERS > 3 #endif // E_STEPPERS > 2 @@ -764,7 +775,7 @@ void setup() { #endif // Vital to init stepper/planner equivalent for current_position - SYNC_PLAN_POSITION_KINEMATIC(); + sync_plan_position(); thermalManager.init(); // Initialize temperature loop @@ -903,6 +914,14 @@ void setup() { #if ENABLED(USE_WATCHDOG) // Reinit watchdog after HAL_get_reset_source call watchdog_init(); #endif + + #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + init_closedloop(); + #endif + + #if ENABLED(SDSUPPORT) && DISABLED(ULTRA_LCD) + card.beginautostart(); + #endif } /** diff --git a/Marlin/src/Marlin.h b/Marlin/src/Marlin.h index 792bee8a4e99..a233b44a3052 100644 --- a/Marlin/src/Marlin.h +++ b/Marlin/src/Marlin.h @@ -64,7 +64,10 @@ void manage_inactivity(const bool ignore_stepper_queue=false); #define disable_Y() NOOP #endif -#if HAS_Z2_ENABLE +#if HAS_Z3_ENABLE + #define enable_Z() do{ Z_ENABLE_WRITE( Z_ENABLE_ON); Z2_ENABLE_WRITE(Z_ENABLE_ON); Z3_ENABLE_WRITE(Z_ENABLE_ON); }while(0) + #define disable_Z() do{ Z_ENABLE_WRITE(!Z_ENABLE_ON); Z2_ENABLE_WRITE(!Z_ENABLE_ON); Z3_ENABLE_WRITE(!Z_ENABLE_ON); CBI(axis_known_position, Z_AXIS); }while(0) +#elif HAS_Z2_ENABLE #define enable_Z() do{ Z_ENABLE_WRITE( Z_ENABLE_ON); Z2_ENABLE_WRITE(Z_ENABLE_ON); }while(0) #define disable_Z() do{ Z_ENABLE_WRITE(!Z_ENABLE_ON); Z2_ENABLE_WRITE(!Z_ENABLE_ON); CBI(axis_known_position, Z_AXIS); }while(0) #elif HAS_Z_ENABLE @@ -80,7 +83,10 @@ void manage_inactivity(const bool ignore_stepper_queue=false); /** * Mixing steppers synchronize their enable (and direction) together */ - #if MIXING_STEPPERS > 4 + #if MIXING_STEPPERS > 5 + #define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); E3_ENABLE_WRITE( E_ENABLE_ON); E4_ENABLE_WRITE( E_ENABLE_ON); E5_ENABLE_WRITE( E_ENABLE_ON); } + #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); E3_ENABLE_WRITE(!E_ENABLE_ON); E4_ENABLE_WRITE(!E_ENABLE_ON); E5_ENABLE_WRITE(!E_ENABLE_ON); } + #elif MIXING_STEPPERS > 4 #define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); E3_ENABLE_WRITE( E_ENABLE_ON); E4_ENABLE_WRITE( E_ENABLE_ON); } #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); E3_ENABLE_WRITE(!E_ENABLE_ON); E4_ENABLE_WRITE(!E_ENABLE_ON); } #elif MIXING_STEPPERS > 3 @@ -101,6 +107,8 @@ void manage_inactivity(const bool ignore_stepper_queue=false); #define disable_E3() NOOP #define enable_E4() NOOP #define disable_E4() NOOP + #define enable_E5() NOOP + #define disable_E5() NOOP #else // !MIXING_EXTRUDER @@ -144,6 +152,14 @@ void manage_inactivity(const bool ignore_stepper_queue=false); #define disable_E4() NOOP #endif + #if E_STEPPERS > 5 && HAS_E5_ENABLE + #define enable_E5() E5_ENABLE_WRITE( E_ENABLE_ON) + #define disable_E5() E5_ENABLE_WRITE(!E_ENABLE_ON) + #else + #define enable_E5() NOOP + #define disable_E5() NOOP + #endif + #endif // !MIXING_EXTRUDER #if ENABLED(EXPERIMENTAL_I2CBUS) diff --git a/Marlin/src/config/default/Configuration.h b/Marlin/src/config/default/Configuration.h index bd63e6362b3c..fe6dd5830b62 100644 --- a/Marlin/src/config/default/Configuration.h +++ b/Marlin/src/config/default/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 0 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -587,11 +590,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -637,14 +642,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } @@ -652,7 +657,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } @@ -891,6 +896,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/default/Configuration_adv.h b/Marlin/src/config/default/Configuration_adv.h index 05701ce19ccb..e7e844cfd93c 100755 --- a/Marlin/src/config/default/Configuration_adv.h +++ b/Marlin/src/config/default/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE_ENDSTOPS_ADJUSTMENT2 0 + #define Z_TRIPLE_ENDSTOPS_ADJUSTMENT3 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration.h b/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration.h index 2c0ca75c3411..149cbf5824db 100644 --- a/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration.h +++ b/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 7 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 250 #define HEATER_3_MAXTEMP 250 #define HEATER_4_MAXTEMP 250 +#define HEATER_5_MAXTEMP 250 #define BED_MAXTEMP 150 //=========================================================================== @@ -607,11 +610,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -657,14 +662,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 100.5, 100.5, 400, 850 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 800, 800, 8, 50 } @@ -672,7 +677,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } @@ -911,6 +916,7 @@ #define INVERT_E2_DIR true #define INVERT_E3_DIR true #define INVERT_E4_DIR true +#define INVERT_E5_DIR true // @section homing diff --git a/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration_adv.h b/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration_adv.h index 196bcea2a9c6..ed0f76c66c9a 100644 --- a/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration_adv.h +++ b/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 4, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 4, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/AliExpress/CL-260/Configuration.h b/Marlin/src/config/examples/AliExpress/CL-260/Configuration.h index 00994d3aaac3..c1c5eb6b0fc2 100644 --- a/Marlin/src/config/examples/AliExpress/CL-260/Configuration.h +++ b/Marlin/src/config/examples/AliExpress/CL-260/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -587,11 +590,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -637,14 +642,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 160.6 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } @@ -652,7 +657,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } @@ -891,6 +896,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Anet/A2/Configuration.h b/Marlin/src/config/examples/Anet/A2/Configuration.h index 84b25c19a462..a15e329e30c0 100644 --- a/Marlin/src/config/examples/Anet/A2/Configuration.h +++ b/Marlin/src/config/examples/Anet/A2/Configuration.h @@ -316,6 +316,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 5 #define TEMP_SENSOR_CHAMBER 0 @@ -346,6 +347,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -356,6 +358,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -570,11 +573,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -620,14 +625,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT {100, 100, 400, 95 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } @@ -635,7 +640,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } @@ -874,6 +879,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Anet/A2/Configuration_adv.h b/Marlin/src/config/examples/Anet/A2/Configuration_adv.h index 2e3ca3cf3181..0b1ba26dd1cf 100644 --- a/Marlin/src/config/examples/Anet/A2/Configuration_adv.h +++ b/Marlin/src/config/examples/Anet/A2/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -464,7 +472,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1100,6 +1108,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1161,6 +1173,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1225,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1301,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Anet/A2plus/Configuration.h b/Marlin/src/config/examples/Anet/A2plus/Configuration.h index 4a64fb733877..28de9602120f 100644 --- a/Marlin/src/config/examples/Anet/A2plus/Configuration.h +++ b/Marlin/src/config/examples/Anet/A2plus/Configuration.h @@ -316,6 +316,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 5 #define TEMP_SENSOR_CHAMBER 0 @@ -346,6 +347,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -356,6 +358,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -570,11 +573,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -620,14 +625,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT {100, 100, 400, 95 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } @@ -635,7 +640,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } @@ -874,6 +879,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Anet/A2plus/Configuration_adv.h b/Marlin/src/config/examples/Anet/A2plus/Configuration_adv.h index 2e3ca3cf3181..0b1ba26dd1cf 100644 --- a/Marlin/src/config/examples/Anet/A2plus/Configuration_adv.h +++ b/Marlin/src/config/examples/Anet/A2plus/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -464,7 +472,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1100,6 +1108,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1161,6 +1173,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1225,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1301,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Anet/A6/Configuration.h b/Marlin/src/config/examples/Anet/A6/Configuration.h index 2486ab5025ac..5f661f9ab28c 100644 --- a/Marlin/src/config/examples/Anet/A6/Configuration.h +++ b/Marlin/src/config/examples/Anet/A6/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 11 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 130 //=========================================================================== @@ -607,11 +610,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -657,7 +662,7 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ //#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 } @@ -669,7 +674,7 @@ /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ //#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } @@ -683,7 +688,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ //#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } @@ -971,6 +976,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Anet/A6/Configuration_adv.h b/Marlin/src/config/examples/Anet/A6/Configuration_adv.h index 7e8b3093534d..49a34ce5f23c 100644 --- a/Marlin/src/config/examples/Anet/A6/Configuration_adv.h +++ b/Marlin/src/config/examples/Anet/A6/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Anet/A8/Configuration.h b/Marlin/src/config/examples/Anet/A8/Configuration.h index ee85a150ddf3..ec8c73e203c4 100644 --- a/Marlin/src/config/examples/Anet/A8/Configuration.h +++ b/Marlin/src/config/examples/Anet/A8/Configuration.h @@ -334,6 +334,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 5 #define TEMP_SENSOR_CHAMBER 0 @@ -364,6 +365,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -374,6 +376,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 130 //=========================================================================== @@ -594,11 +597,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -644,14 +649,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 100, 100, 400, 100 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 8, 50 } @@ -659,7 +664,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 2000, 2000, 100, 10000 } @@ -898,6 +903,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Anet/A8/Configuration_adv.h b/Marlin/src/config/examples/Anet/A8/Configuration_adv.h index 2db18a1c8b29..4ec509090ae4 100644 --- a/Marlin/src/config/examples/Anet/A8/Configuration_adv.h +++ b/Marlin/src/config/examples/Anet/A8/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Azteeg/X5GT/Configuration.h b/Marlin/src/config/examples/Azteeg/X5GT/Configuration.h index 5f06a780ddea..55122dbbb9c7 100644 --- a/Marlin/src/config/examples/Azteeg/X5GT/Configuration.h +++ b/Marlin/src/config/examples/Azteeg/X5GT/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -587,11 +590,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -637,14 +642,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } @@ -652,7 +657,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } @@ -891,6 +896,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Azteeg/X5GT/Configuration_adv.h b/Marlin/src/config/examples/Azteeg/X5GT/Configuration_adv.h index 05701ce19ccb..f3818b34d4fb 100644 --- a/Marlin/src/config/examples/Azteeg/X5GT/Configuration_adv.h +++ b/Marlin/src/config/examples/Azteeg/X5GT/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration.h b/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration.h index 1bdcc04528fa..4a2113cbc4d2 100644 --- a/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration.h +++ b/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 5 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 115 //=========================================================================== @@ -611,14 +614,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 100, 100, 400, 400} /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 350, 350, 10, 50 } @@ -626,7 +629,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 1100, 1100, 300, 2500 } @@ -865,6 +868,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration_adv.h b/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration_adv.h index 931e42658ee0..4795243d11f6 100644 --- a/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration_adv.h +++ b/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/BIBO/TouchX/default/Configuration.h b/Marlin/src/config/examples/BIBO/TouchX/default/Configuration.h index 9ac054cb1510..e6716329870d 100644 --- a/Marlin/src/config/examples/BIBO/TouchX/default/Configuration.h +++ b/Marlin/src/config/examples/BIBO/TouchX/default/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 60 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 115 //=========================================================================== @@ -611,14 +614,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 100, 100, 400, 93.6 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 350, 350, 10, 25 } @@ -626,7 +629,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 1100, 1100, 300, 5000 } @@ -865,6 +868,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/BIBO/TouchX/default/Configuration_adv.h b/Marlin/src/config/examples/BIBO/TouchX/default/Configuration_adv.h index 2f19cb82c612..455521734ccc 100644 --- a/Marlin/src/config/examples/BIBO/TouchX/default/Configuration_adv.h +++ b/Marlin/src/config/examples/BIBO/TouchX/default/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/BQ/Hephestos/Configuration.h b/Marlin/src/config/examples/BQ/Hephestos/Configuration.h index 979b8d375bfc..35554ec0daf3 100644 --- a/Marlin/src/config/examples/BQ/Hephestos/Configuration.h +++ b/Marlin/src/config/examples/BQ/Hephestos/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 0 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 260 #define HEATER_3_MAXTEMP 260 #define HEATER_4_MAXTEMP 260 +#define HEATER_5_MAXTEMP 260 #define BED_MAXTEMP 150 //=========================================================================== @@ -575,11 +578,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -625,14 +630,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 100.47095761381482 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 200, 200, 3.3, 25 } @@ -640,7 +645,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 1100, 1100, 100, 10000 } @@ -879,6 +884,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/BQ/Hephestos/Configuration_adv.h b/Marlin/src/config/examples/BQ/Hephestos/Configuration_adv.h index 564437a5a1fd..ccf15e54fd6c 100644 --- a/Marlin/src/config/examples/BQ/Hephestos/Configuration_adv.h +++ b/Marlin/src/config/examples/BQ/Hephestos/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/BQ/Hephestos_2/Configuration.h b/Marlin/src/config/examples/BQ/Hephestos_2/Configuration.h index 203fec7bcf8a..636c3ca142ae 100644 --- a/Marlin/src/config/examples/BQ/Hephestos_2/Configuration.h +++ b/Marlin/src/config/examples/BQ/Hephestos_2/Configuration.h @@ -341,6 +341,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 0 #define TEMP_SENSOR_CHAMBER 0 @@ -371,6 +372,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -381,6 +383,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 100 //=========================================================================== @@ -588,11 +591,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -638,14 +643,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 160, 160, 8000, 218.77 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 3, 120 } @@ -653,7 +658,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 3000 } @@ -892,6 +897,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/BQ/Hephestos_2/Configuration_adv.h b/Marlin/src/config/examples/BQ/Hephestos_2/Configuration_adv.h index c734d1644727..dd15c0c93802 100644 --- a/Marlin/src/config/examples/BQ/Hephestos_2/Configuration_adv.h +++ b/Marlin/src/config/examples/BQ/Hephestos_2/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1088,6 +1107,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1108,6 +1131,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1154,6 +1181,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1169,6 +1199,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1218,11 +1251,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1292,49 +1327,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/BQ/WITBOX/Configuration.h b/Marlin/src/config/examples/BQ/WITBOX/Configuration.h index 7a9702e7d7ed..3c71e065814a 100644 --- a/Marlin/src/config/examples/BQ/WITBOX/Configuration.h +++ b/Marlin/src/config/examples/BQ/WITBOX/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 0 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 260 #define HEATER_3_MAXTEMP 260 #define HEATER_4_MAXTEMP 260 +#define HEATER_5_MAXTEMP 260 #define BED_MAXTEMP 150 //=========================================================================== @@ -575,11 +578,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -625,14 +630,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 600.0*8/3, 102.073 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 350, 350, 7.2, 80 } @@ -640,7 +645,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 1000, 1000, 10, 1000 } @@ -879,6 +884,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/BQ/WITBOX/Configuration_adv.h b/Marlin/src/config/examples/BQ/WITBOX/Configuration_adv.h index 564437a5a1fd..ccf15e54fd6c 100644 --- a/Marlin/src/config/examples/BQ/WITBOX/Configuration_adv.h +++ b/Marlin/src/config/examples/BQ/WITBOX/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Cartesio/Configuration.h b/Marlin/src/config/examples/Cartesio/Configuration.h index 21fc8377cc33..87902e5737af 100644 --- a/Marlin/src/config/examples/Cartesio/Configuration.h +++ b/Marlin/src/config/examples/Cartesio/Configuration.h @@ -334,6 +334,7 @@ #define TEMP_SENSOR_2 1 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -364,6 +365,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -374,6 +376,7 @@ #define HEATER_2_MAXTEMP 415 #define HEATER_3_MAXTEMP 415 #define HEATER_4_MAXTEMP 415 +#define HEATER_5_MAXTEMP 415 #define BED_MAXTEMP 165 //=========================================================================== @@ -586,11 +589,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -636,14 +641,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 71.128, 71.128, 640, 152 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 200, 200, 20, 20 } @@ -651,7 +656,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 1000, 1000, 100, 10000 } @@ -890,6 +895,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Cartesio/Configuration_adv.h b/Marlin/src/config/examples/Cartesio/Configuration_adv.h index 74dfd980bd9d..9d224ad7ad82 100644 --- a/Marlin/src/config/examples/Cartesio/Configuration_adv.h +++ b/Marlin/src/config/examples/Cartesio/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 35 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Creality/CR-10/Configuration.h b/Marlin/src/config/examples/Creality/CR-10/Configuration.h index 0425b9bcf903..4bf2cf367723 100755 --- a/Marlin/src/config/examples/Creality/CR-10/Configuration.h +++ b/Marlin/src/config/examples/Creality/CR-10/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 5 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 120 //=========================================================================== @@ -597,11 +600,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -647,14 +652,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 95 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 15, 25 } @@ -662,7 +667,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } @@ -901,6 +906,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Creality/CR-10/Configuration_adv.h b/Marlin/src/config/examples/Creality/CR-10/Configuration_adv.h index 2c06e048fa82..de6f22376671 100755 --- a/Marlin/src/config/examples/Creality/CR-10/Configuration_adv.h +++ b/Marlin/src/config/examples/Creality/CR-10/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Creality/CR-10S/Configuration.h b/Marlin/src/config/examples/Creality/CR-10S/Configuration.h index 3fb502165729..dd2dd461da9d 100644 --- a/Marlin/src/config/examples/Creality/CR-10S/Configuration.h +++ b/Marlin/src/config/examples/Creality/CR-10S/Configuration.h @@ -337,6 +337,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 5 #define TEMP_SENSOR_CHAMBER 0 @@ -367,6 +368,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -377,6 +379,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 120 //=========================================================================== @@ -591,11 +594,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -641,14 +646,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 95 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 2500, 2500, 100, 25 } @@ -656,7 +661,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } @@ -895,6 +900,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Creality/CR-10S/Configuration_adv.h b/Marlin/src/config/examples/Creality/CR-10S/Configuration_adv.h index 5219cbdb59a9..3bca47fd57f8 100644 --- a/Marlin/src/config/examples/Creality/CR-10S/Configuration_adv.h +++ b/Marlin/src/config/examples/Creality/CR-10S/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Creality/CR-10mini/Configuration.h b/Marlin/src/config/examples/Creality/CR-10mini/Configuration.h index e7d7702da739..4e69dde84831 100644 --- a/Marlin/src/config/examples/Creality/CR-10mini/Configuration.h +++ b/Marlin/src/config/examples/Creality/CR-10mini/Configuration.h @@ -342,6 +342,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 5 #define TEMP_SENSOR_CHAMBER 0 @@ -372,6 +373,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -382,6 +384,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 120 //=========================================================================== @@ -606,11 +609,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -656,14 +661,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 79.60, 80, 400, 229.4 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 15, 25 } @@ -671,7 +676,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } @@ -910,6 +915,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Creality/CR-10mini/Configuration_adv.h b/Marlin/src/config/examples/Creality/CR-10mini/Configuration_adv.h index 16f84ea6d215..47d32f8326ef 100644 --- a/Marlin/src/config/examples/Creality/CR-10mini/Configuration_adv.h +++ b/Marlin/src/config/examples/Creality/CR-10mini/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Creality/CR-8/Configuration.h b/Marlin/src/config/examples/Creality/CR-8/Configuration.h index ec6cbcf52d5f..4c63fdc2b1fc 100644 --- a/Marlin/src/config/examples/Creality/CR-8/Configuration.h +++ b/Marlin/src/config/examples/Creality/CR-8/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -597,11 +600,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -647,14 +652,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 92.60 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } @@ -662,7 +667,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } @@ -901,6 +906,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Creality/CR-8/Configuration_adv.h b/Marlin/src/config/examples/Creality/CR-8/Configuration_adv.h index f9f494947bc4..5aa2a86dcc3e 100644 --- a/Marlin/src/config/examples/Creality/CR-8/Configuration_adv.h +++ b/Marlin/src/config/examples/Creality/CR-8/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Creality/Ender-2/Configuration.h b/Marlin/src/config/examples/Creality/Ender-2/Configuration.h index 868f02174741..519373a7a54e 100644 --- a/Marlin/src/config/examples/Creality/Ender-2/Configuration.h +++ b/Marlin/src/config/examples/Creality/Ender-2/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 125 //=========================================================================== @@ -591,11 +594,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -641,14 +646,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 93 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } @@ -656,7 +661,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } @@ -895,6 +900,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Creality/Ender-2/Configuration_adv.h b/Marlin/src/config/examples/Creality/Ender-2/Configuration_adv.h index 2452d8bca3c3..327ce530ff25 100644 --- a/Marlin/src/config/examples/Creality/Ender-2/Configuration_adv.h +++ b/Marlin/src/config/examples/Creality/Ender-2/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Creality/Ender-3/Configuration.h b/Marlin/src/config/examples/Creality/Ender-3/Configuration.h index 0b1a077d8000..aabfd197f991 100644 --- a/Marlin/src/config/examples/Creality/Ender-3/Configuration.h +++ b/Marlin/src/config/examples/Creality/Ender-3/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 125 //=========================================================================== @@ -591,11 +594,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -641,14 +646,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 93 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } @@ -656,7 +661,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } @@ -895,6 +900,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Creality/Ender-3/Configuration_adv.h b/Marlin/src/config/examples/Creality/Ender-3/Configuration_adv.h index 11ab312c368f..bb7f9ac43fa9 100644 --- a/Marlin/src/config/examples/Creality/Ender-3/Configuration_adv.h +++ b/Marlin/src/config/examples/Creality/Ender-3/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Creality/Ender-4/Configuration.h b/Marlin/src/config/examples/Creality/Ender-4/Configuration.h index b9e6c2246ec7..2b7f01688d93 100644 --- a/Marlin/src/config/examples/Creality/Ender-4/Configuration.h +++ b/Marlin/src/config/examples/Creality/Ender-4/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -597,11 +600,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -647,14 +652,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 110 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 10, 25 } @@ -662,7 +667,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } @@ -901,6 +906,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Creality/Ender-4/Configuration_adv.h b/Marlin/src/config/examples/Creality/Ender-4/Configuration_adv.h index f9f494947bc4..5aa2a86dcc3e 100644 --- a/Marlin/src/config/examples/Creality/Ender-4/Configuration_adv.h +++ b/Marlin/src/config/examples/Creality/Ender-4/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Einstart-S/Configuration.h b/Marlin/src/config/examples/Einstart-S/Configuration.h index ab7dc49f5737..ed57d3a3760f 100644 --- a/Marlin/src/config/examples/Einstart-S/Configuration.h +++ b/Marlin/src/config/examples/Einstart-S/Configuration.h @@ -335,6 +335,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 0 #define TEMP_SENSOR_CHAMBER 0 @@ -365,6 +366,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -375,6 +377,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -599,11 +602,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -649,14 +654,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 80, 96.337120 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } @@ -664,7 +669,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 2000, 2000, 100, 10000 } @@ -901,6 +906,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Einstart-S/Configuration_adv.h b/Marlin/src/config/examples/Einstart-S/Configuration_adv.h index 4cfdd7c0322c..ef55363ce630 100644 --- a/Marlin/src/config/examples/Einstart-S/Configuration_adv.h +++ b/Marlin/src/config/examples/Einstart-S/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Felix/Configuration.h b/Marlin/src/config/examples/Felix/Configuration.h index a680ebdf8c71..c2639566b439 100644 --- a/Marlin/src/config/examples/Felix/Configuration.h +++ b/Marlin/src/config/examples/Felix/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -568,11 +571,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -619,14 +624,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 76.190476, 76.190476, 1600, 164 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } @@ -634,7 +639,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 5000, 5000, 100, 80000 } @@ -873,6 +878,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Felix/Configuration_adv.h b/Marlin/src/config/examples/Felix/Configuration_adv.h index f114b563e3ea..77edc1f76f2c 100644 --- a/Marlin/src/config/examples/Felix/Configuration_adv.h +++ b/Marlin/src/config/examples/Felix/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Felix/DUAL/Configuration.h b/Marlin/src/config/examples/Felix/DUAL/Configuration.h index edd8517c3aac..4c99dbb505bd 100644 --- a/Marlin/src/config/examples/Felix/DUAL/Configuration.h +++ b/Marlin/src/config/examples/Felix/DUAL/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -568,11 +571,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -619,14 +624,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 76.190476, 76.190476, 1600, 164 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } @@ -634,7 +639,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 5000, 5000, 100, 80000 } @@ -873,6 +878,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration.h b/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration.h index 79ac59cb1531..e20e63b46b9c 100644 --- a/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration.h +++ b/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 245 #define HEATER_3_MAXTEMP 245 #define HEATER_4_MAXTEMP 245 +#define HEATER_5_MAXTEMP 245 #define BED_MAXTEMP 115 //=========================================================================== @@ -592,11 +595,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -642,7 +647,7 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ //#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 52.2 } // 52.4 is correct for printer as shipped #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 104.4 } // 104.4 with 32 micro steps enabled gives better results @@ -650,7 +655,7 @@ /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 250, 250, 2, 17 } @@ -658,7 +663,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 1000, 1000, 4, 750 } @@ -897,6 +902,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration_adv.h b/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration_adv.h index 85e571875dd2..d3596773ffc0 100644 --- a/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration_adv.h +++ b/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Formbot/T-Rex_2+/Configuration.h b/Marlin/src/config/examples/Formbot/T-Rex_2+/Configuration.h index 7f62a258c9cd..bcfdf24dcbdf 100644 --- a/Marlin/src/config/examples/Formbot/T-Rex_2+/Configuration.h +++ b/Marlin/src/config/examples/Formbot/T-Rex_2+/Configuration.h @@ -22,7 +22,7 @@ //#define TREX3 // Turn this on for T-Rex 3 features like dual filament run out sensors -#define ROXYs_TRex // Turn this on to get customizations only available on Roxy's T-Rex 2+ +//#define ROXYs_TRex // Turn this on to get customizations only available on Roxy's T-Rex 2+ // Marlin controlled heat bed, Max7219 debug LED's, less bright LED light level // More aggressive PID numbers for hotends (due to double fans) /** @@ -138,8 +138,7 @@ // The following define selects which electronics board you have. // Please choose the name from boards.h that matches your setup #ifndef MOTHERBOARD -//#define MOTHERBOARD BOARD_RUMBA -#define MOTHERBOARD BOARD_FORMBOT + #define MOTHERBOARD BOARD_FORMBOT_TREX2 #endif // Optional custom name for your RepStrap or other custom machine @@ -326,6 +325,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #if(ENABLED(ROXYs_TRex)) #define TEMP_SENSOR_BED 11 @@ -362,6 +362,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -372,6 +373,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -600,11 +602,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -650,7 +654,7 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ //#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 160, 1600, 93 } #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 800, 93 } @@ -658,7 +662,7 @@ /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ //#define DEFAULT_MAX_FEEDRATE { 250, 150, 5, 25 } #define DEFAULT_MAX_FEEDRATE { 250, 100, 5, 25 } @@ -667,7 +671,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 1500, 500, 400, 4000 } @@ -917,6 +921,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Formbot/T-Rex_2+/Configuration_adv.h b/Marlin/src/config/examples/Formbot/T-Rex_2+/Configuration_adv.h index abbe4604f69a..bdecaf34b02c 100644 --- a/Marlin/src/config/examples/Formbot/T-Rex_2+/Configuration_adv.h +++ b/Marlin/src/config/examples/Formbot/T-Rex_2+/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -291,6 +292,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -335,6 +343,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -347,9 +366,6 @@ */ #define DUAL_X_CARRIAGE #if ENABLED(DUAL_X_CARRIAGE) - // Configuration for second X-carriage - // Note: the first x-carriage is defined as the x-carriage which homes to the minimum endstop; - // the second x-carriage always homes to the maximum endstop. #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage #define X1_MAX_POS (X_BED_SIZE) // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage #define X2_MIN_POS 0 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage @@ -471,7 +487,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1107,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1168,6 +1188,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1217,11 +1240,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1291,49 +1316,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 @@ -1519,12 +1552,12 @@ */ //#define CUSTOM_USER_MENUS #if ENABLED(CUSTOM_USER_MENUS) -//#define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_AUDIBLE_FEEDBACK #define USER_SCRIPT_RETURN // Return to status screen after a script #define USER_DESC_1 "User cmd 1" #define USER_GCODE_1 "G28 X \n" - + #define USER_DESC_2 "User cmd 2" #define USER_GCODE_2 "G28 \nG1 X100 \n" diff --git a/Marlin/src/config/examples/Formbot/T_Rex_3/Configuration.h b/Marlin/src/config/examples/Formbot/T_Rex_3/Configuration.h index 2097d16e144d..c8a9e8422361 100644 --- a/Marlin/src/config/examples/Formbot/T_Rex_3/Configuration.h +++ b/Marlin/src/config/examples/Formbot/T_Rex_3/Configuration.h @@ -20,15 +20,15 @@ * along with this program. If not, see . * */ - + #define TREX3 // Turn this on to generate a T-Rex 3 firmware image // The next few options are for firmware development and probably should not be used by Formbot. #define ICSP_PORT_SWITCHES // If ICSP_PORT_SWITCHES is defined, those pins become filament runout sensors // (But the SD Memory card won't work and is turned off!!!) - + #define ROXYs_TRex // Turn this on to get customizations only available on Roxy's T-Rex 2+ - // Marlin controlled heat bed, Max7219 debug LED's, less bright LED light level + // Marlin controlled heat bed, Max7219 debug LED's, less bright LED light level // More aggressive PID numbers for hotends (due to double fans) /** * Configuration.h @@ -330,6 +330,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #if(ENABLED(ROXYs_TRex)) #define TEMP_SENSOR_BED 11 @@ -372,6 +373,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -382,6 +384,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -610,11 +613,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -660,7 +665,7 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ //#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 160, 1600, 93 } #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 800, 93 } @@ -668,7 +673,7 @@ /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ //#define DEFAULT_MAX_FEEDRATE { 250, 150, 5, 25 } #define DEFAULT_MAX_FEEDRATE { 250, 100, 5, 25 } @@ -677,7 +682,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 1500, 500, 400, 4000 } @@ -927,6 +932,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing @@ -999,11 +1005,11 @@ * By default the firmware assumes HIGH=FILAMENT PRESENT. */ -#ifdef TREX3 +#ifdef TREX3 #define FILAMENT_RUNOUT_SENSOR #define NUM_RUNOUT_SENSORS 2 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. #else -//#define FILAMENT_RUNOUT_SENSOR + //#define FILAMENT_RUNOUT_SENSOR #endif #if ENABLED(FILAMENT_RUNOUT_SENSOR) @@ -1014,7 +1020,6 @@ #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" -//#define FILAMENT_RUNOUT_SCRIPT "M601" #endif //=========================================================================== @@ -2021,9 +2026,7 @@ // If the servo can't reach the requested position, increase it. #define SERVO_DELAY { 300 } -// Servo deactivation -// -// With this option servos are powered only during movement, then turned off to prevent jitter. +// Only power servos during movement, otherwise leave off to prevent jitter //#define DEACTIVATE_SERVOS_AFTER_MOVE #endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Formbot/T_Rex_3/Configuration_adv.h b/Marlin/src/config/examples/Formbot/T_Rex_3/Configuration_adv.h index 0da60da96584..522b335756bc 100644 --- a/Marlin/src/config/examples/Formbot/T_Rex_3/Configuration_adv.h +++ b/Marlin/src/config/examples/Formbot/T_Rex_3/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -291,6 +292,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -335,15 +343,29 @@ #endif #endif -// Enable this for dual x-carriage printers. -// A dual x-carriage design has the advantage that the inactive extruder can be parked which -// prevents hot-end ooze contaminating the print. It also reduces the weight of each x-carriage -// allowing faster printing speeds. Connect your X2 stepper to the first unused E plug. +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ #define DUAL_X_CARRIAGE #if ENABLED(DUAL_X_CARRIAGE) - // Configuration for second X-carriage - // Note: the first x-carriage is defined as the x-carriage which homes to the minimum endstop; - // the second x-carriage always homes to the maximum endstop. #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage #define X1_MAX_POS (X_BED_SIZE) // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage #define X2_MIN_POS 0 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage @@ -363,9 +385,7 @@ // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) - // Mode 3 (DXC_SYMMETRIC_DUPLICATION_MODE) : Symmetric Duplication mode. The firmware will perform similarly to DXC_DUPLICATION_MODE except in a mirror - // image of the first x-carriage. ie. If you are printing a right hand shoe on the 1st extruder, you will - // get a left hand shoe on the 2nd extruder. + // Mode 3 (DXC_SCALED_DUPLICATION_MODE) : Not working yet, but support routines in place // This is the default power-up mode which can be later using M605. #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_AUTO_PARK_MODE @@ -467,7 +487,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1102,6 +1122,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1163,6 +1187,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1212,11 +1239,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1286,49 +1315,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 @@ -1514,12 +1551,12 @@ */ //#define CUSTOM_USER_MENUS #if ENABLED(CUSTOM_USER_MENUS) -//#define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_AUDIBLE_FEEDBACK #define USER_SCRIPT_RETURN // Return to status screen after a script #define USER_DESC_1 "User cmd 1" #define USER_GCODE_1 "G28 X \n" - + #define USER_DESC_2 "User cmd 2" #define USER_GCODE_2 "G28 \nG1 X100 \n" diff --git a/Marlin/src/config/examples/Formbot/T_Rex_3/_Bootscreen.h b/Marlin/src/config/examples/Formbot/T_Rex_3/_Bootscreen.h index 5bedb17160c0..89c0f4309155 100644 --- a/Marlin/src/config/examples/Formbot/T_Rex_3/_Bootscreen.h +++ b/Marlin/src/config/examples/Formbot/T_Rex_3/_Bootscreen.h @@ -102,4 +102,3 @@ B10000000,B00000011,B11000000,B00000000,B01110000,B00001110,B10000001,B11111111, B10000000,B00000011,B11000000,B00000000,B01110000,B00000111,B00000000,B01111100,B00000011,B10000000,B00011100,B00000000,B00000001,B11100000,B00000000,B00000001, B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111 }; - diff --git a/Marlin/src/config/examples/Geeetech/GT2560/Configuration.h b/Marlin/src/config/examples/Geeetech/GT2560/Configuration.h index dc84de1f58f1..8e1a8876468e 100644 --- a/Marlin/src/config/examples/Geeetech/GT2560/Configuration.h +++ b/Marlin/src/config/examples/Geeetech/GT2560/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -602,11 +605,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -652,14 +657,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 78.74, 78.74, 2560, 105 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 45 } @@ -667,7 +672,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 5000, 5000, 50, 5000 } @@ -906,6 +911,7 @@ #define INVERT_E2_DIR true #define INVERT_E3_DIR true #define INVERT_E4_DIR true +#define INVERT_E5_DIR true // @section homing diff --git a/Marlin/src/config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h b/Marlin/src/config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h index 4c647827a0ae..40e76dd57c02 100644 --- a/Marlin/src/config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h +++ b/Marlin/src/config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -587,11 +590,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -637,14 +642,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 2560, 93 } // MXL, Z M8=1.25, MK8 /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 45 } @@ -652,7 +657,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 4000, 4000, 40, 4000 } @@ -891,6 +896,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h index 5129afb22f27..1546dc302b9b 100644 --- a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h +++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 125 //=========================================================================== @@ -602,11 +605,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -652,14 +657,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 78.74, 78.74, 2560, 105 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 45 } @@ -667,7 +672,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 5000, 5000, 75, 5000 } @@ -907,6 +912,7 @@ #define INVERT_E2_DIR true #define INVERT_E3_DIR true #define INVERT_E4_DIR true +#define INVERT_E5_DIR true // @section homing diff --git a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h index 8d978fdfa07e..93b38c8e3598 100644 --- a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h +++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 125 //=========================================================================== @@ -602,11 +605,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -652,14 +657,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 78.74, 78.74, 2560, 105 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 45 } @@ -667,7 +672,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 5000, 5000, 75, 5000 } @@ -906,6 +911,7 @@ #define INVERT_E2_DIR true #define INVERT_E3_DIR true #define INVERT_E4_DIR true +#define INVERT_E5_DIR true // @section homing diff --git a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration.h index 819f46d9c630..f567c360ff34 100644 --- a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration.h +++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -587,11 +590,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -637,14 +642,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 2560, 95, 95 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } @@ -652,7 +657,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } @@ -891,6 +896,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h index bedd6aae13b9..3b4d722e8db3 100644 --- a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h +++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration.h index 90f0a1fa87af..9fa5b38a6a16 100644 --- a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration.h +++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -587,11 +590,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -637,14 +642,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 2560, 95 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } @@ -652,7 +657,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } @@ -891,6 +896,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h index bedd6aae13b9..3b4d722e8db3 100644 --- a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h +++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Infitary/i3-M508/Configuration.h b/Marlin/src/config/examples/Infitary/i3-M508/Configuration.h index fc411be39212..c48f683d88a3 100644 --- a/Marlin/src/config/examples/Infitary/i3-M508/Configuration.h +++ b/Marlin/src/config/examples/Infitary/i3-M508/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 125 //=========================================================================== @@ -591,11 +594,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -641,14 +646,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 100, 100, 400, 92.6 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 5, 25 } @@ -656,7 +661,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } @@ -895,6 +900,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Infitary/i3-M508/Configuration_adv.h b/Marlin/src/config/examples/Infitary/i3-M508/Configuration_adv.h index 2b44b0c0da9a..2770c870ba4a 100644 --- a/Marlin/src/config/examples/Infitary/i3-M508/Configuration_adv.h +++ b/Marlin/src/config/examples/Infitary/i3-M508/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/JGAurora/A5/Configuration.h b/Marlin/src/config/examples/JGAurora/A5/Configuration.h index e7dc56cf7586..6e861693f831 100644 --- a/Marlin/src/config/examples/JGAurora/A5/Configuration.h +++ b/Marlin/src/config/examples/JGAurora/A5/Configuration.h @@ -338,6 +338,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 // measured to be satisfactorily accurate on center of bed within +/- 1 degC. #define TEMP_SENSOR_CHAMBER 0 @@ -368,6 +369,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -378,6 +380,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 120 //=========================================================================== @@ -599,11 +602,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -649,14 +654,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 800, 100 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 15, 25 } @@ -664,7 +669,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 1000, 500, 100, 5000 } @@ -903,6 +908,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/JGAurora/A5/Configuration_adv.h b/Marlin/src/config/examples/JGAurora/A5/Configuration_adv.h index 35447d2f353f..0b92f3889d14 100644 --- a/Marlin/src/config/examples/JGAurora/A5/Configuration_adv.h +++ b/Marlin/src/config/examples/JGAurora/A5/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/MakerParts/Configuration.h b/Marlin/src/config/examples/MakerParts/Configuration.h index 371abf5e332c..2622fc8ef17a 100644 --- a/Marlin/src/config/examples/MakerParts/Configuration.h +++ b/Marlin/src/config/examples/MakerParts/Configuration.h @@ -353,6 +353,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -383,6 +384,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -393,6 +395,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -607,11 +610,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -657,14 +662,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 97 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 2, 30 } // For 300mm/s printing @@ -672,7 +677,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { MAX_XYAXIS_ACCEL, MAX_XYAXIS_ACCEL, 10, 200 } @@ -911,6 +916,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/MakerParts/Configuration_adv.h b/Marlin/src/config/examples/MakerParts/Configuration_adv.h index b2de733082ac..d0d370c4bd89 100644 --- a/Marlin/src/config/examples/MakerParts/Configuration_adv.h +++ b/Marlin/src/config/examples/MakerParts/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Malyan/M150/Configuration.h b/Marlin/src/config/examples/Malyan/M150/Configuration.h index 5e3a3f44b862..22120e508979 100644 --- a/Marlin/src/config/examples/Malyan/M150/Configuration.h +++ b/Marlin/src/config/examples/Malyan/M150/Configuration.h @@ -338,6 +338,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 // For Malyan M150, some discussions around changing the TEMP_SENSOR_BED from 1 to 3 on a french discussion board. // The reasons are inconclusive so I leave at 1 @@ -371,6 +372,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -381,6 +383,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -624,7 +627,7 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ // Standard M150 17T MXL on X and Y #define DEFAULT_AXIS_STEPS_PER_UNIT { 3200/34.544, 3200/34.544, 1600, 103.00 } @@ -638,7 +641,7 @@ /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } @@ -646,7 +649,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 700, 700, 100, 10000 } @@ -889,6 +892,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Malyan/M150/Configuration_adv.h b/Marlin/src/config/examples/Malyan/M150/Configuration_adv.h index 8ef550a7d86e..beeb6d248d8b 100644 --- a/Marlin/src/config/examples/Malyan/M150/Configuration_adv.h +++ b/Marlin/src/config/examples/Malyan/M150/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Malyan/M200/Configuration.h b/Marlin/src/config/examples/Malyan/M200/Configuration.h index d97387b4ff3d..efbbd5d49ced 100644 --- a/Marlin/src/config/examples/Malyan/M200/Configuration.h +++ b/Marlin/src/config/examples/Malyan/M200/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 11 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 100 //=========================================================================== @@ -586,11 +589,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -636,14 +641,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 93, 93, 1097.5, 97 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } @@ -651,7 +656,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } @@ -890,6 +895,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Malyan/M200/Configuration_adv.h b/Marlin/src/config/examples/Malyan/M200/Configuration_adv.h index 1db6b9e4253c..4b70ba22fcd4 100644 --- a/Marlin/src/config/examples/Malyan/M200/Configuration_adv.h +++ b/Marlin/src/config/examples/Malyan/M200/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ #define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Micromake/C1/basic/Configuration.h b/Marlin/src/config/examples/Micromake/C1/basic/Configuration.h index b7930bc1e1f9..aaff055dfb6c 100644 --- a/Marlin/src/config/examples/Micromake/C1/basic/Configuration.h +++ b/Marlin/src/config/examples/Micromake/C1/basic/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 0 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -587,11 +590,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -637,7 +642,7 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ // choose your micro step per step configuration ( 16 factory settings ) #define DEFAULT_AXIS_STEPS_PER_UNIT { 100, 100, 100, 150 } // 16 steps per unit for Micromake C1 - Factory Settings - ( MS1 : closed ; MS2 : closed on MAKEBOARD Mini) @@ -648,7 +653,7 @@ /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 200, 200, 200, 30 } @@ -656,7 +661,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 3000, 4000 } @@ -895,6 +900,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration.h b/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration.h index ef6dbdcdd4b3..f5f82a3c8ac5 100644 --- a/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration.h +++ b/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 0 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -587,11 +590,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -637,7 +642,7 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ // choose your micro step per step configuration ( 16 factory settings ) //#define DEFAULT_AXIS_STEPS_PER_UNIT { 100, 100, 100, 150 } // 16 steps per unit for Micromake C1 - Factory Settings - ( MS1 : closed ; MS2 : closed on MAKEBOARD Mini) @@ -648,7 +653,7 @@ /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 200, 200, 200, 30 } @@ -656,7 +661,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 3000, 4000 } @@ -895,6 +900,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration_adv.h b/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration_adv.h index 8e1d2df13e0b..57000f64ab65 100644 --- a/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration_adv.h +++ b/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Mks/Sbase/Configuration.h b/Marlin/src/config/examples/Mks/Sbase/Configuration.h index 8ebbfaed52f7..f97414c3b3f3 100644 --- a/Marlin/src/config/examples/Mks/Sbase/Configuration.h +++ b/Marlin/src/config/examples/Mks/Sbase/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 5 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -587,11 +590,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -637,14 +642,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 200, 200, 800, 280 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } @@ -652,7 +657,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } @@ -891,6 +896,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Mks/Sbase/Configuration_adv.h b/Marlin/src/config/examples/Mks/Sbase/Configuration_adv.h index acc9e3d11fe8..4e4a2cba98e4 100644 --- a/Marlin/src/config/examples/Mks/Sbase/Configuration_adv.h +++ b/Marlin/src/config/examples/Mks/Sbase/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1088,6 +1107,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1108,6 +1131,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1154,6 +1181,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1169,6 +1199,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1218,11 +1251,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1292,49 +1327,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/RepRapPro/Huxley/Configuration.h b/Marlin/src/config/examples/RepRapPro/Huxley/Configuration.h index 086cebfca0bb..e45642f4b262 100644 --- a/Marlin/src/config/examples/RepRapPro/Huxley/Configuration.h +++ b/Marlin/src/config/examples/RepRapPro/Huxley/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 // Sanguinololu v1.3 with 4.7kOhm pullup #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -587,11 +590,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -676,14 +681,14 @@ Black rubber belt(MXL), 18 - tooth aluminium pulley : 87.489 step per mm (Huxley /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { XY_STEPS, XY_STEPS, Z_STEPS, E_STEPS } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_Z_FEEDRATE 3.3 // older Huxley has problem with speeds > 3.3 mm/s on z axis #define DEFAULT_MAX_FEEDRATE { 200, 200, DEFAULT_MAX_Z_FEEDRATE, 25 } @@ -692,7 +697,7 @@ Black rubber belt(MXL), 18 - tooth aluminium pulley : 87.489 step per mm (Huxley * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 1000, 1000, 50, 1000 } @@ -931,6 +936,7 @@ Black rubber belt(MXL), 18 - tooth aluminium pulley : 87.489 step per mm (Huxley #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/RepRapWorld/Megatronics/Configuration.h b/Marlin/src/config/examples/RepRapWorld/Megatronics/Configuration.h index 24761129f723..067c7ae79ff7 100644 --- a/Marlin/src/config/examples/RepRapWorld/Megatronics/Configuration.h +++ b/Marlin/src/config/examples/RepRapWorld/Megatronics/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -587,11 +590,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -637,14 +642,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 78.7402*2, 78.7402*2, 5120.00, 760*1*1.5 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } @@ -652,7 +657,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } @@ -891,6 +896,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/RigidBot/Configuration.h b/Marlin/src/config/examples/RigidBot/Configuration.h index 3286b9908367..6944b20e6d0b 100644 --- a/Marlin/src/config/examples/RigidBot/Configuration.h +++ b/Marlin/src/config/examples/RigidBot/Configuration.h @@ -336,6 +336,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -366,6 +367,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -376,6 +378,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -583,11 +586,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -633,7 +638,7 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ // default steps per unit for RigidBot with standard hardware #define DEFAULT_AXIS_STEPS_PER_UNIT { 44.3090, 22.1545, 1600, 53.5 } @@ -642,7 +647,7 @@ /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } @@ -650,7 +655,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 800, 800, 100, 10000 } @@ -889,6 +894,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/RigidBot/Configuration_adv.h b/Marlin/src/config/examples/RigidBot/Configuration_adv.h index 4dd0305c66a9..cf16f9d490c1 100644 --- a/Marlin/src/config/examples/RigidBot/Configuration_adv.h +++ b/Marlin/src/config/examples/RigidBot/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/SCARA/Configuration.h b/Marlin/src/config/examples/SCARA/Configuration.h index 04b2cecf03d8..e6b0883823d4 100644 --- a/Marlin/src/config/examples/SCARA/Configuration.h +++ b/Marlin/src/config/examples/SCARA/Configuration.h @@ -364,6 +364,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -394,6 +395,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -404,6 +406,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -600,11 +603,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -650,14 +655,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 103.69, 106.65, 200/1.25, 1000 } // default steps per unit for SCARA /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 30, 25 } @@ -665,7 +670,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 300, 300, 20, 1000 } @@ -904,6 +909,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/SCARA/Configuration_adv.h b/Marlin/src/config/examples/SCARA/Configuration_adv.h index 405eec5250a4..9382e5aa1f71 100644 --- a/Marlin/src/config/examples/SCARA/Configuration_adv.h +++ b/Marlin/src/config/examples/SCARA/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/STM32F10/Configuration.h b/Marlin/src/config/examples/STM32F10/Configuration.h index e44dd07f6933..6814e83bf926 100644 --- a/Marlin/src/config/examples/STM32F10/Configuration.h +++ b/Marlin/src/config/examples/STM32F10/Configuration.h @@ -334,6 +334,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 998 #define TEMP_SENSOR_CHAMBER 0 @@ -364,6 +365,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -374,6 +376,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -589,11 +592,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -639,14 +644,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 78.74, 78.74, 2560, 105.0 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 45 } @@ -654,7 +659,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 1400, 1400, 100, 80000 } @@ -893,6 +898,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/STM32F4/Configuration.h b/Marlin/src/config/examples/STM32F4/Configuration.h index 1f6dede41153..cacd5888bbfe 100644 --- a/Marlin/src/config/examples/STM32F4/Configuration.h +++ b/Marlin/src/config/examples/STM32F4/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 0 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -587,11 +590,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -637,14 +642,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } @@ -652,7 +657,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } @@ -891,6 +896,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Sanguinololu/Configuration.h b/Marlin/src/config/examples/Sanguinololu/Configuration.h index c8ad75ed927c..be45a6dde32d 100644 --- a/Marlin/src/config/examples/Sanguinololu/Configuration.h +++ b/Marlin/src/config/examples/Sanguinololu/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -587,11 +590,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -668,14 +673,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { XY_STEPS, XY_STEPS, Z_STEPS, E_STEPS } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 8, 45 } @@ -683,7 +688,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } @@ -922,6 +927,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Sanguinololu/Configuration_adv.h b/Marlin/src/config/examples/Sanguinololu/Configuration_adv.h index 22eb8a647bf9..face90b13c82 100644 --- a/Marlin/src/config/examples/Sanguinololu/Configuration_adv.h +++ b/Marlin/src/config/examples/Sanguinololu/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/TheBorg/Configuration.h b/Marlin/src/config/examples/TheBorg/Configuration.h index 98216cc61ef4..2331810df355 100644 --- a/Marlin/src/config/examples/TheBorg/Configuration.h +++ b/Marlin/src/config/examples/TheBorg/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 5 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -587,11 +590,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -637,14 +642,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 200, 200, 800, 280 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } @@ -652,7 +657,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } @@ -891,6 +896,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/TheBorg/Configuration_adv.h b/Marlin/src/config/examples/TheBorg/Configuration_adv.h index 45bd6482c8e3..cd13696c6547 100644 --- a/Marlin/src/config/examples/TheBorg/Configuration_adv.h +++ b/Marlin/src/config/examples/TheBorg/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/TinyBoy2/Configuration.h b/Marlin/src/config/examples/TinyBoy2/Configuration.h index 3abe23165ddf..bbf01cfb7265 100644 --- a/Marlin/src/config/examples/TinyBoy2/Configuration.h +++ b/Marlin/src/config/examples/TinyBoy2/Configuration.h @@ -355,6 +355,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #if ENABLED(TB2_HEATBED_MOD) // K8200 Heatbed 1206/100k/3950K spare part #define TEMP_SENSOR_BED 7 @@ -390,6 +391,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -400,6 +402,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 100 //=========================================================================== @@ -638,11 +641,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -688,14 +693,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 100, 100, 6400, 88.16 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 7, 35 } @@ -703,7 +708,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } @@ -942,6 +947,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/TinyBoy2/Configuration_adv.h b/Marlin/src/config/examples/TinyBoy2/Configuration_adv.h index f9bf3e7e64d7..efa35de48592 100644 --- a/Marlin/src/config/examples/TinyBoy2/Configuration_adv.h +++ b/Marlin/src/config/examples/TinyBoy2/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Tronxy/X1/Configuration.h b/Marlin/src/config/examples/Tronxy/X1/Configuration.h index 9bcd7b6f1a6d..0539fc935bdf 100644 --- a/Marlin/src/config/examples/Tronxy/X1/Configuration.h +++ b/Marlin/src/config/examples/Tronxy/X1/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 0 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 260 #define HEATER_3_MAXTEMP 260 #define HEATER_4_MAXTEMP 260 +#define HEATER_5_MAXTEMP 260 #define BED_MAXTEMP 150 //=========================================================================== @@ -587,11 +590,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -637,14 +642,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 100, 100, 1600, 90 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 50 } @@ -652,7 +657,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 400, 400, 40, 5000 } @@ -891,6 +896,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Tronxy/X3A/Configuration.h b/Marlin/src/config/examples/Tronxy/X3A/Configuration.h index a66ccb69bbf6..6eda16c2bf44 100644 --- a/Marlin/src/config/examples/Tronxy/X3A/Configuration.h +++ b/Marlin/src/config/examples/Tronxy/X3A/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 501 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 130 //=========================================================================== @@ -587,11 +590,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -637,14 +642,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 100, 100, 400, 90 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 4, 50 } @@ -652,7 +657,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 1000, 1000, 1500, 5000 } @@ -891,6 +896,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Tronxy/X3A/Configuration_adv.h b/Marlin/src/config/examples/Tronxy/X3A/Configuration_adv.h index 08bed247fe03..32f32cfd2edf 100644 --- a/Marlin/src/config/examples/Tronxy/X3A/Configuration_adv.h +++ b/Marlin/src/config/examples/Tronxy/X3A/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -464,7 +472,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1088,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1112,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1162,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1180,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1232,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1308,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Tronxy/X5S/Configuration.h b/Marlin/src/config/examples/Tronxy/X5S/Configuration.h index 145a64507a11..12c8a26edc53 100644 --- a/Marlin/src/config/examples/Tronxy/X5S/Configuration.h +++ b/Marlin/src/config/examples/Tronxy/X5S/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -587,11 +590,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -637,14 +642,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 90 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 4, 150 } @@ -652,7 +657,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 1000, 1000, 1000, 1000 } @@ -891,6 +896,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Tronxy/XY100/Configuration.h b/Marlin/src/config/examples/Tronxy/XY100/Configuration.h index 5271e38d19b3..ea1aad3f615c 100644 --- a/Marlin/src/config/examples/Tronxy/XY100/Configuration.h +++ b/Marlin/src/config/examples/Tronxy/XY100/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 0 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -598,11 +601,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -648,14 +653,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 100, 100, 1600, 90 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 4, 50 } @@ -663,7 +668,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 1000, 5000 } @@ -902,6 +907,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/UltiMachine/Archim2/Configuration.h b/Marlin/src/config/examples/UltiMachine/Archim2/Configuration.h index 7f77f1c47397..8149be7b6a49 100644 --- a/Marlin/src/config/examples/UltiMachine/Archim2/Configuration.h +++ b/Marlin/src/config/examples/UltiMachine/Archim2/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 0 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -587,11 +590,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 #define E0_DRIVER_TYPE TMC2130 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -637,14 +642,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } @@ -652,7 +657,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } @@ -891,6 +896,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/UltiMachine/Archim2/Configuration_adv.h b/Marlin/src/config/examples/UltiMachine/Archim2/Configuration_adv.h index 8ed4c3f8ea07..269992b6485f 100644 --- a/Marlin/src/config/examples/UltiMachine/Archim2/Configuration_adv.h +++ b/Marlin/src/config/examples/UltiMachine/Archim2/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Velleman/K8200/Configuration.h b/Marlin/src/config/examples/Velleman/K8200/Configuration.h index 9d484d5641fc..eb82f2f1d2ea 100644 --- a/Marlin/src/config/examples/Velleman/K8200/Configuration.h +++ b/Marlin/src/config/examples/Velleman/K8200/Configuration.h @@ -353,6 +353,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 5 #define TEMP_SENSOR_CHAMBER 0 @@ -383,6 +384,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -393,6 +395,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -617,11 +620,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -667,13 +672,13 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 64.25, 64.25, 2560, 600 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } @@ -681,7 +686,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } @@ -920,6 +925,7 @@ #define INVERT_E2_DIR true #define INVERT_E3_DIR true #define INVERT_E4_DIR true +#define INVERT_E5_DIR true // @section homing diff --git a/Marlin/src/config/examples/Velleman/K8200/Configuration_adv.h b/Marlin/src/config/examples/Velleman/K8200/Configuration_adv.h index ab14d61d9618..e226840445f8 100644 --- a/Marlin/src/config/examples/Velleman/K8200/Configuration_adv.h +++ b/Marlin/src/config/examples/Velleman/K8200/Configuration_adv.h @@ -255,6 +255,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -300,6 +301,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -344,6 +352,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -477,7 +496,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1093,6 +1112,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1113,6 +1136,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1159,6 +1186,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1174,6 +1204,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1223,11 +1256,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1297,49 +1332,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Velleman/K8400/Configuration.h b/Marlin/src/config/examples/Velleman/K8400/Configuration.h index 92755abe4a99..39c5990231c0 100644 --- a/Marlin/src/config/examples/Velleman/K8400/Configuration.h +++ b/Marlin/src/config/examples/Velleman/K8400/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 0 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -587,11 +590,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -637,14 +642,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 134.74, 134.74, 4266.66, 148.7 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 160, 160, 10, 10000 } @@ -652,7 +657,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } @@ -891,6 +896,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Velleman/K8400/Configuration_adv.h b/Marlin/src/config/examples/Velleman/K8400/Configuration_adv.h index 61e6742a829d..fc6cf2eb080b 100644 --- a/Marlin/src/config/examples/Velleman/K8400/Configuration_adv.h +++ b/Marlin/src/config/examples/Velleman/K8400/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/Velleman/K8400/Dual-head/Configuration.h b/Marlin/src/config/examples/Velleman/K8400/Dual-head/Configuration.h index 2ee2507818d6..b32def7e6cb4 100644 --- a/Marlin/src/config/examples/Velleman/K8400/Dual-head/Configuration.h +++ b/Marlin/src/config/examples/Velleman/K8400/Dual-head/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 0 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -587,11 +590,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -637,14 +642,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 134.74, 134.74, 4266.66, 148.7 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 160, 160, 10, 10000 } @@ -652,7 +657,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } @@ -891,6 +896,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration.h b/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration.h index 8b43a077a684..a63caa104538 100644 --- a/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration.h +++ b/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 120 //=========================================================================== @@ -597,11 +600,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -647,14 +652,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80.0395, 80.0395, 400.48, 99.1 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } @@ -662,7 +667,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 500 } @@ -901,6 +906,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration_adv.h b/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration_adv.h index fc62ed6732ea..127d2fd7d23b 100644 --- a/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration_adv.h +++ b/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1082,6 +1101,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1102,6 +1125,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1148,6 +1175,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1163,6 +1193,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1212,11 +1245,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1286,49 +1321,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/adafruit/ST7565/Configuration.h b/Marlin/src/config/examples/adafruit/ST7565/Configuration.h index 06d255ed24f0..a02999c88adb 100644 --- a/Marlin/src/config/examples/adafruit/ST7565/Configuration.h +++ b/Marlin/src/config/examples/adafruit/ST7565/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 0 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -587,11 +590,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -637,14 +642,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } @@ -652,7 +657,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } @@ -891,6 +896,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/delta/Anycubic/Kossel/Configuration.h b/Marlin/src/config/examples/delta/Anycubic/Kossel/Configuration.h new file mode 100644 index 000000000000..be5a3eeee701 --- /dev/null +++ b/Marlin/src/config/examples/delta/Anycubic/Kossel/Configuration.h @@ -0,0 +1,2155 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Choose your version: + */ +// normal size or plus? +//#define ANCYUBIC_KOSSEL_PLUS +// Anycubic Probe version 1 or 2 see README.md; 0 for no probe +#define ANYCUBIC_PROBE_VERSION 0 +// Heated Bed: +// 0 ... no heated bed +// 1 ... aluminium heated bed with "BuildTak-like" sticker +// 2 ... ultrabase heated bed +#define ANYCUBIC_KOSSEL_ENABLE_BED 0 + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "@brandstaetter, @grbd" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 "Welcome to ANYCUBIC" // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_TRIGORILLA_14 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "ANYCUBIC Kossel" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 + +#if ANYCUBIC_KOSSEL_ENABLE_BED > 0 + #define TEMP_SENSOR_BED 5 +#else + #define TEMP_SENSOR_BED 0 +#endif + +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 +#define BED_MAXTEMP 120 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + #define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + + // Anycubic Kossel - run 'M106 S255' & 'M303 E0 C10 S200' + #define DEFAULT_Kp 22.36 + #define DEFAULT_Ki 1.63 + #define DEFAULT_Kd 76.48 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +#if ANYCUBIC_KOSSEL_ENABLE_BED > 0 + #define PIDTEMPBED +#endif +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + // Anycubic Kossel + // this is for the aluminium bed with a BuildTak-like sticker on it + // from pid autotune. "M303 E-1 C8 S60" to run autotune on the bed at 60 degreesC for 8 cycles + #if ANYCUBIC_KOSSEL_ENABLE_BED == 1 + #define DEFAULT_bedKp 374.03 + #define DEFAULT_bedKi 72.47 + #define DEFAULT_bedKd 482.59 + #elif ANYCUBIC_KOSSEL_ENABLE_BED == 2 + // TODO get real PID values for Ultrabase Bed + #define DEFAULT_bedKp 374.03 + #define DEFAULT_bedKi 72.47 + #define DEFAULT_bedKd 482.59 + #endif + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + //#define DEFAULT_bedKp 10.00 + //#define DEFAULT_bedKi .023 + //#define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 750 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Delta Settings ============================= +//=========================================================================== +// Enable DELTA kinematics and most of the default configuration for Deltas +#define DELTA + +#if ENABLED(DELTA) + + // Make delta curves from many straight lines (linear interpolation). + // This is a trade-off between visible corners (not enough segments) + // and processor overload (too many expensive sqrt calls). + #define DELTA_SEGMENTS_PER_SECOND 80 + + // Convert feedrates to apply to the Effector instead of the Carriages + //#define DELTA_FEEDRATE_SCALING + + // After homing move down to a height where XY movement is unconstrained + #define DELTA_HOME_TO_SAFE_ZONE + + // Delta calibration menu + // uncomment to add three points calibration menu option. + // See http://minow.blogspot.com/index.html#4918805519571907051 + #define DELTA_CALIBRATION_MENU + + // uncomment to add G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results) + #if ANYCUBIC_PROBE_VERSION > 0 + #define DELTA_AUTO_CALIBRATION + #endif + + // NOTE NB all values for DELTA_* values MUST be floating point, so always have a decimal point in them + + #if ENABLED(DELTA_AUTO_CALIBRATION) + // set the default number of probe points : n*n (1 -> 7) + #define DELTA_CALIBRATION_DEFAULT_POINTS 4 + #endif + + #if ENABLED(DELTA_AUTO_CALIBRATION) || ENABLED(DELTA_CALIBRATION_MENU) + // Set the radius for the calibration probe points - max DELTA_PRINTABLE_RADIUS for non-eccentric probes + #define DELTA_CALIBRATION_RADIUS DELTA_PRINTABLE_RADIUS - MIN_PROBE_EDGE // mm + // Set the steprate for papertest probing + #define PROBE_MANUALLY_STEP 0.05 // mm + #endif + + #if ENABLED(ANCYUBIC_KOSSEL_PLUS) + // Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers). + #define DELTA_PRINTABLE_RADIUS 116.0 // mm + // Center-to-center distance of the holes in the diagonal push rods. + #define DELTA_DIAGONAL_ROD 271.5 // mm + // Horizontal offset from middle of printer to smooth rod center. + #define DELTA_SMOOTH_ROD_OFFSET 186 // mm + // Horizontal offset of the universal joints on the end effector. + #define DELTA_EFFECTOR_OFFSET 31 // mm + // Horizontal offset of the universal joints on the carriages. + #define DELTA_CARRIAGE_OFFSET 20.6 // mm + // Horizontal distance bridged by diagonal push rods when effector is centered. + #define DELTA_RADIUS (DELTA_SMOOTH_ROD_OFFSET-(DELTA_EFFECTOR_OFFSET)-(DELTA_CARRIAGE_OFFSET)) //mm Get this value from auto calibrate + #else + // Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers). + #define DELTA_PRINTABLE_RADIUS 90.0 // mm + // Center-to-center distance of the holes in the diagonal push rods. + #define DELTA_DIAGONAL_ROD 218.0 // mm + // Horizontal distance bridged by diagonal push rods when effector is centered. + #define DELTA_RADIUS 97.0 //mm Get this value from auto calibrate + #endif + + // height from z=0 to home position + #define DELTA_HEIGHT 320.00 // get this value from auto calibrate + + #define DELTA_ENDSTOP_ADJ { 0.0, 0.0, 0.0 } // get these from auto calibrate + + // Trim adjustments for individual towers + // tower angle corrections for X and Y tower / rotate XYZ so Z tower angle = 0 + // measured in degrees anticlockwise looking from above the printer + #define DELTA_TOWER_ANGLE_TRIM { 0.0, 0.0, 0.0 } // get these values from auto calibrate + + // delta radius and diaginal rod adjustments measured in mm + //#define DELTA_RADIUS_TRIM_TOWER { 0.0, 0.0, 0.0 } + //#define DELTA_DIAGONAL_ROD_TRIM_TOWER { 0.0, 0.0, 0.0 } + +#endif + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +//#define USE_XMIN_PLUG +//#define USE_YMIN_PLUG +#if ANYCUBIC_PROBE_VERSION > 0 + #define USE_ZMIN_PLUG // a Z probe +#endif +#define USE_XMAX_PLUG +#define USE_YMAX_PLUG +#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#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 E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +// delta speeds must be the same on xyz +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] + */ +// variables to calculate steps +#define XYZ_FULL_STEPS_PER_ROTATION 200 +#define XYZ_MICROSTEPS 16 +#define XYZ_BELT_PITCH 2 +#define XYZ_PULLEY_TEETH 20 + +// delta speeds must be the same on xyz +#define DEFAULT_XYZ_STEPS_PER_UNIT ((XYZ_FULL_STEPS_PER_ROTATION) * (XYZ_MICROSTEPS) / double(XYZ_BELT_PITCH) / double(XYZ_PULLEY_TEETH)) // 80 +#define DEFAULT_AXIS_STEPS_PER_UNIT { DEFAULT_XYZ_STEPS_PER_UNIT, DEFAULT_XYZ_STEPS_PER_UNIT, DEFAULT_XYZ_STEPS_PER_UNIT, 96 } // default steps per unit for Kossel (GT2, 20 tooth) + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 100, 100, 100, 100} + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 3000, 3000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 5.0 +#define DEFAULT_YJERK DEFAULT_XJERK +#define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta +#define DEFAULT_EJERK DEFAULT_XJERK + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#if ANYCUBIC_PROBE_VERSION > 0 + #define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN +#endif + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +#if ANYCUBIC_PROBE_VERSION == 0 + #define PROBE_MANUALLY + #define MANUAL_PROBE_START_Z 1.5 +#endif + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +#if ANYCUBIC_PROBE_VERSION > 0 + #define FIX_MOUNTED_PROBE +#endif + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 0 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 0 // Y offset: -front +behind [the nozzle] + +#if ANYCUBIC_PROBE_VERSION == 0 + #define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] +#elif ANYCUBIC_PROBE_VERSION == 1 + #define Z_PROBE_OFFSET_FROM_EXTRUDER -19.0 // Z offset: -below +above [the nozzle] +#else + #define Z_PROBE_OFFSET_FROM_EXTRUDER -16.8 // Z offset: -below +above [the nozzle] +#endif + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 20 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 6000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 3) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +#define MULTIPLE_PROBING 3 + +/** + * Allen key retractable z-probe as seen on many Kossel delta printers - http://reprap.org/wiki/Kossel#Automatic_bed_leveling_probe + * Deploys by touching z-axis belt. Retracts by pushing the probe down. Uses Z_MIN_PIN. + */ +//#define Z_PROBE_ALLEN_KEY + +#if ENABLED(Z_PROBE_ALLEN_KEY) + // 2 or 3 sets of coordinates for deploying and retracting the spring loaded touch probe on G29, + // if servo actuated touch probe is not defined. Uncomment as appropriate for your printer/probe. + + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_X 30.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_Y DELTA_PRINTABLE_RADIUS + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_Z 100.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_X 0.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Y DELTA_PRINTABLE_RADIUS + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Z 100.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE (XY_PROBE_SPEED)/10 + + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_X Z_PROBE_ALLEN_KEY_DEPLOY_2_X * 0.75 + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Y Z_PROBE_ALLEN_KEY_DEPLOY_2_Y * 0.75 + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Z Z_PROBE_ALLEN_KEY_DEPLOY_2_Z + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_STOW_1_X -64.0 // Move the probe into position + #define Z_PROBE_ALLEN_KEY_STOW_1_Y 56.0 + #define Z_PROBE_ALLEN_KEY_STOW_1_Z 23.0 + #define Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_STOW_2_X -64.0 // Push it down + #define Z_PROBE_ALLEN_KEY_STOW_2_Y 56.0 + #define Z_PROBE_ALLEN_KEY_STOW_2_Z 3.0 + #define Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE (XY_PROBE_SPEED)/10 + + #define Z_PROBE_ALLEN_KEY_STOW_3_X -64.0 // Move it up to clear + #define Z_PROBE_ALLEN_KEY_STOW_3_Y 56.0 + #define Z_PROBE_ALLEN_KEY_STOW_3_Z 50.0 + #define Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_STOW_4_X 0.0 + #define Z_PROBE_ALLEN_KEY_STOW_4_Y 0.0 + #define Z_PROBE_ALLEN_KEY_STOW_4_Z Z_PROBE_ALLEN_KEY_STOW_3_Z + #define Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE XY_PROBE_SPEED + +#endif // Z_PROBE_ALLEN_KEY + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 25 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 25 // Z Clearance between multiple probes +#define Z_AFTER_PROBING 30 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -40 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +#if ANYCUBIC_PROBE_VERSION > 0 + #define Z_MIN_PROBE_REPEATABILITY_TEST +#endif + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false +#define INVERT_E5_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR 1 // deltas always home to max +#define Y_HOME_DIR 1 +#define Z_HOME_DIR 1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE ((DELTA_PRINTABLE_RADIUS) * 2) +#define Y_BED_SIZE ((DELTA_PRINTABLE_RADIUS) * 2) + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS -(DELTA_PRINTABLE_RADIUS) +#define Y_MIN_POS -(DELTA_PRINTABLE_RADIUS) +#define Z_MIN_POS 0 +#define X_MAX_POS DELTA_PRINTABLE_RADIUS +#define Y_MAX_POS DELTA_PRINTABLE_RADIUS +#define Z_MAX_POS MANUAL_Z_HOME_POS + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +#if ANYCUBIC_PROBE_VERSION == 0 + #define AUTO_BED_LEVELING_3POINT +#else +//#define AUTO_BED_LEVELING_LINEAR + #define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING +#endif +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + //#define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + // Works best with 5 or more points in each dimension. + #define GRID_MAX_POINTS_X 9 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + #define LEFT_PROBE_BED_POSITION -(DELTA_PRINTABLE_RADIUS -(MIN_PROBE_EDGE)) + #define RIGHT_PROBE_BED_POSITION DELTA_PRINTABLE_RADIUS -(MIN_PROBE_EDGE) + #define FRONT_PROBE_BED_POSITION -(DELTA_PRINTABLE_RADIUS -(MIN_PROBE_EDGE)) + #define BACK_PROBE_BED_POSITION DELTA_PRINTABLE_RADIUS -(MIN_PROBE_EDGE) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + #define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + #define PROBE_PT_1_X -40 + #define PROBE_PT_1_Y 60 + #define PROBE_PT_2_X 40 + #define PROBE_PT_2_Y 60 + #define PROBE_PT_3_X 0 + #define PROBE_PT_3_Y -70 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.05 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +#define MANUAL_Z_HOME_POS DELTA_HEIGHT // Distance between the nozzle to printbed after homing + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Delta only homes to Z +#define HOMING_FEEDRATE_Z (100*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 190 +#define PREHEAT_1_TEMP_BED 60 +#define PREHEAT_1_FAN_SPEED 255 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 255 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { 0, 0, 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 100 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +#define ENCODER_PULSES_PER_STEP 3 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/delta/Anycubic/Kossel/Configuration_adv.h b/Marlin/src/config/examples/delta/Anycubic/Kossel/Configuration_adv.h new file mode 100644 index 000000000000..163e17e2da0f --- /dev/null +++ b/Marlin/src/config/examples/delta/Anycubic/Kossel/Configuration_adv.h @@ -0,0 +1,1710 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +//#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 5 // deltas need the same for all three axes +#define HOMING_BUMP_DIVISOR { 10, 10, 10 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE_XYZ 50*60 + #define MANUAL_FEEDRATE { MANUAL_FEEDRATE_XYZ, MANUAL_FEEDRATE_XYZ, MANUAL_FEEDRATE_XYZ, 60 } // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +// (don't use SLOWDOWN with DELTA because DELTA generates hundreds of segments per second) +//#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +#define LCD_INFO_MENU + +// Scroll a longer status message into view +#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + #define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + #define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 40 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 750 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 40 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 650 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + #define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 150 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + #define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + #define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + #define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/delta/Anycubic/Kossel/README.md b/Marlin/src/config/examples/delta/Anycubic/Kossel/README.md new file mode 100644 index 000000000000..874d71fae3c9 --- /dev/null +++ b/Marlin/src/config/examples/delta/Anycubic/Kossel/README.md @@ -0,0 +1,50 @@ +# Readme + +These configurations activate many of the new advanced features of the Marlin firmware: + + * Auto Calibration + * Auto Bed Leveling + * Pause & Filament Change + +**Important**: Before doing anything else after updating the firmware, go to `Configuration > Advanced Settings > Initialize EEPROM` to get rid of old configurations. + +Then you should execute `Configuration > Delta Calibration > Set Delta Height` and also run `Configuration > Delta Configuration > Probe Z-offset` to verify the Probe offset. + +After that you should connect the Z-Probe and start `Configuration > Delta Calibration > Auto Calibration`. When it's done don't forget to also do `Configuration > Delta Calibration > Store Settings` to make it permanent. + +You should also do a `Motion > Bed Leveling > Level bed` followed by `Store Settings` to ensure a perfect leveling. + +Please do a manual paper test (moving the nozzle slowly down to Z0 and checking with a piece of paper). If it's not perfect, use `Configuration > Advanced Settings > Probe Z Offset` to correct the difference and execute the calibration again. + + +# Select the Configuration + +**Please select the correct values at the start of the Configuration.h file** + +The Kossel comes in 3 versions: + + * Pulley + * Linear + * Linear Plus + +Pulley and Linear use the same configuration, the Linear Plus is bigger and uses slightly different configurations. + +Typically the probes for the Anycubic Delta Kossel printers come in two different versions. + + * Version 1: Z Probe Offset of -19.0mm + + ![Version 1 Probe](images/Version1Probe.jpg) + + * Version 2: Z Probe Offset of -16.8mm + + ![Version 2 Probe](images/Version2Probe.jpg) + +If you select the `ANYCUBIC_PROBE_VERSION 0`: It's very important to follow the correct procedure to set it up after flashing the firmware, otherwise you might damage the printer by ramming the nozzle into the buildplate: + +* `Configuration > Advanced Settings > Initialize EEPROM` +* `Motion > Move Axis > Soft Endstops` : `Off` +* Auto Home and slowly move the nozzle down until it barely touches the bed. (Do a paper-test: A normal sheet of paper should just feel the drag of the nozzle) and note this number. +* Subtract this number from the value in `Configuration > Delta Calibration > Delta Settings > Height`. (If it's negative, add it). +* Save and try the paper test again to verify your height. +* `Configuration > Store Settings` +* Motion > Bed Leveling (using paper test) diff --git a/Marlin/src/config/examples/delta/Anycubic/Kossel/images/Version1Probe.jpg b/Marlin/src/config/examples/delta/Anycubic/Kossel/images/Version1Probe.jpg new file mode 100644 index 000000000000..953373b1ab93 Binary files /dev/null and b/Marlin/src/config/examples/delta/Anycubic/Kossel/images/Version1Probe.jpg differ diff --git a/Marlin/src/config/examples/delta/Anycubic/Kossel/images/Version2Probe.jpg b/Marlin/src/config/examples/delta/Anycubic/Kossel/images/Version2Probe.jpg new file mode 100644 index 000000000000..f1f4baf2f283 Binary files /dev/null and b/Marlin/src/config/examples/delta/Anycubic/Kossel/images/Version2Probe.jpg differ diff --git a/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration.h b/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration.h index 44c57da83397..ff9242325aa7 100644 --- a/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration.h +++ b/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 5 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 250 #define HEATER_3_MAXTEMP 250 #define HEATER_4_MAXTEMP 250 +#define HEATER_5_MAXTEMP 250 #define BED_MAXTEMP 115 //=========================================================================== @@ -539,9 +542,6 @@ // and processor overload (too many expensive sqrt calls). #define DELTA_SEGMENTS_PER_SECOND 160 - // Convert feedrates to apply to the Effector instead of the Carriages - #define DELTA_FEEDRATE_SCALING - // After homing move down to a height where XY movement is unconstrained //#define DELTA_HOME_TO_SAFE_ZONE @@ -663,11 +663,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -714,7 +716,7 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ // variables to calculate steps #define XYZ_FULL_STEPS_PER_ROTATION 200 @@ -729,7 +731,7 @@ /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 200, 200, 200, 25 } @@ -737,7 +739,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 4000, 4000, 4000, 4000 } @@ -1026,6 +1028,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration_adv.h b/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration_adv.h index f02ec1b7c11a..2552c6297d43 100644 --- a/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration_adv.h +++ b/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -466,7 +485,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1082,6 +1101,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1102,6 +1125,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1148,6 +1175,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1163,6 +1193,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1212,11 +1245,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1286,49 +1321,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration.h b/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration.h index 624034a2a748..ea6b990d34f8 100644 --- a/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration.h +++ b/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 5 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 250 #define HEATER_3_MAXTEMP 250 #define HEATER_4_MAXTEMP 250 +#define HEATER_5_MAXTEMP 250 #define BED_MAXTEMP 115 //=========================================================================== @@ -539,9 +542,6 @@ // and processor overload (too many expensive sqrt calls). #define DELTA_SEGMENTS_PER_SECOND 160 - // Convert feedrates to apply to the Effector instead of the Carriages - #define DELTA_FEEDRATE_SCALING - // After homing move down to a height where XY movement is unconstrained //#define DELTA_HOME_TO_SAFE_ZONE @@ -663,11 +663,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -714,7 +716,7 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ // variables to calculate steps #define XYZ_FULL_STEPS_PER_ROTATION 200 @@ -729,7 +731,7 @@ /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 200, 200, 200, 25 } @@ -737,7 +739,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 4000, 4000, 4000, 4000 } @@ -1025,6 +1027,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration_adv.h b/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration_adv.h index f02ec1b7c11a..2552c6297d43 100644 --- a/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration_adv.h +++ b/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -466,7 +485,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1082,6 +1101,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1102,6 +1125,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1148,6 +1175,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1163,6 +1193,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1212,11 +1245,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1286,49 +1321,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration.h b/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration.h index 45b8e055a3c8..a034a7b4f819 100644 --- a/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration.h +++ b/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -539,9 +542,6 @@ // and processor overload (too many expensive sqrt calls). #define DELTA_SEGMENTS_PER_SECOND 160 - // Convert feedrates to apply to the Effector instead of the Carriages - #define DELTA_FEEDRATE_SCALING - // After homing move down to a height where XY movement is unconstrained //#define DELTA_HOME_TO_SAFE_ZONE @@ -663,11 +663,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -714,7 +716,7 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ // variables to calculate steps #define XYZ_FULL_STEPS_PER_ROTATION 200 @@ -729,7 +731,7 @@ /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 200, 200, 200, 200 } @@ -737,7 +739,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 4000, 4000, 4000, 4000 } @@ -1025,6 +1027,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration_adv.h b/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration_adv.h index c4e932d703b8..3f9dd3249d6a 100644 --- a/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration_adv.h +++ b/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -466,7 +485,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1082,6 +1101,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1102,6 +1125,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1148,6 +1175,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1163,6 +1193,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1212,11 +1245,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1286,49 +1321,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/delta/Hatchbox_Alpha/Configuration.h b/Marlin/src/config/examples/delta/Hatchbox_Alpha/Configuration.h index 05fa85ceab74..838df6f9b8e4 100644 --- a/Marlin/src/config/examples/delta/Hatchbox_Alpha/Configuration.h +++ b/Marlin/src/config/examples/delta/Hatchbox_Alpha/Configuration.h @@ -338,6 +338,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_CHAMBER 0 @@ -368,6 +369,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -378,6 +380,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -544,9 +547,6 @@ // and processor overload (too many expensive sqrt calls). #define DELTA_SEGMENTS_PER_SECOND 200 - // Convert feedrates to apply to the Effector instead of the Carriages - #define DELTA_FEEDRATE_SCALING - // After homing move down to a height where XY movement is unconstrained //#define DELTA_HOME_TO_SAFE_ZONE @@ -668,11 +668,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -719,7 +721,7 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ // variables to calculate steps #define XYZ_FULL_STEPS_PER_ROTATION 200 @@ -734,7 +736,7 @@ /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 500, 200 } @@ -742,7 +744,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 9000, 10000 } @@ -1028,6 +1030,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/delta/generic/Configuration.h b/Marlin/src/config/examples/delta/generic/Configuration.h index 79c7e2b98ec4..1887f46aea99 100644 --- a/Marlin/src/config/examples/delta/generic/Configuration.h +++ b/Marlin/src/config/examples/delta/generic/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 0 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -529,9 +532,6 @@ // and processor overload (too many expensive sqrt calls). #define DELTA_SEGMENTS_PER_SECOND 200 - // Convert feedrates to apply to the Effector instead of the Carriages - #define DELTA_FEEDRATE_SCALING - // After homing move down to a height where XY movement is unconstrained //#define DELTA_HOME_TO_SAFE_ZONE @@ -653,11 +653,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -704,7 +706,7 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ // variables to calculate steps #define XYZ_FULL_STEPS_PER_ROTATION 200 @@ -719,7 +721,7 @@ /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 500, 25 } @@ -727,7 +729,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 9000, 10000 } @@ -1013,6 +1015,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/delta/generic/Configuration_adv.h b/Marlin/src/config/examples/delta/generic/Configuration_adv.h index c4e932d703b8..3f9dd3249d6a 100644 --- a/Marlin/src/config/examples/delta/generic/Configuration_adv.h +++ b/Marlin/src/config/examples/delta/generic/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -466,7 +485,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1082,6 +1101,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1102,6 +1125,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1148,6 +1175,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1163,6 +1193,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1212,11 +1245,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1286,49 +1321,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/delta/kossel_mini/Configuration.h b/Marlin/src/config/examples/delta/kossel_mini/Configuration.h index 5da31daf3d45..5b7c3a80aad5 100644 --- a/Marlin/src/config/examples/delta/kossel_mini/Configuration.h +++ b/Marlin/src/config/examples/delta/kossel_mini/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 11 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -529,9 +532,6 @@ // and processor overload (too many expensive sqrt calls). #define DELTA_SEGMENTS_PER_SECOND 200 - // Convert feedrates to apply to the Effector instead of the Carriages - #define DELTA_FEEDRATE_SCALING - // After homing move down to a height where XY movement is unconstrained //#define DELTA_HOME_TO_SAFE_ZONE @@ -653,11 +653,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -704,7 +706,7 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ // variables to calculate steps #define XYZ_FULL_STEPS_PER_ROTATION 200 @@ -719,7 +721,7 @@ /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 500, 25 } @@ -727,7 +729,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 9000, 10000 } @@ -1015,6 +1017,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/delta/kossel_mini/Configuration_adv.h b/Marlin/src/config/examples/delta/kossel_mini/Configuration_adv.h index c4e932d703b8..3f9dd3249d6a 100644 --- a/Marlin/src/config/examples/delta/kossel_mini/Configuration_adv.h +++ b/Marlin/src/config/examples/delta/kossel_mini/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -466,7 +485,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1082,6 +1101,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1102,6 +1125,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1148,6 +1175,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1163,6 +1193,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1212,11 +1245,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1286,49 +1321,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/delta/kossel_pro/Configuration.h b/Marlin/src/config/examples/delta/kossel_pro/Configuration.h index d294301ff45c..51f070f15f2a 100644 --- a/Marlin/src/config/examples/delta/kossel_pro/Configuration.h +++ b/Marlin/src/config/examples/delta/kossel_pro/Configuration.h @@ -337,6 +337,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 5 #define TEMP_SENSOR_CHAMBER 0 @@ -367,6 +368,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -377,6 +379,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -515,9 +518,6 @@ // and processor overload (too many expensive sqrt calls). #define DELTA_SEGMENTS_PER_SECOND 160 - // Convert feedrates to apply to the Effector instead of the Carriages - #define DELTA_FEEDRATE_SCALING - // After homing move down to a height where XY movement is unconstrained //#define DELTA_HOME_TO_SAFE_ZONE @@ -639,11 +639,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -697,7 +699,7 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ // variables to calculate steps #define XYZ_FULL_STEPS_PER_ROTATION 200 @@ -712,7 +714,7 @@ /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 200, 200, 200, 200 } @@ -720,7 +722,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 9000, 9000 } @@ -1016,6 +1018,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/delta/kossel_pro/Configuration_adv.h b/Marlin/src/config/examples/delta/kossel_pro/Configuration_adv.h index 0718fb470abb..f5884af7e5f1 100644 --- a/Marlin/src/config/examples/delta/kossel_pro/Configuration_adv.h +++ b/Marlin/src/config/examples/delta/kossel_pro/Configuration_adv.h @@ -247,6 +247,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -292,6 +293,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -336,6 +344,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -471,7 +490,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1087,6 +1106,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1107,6 +1130,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1153,6 +1180,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1168,6 +1198,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1217,11 +1250,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1291,49 +1326,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/delta/kossel_xl/Configuration.h b/Marlin/src/config/examples/delta/kossel_xl/Configuration.h index a9234dae610b..3fbec32a598d 100644 --- a/Marlin/src/config/examples/delta/kossel_xl/Configuration.h +++ b/Marlin/src/config/examples/delta/kossel_xl/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 5 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -533,9 +536,6 @@ // and processor overload (too many expensive sqrt calls). #define DELTA_SEGMENTS_PER_SECOND 160 - // Convert feedrates to apply to the Effector instead of the Carriages - #define DELTA_FEEDRATE_SCALING - // After homing move down to a height where XY movement is unconstrained //#define DELTA_HOME_TO_SAFE_ZONE @@ -657,11 +657,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -707,7 +709,7 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ // variables to calculate steps #define XYZ_FULL_STEPS_PER_ROTATION 200 @@ -722,7 +724,7 @@ /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 200, 200, 200, 25 } @@ -730,7 +732,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 9000, 10000 } @@ -1016,6 +1018,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/delta/kossel_xl/Configuration_adv.h b/Marlin/src/config/examples/delta/kossel_xl/Configuration_adv.h index 74ebb3c3a203..de09be3874f7 100644 --- a/Marlin/src/config/examples/delta/kossel_xl/Configuration_adv.h +++ b/Marlin/src/config/examples/delta/kossel_xl/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -466,7 +485,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1082,6 +1101,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1102,6 +1125,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1148,6 +1175,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1163,6 +1193,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1212,11 +1245,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1286,49 +1321,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration.h b/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration.h index 9e8610c5e643..bd2a9d7ebf89 100644 --- a/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration.h +++ b/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration.h @@ -338,6 +338,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 75 // gMax-1.5+ users please note: This is a Roxy modification to the printer. I want // to print on glass. And I'm using a 400mm x 400mm silicon heat pad powered through // a Fortek SSR to do it. If you are using an unaltered gCreate machine, this needs @@ -371,6 +372,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -381,6 +383,7 @@ #define HEATER_2_MAXTEMP 245 #define HEATER_3_MAXTEMP 245 #define HEATER_4_MAXTEMP 245 +#define HEATER_5_MAXTEMP 245 #define BED_MAXTEMP 115 //=========================================================================== @@ -600,11 +603,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -650,14 +655,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 96 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 25, 25 } @@ -665,7 +670,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 800, 800, 700, 10000 } @@ -904,6 +909,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration_adv.h b/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration_adv.h index 9f029fa7cf27..487fe1a2353d 100644 --- a/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration_adv.h +++ b/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/makibox/Configuration.h b/Marlin/src/config/examples/makibox/Configuration.h index 1f6b8bacfdae..99360258f19a 100644 --- a/Marlin/src/config/examples/makibox/Configuration.h +++ b/Marlin/src/config/examples/makibox/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 12 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -590,11 +593,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -640,14 +645,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 400, 400, 400, 163 } // default steps per unit for ***** MakiBox A6 ***** /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 60, 60, 20, 45 } @@ -655,7 +660,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 2000, 2000, 30, 10000 } @@ -894,6 +899,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/makibox/Configuration_adv.h b/Marlin/src/config/examples/makibox/Configuration_adv.h index 43893f4de84e..4229127c530d 100644 --- a/Marlin/src/config/examples/makibox/Configuration_adv.h +++ b/Marlin/src/config/examples/makibox/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/stm32f103ret6/Configuration.h b/Marlin/src/config/examples/stm32f103ret6/Configuration.h index f3783fb1e9b1..e9979d9f2e35 100644 --- a/Marlin/src/config/examples/stm32f103ret6/Configuration.h +++ b/Marlin/src/config/examples/stm32f103ret6/Configuration.h @@ -334,6 +334,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 998 #define TEMP_SENSOR_CHAMBER 0 @@ -364,6 +365,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -374,6 +376,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -589,11 +592,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -639,14 +644,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 78.74, 78.74, 2560, 105.0 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 45 } @@ -654,7 +659,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 1400, 1400, 100, 80000 } @@ -893,6 +898,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/tvrrug/Round2/Configuration.h b/Marlin/src/config/examples/tvrrug/Round2/Configuration.h index 40f23dda3822..6636106b24b8 100644 --- a/Marlin/src/config/examples/tvrrug/Round2/Configuration.h +++ b/Marlin/src/config/examples/tvrrug/Round2/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 5 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -576,11 +579,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -626,7 +631,7 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 71.1, 71.1, 2560, 600 } // David TVRR @@ -637,7 +642,7 @@ /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 45 } // David TVRR @@ -645,7 +650,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } @@ -886,6 +891,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/tvrrug/Round2/Configuration_adv.h b/Marlin/src/config/examples/tvrrug/Round2/Configuration_adv.h index 8e387d1d6843..bc2b6f7eed2d 100644 --- a/Marlin/src/config/examples/tvrrug/Round2/Configuration_adv.h +++ b/Marlin/src/config/examples/tvrrug/Round2/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1080,6 +1099,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1100,6 +1123,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1146,6 +1173,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1161,6 +1191,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1210,11 +1243,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1284,49 +1319,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/config/examples/wt150/Configuration.h b/Marlin/src/config/examples/wt150/Configuration.h index 1c69b77c25b5..223c44cd37f1 100644 --- a/Marlin/src/config/examples/wt150/Configuration.h +++ b/Marlin/src/config/examples/wt150/Configuration.h @@ -333,6 +333,7 @@ #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_BED 0 #define TEMP_SENSOR_CHAMBER 0 @@ -363,6 +364,7 @@ #define HEATER_2_MINTEMP 5 #define HEATER_3_MINTEMP 5 #define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 #define BED_MINTEMP 5 // When temperature exceeds max temp, your heater will be switched off. @@ -373,6 +375,7 @@ #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 #define BED_MAXTEMP 150 //=========================================================================== @@ -592,11 +595,13 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -642,14 +647,14 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 71.699959, 71.699959, 71.699959, 100.470955 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_FEEDRATE { 83.333333, 83.333333, 19.5, 26.666666 } @@ -657,7 +662,7 @@ * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]] */ #define DEFAULT_MAX_ACCELERATION { 1200, 1200, 100, 10000 } @@ -896,6 +901,7 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false +#define INVERT_E5_DIR false // @section homing diff --git a/Marlin/src/config/examples/wt150/Configuration_adv.h b/Marlin/src/config/examples/wt150/Configuration_adv.h index 9aa7f5a49d17..5ed0c133e450 100644 --- a/Marlin/src/config/examples/wt150/Configuration_adv.h +++ b/Marlin/src/config/examples/wt150/Configuration_adv.h @@ -242,6 +242,7 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed @@ -287,6 +288,13 @@ //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + /** * Dual Steppers / Dual Endstops * @@ -331,6 +339,17 @@ #endif #endif +//#define Z_TRIPLE_STEPPER_DRIVERS +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + //#define Z_TRIPLE_ENDSTOPS + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z3_USE_ENDSTOP _YMAX_ + #define Z_TRIPLE2_ENDSTOPS_ADJUSTMENT 0 + #define Z_TRIPLE3_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + /** * Dual X Carriage * @@ -464,7 +483,7 @@ //#define ADAPTIVE_STEP_SMOOTHING // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. -#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1081,6 +1100,10 @@ #define Z2_SENSE_RESISTOR 91 #define Z2_MICROSTEPS 16 + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #define E0_MAX_CURRENT 1000 #define E0_SENSE_RESISTOR 91 #define E0_MICROSTEPS 16 @@ -1101,6 +1124,10 @@ #define E4_SENSE_RESISTOR 91 #define E4_MICROSTEPS 16 + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif // TMC26X // @section tmc_smart @@ -1147,6 +1174,9 @@ #define Z2_CURRENT 800 #define Z2_MICROSTEPS 16 + #define Z3_CURRENT 800 + #define Z3_MICROSTEPS 16 + #define E0_CURRENT 800 #define E0_MICROSTEPS 16 @@ -1162,6 +1192,9 @@ #define E4_CURRENT 800 #define E4_MICROSTEPS 16 + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + /** * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, @@ -1211,11 +1244,13 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 /** * Use stallGuard2 to sense an obstacle and trigger an endstop. @@ -1285,49 +1320,57 @@ */ #if HAS_DRIVER(L6470) - #define X_MICROSTEPS 16 // number of microsteps - #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off - #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - #define X2_MICROSTEPS 16 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #define Y_MICROSTEPS 16 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #define Y2_MICROSTEPS 16 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #define Z_MICROSTEPS 16 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #define Z2_MICROSTEPS 16 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #define E0_MICROSTEPS 16 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 + #define Z3_MICROSTEPS 16 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 - #define E1_MICROSTEPS 16 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #define E2_MICROSTEPS 16 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #define E3_MICROSTEPS 16 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #define E4_MICROSTEPS 16 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 + #define E5_MICROSTEPS 16 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 #endif // L6470 diff --git a/Marlin/src/core/drivers.h b/Marlin/src/core/drivers.h index 6ba0df7d4953..e775c58b5c60 100644 --- a/Marlin/src/core/drivers.h +++ b/Marlin/src/core/drivers.h @@ -47,21 +47,23 @@ #define AXIS_DRIVER_TYPE_Z(T) _AXIS_DRIVER_TYPE(Z,T) #define AXIS_DRIVER_TYPE_X2(T) (ENABLED(X_DUAL_STEPPER_DRIVERS) || ENABLED(DUAL_X_CARRIAGE)) && _AXIS_DRIVER_TYPE(X2,T) #define AXIS_DRIVER_TYPE_Y2(T) (ENABLED(Y_DUAL_STEPPER_DRIVERS) && _AXIS_DRIVER_TYPE(Y2,T)) -#define AXIS_DRIVER_TYPE_Z2(T) (ENABLED(Z_DUAL_STEPPER_DRIVERS) && _AXIS_DRIVER_TYPE(Z2,T)) +#define AXIS_DRIVER_TYPE_Z2(T) (Z_MULTI_STEPPER_DRIVERS && _AXIS_DRIVER_TYPE(Z2,T)) +#define AXIS_DRIVER_TYPE_Z3(T) (ENABLED(Z_TRIPLE_STEPPER_DRIVERS) && _AXIS_DRIVER_TYPE(Z3,T)) #define AXIS_DRIVER_TYPE_E0(T) (E_STEPPERS > 0 && _AXIS_DRIVER_TYPE(E0,T)) #define AXIS_DRIVER_TYPE_E1(T) (E_STEPPERS > 1 && _AXIS_DRIVER_TYPE(E1,T)) #define AXIS_DRIVER_TYPE_E2(T) (E_STEPPERS > 2 && _AXIS_DRIVER_TYPE(E2,T)) #define AXIS_DRIVER_TYPE_E3(T) (E_STEPPERS > 3 && _AXIS_DRIVER_TYPE(E3,T)) #define AXIS_DRIVER_TYPE_E4(T) (E_STEPPERS > 4 && _AXIS_DRIVER_TYPE(E4,T)) +#define AXIS_DRIVER_TYPE_E5(T) (E_STEPPERS > 5 && _AXIS_DRIVER_TYPE(E5,T)) #define AXIS_DRIVER_TYPE(A,T) AXIS_DRIVER_TYPE_##A(T) #define HAS_DRIVER(T) (AXIS_DRIVER_TYPE_X(T) || AXIS_DRIVER_TYPE_X2(T) || \ AXIS_DRIVER_TYPE_Y(T) || AXIS_DRIVER_TYPE_Y2(T) || \ - AXIS_DRIVER_TYPE_Z(T) || AXIS_DRIVER_TYPE_Z2(T) || \ + AXIS_DRIVER_TYPE_Z(T) || AXIS_DRIVER_TYPE_Z2(T) || AXIS_DRIVER_TYPE_Z3(T) || \ AXIS_DRIVER_TYPE_E0(T) || AXIS_DRIVER_TYPE_E1(T) || \ AXIS_DRIVER_TYPE_E2(T) || AXIS_DRIVER_TYPE_E3(T) || \ - AXIS_DRIVER_TYPE_E4(T) ) + AXIS_DRIVER_TYPE_E4(T) || AXIS_DRIVER_TYPE_E5(T) ) // Test for supported TMC drivers that require advanced configuration // Does not match standalone configurations diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index 359cc3e4fe83..31b7874d4b94 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -139,23 +139,25 @@ #define MSG_RESEND "Resend: " #define MSG_UNKNOWN_COMMAND "Unknown command: \"" #define MSG_ACTIVE_EXTRUDER "Active Extruder: " -#define MSG_X_MIN "x_min: " -#define MSG_X_MAX "x_max: " -#define MSG_X2_MIN "x2_min: " -#define MSG_X2_MAX "x2_max: " -#define MSG_Y_MIN "y_min: " -#define MSG_Y_MAX "y_max: " -#define MSG_Y2_MIN "y2_min: " -#define MSG_Y2_MAX "y2_max: " -#define MSG_Z_MIN "z_min: " -#define MSG_Z_MAX "z_max: " -#define MSG_Z2_MIN "z2_min: " -#define MSG_Z2_MAX "z2_max: " -#define MSG_Z_PROBE "z_probe: " +#define MSG_X_MIN "x_min" +#define MSG_X_MAX "x_max" +#define MSG_X2_MIN "x2_min" +#define MSG_X2_MAX "x2_max" +#define MSG_Y_MIN "y_min" +#define MSG_Y_MAX "y_max" +#define MSG_Y2_MIN "y2_min" +#define MSG_Y2_MAX "y2_max" +#define MSG_Z_MIN "z_min" +#define MSG_Z_MAX "z_max" +#define MSG_Z2_MIN "z2_min" +#define MSG_Z2_MAX "z2_max" +#define MSG_Z3_MIN "z3_min" +#define MSG_Z3_MAX "z3_max" +#define MSG_Z_PROBE "z_probe" +#define MSG_FILAMENT_RUNOUT_SENSOR "filament" #define MSG_PROBE_Z_OFFSET "Probe Z Offset" #define MSG_SKEW_MIN "min_skew_factor: " #define MSG_SKEW_MAX "max_skew_factor: " -#define MSG_FILAMENT_RUNOUT_SENSOR "filament: " #define MSG_ERR_MATERIAL_INDEX "M145 S out of range (0-1)" #define MSG_ERR_M355_NONE "No case light" #define MSG_ERR_M421_PARAMETERS "M421 incorrect parameter usage" @@ -287,26 +289,31 @@ #define MSG_H3 "3" #define MSG_H4 "4" #define MSG_H5 "5" +#define MSG_H6 "6" #define MSG_N1 " 1" #define MSG_N2 " 2" #define MSG_N3 " 3" #define MSG_N4 " 4" #define MSG_N5 " 5" +#define MSG_N6 " 6" #define MSG_E1 "E1" #define MSG_E2 "E2" #define MSG_E3 "E3" #define MSG_E4 "E4" #define MSG_E5 "E5" +#define MSG_E6 "E6" #define MSG_MOVE_E1 "1" #define MSG_MOVE_E2 "2" #define MSG_MOVE_E3 "3" #define MSG_MOVE_E4 "4" #define MSG_MOVE_E5 "5" +#define MSG_MOVE_E6 "6" #define MSG_DIAM_E1 " 1" #define MSG_DIAM_E2 " 2" #define MSG_DIAM_E3 " 3" #define MSG_DIAM_E4 " 4" #define MSG_DIAM_E5 " 5" +#define MSG_DIAM_E6 " 6" #include INCLUDE_LANGUAGE diff --git a/Marlin/src/feature/I2CPositionEncoder.cpp b/Marlin/src/feature/I2CPositionEncoder.cpp index f5bec8885c80..55c607ca4f0d 100644 --- a/Marlin/src/feature/I2CPositionEncoder.cpp +++ b/Marlin/src/feature/I2CPositionEncoder.cpp @@ -646,6 +646,37 @@ void I2CPositionEncodersMgr::init() { encoders[i].set_homed(); #endif #endif + + #if I2CPE_ENCODER_CNT > 5 + i++; + + encoders[i].init(I2CPE_ENC_6_ADDR, I2CPE_ENC_6_AXIS); + + #ifdef I2CPE_ENC_6_TYPE + encoders[i].set_type(I2CPE_ENC_6_TYPE); + #endif + #ifdef I2CPE_ENC_6_TICKS_UNIT + encoders[i].set_ticks_unit(I2CPE_ENC_6_TICKS_UNIT); + #endif + #ifdef I2CPE_ENC_6_TICKS_REV + encoders[i].set_stepper_ticks(I2CPE_ENC_6_TICKS_REV); + #endif + #ifdef I2CPE_ENC_6_INVERT + encoders[i].set_inverted(I2CPE_ENC_6_INVERT); + #endif + #ifdef I2CPE_ENC_6_EC_METHOD + encoders[i].set_ec_method(I2CPE_ENC_6_EC_METHOD); + #endif + #ifdef I2CPE_ENC_6_EC_THRESH + encoders[i].set_ec_threshold(I2CPE_ENC_6_EC_THRESH); + #endif + + encoders[i].set_active(encoders[i].passes_test(true)); + + #if I2CPE_ENC_6_AXIS == E_AXIS + encoders[i].set_homed(); + #endif + #endif } void I2CPositionEncodersMgr::report_position(const int8_t idx, const bool units, const bool noOffset) { diff --git a/Marlin/src/feature/Max7219_Debug_LEDs.cpp b/Marlin/src/feature/Max7219_Debug_LEDs.cpp index 0588c836b506..c8aaaaffebbb 100644 --- a/Marlin/src/feature/Max7219_Debug_LEDs.cpp +++ b/Marlin/src/feature/Max7219_Debug_LEDs.cpp @@ -56,6 +56,8 @@ uint8_t Max7219::led_line[MAX7219_LINES]; // = { 0 }; #if _ROT == 0 || _ROT == 270 #define _LED_BIT(Q) (7 - ((Q) & 0x7)) #define _LED_UNIT(Q) ((Q) & ~0x7) + //#define _LED_UNIT(Q) ((MAX7219_NUMBER_UNITS - 1 - ((Q) >> 3)) << 3) // some Max7219 boards have rotated the matrix + // this line can be substituted to correct orientation #else #define _LED_BIT(Q) ((Q) & 0x7) #define _LED_UNIT(Q) ((MAX7219_NUMBER_UNITS - 1 - ((Q) >> 3)) << 3) diff --git a/Marlin/src/feature/bedlevel/bedlevel.cpp b/Marlin/src/feature/bedlevel/bedlevel.cpp index 93bea5b8e41b..5dc328c273a3 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.cpp +++ b/Marlin/src/feature/bedlevel/bedlevel.cpp @@ -25,15 +25,12 @@ #if HAS_LEVELING #include "bedlevel.h" +#include "../../module/planner.h" #if ENABLED(MESH_BED_LEVELING) || ENABLED(PROBE_MANUALLY) #include "../../module/motion.h" #endif -#if PLANNER_LEVELING - #include "../../module/planner.h" -#endif - #if ENABLED(PROBE_MANUALLY) bool g29_in_progress = false; #endif @@ -79,74 +76,24 @@ void set_bed_leveling_enabled(const bool enable/*=true*/) { planner.synchronize(); - #if ENABLED(MESH_BED_LEVELING) - - if (!enable) - planner.apply_leveling(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS]); - - const bool enabling = enable && leveling_is_valid(); - planner.leveling_active = enabling; - if (enabling) planner.unapply_leveling(current_position); - - #elif ENABLED(AUTO_BED_LEVELING_UBL) - #if PLANNER_LEVELING - if (planner.leveling_active) { // leveling from on to off - // change unleveled current_position to physical current_position without moving steppers. - planner.apply_leveling(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS]); - planner.leveling_active = false; // disable only AFTER calling apply_leveling - } - else { // leveling from off to on - planner.leveling_active = true; // enable BEFORE calling unapply_leveling, otherwise ignored - // change physical current_position to unleveled current_position without moving steppers. - planner.unapply_leveling(current_position); - } - #else - // UBL equivalents for apply/unapply_leveling - #if ENABLED(SKEW_CORRECTION) - float pos[XYZ] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] }; - planner.skew(pos[X_AXIS], pos[Y_AXIS], pos[Z_AXIS]); - #else - const float (&pos)[XYZE] = current_position; - #endif - if (planner.leveling_active) { - current_position[Z_AXIS] += ubl.get_z_correction(pos[X_AXIS], pos[Y_AXIS]); - planner.leveling_active = false; - } - else { - planner.leveling_active = true; - current_position[Z_AXIS] -= ubl.get_z_correction(pos[X_AXIS], pos[Y_AXIS]); - } - #endif - - #else // OLDSCHOOL_ABL - - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - // Force bilinear_z_offset to re-calculate next time - const float reset[XYZ] = { -9999.999, -9999.999, 0 }; - (void)bilinear_z_offset(reset); - #endif - - // Enable or disable leveling compensation in the planner - planner.leveling_active = enable; - - if (!enable) - // When disabling just get the current position from the steppers. - // This will yield the smallest error when first converted back to steps. - set_current_from_steppers_for_axis( - #if ABL_PLANAR - ALL_AXES - #else - Z_AXIS - #endif - ); - else - // When enabling, remove compensation from the current position, - // so compensation will give the right stepper counts. - planner.unapply_leveling(current_position); + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + // Force bilinear_z_offset to re-calculate next time + const float reset[XYZ] = { -9999.999, -9999.999, 0 }; + (void)bilinear_z_offset(reset); + #endif - SYNC_PLAN_POSITION_KINEMATIC(); + if (planner.leveling_active) { // leveling from on to off + // change unleveled current_position to physical current_position without moving steppers. + planner.apply_leveling(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS]); + planner.leveling_active = false; // disable only AFTER calling apply_leveling + } + else { // leveling from off to on + planner.leveling_active = true; // enable BEFORE calling unapply_leveling, otherwise ignored + // change physical current_position to unleveled current_position without moving steppers. + planner.unapply_leveling(current_position); + } - #endif // OLDSCHOOL_ABL + sync_plan_position(); } } @@ -214,7 +161,7 @@ void reset_bed_level() { for (uint8_t x = 0; x < sx; x++) { for (uint8_t i = 0; i < precision + 2 + (x < 10 ? 1 : 0); i++) SERIAL_PROTOCOLCHAR(' '); - SERIAL_PROTOCOL((int)x); + SERIAL_PROTOCOL(int(x)); } SERIAL_EOL(); #endif @@ -226,14 +173,14 @@ void reset_bed_level() { SERIAL_PROTOCOLPGM(" ["); // open sub-array #else if (y < 10) SERIAL_PROTOCOLCHAR(' '); - SERIAL_PROTOCOL((int)y); + SERIAL_PROTOCOL(int(y)); #endif for (uint8_t x = 0; x < sx; x++) { SERIAL_PROTOCOLCHAR(' '); const float offset = fn(x, y); if (!isnan(offset)) { if (offset >= 0) SERIAL_PROTOCOLCHAR('+'); - SERIAL_PROTOCOL_F(offset, precision); + SERIAL_PROTOCOL_F(offset, int(precision)); } else { #ifdef SCAD_MESH_OUTPUT diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp index 85ed86838eb8..0519f736d9a1 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp @@ -49,12 +49,11 @@ * as possible to determine if this is the case. If this move is within the same cell, we will * just do the required Z-Height correction, call the Planner's buffer_line() routine, and leave */ - #if ENABLED(SKEW_CORRECTION) - // For skew correction just adjust the destination point and we're done + #if HAS_POSITION_MODIFIERS float start[XYZE] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS] }, end[XYZE] = { destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS] }; - planner.skew(start[X_AXIS], start[Y_AXIS], start[Z_AXIS]); - planner.skew(end[X_AXIS], end[Y_AXIS], end[Z_AXIS]); + planner.apply_modifiers(start); + planner.apply_modifiers(end); #else const float (&start)[XYZE] = current_position, (&end)[XYZE] = destination; @@ -364,47 +363,6 @@ #else // UBL_SEGMENTED - #if IS_SCARA // scale the feed rate from mm/s to degrees/s - static float scara_feed_factor, scara_oldA, scara_oldB; - #endif - - // We don't want additional apply_leveling() performed by regular buffer_line or buffer_line_kinematic, - // so we call buffer_segment directly here. Per-segmented leveling and kinematics performed first. - - inline void _O2 ubl_buffer_segment_raw(const float (&in_raw)[XYZE], const float &fr) { - - #if ENABLED(SKEW_CORRECTION) - float raw[XYZE] = { in_raw[X_AXIS], in_raw[Y_AXIS], in_raw[Z_AXIS] }; - planner.skew(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); - #else - const float (&raw)[XYZE] = in_raw; - #endif - - #if ENABLED(DELTA) // apply delta inverse_kinematics - - DELTA_IK(raw); - planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], in_raw[E_AXIS], fr, active_extruder); - - #elif IS_SCARA // apply scara inverse_kinematics (should be changed to save raw->logical->raw) - - inverse_kinematics(raw); // this writes delta[ABC] from raw[XYZE] - // should move the feedrate scaling to scara inverse_kinematics - - const float adiff = ABS(delta[A_AXIS] - scara_oldA), - bdiff = ABS(delta[B_AXIS] - scara_oldB); - scara_oldA = delta[A_AXIS]; - scara_oldB = delta[B_AXIS]; - float s_feedrate = MAX(adiff, bdiff) * scara_feed_factor; - - planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], in_raw[E_AXIS], s_feedrate, active_extruder); - - #else // CARTESIAN - - planner.buffer_segment(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS], in_raw[E_AXIS], fr, active_extruder); - - #endif - } - #if IS_SCARA #define DELTA_SEGMENT_MIN_LENGTH 0.25 // SCARA minimum segment size is 0.25mm #elif ENABLED(DELTA) @@ -439,20 +397,19 @@ #if IS_KINEMATIC const float seconds = cartesian_xy_mm / feedrate; // seconds to move xy distance at requested rate - uint16_t segments = lroundf(delta_segments_per_second * seconds), // preferred number of segments for distance @ feedrate - seglimit = lroundf(cartesian_xy_mm * (1.0f / (DELTA_SEGMENT_MIN_LENGTH))); // number of segments at minimum segment length + uint16_t segments = LROUND(delta_segments_per_second * seconds), // preferred number of segments for distance @ feedrate + seglimit = LROUND(cartesian_xy_mm * (1.0f / (DELTA_SEGMENT_MIN_LENGTH))); // number of segments at minimum segment length NOMORE(segments, seglimit); // limit to minimum segment length (fewer segments) #else - uint16_t segments = lroundf(cartesian_xy_mm * (1.0f / (DELTA_SEGMENT_MIN_LENGTH))); // cartesian fixed segment length + uint16_t segments = LROUND(cartesian_xy_mm * (1.0f / (DELTA_SEGMENT_MIN_LENGTH))); // cartesian fixed segment length #endif NOLESS(segments, 1U); // must have at least one segment const float inv_segments = 1.0f / segments; // divide once, multiply thereafter - #if IS_SCARA // scale the feed rate from mm/s to degrees/s - scara_feed_factor = cartesian_xy_mm * inv_segments * feedrate; - scara_oldA = planner.get_axis_position_degrees(A_AXIS); - scara_oldB = planner.get_axis_position_degrees(B_AXIS); + const float segment_xyz_mm = HYPOT(cartesian_xy_mm, total[Z_AXIS]) * inv_segments; // length of each segment + #if ENABLED(SCARA_FEEDRATE_SCALING) + const float inv_duration = feedrate / segment_xyz_mm; #endif const float diff[XYZE] = { @@ -476,9 +433,17 @@ if (!planner.leveling_active || !planner.leveling_active_at_z(rtarget[Z_AXIS])) { // no mesh leveling while (--segments) { LOOP_XYZE(i) raw[i] += diff[i]; - ubl_buffer_segment_raw(raw, feedrate); + planner.buffer_line(raw, feedrate, active_extruder, segment_xyz_mm + #if ENABLED(SCARA_FEEDRATE_SCALING) + , inv_duration + #endif + ); } - ubl_buffer_segment_raw(rtarget, feedrate); + planner.buffer_line(rtarget, feedrate, active_extruder, segment_xyz_mm + #if ENABLED(SCARA_FEEDRATE_SCALING) + , inv_duration + #endif + ); return false; // moved but did not set_current_from_destination(); } @@ -554,7 +519,11 @@ const float z = raw[Z_AXIS]; raw[Z_AXIS] += z_cxcy; - ubl_buffer_segment_raw(raw, feedrate); + planner.buffer_line(raw, feedrate, active_extruder, segment_xyz_mm + #if ENABLED(SCARA_FEEDRATE_SCALING) + , inv_duration + #endif + ); raw[Z_AXIS] = z; if (segments == 0) // done with last segment diff --git a/Marlin/src/feature/closedloop.cpp b/Marlin/src/feature/closedloop.cpp new file mode 100644 index 000000000000..2fe60fcf9c8a --- /dev/null +++ b/Marlin/src/feature/closedloop.cpp @@ -0,0 +1,41 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../inc/MarlinConfig.h" + +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + +#if !PIN_EXISTS(CLOSED_LOOP_ENABLE) || !PIN_EXISTS(CLOSED_LOOP_MOVE_COMPLETE) + #error "CLOSED_LOOP_ENABLE_PIN and CLOSED_LOOP_MOVE_COMPLETE_PIN are required for EXTERNAL_CLOSED_LOOP_CONTROLLER." +#endif + +#include "closedloop.h" + +void init_closedloop() { + OUT_WRITE(CLOSED_LOOP_ENABLE_PIN, LOW); + SET_INPUT_PULLUP(CLOSED_LOOP_MOVE_COMPLETE_PIN); +} + +void set_closedloop(const byte val) { + OUT_WRITE(CLOSED_LOOP_ENABLE_PIN, val); +} + +#endif // EXTERNAL_CLOSED_LOOP_CONTROLLER diff --git a/Marlin/src/feature/closedloop.h b/Marlin/src/feature/closedloop.h new file mode 100644 index 000000000000..84cec36fe6c2 --- /dev/null +++ b/Marlin/src/feature/closedloop.h @@ -0,0 +1,25 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +void init_closedloop(); +void set_closedloop(const byte val); diff --git a/Marlin/src/feature/controllerfan.cpp b/Marlin/src/feature/controllerfan.cpp index b98bb80a0f10..1dec32647e31 100644 --- a/Marlin/src/feature/controllerfan.cpp +++ b/Marlin/src/feature/controllerfan.cpp @@ -50,15 +50,21 @@ void controllerfan_update() { #if HAS_Z2_ENABLE || Z2_ENABLE_READ == Z_ENABLE_ON #endif + #if HAS_Z3_ENABLE + || Z3_ENABLE_READ == Z_ENABLE_ON + #endif || E0_ENABLE_READ == E_ENABLE_ON #if E_STEPPERS > 1 || E1_ENABLE_READ == E_ENABLE_ON #if E_STEPPERS > 2 - || E2_ENABLE_READ == E_ENABLE_ON + || E2_ENABLE_READ == E_ENABLE_ON #if E_STEPPERS > 3 - || E3_ENABLE_READ == E_ENABLE_ON + || E3_ENABLE_READ == E_ENABLE_ON #if E_STEPPERS > 4 - || E4_ENABLE_READ == E_ENABLE_ON + || E4_ENABLE_READ == E_ENABLE_ON + #if E_STEPPERS > 5 + || E5_ENABLE_READ == E_ENABLE_ON + #endif #endif #endif #endif diff --git a/Marlin/src/feature/fwretract.cpp b/Marlin/src/feature/fwretract.cpp index bc26a97371d1..a06f48ec05ee 100644 --- a/Marlin/src/feature/fwretract.cpp +++ b/Marlin/src/feature/fwretract.cpp @@ -54,7 +54,8 @@ float FWRetract::retract_length, // M207 S - G10 Retract len FWRetract::swap_retract_length, // M207 W - G10 Swap Retract length FWRetract::swap_retract_recover_length, // M208 W - G11 Swap Recover length FWRetract::swap_retract_recover_feedrate_mm_s, // M208 R - G11 Swap Recover feedrate - FWRetract::hop_amount; + FWRetract::current_retract[EXTRUDERS], // Retract value used by planner + FWRetract::current_hop; void FWRetract::reset() { autoretract_enabled = false; @@ -66,13 +67,14 @@ void FWRetract::reset() { swap_retract_length = RETRACT_LENGTH_SWAP; swap_retract_recover_length = RETRACT_RECOVER_LENGTH_SWAP; swap_retract_recover_feedrate_mm_s = RETRACT_RECOVER_FEEDRATE_SWAP; - hop_amount = 0.0; + current_hop = 0.0; for (uint8_t i = 0; i < EXTRUDERS; ++i) { retracted[i] = false; #if EXTRUDERS > 1 retracted_swap[i] = false; #endif + current_retract[i] = 0.0; } } @@ -84,9 +86,6 @@ void FWRetract::reset() { * * To simplify the logic, doubled retract/recover moves are ignored. * - * Note: Z lift is done transparently to the planner. Aborting - * a print between G10 and G11 may corrupt the Z position. - * * Note: Auto-retract will apply the set Z hop in addition to any Z hop * included in the G-code. Use M207 Z0 to to prevent double hop. */ @@ -95,9 +94,6 @@ void FWRetract::retract(const bool retracting , bool swapping /* =false */ #endif ) { - - static float hop_amount = 0.0; // Total amount lifted, for use in recover - // Prevent two retracts or recovers in a row if (retracted[active_extruder] == retracting) return; @@ -125,52 +121,54 @@ void FWRetract::retract(const bool retracting } SERIAL_ECHOLNPAIR("current_position[z] ", current_position[Z_AXIS]); SERIAL_ECHOLNPAIR("current_position[e] ", current_position[E_AXIS]); - SERIAL_ECHOLNPAIR("hop_amount ", hop_amount); + SERIAL_ECHOLNPAIR("current_hop ", current_hop); //*/ const float old_feedrate_mm_s = feedrate_mm_s, - renormalize = RECIPROCAL(planner.e_factor[active_extruder]), - base_retract = swapping ? swap_retract_length : retract_length, - old_z = current_position[Z_AXIS], - old_e = current_position[E_AXIS]; + unscale_e = RECIPROCAL(planner.e_factor[active_extruder]), + unscale_fr = 100.0 / feedrate_percentage, // Disable feedrate scaling for retract moves + base_retract = swapping ? swap_retract_length : retract_length; // The current position will be the destination for E and Z moves set_destination_from_current(); if (retracting) { // Retract by moving from a faux E position back to the current E position - feedrate_mm_s = retract_feedrate_mm_s; - destination[E_AXIS] -= base_retract * renormalize; + feedrate_mm_s = retract_feedrate_mm_s * unscale_fr; + current_retract[active_extruder] = base_retract * unscale_e; prepare_move_to_destination(); // set_current_to_destination + planner.synchronize(); // Wait for move to complete // Is a Z hop set, and has the hop not yet been done? - if (retract_zlift > 0.01 && !hop_amount) { // Apply hop only once - hop_amount += retract_zlift; // Add to the hop total (again, only once) - destination[Z_AXIS] += retract_zlift; // Raise Z by the zlift (M207 Z) amount - feedrate_mm_s = planner.max_feedrate_mm_s[Z_AXIS]; // Maximum Z feedrate + if (retract_zlift > 0.01 && !current_hop) { // Apply hop only once + current_hop += retract_zlift; // Add to the hop total (again, only once) + feedrate_mm_s = planner.max_feedrate_mm_s[Z_AXIS] * unscale_fr; // Maximum Z feedrate prepare_move_to_destination(); // Raise up, set_current_to_destination + planner.synchronize(); // Wait for move to complete } } else { // If a hop was done and Z hasn't changed, undo the Z hop - if (hop_amount) { - current_position[Z_AXIS] += hop_amount; // Restore the actual Z position - SYNC_PLAN_POSITION_KINEMATIC(); // Unspoof the position planner - feedrate_mm_s = planner.max_feedrate_mm_s[Z_AXIS]; // Z feedrate to max + if (current_hop) { + current_hop = 0.0; + feedrate_mm_s = planner.max_feedrate_mm_s[Z_AXIS] * unscale_fr; // Z feedrate to max prepare_move_to_destination(); // Lower Z, set_current_to_destination - hop_amount = 0.0; // Clear the hop amount + planner.synchronize(); // Wait for move to complete } - destination[E_AXIS] += (base_retract + (swapping ? swap_retract_recover_length : retract_recover_length)) * renormalize; - feedrate_mm_s = swapping ? swap_retract_recover_feedrate_mm_s : retract_recover_feedrate_mm_s; + const float extra_recover = swapping ? swap_retract_recover_length : retract_recover_length; + if (extra_recover != 0.0) { + current_position[E_AXIS] -= extra_recover; // Adjust the current E position by the extra amount to recover + sync_plan_position_e(); // Sync the planner position so the extra amount is recovered + } + + current_retract[active_extruder] = 0.0; + feedrate_mm_s = (swapping ? swap_retract_recover_feedrate_mm_s : retract_recover_feedrate_mm_s) * unscale_fr; prepare_move_to_destination(); // Recover E, set_current_to_destination + planner.synchronize(); // Wait for move to complete } feedrate_mm_s = old_feedrate_mm_s; // Restore original feedrate - current_position[Z_AXIS] = old_z; // Restore Z and E positions - current_position[E_AXIS] = old_e; - SYNC_PLAN_POSITION_KINEMATIC(); // As if the move never took place - retracted[active_extruder] = retracting; // Active extruder now retracted / recovered // If swap retract/recover update the retracted_swap flag too @@ -192,9 +190,8 @@ void FWRetract::retract(const bool retracting } SERIAL_ECHOLNPAIR("current_position[z] ", current_position[Z_AXIS]); SERIAL_ECHOLNPAIR("current_position[e] ", current_position[E_AXIS]); - SERIAL_ECHOLNPAIR("hop_amount ", hop_amount); + SERIAL_ECHOLNPAIR("current_hop ", current_hop); //*/ - } #endif // FWRETRACT diff --git a/Marlin/src/feature/fwretract.h b/Marlin/src/feature/fwretract.h index bb086df832b3..5483cd592420 100644 --- a/Marlin/src/feature/fwretract.h +++ b/Marlin/src/feature/fwretract.h @@ -46,7 +46,8 @@ class FWRetract { swap_retract_length, // M207 W - G10 Swap Retract length swap_retract_recover_length, // M208 W - G11 Swap Recover length swap_retract_recover_feedrate_mm_s, // M208 R - G11 Swap Recover feedrate - hop_amount; + current_retract[EXTRUDERS], // Retract value used by planner + current_hop; // Hop value used by planner FWRetract() { reset(); } diff --git a/Marlin/src/feature/mixing.cpp b/Marlin/src/feature/mixing.cpp index b1054c2946e3..1a36741d51c1 100644 --- a/Marlin/src/feature/mixing.cpp +++ b/Marlin/src/feature/mixing.cpp @@ -28,7 +28,7 @@ #include "../gcode/parser.h" #endif -float mixing_factor[MIXING_STEPPERS]; // Reciprocal of mix proportion. 0.0 = off, otherwise >= 1.0. +float mixing_factor[MIXING_STEPPERS]; // Reciprocal of mix proportion. 0.0 = off, otherwise <= 1.0. (Array must sum to 1.0.) #if MIXING_VIRTUAL_TOOLS > 1 @@ -56,11 +56,12 @@ float mixing_factor[MIXING_STEPPERS]; // Reciprocal of mix proportion. 0.0 = off void normalize_mix() { float mix_total = 0.0; - for (uint8_t i = 0; i < MIXING_STEPPERS; i++) mix_total += RECIPROCAL(mixing_factor[i]); + for (uint8_t i = 0; i < MIXING_STEPPERS; i++) mix_total += mixing_factor[i]; // Ex: 1/4 + 1/8 + 1/8 = 1/2 // Scale all values if they don't add up to ~1.0 if (!NEAR(mix_total, 1.0)) { SERIAL_PROTOCOLLNPGM("Warning: Mix factors must add up to 1.0. Scaling."); - for (uint8_t i = 0; i < MIXING_STEPPERS; i++) mixing_factor[i] *= mix_total; + mix_total = RECIPROCAL(mix_total); + for (uint8_t i = 0; i < MIXING_STEPPERS; i++) mixing_factor[i] *= mix_total; // Ex: 1/4*2 + 1/8*2 + 1/8*2 = 1/2 + 1/4 + 1/4 = 1 } } diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 62e66122ef6a..2b7f547dd6db 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -120,7 +120,7 @@ static bool ensure_safe_temperature(const AdvancedPauseMode mode=ADVANCED_PAUSE_ static void do_pause_e_move(const float &length, const float &fr) { set_destination_from_current(); destination[E_AXIS] += length / planner.e_factor[active_extruder]; - planner.buffer_line_kinematic(destination, fr, active_extruder); + planner.buffer_line(destination, fr, active_extruder); set_current_from_destination(); planner.synchronize(); } @@ -140,6 +140,7 @@ static void do_pause_e_move(const float &length, const float &fr) { bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_length/*=0*/, const float &purge_length/*=0*/, const int8_t max_beep_count/*=0*/, const bool show_lcd/*=false*/, const bool pause_for_user/*=false*/, const AdvancedPauseMode mode/*=ADVANCED_PAUSE_MODE_PAUSE_PRINT*/ + DXC_ARGS ) { #if DISABLED(ULTIPANEL) UNUSED(show_lcd); @@ -184,6 +185,13 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_LOAD, mode); #endif + #if ENABLED(DUAL_X_CARRIAGE) + const int8_t saved_ext = active_extruder; + const bool saved_ext_dup_mode = extruder_duplication_enabled; + active_extruder = DXC_ext; + extruder_duplication_enabled = false; + #endif + // Slow Load filament if (slow_load_length) do_pause_e_move(slow_load_length, FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE); @@ -201,6 +209,12 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l #endif } + #if ENABLED(DUAL_X_CARRIAGE) // Tie the two extruders movement back together. + active_extruder = saved_ext; + extruder_duplication_enabled = saved_ext_dup_mode; + stepper.set_directions(); + #endif + #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) #if ENABLED(ULTIPANEL) @@ -328,7 +342,8 @@ bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/, */ uint8_t did_pause_print = 0; -bool pause_print(const float &retract, const point_t &park_point, const float &unload_length/*=0*/, const bool show_lcd/*=false*/) { +bool pause_print(const float &retract, const point_t &park_point, const float &unload_length/*=0*/, const bool show_lcd/*=false*/ DXC_ARGS) { + if (did_pause_print) return false; // already paused #ifdef ACTION_ON_PAUSE @@ -380,10 +395,22 @@ bool pause_print(const float &retract, const point_t &park_point, const float &u if (!axis_unhomed_error()) Nozzle::park(2, park_point); - // Unload the filament - if (unload_length) + #if ENABLED(DUAL_X_CARRIAGE) + const int8_t saved_ext = active_extruder; + const bool saved_ext_dup_mode = extruder_duplication_enabled; + active_extruder = DXC_ext; + extruder_duplication_enabled = false; + #endif + + if (unload_length) // Unload the filament unload_filament(unload_length, show_lcd); + #if ENABLED(DUAL_X_CARRIAGE) + active_extruder = saved_ext; + extruder_duplication_enabled = saved_ext_dup_mode; + stepper.set_directions(); + #endif + return true; } @@ -394,7 +421,7 @@ bool pause_print(const float &retract, const point_t &park_point, const float &u * * Used by M125 and M600 */ -void wait_for_filament_reload(const int8_t max_beep_count/*=0*/) { +void wait_for_filament_reload(const int8_t max_beep_count/*=0*/ DXC_ARGS) { bool nozzle_timed_out = false; #if ENABLED(ULTIPANEL) @@ -413,6 +440,13 @@ void wait_for_filament_reload(const int8_t max_beep_count/*=0*/) { HOTEND_LOOP() thermalManager.start_heater_idle_timer(e, nozzle_timeout); + #if ENABLED(DUAL_X_CARRIAGE) + const int8_t saved_ext = active_extruder; + const bool saved_ext_dup_mode = extruder_duplication_enabled; + active_extruder = DXC_ext; + extruder_duplication_enabled = false; + #endif + // Wait for filament insert by user and press button KEEPALIVE_STATE(PAUSED_FOR_USER); wait_for_user = true; // LCD click or M108 will clear this @@ -477,6 +511,11 @@ void wait_for_filament_reload(const int8_t max_beep_count/*=0*/) { idle(true); } + #if ENABLED(DUAL_X_CARRIAGE) + active_extruder = saved_ext; + extruder_duplication_enabled = saved_ext_dup_mode; + stepper.set_directions(); + #endif KEEPALIVE_STATE(IN_HANDLER); } @@ -498,7 +537,15 @@ void wait_for_filament_reload(const int8_t max_beep_count/*=0*/) { * - Send host action for resume, if configured * - Resume the current SD print job, if any */ -void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_length/*=0*/, const float &purge_length/*=ADVANCED_PAUSE_PURGE_LENGTH*/, const int8_t max_beep_count/*=0*/) { +void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_length/*=0*/, const float &purge_length/*=ADVANCED_PAUSE_PURGE_LENGTH*/, const int8_t max_beep_count/*=0*/ DXC_ARGS) { + /* + SERIAL_ECHOPGM("start of resume_print()\n"); + SERIAL_ECHOPAIR("\ndual_x_carriage_mode:", dual_x_carriage_mode); + SERIAL_ECHOPAIR("\nextruder_duplication_enabled:", extruder_duplication_enabled); + SERIAL_ECHOPAIR("\nactive_extruder:", active_extruder); + SERIAL_ECHOPGM("\n\n"); + */ + if (!did_pause_print) return; // Re-enable the heaters if they timed out @@ -508,14 +555,11 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le thermalManager.reset_heater_idle_timer(e); } - if (nozzle_timed_out || thermalManager.hotEnoughToExtrude(active_extruder)) { - // Load the new filament - load_filament(slow_load_length, fast_load_length, purge_length, max_beep_count, true, nozzle_timed_out); - } + if (nozzle_timed_out || thermalManager.hotEnoughToExtrude(active_extruder)) // Load the new filament + load_filament(slow_load_length, fast_load_length, purge_length, max_beep_count, true, nozzle_timed_out, ADVANCED_PAUSE_MODE_PAUSE_PRINT DXC_PASS); #if ENABLED(ULTIPANEL) - // "Wait for print to resume" - lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_RESUME); + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_RESUME); // "Wait for print to resume" #endif // Intelligent resuming diff --git a/Marlin/src/feature/pause.h b/Marlin/src/feature/pause.h index c920fd599f18..5eb39a5e1a90 100644 --- a/Marlin/src/feature/pause.h +++ b/Marlin/src/feature/pause.h @@ -67,14 +67,24 @@ extern float filament_change_unload_length[EXTRUDERS], extern uint8_t did_pause_print; -bool pause_print(const float &retract, const point_t &park_point, const float &unload_length=0, const bool show_lcd=false); +#if ENABLED(DUAL_X_CARRIAGE) + #define DXC_PARAMS , const int8_t DXC_ext=-1 + #define DXC_ARGS , const int8_t DXC_ext + #define DXC_PASS , DXC_ext +#else + #define DXC_PARAMS + #define DXC_ARGS + #define DXC_PASS +#endif -void wait_for_filament_reload(const int8_t max_beep_count=0); +bool pause_print(const float &retract, const point_t &park_point, const float &unload_length=0, const bool show_lcd=false DXC_PARAMS); -void resume_print(const float &slow_load_length=0, const float &fast_load_length=0, const float &extrude_length=ADVANCED_PAUSE_PURGE_LENGTH, const int8_t max_beep_count=0); +void wait_for_filament_reload(const int8_t max_beep_count=0 DXC_PARAMS); + +void resume_print(const float &slow_load_length=0, const float &fast_load_length=0, const float &extrude_length=ADVANCED_PAUSE_PURGE_LENGTH, const int8_t max_beep_count=0 DXC_PARAMS); bool load_filament(const float &slow_load_length=0, const float &fast_load_length=0, const float &extrude_length=0, const int8_t max_beep_count=0, const bool show_lcd=false, - const bool pause_for_user=false, const AdvancedPauseMode mode=ADVANCED_PAUSE_MODE_PAUSE_PRINT); + const bool pause_for_user=false, const AdvancedPauseMode mode=ADVANCED_PAUSE_MODE_PAUSE_PRINT DXC_PARAMS); bool unload_filament(const float &unload_length, const bool show_lcd=false, const AdvancedPauseMode mode=ADVANCED_PAUSE_MODE_PAUSE_PRINT); diff --git a/Marlin/src/feature/power.cpp b/Marlin/src/feature/power.cpp index 53fcd142bbd9..6c196fd6f38d 100644 --- a/Marlin/src/feature/power.cpp +++ b/Marlin/src/feature/power.cpp @@ -68,11 +68,14 @@ bool Power::is_power_needed() { #if E_STEPPERS > 1 || E1_ENABLE_READ == E_ENABLE_ON #if E_STEPPERS > 2 - || E2_ENABLE_READ == E_ENABLE_ON + || E2_ENABLE_READ == E_ENABLE_ON #if E_STEPPERS > 3 - || E3_ENABLE_READ == E_ENABLE_ON + || E3_ENABLE_READ == E_ENABLE_ON #if E_STEPPERS > 4 - || E4_ENABLE_READ == E_ENABLE_ON + || E4_ENABLE_READ == E_ENABLE_ON + #if E_STEPPERS > 5 + || E5_ENABLE_READ == E_ENABLE_ON + #endif #endif #endif #endif diff --git a/Marlin/src/feature/power_loss_recovery.cpp b/Marlin/src/feature/power_loss_recovery.cpp index 095858837385..6613c0adf6a6 100644 --- a/Marlin/src/feature/power_loss_recovery.cpp +++ b/Marlin/src/feature/power_loss_recovery.cpp @@ -32,19 +32,24 @@ #include "../lcd/ultralcd.h" #include "../gcode/queue.h" +#include "../module/motion.h" #include "../module/planner.h" #include "../module/printcounter.h" #include "../module/temperature.h" #include "../sd/cardreader.h" #include "../core/serial.h" +#if ENABLED(FWRETRACT) + #include "fwretract.h" +#endif + // Recovery data job_recovery_info_t job_recovery_info; JobRecoveryPhase job_recovery_phase = JOB_RECOVERY_IDLE; uint8_t job_recovery_commands_count; //=0 char job_recovery_commands[BUFSIZE + APPEND_CMD_COUNT][MAX_CMD_SIZE]; -// Extern -extern uint8_t active_extruder, commands_in_queue, cmd_queue_index_r; + +extern uint8_t commands_in_queue, cmd_queue_index_r; #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) void debug_print_job_recovery(const bool recovery) { @@ -89,6 +94,15 @@ extern uint8_t active_extruder, commands_in_queue, cmd_queue_index_r; SERIAL_PROTOCOLPAIR("leveling: ", int(job_recovery_info.leveling)); SERIAL_PROTOCOLLNPAIR(" fade: ", int(job_recovery_info.fade)); #endif + #if ENABLED(FWRETRACT) + SERIAL_PROTOCOLPGM("retract: "); + for (int8_t e = 0; e < EXTRUDERS; e++) { + SERIAL_PROTOCOL(job_recovery_info.retract[e]); + if (e < EXTRUDERS - 1) SERIAL_CHAR(','); + } + SERIAL_EOL(); + SERIAL_PROTOCOLLNPAIR("retract_hop: ", job_recovery_info.retract_hop); + #endif SERIAL_PROTOCOLLNPAIR("cmd_queue_index_r: ", int(job_recovery_info.cmd_queue_index_r)); SERIAL_PROTOCOLLNPAIR("commands_in_queue: ", int(job_recovery_info.commands_in_queue)); if (recovery) @@ -159,6 +173,15 @@ void check_print_job_recovery() { } #endif + #if ENABLED(FWRETRACT) + for (uint8_t e = 0; e < EXTRUDERS; e++) { + if (job_recovery_info.retract[e] != 0.0) + fwretract.current_retract[e] = job_recovery_info.retract[e]; + fwretract.retracted[e] = true; + } + fwretract.current_hop = job_recovery_info.retract_hop; + #endif + dtostrf(job_recovery_info.current_position[Z_AXIS] + 2, 1, 3, str_1); dtostrf(job_recovery_info.current_position[E_AXIS] #if ENABLED(SAVE_EACH_CMD_MODE) @@ -255,6 +278,11 @@ void save_job_recovery_info() { ); #endif + #if ENABLED(FWRETRACT) + COPY(job_recovery_info.retract, fwretract.current_retract); + job_recovery_info.retract_hop = fwretract.current_hop; + #endif + // Commands in the queue job_recovery_info.cmd_queue_index_r = cmd_queue_index_r; job_recovery_info.commands_in_queue = commands_in_queue; diff --git a/Marlin/src/feature/power_loss_recovery.h b/Marlin/src/feature/power_loss_recovery.h index 46a8fd52de3e..24b0891a02c3 100644 --- a/Marlin/src/feature/power_loss_recovery.h +++ b/Marlin/src/feature/power_loss_recovery.h @@ -60,6 +60,10 @@ typedef struct { float fade; #endif + #if ENABLED(FWRETRACT) + float retract[EXTRUDERS], retract_hop; + #endif + // Command queue uint8_t cmd_queue_index_r, commands_in_queue; char command_queue[BUFSIZE][MAX_CMD_SIZE]; diff --git a/Marlin/src/feature/runout.cpp b/Marlin/src/feature/runout.cpp index fde93e7f7a11..00eb97195d42 100644 --- a/Marlin/src/feature/runout.cpp +++ b/Marlin/src/feature/runout.cpp @@ -54,6 +54,9 @@ void FilamentRunoutSensor::setup() { INIT_RUNOUT_PIN(FIL_RUNOUT4_PIN); #if NUM_RUNOUT_SENSORS > 4 INIT_RUNOUT_PIN(FIL_RUNOUT5_PIN); + #if NUM_RUNOUT_SENSORS > 5 + INIT_RUNOUT_PIN(FIL_RUNOUT6_PIN); + #endif #endif #endif #endif diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index 47bd2cf7b855..aaabaad6e9ce 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -62,19 +62,31 @@ class FilamentRunoutSensor { #else // Read the sensor for the active extruder bool is_out; - switch (active_extruder) { - case 0: is_out = READ(FIL_RUNOUT_PIN) == FIL_RUNOUT_INVERTING; break; - case 1: is_out = READ(FIL_RUNOUT2_PIN) == FIL_RUNOUT_INVERTING; break; - #if NUM_RUNOUT_SENSORS > 2 - case 2: is_out = READ(FIL_RUNOUT3_PIN) == FIL_RUNOUT_INVERTING; break; - #if NUM_RUNOUT_SENSORS > 3 - case 3: is_out = READ(FIL_RUNOUT4_PIN) == FIL_RUNOUT_INVERTING; break; - #if NUM_RUNOUT_SENSORS > 4 - case 4: is_out = READ(FIL_RUNOUT5_PIN) == FIL_RUNOUT_INVERTING; break; - #endif - #endif - #endif + #if ENABLED(DUAL_X_CARRIAGE) + const bool out1 = READ(FIL_RUNOUT_PIN ) == FIL_RUNOUT_INVERTING, + out2 = READ(FIL_RUNOUT2_PIN) == FIL_RUNOUT_INVERTING; + if (extruder_duplication_enabled) + is_out = out1 || out2; + else + is_out = active_extruder ? out2 : out1; + #else + switch (active_extruder) { + case 0: is_out = READ(FIL_RUNOUT_PIN) == FIL_RUNOUT_INVERTING; break; + case 1: is_out = READ(FIL_RUNOUT2_PIN) == FIL_RUNOUT_INVERTING; break; + #if NUM_RUNOUT_SENSORS > 2 + case 2: is_out = READ(FIL_RUNOUT3_PIN) == FIL_RUNOUT_INVERTING; break; + #if NUM_RUNOUT_SENSORS > 3 + case 3: is_out = READ(FIL_RUNOUT4_PIN) == FIL_RUNOUT_INVERTING; break; + #if NUM_RUNOUT_SENSORS > 4 + case 4: is_out = READ(FIL_RUNOUT5_PIN) == FIL_RUNOUT_INVERTING; break; + #if NUM_RUNOUT_SENSORS > 5 + case 5: is_out = READ(FIL_RUNOUT6_PIN) == FIL_RUNOUT_INVERTING; break; + #endif // > 5 + #endif // > 4 + #endif // > 3 + #endif // > 2 } + #endif #endif return (is_out ? ++runout_count : (runout_count = 0)) > FIL_RUNOUT_THRESHOLD; } diff --git a/Marlin/src/feature/solenoid.cpp b/Marlin/src/feature/solenoid.cpp index dcb63cd8667a..b0efa88270bd 100644 --- a/Marlin/src/feature/solenoid.cpp +++ b/Marlin/src/feature/solenoid.cpp @@ -53,6 +53,11 @@ inline void enable_solenoid(const uint8_t num) { OUT_WRITE(SOL4_PIN, HIGH); break; #endif + #if HAS_SOLENOID_5 && EXTRUDERS > 5 + case 5: + OUT_WRITE(SOL5_PIN, HIGH); + break; + #endif default: SERIAL_ECHO_START(); SERIAL_ECHOLNPGM(MSG_INVALID_SOLENOID); @@ -76,6 +81,9 @@ void disable_all_solenoids() { #if HAS_SOLENOID_4 && EXTRUDERS > 4 OUT_WRITE(SOL4_PIN, LOW); #endif + #if HAS_SOLENOID_5 && EXTRUDERS > 5 + OUT_WRITE(SOL5_PIN, LOW); + #endif } #endif // EXT_SOLENOID diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp index 199520192265..abfe4ba035ce 100644 --- a/Marlin/src/feature/tmc_util.cpp +++ b/Marlin/src/feature/tmc_util.cpp @@ -189,6 +189,10 @@ bool report_tmc_status = false; static uint8_t z2_otpw_cnt = 0; monitor_tmc_driver(stepperZ2, TMC_Z, z2_otpw_cnt); #endif + #if HAS_HW_COMMS(Z3) + static uint8_t z3_otpw_cnt = 0; + monitor_tmc_driver(stepperZ3, TMC_Z, z3_otpw_cnt); + #endif #if HAS_HW_COMMS(E0) static uint8_t e0_otpw_cnt = 0; monitor_tmc_driver(stepperE0, TMC_E0, e0_otpw_cnt); @@ -209,6 +213,10 @@ bool report_tmc_status = false; static uint8_t e4_otpw_cnt = 0; monitor_tmc_driver(stepperE4, TMC_E4, e4_otpw_cnt); #endif + #if HAS_HW_COMMS(E5) + static uint8_t e5_otpw_cnt = 0; + monitor_tmc_driver(stepperE5, TMC_E5, e5_otpw_cnt); + #endif if (report_tmc_status) SERIAL_EOL(); } @@ -217,12 +225,72 @@ bool report_tmc_status = false; #endif // MONITOR_DRIVER_STATUS void _tmc_say_axis(const TMC_AxisEnum axis) { - static const char ext_X[] PROGMEM = "X", ext_Y[] PROGMEM = "Y", ext_Z[] PROGMEM = "Z", - ext_X2[] PROGMEM = "X2", ext_Y2[] PROGMEM = "Y2", ext_Z2[] PROGMEM = "Z2", - ext_E0[] PROGMEM = "E0", ext_E1[] PROGMEM = "E1", - ext_E2[] PROGMEM = "E2", ext_E3[] PROGMEM = "E3", - ext_E4[] PROGMEM = "E4"; - static const char* const tmc_axes[] PROGMEM = { ext_X, ext_Y, ext_Z, ext_X2, ext_Y2, ext_Z2, ext_E0, ext_E1, ext_E2, ext_E3, ext_E4 }; + static const char ext_X[] PROGMEM = "X", ext_Y[] PROGMEM = "Y", ext_Z[] PROGMEM = "Z" + #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(X_DUAL_STEPPER_DRIVERS) + , ext_X2[] PROGMEM = "X2" + #endif + #if ENABLED(Y_DUAL_STEPPER_DRIVERS) + , ext_Y2[] PROGMEM = "Y2" + #endif + #if Z_MULTI_STEPPER_DRIVERS + , ext_Z2[] PROGMEM = "Z2" + #if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + , ext_Z3[] PROGMEM = "Z3" + #endif + #endif + #if E_STEPPERS + , ext_E0[] PROGMEM = "E0" + #if E_STEPPERS > 1 + , ext_E1[] PROGMEM = "E1" + #if E_STEPPERS > 2 + , ext_E2[] PROGMEM = "E2" + #if E_STEPPERS > 3 + , ext_E3[] PROGMEM = "E3" + #if E_STEPPERS > 4 + , ext_E4[] PROGMEM = "E4" + #if E_STEPPERS > 5 + , ext_E5[] PROGMEM = "E5" + #endif + #endif + #endif + #endif + #endif + #endif + ; + + static const char* const tmc_axes[] PROGMEM = { + ext_X, ext_Y, ext_Z + #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(X_DUAL_STEPPER_DRIVERS) + , ext_X2 + #endif + #if ENABLED(Y_DUAL_STEPPER_DRIVERS) + , ext_Y2 + #endif + #if Z_MULTI_STEPPER_DRIVERS + , ext_Z2 + #if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + , ext_Z3 + #endif + #endif + #if E_STEPPERS + , ext_E0 + #if E_STEPPERS > 1 + , ext_E1 + #if E_STEPPERS > 2 + , ext_E2 + #if E_STEPPERS > 3 + , ext_E3 + #if E_STEPPERS > 4 + , ext_E4 + #if E_STEPPERS > 5 + , ext_E5 + #endif + #endif + #endif + #endif + #endif + #endif + }; serialprintPGM((char*)pgm_read_ptr(&tmc_axes[axis])); } @@ -440,6 +508,9 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) { #if AXIS_IS_TMC(Z2) tmc_status(stepperZ2, TMC_Z2, i, planner.axis_steps_per_mm[Z_AXIS]); #endif + #if AXIS_IS_TMC(Z3) + tmc_status(stepperZ3, TMC_Z3, i, planner.axis_steps_per_mm[Z_AXIS]); + #endif #if AXIS_IS_TMC(E0) tmc_status(stepperE0, TMC_E0, i, planner.axis_steps_per_mm[E_AXIS]); @@ -472,6 +543,13 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) { #endif ]); #endif + #if AXIS_IS_TMC(E5) + tmc_status(stepperE5, TMC_E5, i, planner.axis_steps_per_mm[E_AXIS + #if ENABLED(DISTINCT_E_FACTORS) + + 5 + #endif + ]); + #endif SERIAL_EOL(); } @@ -497,6 +575,9 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) { #if AXIS_IS_TMC(Z2) tmc_parse_drv_status(stepperZ2, TMC_Z2, i); #endif + #if AXIS_IS_TMC(Z3) + tmc_parse_drv_status(stepperZ3, TMC_Z3, i); + #endif #if AXIS_IS_TMC(E0) tmc_parse_drv_status(stepperE0, TMC_E0, i); @@ -513,6 +594,9 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) { #if AXIS_IS_TMC(E4) tmc_parse_drv_status(stepperE4, TMC_E4, i); #endif + #if AXIS_IS_TMC(E5) + tmc_parse_drv_status(stepperE5, TMC_E5, i); + #endif SERIAL_EOL(); } @@ -612,6 +696,9 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) { #if AXIS_DRIVER_TYPE(Z2, TMC2130) SET_CS_PIN(Z2); #endif + #if AXIS_DRIVER_TYPE(Z3, TMC2130) + SET_CS_PIN(Z3); + #endif #if AXIS_DRIVER_TYPE(E0, TMC2130) SET_CS_PIN(E0); #endif @@ -627,6 +714,9 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) { #if AXIS_DRIVER_TYPE(E4, TMC2130) SET_CS_PIN(E4); #endif + #if AXIS_DRIVER_TYPE(E5, TMC2130) + SET_CS_PIN(E5); + #endif } #endif // TMC2130 diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h index 6f11955ac543..514f603f18e0 100644 --- a/Marlin/src/feature/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -35,7 +35,39 @@ extern bool report_tmc_status; -enum TMC_AxisEnum : char { TMC_X, TMC_Y, TMC_Z, TMC_X2, TMC_Y2, TMC_Z2, TMC_E0, TMC_E1, TMC_E2, TMC_E3, TMC_E4 }; +enum TMC_AxisEnum : char { + TMC_X, TMC_Y, TMC_Z + #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(X_DUAL_STEPPER_DRIVERS) + , TMC_X2 + #endif + #if ENABLED(Y_DUAL_STEPPER_DRIVERS) + , TMC_Y2 + #endif + #if ENABLED(Z_DUAL_STEPPER_DRIVERS) + , TMC_Z2 + #endif + #if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + , TMC_Z3 + #endif + #if E_STEPPERS + , TMC_E0 + #if E_STEPPERS > 1 + , TMC_E1 + #if E_STEPPERS > 2 + , TMC_E2 + #if E_STEPPERS > 3 + , TMC_E3 + #if E_STEPPERS > 4 + , TMC_E4 + #if E_STEPPERS > 5 + , TMC_E5 + #endif // E_STEPPERS > 5 + #endif // E_STEPPERS > 4 + #endif // E_STEPPERS > 3 + #endif // E_STEPPERS > 2 + #endif // E_STEPPERS > 1 + #endif // E_STEPPERS +}; constexpr uint32_t _tmc_thrs(const uint16_t msteps, const int32_t thrs, const uint32_t spmm) { return 12650000UL * msteps / (256 * thrs * spmm); diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index c711b9deed54..6f4a2a5635e5 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -677,8 +677,8 @@ G29_TYPE GcodeSuite::G29() { // Inner loop is Y with PROBE_Y_FIRST enabled for (int8_t PR_INNER_VAR = inStart; PR_INNER_VAR != inStop; PR_INNER_VAR += inInc) { - float xBase = left_probe_bed_position + xGridSpacing * xCount, - yBase = front_probe_bed_position + yGridSpacing * yCount; + const float xBase = left_probe_bed_position + xGridSpacing * xCount, + yBase = front_probe_bed_position + yGridSpacing * yCount; xProbe = FLOOR(xBase + (xBase < 0 ? 0 : 0.5)); yProbe = FLOOR(yBase + (yBase < 0 ? 0 : 0.5)); @@ -989,7 +989,7 @@ G29_TYPE GcodeSuite::G29() { KEEPALIVE_STATE(IN_HANDLER); if (planner.leveling_active) - SYNC_PLAN_POSITION_KINEMATIC(); + sync_plan_position(); #if HAS_BED_PROBE && defined(Z_AFTER_PROBING) move_z_after_probing(); diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index b1845ee79b3b..6553fc5cfc2f 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -101,7 +101,7 @@ if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Z_SAFE_HOMING >>>"); #endif - SYNC_PLAN_POSITION_KINEMATIC(); + sync_plan_position(); /** * Move the Z probe (or just the nozzle) to the safe homing point @@ -182,7 +182,7 @@ void GcodeSuite::G28(const bool always_home_all) { #if ENABLED(MARLIN_DEV_MODE) if (parser.seen('S')) { LOOP_XYZ(a) set_axis_is_at_home((AxisEnum)a); - SYNC_PLAN_POSITION_KINEMATIC(); + sync_plan_position(); SERIAL_ECHOLNPGM("Simulated Homing"); report_current_position(); #if ENABLED(DEBUG_LEVELING_FEATURE) @@ -205,13 +205,15 @@ void GcodeSuite::G28(const bool always_home_all) { // Wait for planner moves to finish! planner.synchronize(); - // Cancel the active G29 session - #if ENABLED(PROBE_MANUALLY) - g29_in_progress = false; - #endif - // Disable the leveling matrix before homing #if HAS_LEVELING + + // Cancel the active G29 session + #if ENABLED(PROBE_MANUALLY) + extern bool g29_in_progress; + g29_in_progress = false; + #endif + #if ENABLED(RESTORE_LEVELING_AFTER_G28) const bool leveling_was_active = planner.leveling_active; #endif @@ -355,7 +357,7 @@ void GcodeSuite::G28(const bool always_home_all) { } // home_all || homeZ #endif // Z_HOME_DIR < 0 - SYNC_PLAN_POSITION_KINEMATIC(); + sync_plan_position(); #endif // !DELTA (G28) @@ -367,7 +369,7 @@ void GcodeSuite::G28(const bool always_home_all) { */ #if ENABLED(DUAL_X_CARRIAGE) - if (dual_x_carriage_mode == DXC_DUPLICATION_MODE) { + if (dxc_is_duplicating()) { // Always home the 2nd (right) extruder first active_extruder = 1; @@ -385,7 +387,10 @@ void GcodeSuite::G28(const bool always_home_all) { delayed_move_time = 0; active_extruder_parked = true; extruder_duplication_enabled = IDEX_saved_duplication_state; + extruder_duplication_enabled = false; + dual_x_carriage_mode = IDEX_saved_mode; + stepper.set_directions(); } #endif // DUAL_X_CARRIAGE @@ -397,7 +402,7 @@ void GcodeSuite::G28(const bool always_home_all) { do_blocking_move_to_z(delta_clip_start_height); #endif - #if ENABLED(RESTORE_LEVELING_AFTER_G28) + #if HAS_LEVELING && ENABLED(RESTORE_LEVELING_AFTER_G28) set_bed_leveling_enabled(leveling_was_active); #endif diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp index e9ae4eca44f9..c2aac6d1ae42 100644 --- a/Marlin/src/gcode/calibrate/G33.cpp +++ b/Marlin/src/gcode/calibrate/G33.cpp @@ -273,7 +273,7 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi for (int8_t circle = 0; circle <= offset; circle++) { const float a = RADIANS(210 + (360 / NPP) * (rad - 1)), r = delta_calibration_radius * (1 - 0.1 * (zig_zag ? offset - circle : circle)), - interpol = fmod(rad, 1); + interpol = FMOD(rad, 1); const float z_temp = calibration_probe(cos(a) * r, sin(a) * r, stow_after_each, set_up); if (isnan(z_temp)) return false; // split probe point to neighbouring calibration points diff --git a/Marlin/src/gcode/calibrate/M12.cpp b/Marlin/src/gcode/calibrate/M12.cpp new file mode 100644 index 000000000000..a4b75e71bda5 --- /dev/null +++ b/Marlin/src/gcode/calibrate/M12.cpp @@ -0,0 +1,36 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + +#include "../gcode.h" +#include "../../module/planner.h" +#include "../../feature/closedloop.h" + +void GcodeSuite::M12() { + planner.synchronize(); + if (parser.seenval('S')) + set_closedloop(parser.value_int()); // Force a CLC set +} + +#endif diff --git a/Marlin/src/gcode/calibrate/M666.cpp b/Marlin/src/gcode/calibrate/M666.cpp index 1cad2d018177..0f823380555d 100644 --- a/Marlin/src/gcode/calibrate/M666.cpp +++ b/Marlin/src/gcode/calibrate/M666.cpp @@ -59,44 +59,60 @@ #endif } -#elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) +#elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || Z_MULTI_ENDSTOPS #include "../../module/endstops.h" /** * M666: Set Dual Endstops offsets for X, Y, and/or Z. * With no parameters report current offsets. + * + * For Triple Z Endstops: + * Set Z2 Only: M666 S2 Z + * Set Z3 Only: M666 S3 Z + * Set Both: M666 Z */ void GcodeSuite::M666() { bool report = true; #if ENABLED(X_DUAL_ENDSTOPS) if (parser.seen('X')) { - endstops.x_endstop_adj = parser.value_linear_units(); + endstops.x2_endstop_adj = parser.value_linear_units(); report = false; } #endif #if ENABLED(Y_DUAL_ENDSTOPS) if (parser.seen('Y')) { - endstops.y_endstop_adj = parser.value_linear_units(); + endstops.y2_endstop_adj = parser.value_linear_units(); report = false; } #endif - #if ENABLED(Z_DUAL_ENDSTOPS) + #if ENABLED(Z_TRIPLE_ENDSTOPS) if (parser.seen('Z')) { - endstops.z_endstop_adj = parser.value_linear_units(); + const int ind = parser.intval('S'); + const float z_adj = parser.value_linear_units(); + if (!ind || ind == 2) endstops.z2_endstop_adj = z_adj; + if (!ind || ind == 3) endstops.z3_endstop_adj = z_adj; + report = false; + } + #elif Z_MULTI_ENDSTOPS + if (parser.seen('Z')) { + endstops.z2_endstop_adj = parser.value_linear_units(); report = false; } #endif if (report) { SERIAL_ECHOPGM("Dual Endstop Adjustment (mm): "); #if ENABLED(X_DUAL_ENDSTOPS) - SERIAL_ECHOPAIR(" X", endstops.x_endstop_adj); + SERIAL_ECHOPAIR(" X2:", endstops.x2_endstop_adj); #endif #if ENABLED(Y_DUAL_ENDSTOPS) - SERIAL_ECHOPAIR(" Y", endstops.y_endstop_adj); + SERIAL_ECHOPAIR(" Y2:", endstops.y2_endstop_adj); + #endif + #if Z_MULTI_ENDSTOPS + SERIAL_ECHOPAIR(" Z2:", endstops.z2_endstop_adj); #endif - #if ENABLED(Z_DUAL_ENDSTOPS) - SERIAL_ECHOPAIR(" Z", endstops.z_endstop_adj); + #if ENABLED(Z_TRIPLE_ENDSTOPS) + SERIAL_ECHOPAIR(" Z3:", endstops.z3_endstop_adj); #endif SERIAL_EOL(); } diff --git a/Marlin/src/gcode/calibrate/M852.cpp b/Marlin/src/gcode/calibrate/M852.cpp index 4841cecbc037..927c0838e430 100644 --- a/Marlin/src/gcode/calibrate/M852.cpp +++ b/Marlin/src/gcode/calibrate/M852.cpp @@ -87,7 +87,7 @@ void GcodeSuite::M852() { // When skew is changed the current position changes if (setval) { set_current_from_steppers_for_axis(ALL_AXES); - SYNC_PLAN_POSITION_KINEMATIC(); + sync_plan_position(); report_current_position(); } diff --git a/Marlin/src/gcode/config/M200-M205.cpp b/Marlin/src/gcode/config/M200-M205.cpp index cd45047be60f..132cfc9ae189 100644 --- a/Marlin/src/gcode/config/M200-M205.cpp +++ b/Marlin/src/gcode/config/M200-M205.cpp @@ -136,14 +136,17 @@ void GcodeSuite::M205() { const float junc_dev = parser.value_linear_units(); if (WITHIN(junc_dev, 0.01f, 0.3f)) { planner.junction_deviation_mm = junc_dev; - planner.recalculate_max_e_jerk(); + #if ENABLED(LIN_ADVANCE) + planner.recalculate_max_e_jerk(); + #endif } else { SERIAL_ERROR_START(); SERIAL_ERRORLNPGM("?J out of range (0.01 to 0.3)"); } } - #else + #endif + #if HAS_CLASSIC_JERK if (parser.seen('X')) planner.max_jerk[X_AXIS] = parser.value_linear_units(); if (parser.seen('Y')) planner.max_jerk[Y_AXIS] = parser.value_linear_units(); if (parser.seen('Z')) { @@ -153,6 +156,8 @@ void GcodeSuite::M205() { SERIAL_ECHOLNPGM("WARNING! Low Z Jerk may lead to unwanted pauses."); #endif } - if (parser.seen('E')) planner.max_jerk[E_AXIS] = parser.value_linear_units(); + #if DISABLED(JUNCTION_DEVIATION) || DISABLED(LIN_ADVANCE) + if (parser.seen('E')) planner.max_jerk[E_AXIS] = parser.value_linear_units(); + #endif #endif } diff --git a/Marlin/src/gcode/config/M92.cpp b/Marlin/src/gcode/config/M92.cpp index 310b754aa39c..2ac913e701fa 100644 --- a/Marlin/src/gcode/config/M92.cpp +++ b/Marlin/src/gcode/config/M92.cpp @@ -39,7 +39,7 @@ void GcodeSuite::M92() { const float value = parser.value_per_axis_unit((AxisEnum)(E_AXIS + TARGET_EXTRUDER)); if (value < 20) { float factor = planner.axis_steps_per_mm[E_AXIS + TARGET_EXTRUDER] / value; // increase e constants if M92 E14 is given for netfab. - #if DISABLED(JUNCTION_DEVIATION) + #if HAS_CLASSIC_JERK && (DISABLED(JUNCTION_DEVIATION) || DISABLED(LIN_ADVANCE)) planner.max_jerk[E_AXIS] *= factor; #endif planner.max_feedrate_mm_s[E_AXIS + TARGET_EXTRUDER] *= factor; diff --git a/Marlin/src/gcode/control/M605.cpp b/Marlin/src/gcode/control/M605.cpp index 80b39ef30101..780a7f57b548 100644 --- a/Marlin/src/gcode/control/M605.cpp +++ b/Marlin/src/gcode/control/M605.cpp @@ -44,9 +44,9 @@ * units x-offset and an optional differential hotend temperature of * mmm degrees. E.g., with "M605 S2 X100 R2" the second extruder will duplicate * the first with a spacing of 100mm in the x direction and 2 degrees hotter. - * M605 S3 : Enable Symmetric Duplication mode. The second extruder will duplicate the first extruder's + * M605 S3 : Enable Scaled Duplication mode. The second extruder will duplicate the first extruder's * movement similar to the M605 S2 mode. However, the second extruder will be producing - * a mirror image of the first extruder. The initial x-offset and temperature differential are + * a scaled image of the first extruder. The initial x-offset and temperature differential are * set with M605 S2 [Xnnn] [Rmmm] and then followed with a M605 S3 to start the mirrored movement. * M605 W : IDEX What? command. * @@ -56,7 +56,27 @@ planner.synchronize(); if (parser.seen('S')) { + const DualXMode previous_mode = dual_x_carriage_mode; + dual_x_carriage_mode = (DualXMode)parser.value_byte(); + scaled_duplication_mode = false; + + if (dual_x_carriage_mode == DXC_SCALED_DUPLICATION_MODE) { + if (previous_mode != DXC_DUPLICATION_MODE) { + SERIAL_ECHOPGM("Printer must be in DXC_DUPLICATION_MODE prior to \n"); + SERIAL_ECHOPGM("specifying DXC_SCALED_DUPLICATION_MODE.\n"); + dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; + return; + } + scaled_duplication_mode = true; + stepper.set_directions(); + float x_jog = current_position[X_AXIS] - .1; + for (uint8_t i = 2; --i;) { + planner.buffer_line(x_jog, current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], feedrate_mm_s, 0); + x_jog += .1; + } + return; + } switch (dual_x_carriage_mode) { case DXC_FULL_CONTROL_MODE: @@ -73,6 +93,7 @@ } active_extruder_parked = false; extruder_duplication_enabled = false; + stepper.set_directions(); delayed_move_time = 0; } else if (!parser.seen('W')) // if no S or W parameter, the DXC mode gets reset to the user's default @@ -82,21 +103,45 @@ SERIAL_ECHO_START(); SERIAL_ECHOPGM("IDEX mode: "); switch (dual_x_carriage_mode) { - case DXC_FULL_CONTROL_MODE: SERIAL_ECHOPGM("DXC_FULL_CONTROL_MODE"); break; - case DXC_AUTO_PARK_MODE: SERIAL_ECHOPGM("DXC_AUTO_PARK_MODE"); break; - case DXC_DUPLICATION_MODE: SERIAL_ECHOPGM("DXC_DUPLICATION_MODE"); break; + case DXC_FULL_CONTROL_MODE: SERIAL_ECHOPGM("DXC_FULL_CONTROL_MODE"); break; + case DXC_AUTO_PARK_MODE: SERIAL_ECHOPGM("DXC_AUTO_PARK_MODE"); break; + case DXC_DUPLICATION_MODE: SERIAL_ECHOPGM("DXC_DUPLICATION_MODE"); break; + case DXC_SCALED_DUPLICATION_MODE: SERIAL_ECHOPGM("DXC_SCALED_DUPLICATION_MODE"); break; } SERIAL_ECHOPAIR("\nActive Ext: ", int(active_extruder)); if (!active_extruder_parked) SERIAL_ECHOPGM(" NOT "); - SERIAL_ECHOLNPGM(" parked."); - SERIAL_ECHOPAIR("active_extruder_x_pos: ", current_position[X_AXIS]); - SERIAL_ECHOPAIR(" inactive_extruder_x_pos: ", inactive_extruder_x_pos); - SERIAL_ECHOPAIR("\nT0 Home X: ", x_home_pos(0)); - SERIAL_ECHOPAIR("\nT1 Home X: ", x_home_pos(1)); + SERIAL_ECHOPGM(" parked."); + SERIAL_ECHOPAIR("\nactive_extruder_x_pos: ", current_position[X_AXIS]); + SERIAL_ECHOPAIR("\ninactive_extruder_x_pos: ", inactive_extruder_x_pos); SERIAL_ECHOPAIR("\nextruder_duplication_enabled: ", int(extruder_duplication_enabled)); SERIAL_ECHOPAIR("\nduplicate_extruder_x_offset: ", duplicate_extruder_x_offset); SERIAL_ECHOPAIR("\nduplicate_extruder_temp_offset: ", duplicate_extruder_temp_offset); SERIAL_ECHOPAIR("\ndelayed_move_time: ", delayed_move_time); + SERIAL_ECHOPAIR("\nX1 Home X: ", x_home_pos(0)); + SERIAL_ECHOPAIR("\nX1_MIN_POS=", int(X1_MIN_POS)); + SERIAL_ECHOPAIR("\nX1_MAX_POS=", int(X1_MAX_POS)); + SERIAL_ECHOPAIR("\nX2 Home X: ", x_home_pos(1)); + SERIAL_ECHOPAIR("\nX2_MIN_POS=", int(X2_MIN_POS)); + SERIAL_ECHOPAIR("\nX2_MAX_POS=", int(X2_MAX_POS)); + SERIAL_ECHOPAIR("\nX2_HOME_DIR=", int(X2_HOME_DIR)); + SERIAL_ECHOPAIR("\nX2_HOME_POS=", int(X2_HOME_POS)); + SERIAL_ECHOPAIR("\nDEFAULT_DUAL_X_CARRIAGE_MODE=", STRINGIFY(DEFAULT_DUAL_X_CARRIAGE_MODE)); + SERIAL_ECHOPAIR("\nTOOLCHANGE_PARK_ZLIFT=", float(TOOLCHANGE_PARK_ZLIFT)); + SERIAL_ECHOPAIR("\nTOOLCHANGE_UNPARK_ZLIFT=", float(TOOLCHANGE_UNPARK_ZLIFT)); + SERIAL_ECHOPAIR("\nDEFAULT_DUPLICATION_X_OFFSET=", int(DEFAULT_DUPLICATION_X_OFFSET)); + + SERIAL_EOL(); + for (uint8_t i = 0; i < 2; i++) { + SERIAL_ECHOPAIR(" nozzle:", int(i)); + LOOP_XYZ(j) { + SERIAL_ECHOPGM(" hotend_offset["); + SERIAL_CHAR(axis_codes[j]); + SERIAL_ECHOPAIR("_AXIS][", int(i)); + SERIAL_ECHOPAIR("]=", hotend_offset[j][i]); + } + SERIAL_EOL(); + } + SERIAL_EOL(); } } diff --git a/Marlin/src/gcode/feature/advance/M900.cpp b/Marlin/src/gcode/feature/advance/M900.cpp index 3627869a0685..8b1c60d9c72a 100644 --- a/Marlin/src/gcode/feature/advance/M900.cpp +++ b/Marlin/src/gcode/feature/advance/M900.cpp @@ -34,18 +34,38 @@ * K Set advance K factor */ void GcodeSuite::M900() { + + #if EXTRUDERS < 2 + constexpr uint8_t tmp_extruder = 0; + #else + const uint8_t tmp_extruder = parser.seenval('T') ? parser.value_int() : active_extruder; + if (tmp_extruder >= EXTRUDERS) { + SERIAL_PROTOCOLLNPGM("?T value out of range."); + return; + } + #endif + if (parser.seenval('K')) { const float newK = parser.floatval('K'); if (WITHIN(newK, 0, 10)) { planner.synchronize(); - planner.extruder_advance_K = newK; + planner.extruder_advance_K[tmp_extruder] = newK; } else SERIAL_PROTOCOLLNPGM("?K value out of range (0-10)."); } else { SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("Advance K=", planner.extruder_advance_K); + #if EXTRUDERS < 2 + SERIAL_ECHOLNPAIR("Advance K=", planner.extruder_advance_K[0]); + #else + SERIAL_ECHOPGM("Advance K"); + LOOP_L_N(i, EXTRUDERS) { + SERIAL_CHAR(' '); SERIAL_ECHO(int(i)); + SERIAL_CHAR('='); SERIAL_ECHO(planner.extruder_advance_K[i]); + } + SERIAL_EOL(); + #endif } } diff --git a/Marlin/src/gcode/feature/leds/M7219.cpp b/Marlin/src/gcode/feature/leds/M7219.cpp index 3621c4ac0283..2a141185e056 100644 --- a/Marlin/src/gcode/feature/leds/M7219.cpp +++ b/Marlin/src/gcode/feature/leds/M7219.cpp @@ -79,7 +79,7 @@ void GcodeSuite::M7219() { SERIAL_ECHOPGM("led_line["); if (r < 10) SERIAL_CHAR(' '); SERIAL_ECHO(int(r)); - SERIAL_ECHO("]="); + SERIAL_ECHOPGM("]="); for (uint8_t b = 8; b--;) SERIAL_CHAR('0' + TEST(max7219.led_line[r], b)); SERIAL_EOL(); } diff --git a/Marlin/src/gcode/feature/pause/M600.cpp b/Marlin/src/gcode/feature/pause/M600.cpp index 42ed74dbe11b..5bb54de65c22 100644 --- a/Marlin/src/gcode/feature/pause/M600.cpp +++ b/Marlin/src/gcode/feature/pause/M600.cpp @@ -56,6 +56,19 @@ void GcodeSuite::M600() { if (get_target_extruder_from_command()) return; + #if ENABLED(DUAL_X_CARRIAGE) + int8_t DXC_ext = target_extruder; + if (!parser.seen('T')) { // If no tool index is specified, M600 was (probably) sent in response to filament runout. + // In this case, for duplicating modes set DXC_ext to the extruder that ran out. + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + if (dxc_is_duplicating()) + DXC_ext = (READ(FIL_RUNOUT2_PIN) == FIL_RUNOUT_INVERTING) ? 1 : 0; + #else + DXC_ext = active_extruder; + #endif + } + #endif + // Show initial "wait for start" message #if ENABLED(ULTIPANEL) lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_INIT, ADVANCED_PAUSE_MODE_PAUSE_PRINT, target_extruder); @@ -63,14 +76,18 @@ void GcodeSuite::M600() { #if ENABLED(HOME_BEFORE_FILAMENT_CHANGE) // Don't allow filament change without homing first - if (axis_unhomed_error()) home_all_axes(); + if (axis_unhomed_error()) gcode.home_all_axes(); #endif #if EXTRUDERS > 1 // Change toolhead if specified - uint8_t active_extruder_before_filament_change = active_extruder; - if (active_extruder != target_extruder) - tool_change(target_extruder, 0, true); + const uint8_t active_extruder_before_filament_change = active_extruder; + if ( + active_extruder != target_extruder + #if ENABLED(DUAL_X_CARRIAGE) + && dual_x_carriage_mode != DXC_DUPLICATION_MODE && dual_x_carriage_mode != DXC_SCALED_DUPLICATION_MODE + #endif + ) tool_change(target_extruder, 0, true); #endif // Initial retract before move to filament change position @@ -113,9 +130,9 @@ void GcodeSuite::M600() { const bool job_running = print_job_timer.isRunning(); - if (pause_print(retract, park_point, unload_length, true)) { - wait_for_filament_reload(beep_count); - resume_print(slow_load_length, fast_load_length, ADVANCED_PAUSE_PURGE_LENGTH, beep_count); + if (pause_print(retract, park_point, unload_length, true DXC_PASS)) { + wait_for_filament_reload(beep_count DXC_PASS); + resume_print(slow_load_length, fast_load_length, ADVANCED_PAUSE_PURGE_LENGTH, beep_count DXC_PASS); } #if EXTRUDERS > 1 diff --git a/Marlin/src/gcode/feature/pause/M701_M702.cpp b/Marlin/src/gcode/feature/pause/M701_M702.cpp index d9b4175cea36..1203b6bd093c 100644 --- a/Marlin/src/gcode/feature/pause/M701_M702.cpp +++ b/Marlin/src/gcode/feature/pause/M701_M702.cpp @@ -81,7 +81,11 @@ void GcodeSuite::M701() { const float fast_load_length = ABS(parser.seen('L') ? parser.value_axis_units(E_AXIS) : filament_change_load_length[active_extruder]); load_filament(slow_load_length, fast_load_length, ADVANCED_PAUSE_PURGE_LENGTH, FILAMENT_CHANGE_ALERT_BEEPS, - true, thermalManager.wait_for_heating(target_extruder), ADVANCED_PAUSE_MODE_LOAD_FILAMENT); + true, thermalManager.wait_for_heating(target_extruder), ADVANCED_PAUSE_MODE_LOAD_FILAMENT + #if ENABLED(DUAL_X_CARRIAGE) + , target_extruder + #endif + ); // Restore Z axis if (park_point.z > 0) diff --git a/Marlin/src/gcode/feature/trinamic/M906.cpp b/Marlin/src/gcode/feature/trinamic/M906.cpp index 22d9a3f90a03..e727d3e30a28 100644 --- a/Marlin/src/gcode/feature/trinamic/M906.cpp +++ b/Marlin/src/gcode/feature/trinamic/M906.cpp @@ -64,6 +64,9 @@ void GcodeSuite::M906() { #if AXIS_IS_TMC(Z2) if (index == 1) TMC_SET_CURRENT(Z2); #endif + #if AXIS_IS_TMC(Z3) + if (index == 2) TMC_SET_CURRENT(Z3); + #endif break; case E_AXIS: { if (get_target_extruder_from_command()) return; @@ -83,6 +86,9 @@ void GcodeSuite::M906() { #if AXIS_IS_TMC(E4) case 4: TMC_SET_CURRENT(E4); break; #endif + #if AXIS_IS_TMC(E5) + case 5: TMC_SET_CURRENT(E5); break; + #endif } } break; } @@ -107,6 +113,9 @@ void GcodeSuite::M906() { #if AXIS_IS_TMC(Z2) TMC_SAY_CURRENT(Z2); #endif + #if AXIS_IS_TMC(Z3) + TMC_SAY_CURRENT(Z3); + #endif #if AXIS_IS_TMC(E0) TMC_SAY_CURRENT(E0); #endif @@ -122,6 +131,9 @@ void GcodeSuite::M906() { #if AXIS_IS_TMC(E4) TMC_SAY_CURRENT(E4); #endif + #if AXIS_IS_TMC(E5) + TMC_SAY_CURRENT(E5); + #endif } } diff --git a/Marlin/src/gcode/feature/trinamic/M911-M915.cpp b/Marlin/src/gcode/feature/trinamic/M911-M915.cpp index 6ba9ee5e99a4..69bf070a9276 100644 --- a/Marlin/src/gcode/feature/trinamic/M911-M915.cpp +++ b/Marlin/src/gcode/feature/trinamic/M911-M915.cpp @@ -56,6 +56,9 @@ void GcodeSuite::M911() { #if M91x_USE(Z2) tmc_report_otpw(stepperZ2, TMC_Z2); #endif + #if M91x_USE(Z3) + tmc_report_otpw(stepperZ3, TMC_Z3); + #endif #if M91x_USE_E(0) tmc_report_otpw(stepperE0, TMC_E0); #endif @@ -71,11 +74,14 @@ void GcodeSuite::M911() { #if M91x_USE_E(4) tmc_report_otpw(stepperE4, TMC_E4); #endif + #if M91x_USE_E(5) + tmc_report_otpw(stepperE5, TMC_E5); + #endif } /** * M912: Clear TMC stepper driver overtemperature pre-warn flag held by the library - * Specify one or more axes with X, Y, Z, X1, Y1, Z1, X2, Y2, Z2, and E[index]. + * Specify one or more axes with X, Y, Z, X1, Y1, Z1, X2, Y2, Z2, Z3 and E[index]. * If no axes are given, clear all. * * Examples: @@ -93,51 +99,57 @@ void GcodeSuite::M912() { hasNone = !hasX && !hasY && !hasZ && !hasE; #if M91x_USE(X) || M91x_USE(X2) - const uint8_t xval = parser.byteval(axis_codes[X_AXIS], 10); + const int8_t xval = int8_t(parser.byteval(axis_codes[X_AXIS], 0xFF)); #if M91x_USE(X) - if (hasNone || xval == 1 || (hasX && xval == 10)) tmc_clear_otpw(stepperX, TMC_X); + if (hasNone || xval == 1 || (hasX && xval < 0)) tmc_clear_otpw(stepperX, TMC_X); #endif #if M91x_USE(X2) - if (hasNone || xval == 2 || (hasX && xval == 10)) tmc_clear_otpw(stepperX2, TMC_X2); + if (hasNone || xval == 2 || (hasX && xval < 0)) tmc_clear_otpw(stepperX2, TMC_X2); #endif #endif #if M91x_USE(Y) || M91x_USE(Y2) - const uint8_t yval = parser.byteval(axis_codes[Y_AXIS], 10); + const int8_t yval = int8_t(parser.byteval(axis_codes[Y_AXIS], 0xFF)); #if M91x_USE(Y) - if (hasNone || yval == 1 || (hasY && yval == 10)) tmc_clear_otpw(stepperY, TMC_Y); + if (hasNone || yval == 1 || (hasY && yval < 0)) tmc_clear_otpw(stepperY, TMC_Y); #endif #if M91x_USE(Y2) - if (hasNone || yval == 2 || (hasY && yval == 10)) tmc_clear_otpw(stepperY2, TMC_Y2); + if (hasNone || yval == 2 || (hasY && yval < 0)) tmc_clear_otpw(stepperY2, TMC_Y2); #endif #endif - #if M91x_USE(Z) || M91x_USE(Z2) - const uint8_t zval = parser.byteval(axis_codes[Z_AXIS], 10); + #if M91x_USE(Z) || M91x_USE(Z2) || M91x_USE(Z3) + const int8_t zval = int8_t(parser.byteval(axis_codes[Z_AXIS], 0xFF)); #if M91x_USE(Z) - if (hasNone || zval == 1 || (hasZ && zval == 10)) tmc_clear_otpw(stepperZ, TMC_Z); + if (hasNone || zval == 1 || (hasZ && zval < 0)) tmc_clear_otpw(stepperZ, TMC_Z); #endif #if M91x_USE(Z2) - if (hasNone || zval == 2 || (hasZ && zval == 10)) tmc_clear_otpw(stepperZ2, TMC_Z2); + if (hasNone || zval == 2 || (hasZ && zval < 0)) tmc_clear_otpw(stepperZ2, TMC_Z2); + #endif + #if M91x_USE(Z3) + if (hasNone || zval == 3 || (hasZ && zval < 0)) tmc_clear_otpw(stepperZ3, TMC_Z3); #endif #endif - #if M91x_USE_E(0) || M91x_USE_E(1) || M91x_USE_E(2) || M91x_USE_E(3) || M91x_USE_E(4) - const uint8_t eval = parser.byteval(axis_codes[E_AXIS], 10); + #if M91x_USE_E(0) || M91x_USE_E(1) || M91x_USE_E(2) || M91x_USE_E(3) || M91x_USE_E(4) || M91x_USE_E(5) + const uint8_t eval = int8_t(parser.byteval(axis_codes[E_AXIS], 0xFF)); #if M91x_USE_E(0) - if (hasNone || eval == 0 || (hasE && eval == 10)) tmc_clear_otpw(stepperE0, TMC_E0); + if (hasNone || eval == 0 || (hasE && eval < 0)) tmc_clear_otpw(stepperE0, TMC_E0); #endif #if M91x_USE_E(1) - if (hasNone || eval == 1 || (hasE && eval == 10)) tmc_clear_otpw(stepperE1, TMC_E1); + if (hasNone || eval == 1 || (hasE && eval < 0)) tmc_clear_otpw(stepperE1, TMC_E1); #endif #if M91x_USE_E(2) - if (hasNone || eval == 2 || (hasE && eval == 10)) tmc_clear_otpw(stepperE2, TMC_E2); + if (hasNone || eval == 2 || (hasE && eval < 0)) tmc_clear_otpw(stepperE2, TMC_E2); #endif #if M91x_USE_E(3) - if (hasNone || eval == 3 || (hasE && eval == 10)) tmc_clear_otpw(stepperE3, TMC_E3); + if (hasNone || eval == 3 || (hasE && eval < 0)) tmc_clear_otpw(stepperE3, TMC_E3); #endif #if M91x_USE_E(4) - if (hasNone || eval == 4 || (hasE && eval == 10)) tmc_clear_otpw(stepperE4, TMC_E4); + if (hasNone || eval == 4 || (hasE && eval < 0)) tmc_clear_otpw(stepperE4, TMC_E4); + #endif + #if M91x_USE_E(5) + if (hasNone || eval == 5 || (hasE && eval < 0)) tmc_clear_otpw(stepperE5, TMC_E5); #endif #endif } @@ -178,7 +190,10 @@ void GcodeSuite::M912() { if (index < 2) TMC_SET_PWMTHRS(Z,Z); #endif #if AXIS_HAS_STEALTHCHOP(Z2) - if (!(index & 1)) TMC_SET_PWMTHRS(Z,Z2); + if (index == 0 || index == 2) TMC_SET_PWMTHRS(Z,Z2); + #endif + #if AXIS_HAS_STEALTHCHOP(Z3) + if (index == 0 || index == 3) TMC_SET_PWMTHRS(Z,Z3); #endif break; case E_AXIS: { @@ -199,6 +214,9 @@ void GcodeSuite::M912() { #if E_STEPPERS > 4 && AXIS_HAS_STEALTHCHOP(E4) case 4: TMC_SET_PWMTHRS_E(4); break; #endif + #if E_STEPPERS > 5 && AXIS_HAS_STEALTHCHOP(E5) + case 5: TMC_SET_PWMTHRS_E(5); break; + #endif } } break; } @@ -223,6 +241,9 @@ void GcodeSuite::M912() { #if AXIS_HAS_STEALTHCHOP(Z2) TMC_SAY_PWMTHRS(Z,Z2); #endif + #if AXIS_HAS_STEALTHCHOP(Z3) + TMC_SAY_PWMTHRS(Z,Z3); + #endif #if AXIS_HAS_STEALTHCHOP(E0) TMC_SAY_PWMTHRS_E(0); #endif @@ -238,6 +259,9 @@ void GcodeSuite::M912() { #if E_STEPPERS > 4 && AXIS_HAS_STEALTHCHOP(E4) TMC_SAY_PWMTHRS_E(4); #endif + #if E_STEPPERS > 5 && AXIS_HAS_STEALTHCHOP(E5) + TMC_SAY_PWMTHRS_E(5); + #endif } } #endif // HYBRID_THRESHOLD @@ -282,7 +306,10 @@ void GcodeSuite::M912() { if (index < 2) TMC_SET_SGT(Z); #endif #if AXIS_HAS_STALLGUARD(Z2) - if (!(index & 1)) TMC_SET_SGT(Z2); + if (index == 0 || index == 2) TMC_SET_SGT(Z2); + #endif + #if AXIS_HAS_STALLGUARD(Z3) + if (index == 0 || index == 3) TMC_SET_SGT(Z3); #endif break; #endif @@ -313,6 +340,9 @@ void GcodeSuite::M912() { #if AXIS_HAS_STALLGUARD(Z2) TMC_SAY_SGT(Z2); #endif + #if AXIS_HAS_STALLGUARD(Z3) + TMC_SAY_SGT(Z3); + #endif #endif } } @@ -339,6 +369,10 @@ void GcodeSuite::M912() { const uint16_t Z2_current_1 = stepperZ2.getCurrent(); stepperZ2.setCurrent(_rms, R_SENSE, HOLD_MULTIPLIER); #endif + #if Z3_IS_TRINAMIC + const uint16_t Z3_current_1 = stepperZ3.getCurrent(); + stepperZ3.setCurrent(_rms, R_SENSE, HOLD_MULTIPLIER); + #endif SERIAL_ECHOPAIR("\nCalibration current: Z", _rms); @@ -352,6 +386,9 @@ void GcodeSuite::M912() { #if AXIS_IS_TMC(Z2) stepperZ2.setCurrent(Z2_current_1, R_SENSE, HOLD_MULTIPLIER); #endif + #if AXIS_IS_TMC(Z3) + stepperZ3.setCurrent(Z3_current_1, R_SENSE, HOLD_MULTIPLIER); + #endif do_blocking_move_to_z(Z_MAX_POS); soft_endstops_enabled = true; diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 6682cfbeb94a..063f32999f62 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -292,6 +292,10 @@ void GcodeSuite::process_parsed_command( case 5: M5(); break; // M5 - turn spindle/laser off #endif + #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + case 12: M12(); break; // M12: Synchronize and optionally force a CLC set + #endif + case 17: M17(); break; // M17: Enable all stepper motors #if ENABLED(SDSUPPORT) diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index cb9e03b58f49..36d8fc3fc34d 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -76,6 +76,7 @@ * M3 - Turn laser/spindle on, set spindle/laser speed/power, set rotation to clockwise * M4 - Turn laser/spindle on, set spindle/laser speed/power, set rotation to counter-clockwise * M5 - Turn laser/spindle off + * M12 - Set up closed loop control system. More features coming soon. (Requires EXTERNAL_CLOSED_LOOP_CONTROLLER) * M17 - Enable/Power all stepper motors * M18 - Disable all stepper motors; same as M84 * M20 - List SD card. (Requires SDSUPPORT) @@ -438,6 +439,10 @@ class GcodeSuite { static void M5(); #endif + #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + static void M12(); + #endif + static void M17(); static void M18_M84(); diff --git a/Marlin/src/gcode/geometry/G92.cpp b/Marlin/src/gcode/geometry/G92.cpp index 933a6e1cdb83..721c8b73c31f 100644 --- a/Marlin/src/gcode/geometry/G92.cpp +++ b/Marlin/src/gcode/geometry/G92.cpp @@ -92,7 +92,7 @@ void GcodeSuite::G92() { COPY(coordinate_system[active_coordinate_system], position_shift); #endif - if (didXYZ) SYNC_PLAN_POSITION_KINEMATIC(); + if (didXYZ) sync_plan_position(); else if (didE) sync_plan_position_e(); report_current_position(); diff --git a/Marlin/src/gcode/host/M114.cpp b/Marlin/src/gcode/host/M114.cpp index e273c4e10185..9d1a48b55b93 100644 --- a/Marlin/src/gcode/host/M114.cpp +++ b/Marlin/src/gcode/host/M114.cpp @@ -56,7 +56,7 @@ float leveled[XYZ] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] }; - #if PLANNER_LEVELING + #if HAS_LEVELING SERIAL_PROTOCOLPGM("Leveled:"); planner.apply_leveling(leveled); report_xyz(leveled); diff --git a/Marlin/src/gcode/motion/G2_G3.cpp b/Marlin/src/gcode/motion/G2_G3.cpp index 5e52d54c9b90..0ae3f8574f7e 100644 --- a/Marlin/src/gcode/motion/G2_G3.cpp +++ b/Marlin/src/gcode/motion/G2_G3.cpp @@ -35,10 +35,6 @@ #include "../../module/scara.h" #endif -#if HAS_FEEDRATE_SCALING && ENABLED(AUTO_BED_LEVELING_BILINEAR) - #include "../../feature/bedlevel/abl/abl.h" -#endif - #if N_ARC_CORRECTION < 1 #undef N_ARC_CORRECTION #define N_ARC_CORRECTION 1 @@ -139,20 +135,12 @@ void plan_arc( const float fr_mm_s = MMS_SCALED(feedrate_mm_s); - millis_t next_idle_ms = millis() + 200UL; - - #if HAS_FEEDRATE_SCALING - // SCARA needs to scale the feed rate from mm/s to degrees/s - const float inv_segment_length = 1.0f / float(MM_PER_ARC_SEGMENT), - inverse_secs = inv_segment_length * fr_mm_s; - float oldA = planner.position_float[A_AXIS], - oldB = planner.position_float[B_AXIS] - #if ENABLED(DELTA_FEEDRATE_SCALING) - , oldC = planner.position_float[C_AXIS] - #endif - ; + #if ENABLED(SCARA_FEEDRATE_SCALING) + const float inv_duration = fr_mm_s / MM_PER_ARC_SEGMENT; #endif + millis_t next_idle_ms = millis() + 200UL; + #if N_ARC_CORRECTION > 1 int8_t arc_recalc_count = N_ARC_CORRECTION; #endif @@ -196,57 +184,32 @@ void plan_arc( clamp_to_software_endstops(raw); - #if HAS_FEEDRATE_SCALING - inverse_kinematics(raw); - ADJUST_DELTA(raw); + #if HAS_LEVELING && !PLANNER_LEVELING + planner.apply_leveling(raw); #endif - #if ENABLED(SCARA_FEEDRATE_SCALING) - // For SCARA scale the feed rate from mm/s to degrees/s - // i.e., Complete the angular vector in the given time. - if (!planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], raw[Z_AXIS], raw[E_AXIS], HYPOT(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB) * inverse_secs, active_extruder, MM_PER_ARC_SEGMENT)) - break; - oldA = delta[A_AXIS]; oldB = delta[B_AXIS]; - #elif ENABLED(DELTA_FEEDRATE_SCALING) - // For DELTA scale the feed rate from Effector mm/s to Carriage mm/s - // i.e., Complete the linear vector in the given time. - if (!planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], raw[E_AXIS], SQRT(sq(delta[A_AXIS] - oldA) + sq(delta[B_AXIS] - oldB) + sq(delta[C_AXIS] - oldC)) * inverse_secs, active_extruder, MM_PER_ARC_SEGMENT)) - break; - oldA = delta[A_AXIS]; oldB = delta[B_AXIS]; oldC = delta[C_AXIS]; - #elif HAS_UBL_AND_CURVES - float pos[XYZ] = { raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS] }; - planner.apply_leveling(pos); - if (!planner.buffer_segment(pos[X_AXIS], pos[Y_AXIS], pos[Z_AXIS], raw[E_AXIS], fr_mm_s, active_extruder, MM_PER_ARC_SEGMENT)) - break; - #else - if (!planner.buffer_line_kinematic(raw, fr_mm_s, active_extruder)) - break; - #endif + if (!planner.buffer_line(raw, fr_mm_s, active_extruder, MM_PER_ARC_SEGMENT + #if ENABLED(SCARA_FEEDRATE_SCALING) + , inv_duration + #endif + )) + break; } // Ensure last segment arrives at target location. - #if HAS_FEEDRATE_SCALING - inverse_kinematics(cart); - ADJUST_DELTA(cart); - #endif + COPY(raw, cart); - #if ENABLED(SCARA_FEEDRATE_SCALING) - const float diff2 = HYPOT2(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB); - if (diff2) - planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], cart[Z_AXIS], cart[E_AXIS], SQRT(diff2) * inverse_secs, active_extruder, MM_PER_ARC_SEGMENT); - #elif ENABLED(DELTA_FEEDRATE_SCALING) - const float diff2 = sq(delta[A_AXIS] - oldA) + sq(delta[B_AXIS] - oldB) + sq(delta[C_AXIS] - oldC); - if (diff2) - planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], cart[E_AXIS], SQRT(diff2) * inverse_secs, active_extruder, MM_PER_ARC_SEGMENT); - #elif HAS_UBL_AND_CURVES - float pos[XYZ] = { cart[X_AXIS], cart[Y_AXIS], cart[Z_AXIS] }; - planner.apply_leveling(pos); - planner.buffer_segment(pos[X_AXIS], pos[Y_AXIS], pos[Z_AXIS], cart[E_AXIS], fr_mm_s, active_extruder, MM_PER_ARC_SEGMENT); - #else - planner.buffer_line_kinematic(cart, fr_mm_s, active_extruder); + #if HAS_LEVELING && !PLANNER_LEVELING + planner.apply_leveling(raw); #endif - COPY(current_position, cart); + planner.buffer_line(raw, fr_mm_s, active_extruder, MM_PER_ARC_SEGMENT + #if ENABLED(SCARA_FEEDRATE_SCALING) + , inv_duration + #endif + ); + + COPY(current_position, raw); } // plan_arc /** diff --git a/Marlin/src/gcode/probe/G38.cpp b/Marlin/src/gcode/probe/G38.cpp index bdbb635ef38c..6bf09b8bac3d 100644 --- a/Marlin/src/gcode/probe/G38.cpp +++ b/Marlin/src/gcode/probe/G38.cpp @@ -56,7 +56,7 @@ static bool G38_run_probe() { endstops.hit_on_purpose(); set_current_from_steppers_for_axis(ALL_AXES); - SYNC_PLAN_POSITION_KINEMATIC(); + sync_plan_position(); if (G38_endstop_hit) { @@ -82,7 +82,7 @@ static bool G38_run_probe() { G38_move = false; set_current_from_steppers_for_axis(ALL_AXES); - SYNC_PLAN_POSITION_KINEMATIC(); + sync_plan_position(); #endif } diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 7951e5904f7a..7187f1fee038 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -139,12 +139,12 @@ inline bool _enqueuecommand(const char* cmd, bool say_ok=false */ bool enqueue_and_echo_command(const char* cmd) { - //SERIAL_ECHO("enqueue_and_echo_command(\""); + //SERIAL_ECHOPGM("enqueue_and_echo_command(\""); //SERIAL_ECHO(cmd); - //SERIAL_ECHO("\") \n"); + //SERIAL_ECHOPGM("\") \n"); if (*cmd == 0 || *cmd == '\n' || *cmd == '\r') { - //SERIAL_ECHO("Null command found... Did not queue!\n"); + //SERIAL_ECHOPGM("Null command found... Did not queue!\n"); return true; } diff --git a/Marlin/src/gcode/temperature/M104_M109.cpp b/Marlin/src/gcode/temperature/M104_M109.cpp index 61099aa208b0..07859ca21ed7 100644 --- a/Marlin/src/gcode/temperature/M104_M109.cpp +++ b/Marlin/src/gcode/temperature/M104_M109.cpp @@ -53,7 +53,7 @@ void GcodeSuite::M104() { thermalManager.setTargetHotend(temp, e); #if ENABLED(DUAL_X_CARRIAGE) - if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && e == 0) + if (dxc_is_duplicating() && e == 0) thermalManager.setTargetHotend(temp ? temp + duplicate_extruder_temp_offset : 0, 1); #endif @@ -103,7 +103,7 @@ void GcodeSuite::M109() { thermalManager.setTargetHotend(temp, target_extruder); #if ENABLED(DUAL_X_CARRIAGE) - if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && target_extruder == 0) + if (dxc_is_duplicating() && target_extruder == 0) thermalManager.setTargetHotend(temp ? temp + duplicate_extruder_temp_offset : 0, 1); #endif diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 11d4a3ce65ac..aaa6d5462da8 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -546,4 +546,7 @@ #define HAS_RESUME_CONTINUE (ENABLED(NEWPANEL) || ENABLED(EMERGENCY_PARSER)) #define HAS_COLOR_LEDS (ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED)) +#define Z_MULTI_STEPPER_DRIVERS (ENABLED(Z_DUAL_STEPPER_DRIVERS) || ENABLED(Z_TRIPLE_STEPPER_DRIVERS)) +#define Z_MULTI_ENDSTOPS (ENABLED(Z_DUAL_ENDSTOPS) || ENABLED(Z_TRIPLE_ENDSTOPS)) + #endif // CONDITIONALS_LCD_H diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index f6345f3ecc7e..bd6f7aa0e838 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -49,6 +49,8 @@ #define IS_KINEMATIC (ENABLED(DELTA) || IS_SCARA) #define IS_CARTESIAN !IS_KINEMATIC +#define HAS_CLASSIC_JERK (IS_KINEMATIC || DISABLED(JUNCTION_DEVIATION)) + /** * Axis lengths and center */ @@ -379,6 +381,22 @@ #define HEATER_4_USES_THERMISTOR #endif +#if TEMP_SENSOR_5 == -4 + #define HEATER_5_USES_AD8495 +#elif TEMP_SENSOR_5 == -3 + #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_5." +#elif TEMP_SENSOR_5 == -2 + #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_5." +#elif TEMP_SENSOR_5 == -1 + #define HEATER_5_USES_AD595 +#elif TEMP_SENSOR_5 == 0 + #undef HEATER_5_MINTEMP + #undef HEATER_5_MAXTEMP +#elif TEMP_SENSOR_5 > 0 + #define THERMISTORHEATER_5 TEMP_SENSOR_5 + #define HEATER_5_USES_THERMISTOR +#endif + #if TEMP_SENSOR_BED == -4 #define HEATER_BED_USES_AD8495 #elif TEMP_SENSOR_BED == -3 @@ -611,7 +629,7 @@ /** * Z_DUAL_ENDSTOPS endstop reassignment */ -#if ENABLED(Z_DUAL_ENDSTOPS) +#if Z_MULTI_ENDSTOPS #if Z_HOME_DIR > 0 #if Z2_USE_ENDSTOP == _XMIN_ #define Z2_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING @@ -661,9 +679,64 @@ #endif #endif +#if ENABLED(Z_TRIPLE_ENDSTOPS) + #if Z_HOME_DIR > 0 + #if Z3_USE_ENDSTOP == _XMIN_ + #define Z3_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #define Z3_MAX_PIN X_MIN_PIN + #elif Z3_USE_ENDSTOP == _XMAX_ + #define Z3_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #define Z3_MAX_PIN X_MAX_PIN + #elif Z3_USE_ENDSTOP == _YMIN_ + #define Z3_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #define Z3_MAX_PIN Y_MIN_PIN + #elif Z3_USE_ENDSTOP == _YMAX_ + #define Z3_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #define Z3_MAX_PIN Y_MAX_PIN + #elif Z3_USE_ENDSTOP == _ZMIN_ + #define Z3_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #define Z3_MAX_PIN Z_MIN_PIN + #elif Z3_USE_ENDSTOP == _ZMAX_ + #define Z3_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #define Z3_MAX_PIN Z_MAX_PIN + #else + #define Z3_MAX_ENDSTOP_INVERTING false + #endif + #define Z3_MIN_ENDSTOP_INVERTING false + #else + #if Z3_USE_ENDSTOP == _XMIN_ + #define Z3_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #define Z3_MIN_PIN X_MIN_PIN + #elif Z3_USE_ENDSTOP == _XMAX_ + #define Z3_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #define Z3_MIN_PIN X_MAX_PIN + #elif Z3_USE_ENDSTOP == _YMIN_ + #define Z3_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #define Z3_MIN_PIN Y_MIN_PIN + #elif Z3_USE_ENDSTOP == _YMAX_ + #define Z3_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #define Z3_MIN_PIN Y_MAX_PIN + #elif Z3_USE_ENDSTOP == _ZMIN_ + #define Z3_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #define Z3_MIN_PIN Z_MIN_PIN + #elif Z3_USE_ENDSTOP == _ZMAX_ + #define Z3_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #define Z3_MIN_PIN Z_MAX_PIN + #else + #define Z3_MIN_ENDSTOP_INVERTING false + #endif + #define Z3_MAX_ENDSTOP_INVERTING false + #endif +#endif + // Is an endstop plug used for the Z2 endstop or the bed probe? #define IS_Z2_OR_PROBE(A,M) ( \ - (ENABLED(Z_DUAL_ENDSTOPS) && Z2_USE_ENDSTOP == _##A##M##_) \ + (Z_MULTI_ENDSTOPS && Z2_USE_ENDSTOP == _##A##M##_) \ + || (ENABLED(Z_MIN_PROBE_ENDSTOP) && Z_MIN_PROBE_PIN == A##_##M##_PIN ) ) + +// Is an endstop plug used for the Z3 endstop or the bed probe? +#define IS_Z3_OR_PROBE(A,M) ( \ + (ENABLED(Z_TRIPLE_ENDSTOPS) && Z3_USE_ENDSTOP == _##A##M##_) \ || (ENABLED(Z_MIN_PROBE_ENDSTOP) && Z_MIN_PROBE_PIN == A##_##M##_PIN ) ) /** @@ -749,6 +822,10 @@ #define HAS_Z2_STEP (PIN_EXISTS(Z2_STEP)) #define HAS_Z2_MICROSTEPS (PIN_EXISTS(Z2_MS1)) +#define HAS_Z3_ENABLE (PIN_EXISTS(Z3_ENABLE)) +#define HAS_Z3_DIR (PIN_EXISTS(Z3_DIR)) +#define HAS_Z3_STEP (PIN_EXISTS(Z3_STEP)) + // Extruder steppers and solenoids #define HAS_E0_ENABLE (PIN_EXISTS(E0_ENABLE)) #define HAS_E0_DIR (PIN_EXISTS(E0_DIR)) @@ -780,6 +857,12 @@ #define HAS_E4_MICROSTEPS (PIN_EXISTS(E4_MS1)) #define HAS_SOLENOID_4 (PIN_EXISTS(SOL4)) +#define HAS_E5_ENABLE (PIN_EXISTS(E5_ENABLE)) +#define HAS_E5_DIR (PIN_EXISTS(E5_DIR)) +#define HAS_E5_STEP (PIN_EXISTS(E5_STEP)) +#define HAS_E5_MICROSTEPS (PIN_EXISTS(E5_MS1)) +#define HAS_SOLENOID_5 (PIN_EXISTS(SOL5)) + // Trinamic Stepper Drivers #define HAS_STEALTHCHOP (HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2208)) #define HAS_STALLGUARD HAS_DRIVER(TMC2130) @@ -810,6 +893,8 @@ #define HAS_Y2_MAX (PIN_EXISTS(Y2_MAX)) #define HAS_Z2_MIN (PIN_EXISTS(Z2_MIN)) #define HAS_Z2_MAX (PIN_EXISTS(Z2_MAX)) +#define HAS_Z3_MIN (PIN_EXISTS(Z3_MIN)) +#define HAS_Z3_MAX (PIN_EXISTS(Z3_MAX)) #define HAS_Z_MIN_PROBE_PIN (PIN_EXISTS(Z_MIN_PROBE)) // ADC Temp Sensors (Thermistor or Thermocouple with amplifier ADC interface) @@ -856,8 +941,9 @@ #define HAS_AUTO_FAN_2 (HOTENDS > 2 && PIN_EXISTS(E2_AUTO_FAN)) #define HAS_AUTO_FAN_3 (HOTENDS > 3 && PIN_EXISTS(E3_AUTO_FAN)) #define HAS_AUTO_FAN_4 (HOTENDS > 4 && PIN_EXISTS(E4_AUTO_FAN)) +#define HAS_AUTO_FAN_5 (HOTENDS > 5 && PIN_EXISTS(E5_AUTO_FAN)) #define HAS_AUTO_CHAMBER_FAN (PIN_EXISTS(CHAMBER_AUTO_FAN)) -#define HAS_AUTO_FAN (HAS_AUTO_FAN_0 || HAS_AUTO_FAN_1 || HAS_AUTO_FAN_2 || HAS_AUTO_FAN_3 || HAS_AUTO_CHAMBER_FAN) +#define HAS_AUTO_FAN (HAS_AUTO_FAN_0 || HAS_AUTO_FAN_1 || HAS_AUTO_FAN_2 || HAS_AUTO_FAN_3 || HAS_AUTO_FAN_4 || HAS_AUTO_FAN_5 || HAS_AUTO_CHAMBER_FAN) #define AUTO_1_IS_0 (E1_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) #define AUTO_2_IS_0 (E2_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) #define AUTO_2_IS_1 (E2_AUTO_FAN_PIN == E1_AUTO_FAN_PIN) @@ -868,11 +954,17 @@ #define AUTO_4_IS_1 (E4_AUTO_FAN_PIN == E1_AUTO_FAN_PIN) #define AUTO_4_IS_2 (E4_AUTO_FAN_PIN == E2_AUTO_FAN_PIN) #define AUTO_4_IS_3 (E4_AUTO_FAN_PIN == E3_AUTO_FAN_PIN) +#define AUTO_5_IS_0 (E5_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) +#define AUTO_5_IS_1 (E5_AUTO_FAN_PIN == E1_AUTO_FAN_PIN) +#define AUTO_5_IS_2 (E5_AUTO_FAN_PIN == E2_AUTO_FAN_PIN) +#define AUTO_5_IS_3 (E5_AUTO_FAN_PIN == E3_AUTO_FAN_PIN) +#define AUTO_5_IS_4 (E5_AUTO_FAN_PIN == E4_AUTO_FAN_PIN) #define AUTO_CHAMBER_IS_0 (CHAMBER_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) #define AUTO_CHAMBER_IS_1 (CHAMBER_AUTO_FAN_PIN == E1_AUTO_FAN_PIN) #define AUTO_CHAMBER_IS_2 (CHAMBER_AUTO_FAN_PIN == E2_AUTO_FAN_PIN) #define AUTO_CHAMBER_IS_3 (CHAMBER_AUTO_FAN_PIN == E3_AUTO_FAN_PIN) #define AUTO_CHAMBER_IS_4 (CHAMBER_AUTO_FAN_PIN == E4_AUTO_FAN_PIN) +#define AUTO_CHAMBER_IS_5 (CHAMBER_AUTO_FAN_PIN == E5_AUTO_FAN_PIN) // Other fans #define HAS_FAN0 (PIN_EXISTS(FAN)) @@ -903,7 +995,7 @@ #define HAS_CASE_LIGHT (PIN_EXISTS(CASE_LIGHT) && ENABLED(CASE_LIGHT_ENABLE)) // Digital control -#define HAS_MICROSTEPS (HAS_X_MICROSTEPS || HAS_Y_MICROSTEPS || HAS_Z_MICROSTEPS || HAS_E0_MICROSTEPS || HAS_E1_MICROSTEPS || HAS_E2_MICROSTEPS || HAS_E3_MICROSTEPS || HAS_E4_MICROSTEPS) +#define HAS_MICROSTEPS (HAS_X_MICROSTEPS || HAS_Y_MICROSTEPS || HAS_Z_MICROSTEPS || HAS_E0_MICROSTEPS || HAS_E1_MICROSTEPS || HAS_E2_MICROSTEPS || HAS_E3_MICROSTEPS || HAS_E4_MICROSTEPS || HAS_E5_MICROSTEPS) #define HAS_STEPPER_RESET (PIN_EXISTS(STEPPER_RESET)) #define HAS_DIGIPOTSS (PIN_EXISTS(DIGIPOTSS)) #define HAS_MOTOR_CURRENT_PWM (PIN_EXISTS(MOTOR_CURRENT_PWM_XY) || PIN_EXISTS(MOTOR_CURRENT_PWM_Z) || PIN_EXISTS(MOTOR_CURRENT_PWM_E)) @@ -959,6 +1051,9 @@ #define WRITE_HEATER_3(v) WRITE(HEATER_3_PIN, (v) ^ HEATER_3_INVERTING) #if HOTENDS > 4 #define WRITE_HEATER_4(v) WRITE(HEATER_4_PIN, (v) ^ HEATER_4_INVERTING) + #if HOTENDS > 5 + #define WRITE_HEATER_5(v) WRITE(HEATER_5_PIN, (v) ^ HEATER_5_INVERTING) + #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 @@ -1112,10 +1207,9 @@ #define HAS_LEVELING (HAS_ABL || ENABLED(MESH_BED_LEVELING)) #define HAS_AUTOLEVEL (HAS_ABL && DISABLED(PROBE_MANUALLY)) #define HAS_MESH (ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(MESH_BED_LEVELING)) -#define PLANNER_LEVELING (OLDSCHOOL_ABL || ENABLED(MESH_BED_LEVELING) || UBL_SEGMENTED || ENABLED(SKEW_CORRECTION)) +#define PLANNER_LEVELING (HAS_LEVELING && DISABLED(AUTO_BED_LEVELING_UBL)) #define HAS_PROBING_PROCEDURE (HAS_ABL || ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST)) -#define HAS_UBL_AND_CURVES (ENABLED(AUTO_BED_LEVELING_UBL) && !PLANNER_LEVELING && (ENABLED(ARC_SUPPORT) || ENABLED(BEZIER_CURVE_SUPPORT))) -#define HAS_FEEDRATE_SCALING (ENABLED(SCARA_FEEDRATE_SCALING) || ENABLED(DELTA_FEEDRATE_SCALING)) +#define HAS_POSITION_MODIFIERS (ENABLED(FWRETRACT) || HAS_LEVELING || ENABLED(SKEW_CORRECTION)) #if ENABLED(AUTO_BED_LEVELING_UBL) #undef LCD_BED_LEVELING diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 529682478393..49505543ecc5 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -272,20 +272,20 @@ #error "HAVE_TMC2130 is now [AXIS]_DRIVER_TYPE TMC2130. Please update your Configuration.h." #elif defined(HAVE_L6470DRIVER) #error "HAVE_L6470DRIVER is now [AXIS]_DRIVER_TYPE L6470. Please update your Configuration.h." -#elif defined(X_IS_TMC) || defined(X2_IS_TMC) || defined(Y_IS_TMC) || defined(Y2_IS_TMC) || defined(Z_IS_TMC) || defined(Z2_IS_TMC) \ - || defined(E0_IS_TMC) || defined(E1_IS_TMC) || defined(E2_IS_TMC) || defined(E3_IS_TMC) || defined(E4_IS_TMC) +#elif defined(X_IS_TMC) || defined(X2_IS_TMC) || defined(Y_IS_TMC) || defined(Y2_IS_TMC) || defined(Z_IS_TMC) || defined(Z2_IS_TMC) || defined(Z3_IS_TMC) \ + || defined(E0_IS_TMC) || defined(E1_IS_TMC) || defined(E2_IS_TMC) || defined(E3_IS_TMC) || defined(E4_IS_TMC) || defined(E5_IS_TMC) #error "[AXIS]_IS_TMC is now [AXIS]_DRIVER_TYPE TMC26X. Please update your Configuration.h." -#elif defined(X_IS_TMC26X) || defined(X2_IS_TMC26X) || defined(Y_IS_TMC26X) || defined(Y2_IS_TMC26X) || defined(Z_IS_TMC26X) || defined(Z2_IS_TMC26X) \ - || defined(E0_IS_TMC26X) || defined(E1_IS_TMC26X) || defined(E2_IS_TMC26X) || defined(E3_IS_TMC26X) || defined(E4_IS_TMC26X) +#elif defined(X_IS_TMC26X) || defined(X2_IS_TMC26X) || defined(Y_IS_TMC26X) || defined(Y2_IS_TMC26X) || defined(Z_IS_TMC26X) || defined(Z2_IS_TMC26X) || defined(Z3_IS_TMC26X) \ + || defined(E0_IS_TMC26X) || defined(E1_IS_TMC26X) || defined(E2_IS_TMC26X) || defined(E3_IS_TMC26X) || defined(E4_IS_TMC26X) || defined(E5_IS_TMC26X) #error "[AXIS]_IS_TMC26X is now [AXIS]_DRIVER_TYPE TMC26X. Please update your Configuration.h." -#elif defined(X_IS_TMC2130) || defined(X2_IS_TMC2130) || defined(Y_IS_TMC2130) || defined(Y2_IS_TMC2130) || defined(Z_IS_TMC2130) || defined(Z2_IS_TMC2130) \ - || defined(E0_IS_TMC2130) || defined(E1_IS_TMC2130) || defined(E2_IS_TMC2130) || defined(E3_IS_TMC2130) || defined(E4_IS_TMC2130) +#elif defined(X_IS_TMC2130) || defined(X2_IS_TMC2130) || defined(Y_IS_TMC2130) || defined(Y2_IS_TMC2130) || defined(Z_IS_TMC2130) || defined(Z2_IS_TMC2130) || defined(Z3_IS_TMC2130) \ + || defined(E0_IS_TMC2130) || defined(E1_IS_TMC2130) || defined(E2_IS_TMC2130) || defined(E3_IS_TMC2130) || defined(E4_IS_TMC2130) || defined(E5_IS_TMC2130) #error "[AXIS]_IS_TMC2130 is now [AXIS]_DRIVER_TYPE TMC2130. Please update your Configuration.h." -#elif defined(X_IS_TMC2208) || defined(X2_IS_TMC2208) || defined(Y_IS_TMC2208) || defined(Y2_IS_TMC2208) || defined(Z_IS_TMC2208) || defined(Z2_IS_TMC2208) \ - || defined(E0_IS_TMC2208) || defined(E1_IS_TMC2208) || defined(E2_IS_TMC2208) || defined(E3_IS_TMC2208) || defined(E4_IS_TMC2208) +#elif defined(X_IS_TMC2208) || defined(X2_IS_TMC2208) || defined(Y_IS_TMC2208) || defined(Y2_IS_TMC2208) || defined(Z_IS_TMC2208) || defined(Z2_IS_TMC2208) || defined(Z3_IS_TMC2208) \ + || defined(E0_IS_TMC2208) || defined(E1_IS_TMC2208) || defined(E2_IS_TMC2208) || defined(E3_IS_TMC2208) || defined(E4_IS_TMC2208) || defined(E5_IS_TMC2208) #error "[AXIS]_IS_TMC2208 is now [AXIS]_DRIVER_TYPE TMC2208. Please update your Configuration.h." -#elif defined(X_IS_L6470) || defined(X2_IS_L6470) || defined(Y_IS_L6470) || defined(Y2_IS_L6470) || defined(Z_IS_L6470) || defined(Z2_IS_L6470) \ - || defined(E0_IS_L6470) || defined(E1_IS_L6470) || defined(E2_IS_L6470) || defined(E3_IS_L6470) || defined(E4_IS_L6470) +#elif defined(X_IS_L6470) || defined(X2_IS_L6470) || defined(Y_IS_L6470) || defined(Y2_IS_L6470) || defined(Z_IS_L6470) || defined(Z2_IS_L6470) || defined(Z3_IS_L6470) \ + || defined(E0_IS_L6470) || defined(E1_IS_L6470) || defined(E2_IS_L6470) || defined(E3_IS_L6470) || defined(E4_IS_L6470) || defined(E5_IS_L6470) #error "[AXIS]_IS_L6470 is now [AXIS]_DRIVER_TYPE L6470. Please update your Configuration.h." #elif defined(AUTOMATIC_CURRENT_CONTROL) #error "AUTOMATIC_CURRENT_CONTROL is now MONITOR_DRIVER_STATUS. Please update your configuration." @@ -365,16 +365,22 @@ #endif /** - * Dual Stepper Drivers + * Dual / Triple Stepper Drivers */ #if ENABLED(X_DUAL_STEPPER_DRIVERS) && ENABLED(DUAL_X_CARRIAGE) #error "DUAL_X_CARRIAGE is not compatible with X_DUAL_STEPPER_DRIVERS." -#elif ENABLED(X_DUAL_STEPPER_DRIVERS) && (!HAS_X2_ENABLE || !HAS_X2_STEP || !HAS_X2_DIR) +#elif ENABLED(X_DUAL_STEPPER_DRIVERS) && !(HAS_X2_ENABLE && HAS_X2_STEP && HAS_X2_DIR) #error "X_DUAL_STEPPER_DRIVERS requires X2 pins (and an extra E plug)." -#elif ENABLED(Y_DUAL_STEPPER_DRIVERS) && (!HAS_Y2_ENABLE || !HAS_Y2_STEP || !HAS_Y2_DIR) +#elif ENABLED(Y_DUAL_STEPPER_DRIVERS) && !(HAS_Y2_ENABLE && HAS_Y2_STEP && HAS_Y2_DIR) #error "Y_DUAL_STEPPER_DRIVERS requires Y2 pins (and an extra E plug)." -#elif ENABLED(Z_DUAL_STEPPER_DRIVERS) && (!HAS_Z2_ENABLE || !HAS_Z2_STEP || !HAS_Z2_DIR) - #error "Z_DUAL_STEPPER_DRIVERS requires Z2 pins (and an extra E plug)." +#elif ENABLED(Z_DUAL_STEPPER_DRIVERS) + #if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + #error "Please select either Z_TRIPLE_STEPPER_DRIVERS or Z_DUAL_STEPPER_DRIVERS, not both." + #elif !(HAS_Z2_ENABLE && HAS_Z2_STEP && HAS_Z2_DIR) + #error "Z_DUAL_STEPPER_DRIVERS requires Z2 pins (and an extra E plug)." + #endif +#elif ENABLED(Z_TRIPLE_STEPPER_DRIVERS) && !(HAS_Z2_ENABLE && HAS_Z2_STEP && HAS_Z2_DIR && HAS_Z3_ENABLE && HAS_Z3_STEP && HAS_Z3_DIR) + #error "Z_TRIPLE_STEPPER_DRIVERS requires Z3 pins (and two extra E plugs)." #endif /** @@ -528,6 +534,8 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE, #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 3 requires FIL_RUNOUT4_PIN." #elif NUM_RUNOUT_SENSORS > 4 && !PIN_EXISTS(FIL_RUNOUT5) #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 4 requires FIL_RUNOUT5_PIN." + #elif NUM_RUNOUT_SENSORS > 5 && !PIN_EXISTS(FIL_RUNOUT6) + #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 5 requires FIL_RUNOUT6_PIN." #elif DISABLED(SDSUPPORT) && DISABLED(PRINTJOB_TIMER_AUTOSTART) #error "FILAMENT_RUNOUT_SENSOR requires SDSUPPORT or PRINTJOB_TIMER_AUTOSTART." #elif DISABLED(ADVANCED_PAUSE_FEATURE) @@ -756,7 +764,7 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE, /** * Limited number of servos */ -#if NUM_SERVOS > MAX_SERVOS +#if NUM_SERVOS > NUM_SERVO_PLUGS #error "The selected board doesn't support enough servos for your configuration. Reduce NUM_SERVOS." #endif @@ -1138,7 +1146,7 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE, #error "DUAL_X_CARRIAGE requires 2 (or more) extruders." #elif CORE_IS_XY || CORE_IS_XZ #error "DUAL_X_CARRIAGE cannot be used with COREXY, COREYX, COREXZ, or COREZX." - #elif !HAS_X2_ENABLE || !HAS_X2_STEP || !HAS_X2_DIR + #elif !(HAS_X2_ENABLE && HAS_X2_STEP && HAS_X2_DIR) #error "DUAL_X_CARRIAGE requires X2 stepper pins to be defined." #elif !HAS_X_MAX #error "DUAL_X_CARRIAGE requires USE_XMAX_PLUG and an X Max Endstop." @@ -1236,13 +1244,28 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE, #elif !PIN_EXISTS(TEMP_4) #error "TEMP_4_PIN not defined for this board." #endif + #if HOTENDS > 5 + #if TEMP_SENSOR_5 == 0 + #error "TEMP_SENSOR_5 is required with 5 HOTENDS." + #elif !HAS_HEATER_5 + #error "HEATER_5_PIN not defined for this board." + #elif !PIN_EXISTS(TEMP_5) + #error "TEMP_5_PIN not defined for this board." + #endif + #elif TEMP_SENSOR_5 != 0 + #error "TEMP_SENSOR_5 shouldn't be set with only 5 HOTENDS." + #endif #elif TEMP_SENSOR_4 != 0 #error "TEMP_SENSOR_4 shouldn't be set with only 4 HOTENDS." + #elif TEMP_SENSOR_5 != 0 + #error "TEMP_SENSOR_5 shouldn't be set with only 5 HOTENDS." #endif #elif TEMP_SENSOR_3 != 0 #error "TEMP_SENSOR_3 shouldn't be set with only 3 HOTENDS." #elif TEMP_SENSOR_4 != 0 #error "TEMP_SENSOR_4 shouldn't be set with only 3 HOTENDS." + #elif TEMP_SENSOR_5 != 0 + #error "TEMP_SENSOR_5 shouldn't be set with only 4 HOTENDS." #endif #elif TEMP_SENSOR_2 != 0 #error "TEMP_SENSOR_2 shouldn't be set with only 2 HOTENDS." @@ -1250,6 +1273,8 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE, #error "TEMP_SENSOR_3 shouldn't be set with only 2 HOTENDS." #elif TEMP_SENSOR_4 != 0 #error "TEMP_SENSOR_4 shouldn't be set with only 2 HOTENDS." + #elif TEMP_SENSOR_5 != 0 + #error "TEMP_SENSOR_5 shouldn't be set with only 2 HOTENDS." #endif #elif TEMP_SENSOR_1 != 0 && DISABLED(TEMP_SENSOR_1_AS_REDUNDANT) #error "TEMP_SENSOR_1 shouldn't be set with only 1 HOTEND." @@ -1259,6 +1284,8 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE, #error "TEMP_SENSOR_3 shouldn't be set with only 1 HOTEND." #elif TEMP_SENSOR_4 != 0 #error "TEMP_SENSOR_4 shouldn't be set with only 1 HOTEND." +#elif TEMP_SENSOR_5 != 0 + #error "TEMP_SENSOR_5 shouldn't be set with only 1 HOTEND." #endif #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) && TEMP_SENSOR_1 == 0 @@ -1300,24 +1327,38 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE, * Test Extruder Stepper Pins */ #if DISABLED(MK2_MULTIPLEXER) // MK2_MULTIPLEXER uses E0 stepper only - #if E_STEPPERS > 4 - #if !PIN_EXISTS(E4_STEP) || !PIN_EXISTS(E4_DIR) || !PIN_EXISTS(E4_ENABLE) - #error "E4_STEP_PIN, E4_DIR_PIN, or E4_ENABLE_PIN not defined for this board." - #endif - #elif E_STEPPERS > 3 - #if !PIN_EXISTS(E3_STEP) || !PIN_EXISTS(E3_DIR) || !PIN_EXISTS(E3_ENABLE) - #error "E3_STEP_PIN, E3_DIR_PIN, or E3_ENABLE_PIN not defined for this board." - #endif - #elif E_STEPPERS > 2 - #if !PIN_EXISTS(E2_STEP) || !PIN_EXISTS(E2_DIR) || !PIN_EXISTS(E2_ENABLE) - #error "E2_STEP_PIN, E2_DIR_PIN, or E2_ENABLE_PIN not defined for this board." + #if E_STEPPERS + #if !(PIN_EXISTS(E0_STEP) && PIN_EXISTS(E0_DIR) && PIN_EXISTS(E0_ENABLE)) + #error "E0_STEP_PIN, E0_DIR_PIN, or E0_ENABLE_PIN not defined for this board." #endif - #elif E_STEPPERS > 1 - #if !PIN_EXISTS(E1_STEP) || !PIN_EXISTS(E1_DIR) || !PIN_EXISTS(E1_ENABLE) - #error "E1_STEP_PIN, E1_DIR_PIN, or E1_ENABLE_PIN not defined for this board." - #endif - #endif + #if E_STEPPERS > 1 + #if !(PIN_EXISTS(E1_STEP) && PIN_EXISTS(E1_DIR) && PIN_EXISTS(E1_ENABLE)) + #error "E1_STEP_PIN, E1_DIR_PIN, or E1_ENABLE_PIN not defined for this board." + #endif + #if E_STEPPERS > 2 + #if !(PIN_EXISTS(E2_STEP) && PIN_EXISTS(E2_DIR) && PIN_EXISTS(E2_ENABLE)) + #error "E2_STEP_PIN, E2_DIR_PIN, or E2_ENABLE_PIN not defined for this board." + #endif + #if E_STEPPERS > 3 + #if !(PIN_EXISTS(E3_STEP) && PIN_EXISTS(E3_DIR) && PIN_EXISTS(E3_ENABLE)) + #error "E3_STEP_PIN, E3_DIR_PIN, or E3_ENABLE_PIN not defined for this board." + #endif + #if E_STEPPERS > 4 + #if !(PIN_EXISTS(E4_STEP) && PIN_EXISTS(E4_DIR) && PIN_EXISTS(E4_ENABLE)) + #error "E4_STEP_PIN, E4_DIR_PIN, or E4_ENABLE_PIN not defined for this board." + #endif + #if E_STEPPERS > 5 + #if !(PIN_EXISTS(E5_STEP) && PIN_EXISTS(E5_DIR) && PIN_EXISTS(E5_ENABLE)) + #error "E5_STEP_PIN, E5_DIR_PIN, or E5_ENABLE_PIN not defined for this board." + #endif + #endif // E_STEPPERS > 5 + #endif // E_STEPPERS > 4 + #endif // E_STEPPERS > 3 + #endif // E_STEPPERS > 2 + #endif // E_STEPPERS > 1 + #endif // E_STEPPERS #endif + /** * Endstop Tests */ @@ -1418,6 +1459,46 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE, #error "Z_DUAL_ENDSTOPS is not compatible with DELTA." #endif #endif +#if ENABLED(Z_TRIPLE_ENDSTOPS) + #if !Z2_USE_ENDSTOP + #error "You must set Z2_USE_ENDSTOP with Z_TRIPLE_ENDSTOPS." + #elif Z2_USE_ENDSTOP == _XMIN_ && DISABLED(USE_XMIN_PLUG) + #error "USE_XMIN_PLUG is required when Z2_USE_ENDSTOP is _XMIN_." + #elif Z2_USE_ENDSTOP == _XMAX_ && DISABLED(USE_XMAX_PLUG) + #error "USE_XMAX_PLUG is required when Z2_USE_ENDSTOP is _XMAX_." + #elif Z2_USE_ENDSTOP == _YMIN_ && DISABLED(USE_YMIN_PLUG) + #error "USE_YMIN_PLUG is required when Z2_USE_ENDSTOP is _YMIN_." + #elif Z2_USE_ENDSTOP == _YMAX_ && DISABLED(USE_YMAX_PLUG) + #error "USE_YMAX_PLUG is required when Z2_USE_ENDSTOP is _YMAX_." + #elif Z2_USE_ENDSTOP == _ZMIN_ && DISABLED(USE_ZMIN_PLUG) + #error "USE_ZMIN_PLUG is required when Z2_USE_ENDSTOP is _ZMIN_." + #elif Z2_USE_ENDSTOP == _ZMAX_ && DISABLED(USE_ZMAX_PLUG) + #error "USE_ZMAX_PLUG is required when Z2_USE_ENDSTOP is _ZMAX_." + #elif !HAS_Z2_MIN && !HAS_Z2_MAX + #error "Z2_USE_ENDSTOP has been assigned to a nonexistent endstop!" + #elif ENABLED(DELTA) + #error "Z_TRIPLE_ENDSTOPS is not compatible with DELTA." + #endif + #if !Z3_USE_ENDSTOP + #error "You must set Z3_USE_ENDSTOP with Z_TRIPLE_ENDSTOPS." + #elif Z3_USE_ENDSTOP == _XMIN_ && DISABLED(USE_XMIN_PLUG) + #error "USE_XMIN_PLUG is required when Z3_USE_ENDSTOP is _XMIN_." + #elif Z3_USE_ENDSTOP == _XMAX_ && DISABLED(USE_XMAX_PLUG) + #error "USE_XMAX_PLUG is required when Z3_USE_ENDSTOP is _XMAX_." + #elif Z3_USE_ENDSTOP == _YMIN_ && DISABLED(USE_YMIN_PLUG) + #error "USE_YMIN_PLUG is required when Z3_USE_ENDSTOP is _YMIN_." + #elif Z3_USE_ENDSTOP == _YMAX_ && DISABLED(USE_YMAX_PLUG) + #error "USE_YMAX_PLUG is required when Z3_USE_ENDSTOP is _YMAX_." + #elif Z3_USE_ENDSTOP == _ZMIN_ && DISABLED(USE_ZMIN_PLUG) + #error "USE_ZMIN_PLUG is required when Z3_USE_ENDSTOP is _ZMIN_." + #elif Z3_USE_ENDSTOP == _ZMAX_ && DISABLED(USE_ZMAX_PLUG) + #error "USE_ZMAX_PLUG is required when Z3_USE_ENDSTOP is _ZMAX_." + #elif !HAS_Z3_MIN && !HAS_Z3_MAX + #error "Z3_USE_ENDSTOP has been assigned to a nonexistent endstop!" + #elif ENABLED(DELTA) + #error "Z_TRIPLE_ENDSTOPS is not compatible with DELTA." + #endif +#endif /** * emergency-command parser @@ -1566,6 +1647,8 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE, #error "Z_CS_PIN is required for TMC2130. Define Z_CS_PIN in Configuration_adv.h." #elif AXIS_DRIVER_TYPE(Z2, TMC2130) && !PIN_EXISTS(Z2_CS) #error "Z2_CS_PIN is required for TMC2130. Define Z2_CS_PIN in Configuration_adv.h." +#elif AXIS_DRIVER_TYPE(Z3, TMC2130) && !PIN_EXISTS(Z3_CS) + #error "Z3_CS_PIN is required for TMC2130. Define Z3_CS_PIN in Configuration_adv.h." #elif AXIS_DRIVER_TYPE(E0, TMC2130) && !PIN_EXISTS(E0_CS) #error "E0_CS_PIN is required for TMC2130. Define E0_CS_PIN in Configuration_adv.h." #elif AXIS_DRIVER_TYPE(E1, TMC2130) && !PIN_EXISTS(E1_CS) @@ -1576,6 +1659,8 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE, #error "E3_CS_PIN is required for TMC2130. Define E3_CS_PIN in Configuration_adv.h." #elif AXIS_DRIVER_TYPE(E4, TMC2130) && !PIN_EXISTS(E4_CS) #error "E4_CS_PIN is required for TMC2130. Define E4_CS_PIN in Configuration_adv.h." +#elif AXIS_DRIVER_TYPE(E5, TMC2130) && !PIN_EXISTS(E5_CS) + #error "E5_CS_PIN is required for TMC2130. Define E5_CS_PIN in Configuration_adv.h." #endif /** @@ -1588,18 +1673,20 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE, || defined(Y2_HARDWARE_SERIAL) \ || defined(Z_HARDWARE_SERIAL ) \ || defined(Z2_HARDWARE_SERIAL) \ + || defined(Z3_HARDWARE_SERIAL) \ || defined(E0_HARDWARE_SERIAL) \ || defined(E1_HARDWARE_SERIAL) \ || defined(E2_HARDWARE_SERIAL) \ || defined(E3_HARDWARE_SERIAL) \ - || defined(E4_HARDWARE_SERIAL) ) - #error "select hardware UART for TMC2208 to use both TMC2208 and ENDSTOP_INTERRUPTS_FEATURE." + || defined(E4_HARDWARE_SERIAL) \ + || defined(E5_HARDWARE_SERIAL) ) + #error "Select hardware UART for TMC2208 to use both TMC2208 and ENDSTOP_INTERRUPTS_FEATURE." #endif /** * TMC2208 software UART is only supported on AVR */ -#if HAS_DRIVER(TMC2208) && !defined(__AVR__) && !( \ +#if HAS_DRIVER(TMC2208) && !defined(__AVR__) && !defined(TARGET_LPC1768) && !( \ defined(X_HARDWARE_SERIAL ) \ || defined(X2_HARDWARE_SERIAL) \ || defined(Y_HARDWARE_SERIAL ) \ @@ -1610,8 +1697,9 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE, || defined(E1_HARDWARE_SERIAL) \ || defined(E2_HARDWARE_SERIAL) \ || defined(E3_HARDWARE_SERIAL) \ - || defined(E4_HARDWARE_SERIAL) ) - #error "TMC2208 Software Serial is supported only on AVR platforms." + || defined(E4_HARDWARE_SERIAL) \ + || defined(E5_HARDWARE_SERIAL) ) + #error "TMC2208 Software Serial is supported only on AVR and LPC1768 platforms." #endif #if ENABLED(SENSORLESS_HOMING) @@ -1650,7 +1738,7 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE, #if ENABLED(HYBRID_THRESHOLD) && DISABLED(STEALTHCHOP) #error "Enable STEALTHCHOP to use HYBRID_THRESHOLD." #endif -#if ENABLED(TMC_Z_CALIBRATION) && !AXIS_IS_TMC(Z) && !AXIS_IS_TMC(Z2) +#if ENABLED(TMC_Z_CALIBRATION) && !AXIS_IS_TMC(Z) && !AXIS_IS_TMC(Z2) && !AXIS_IS_TMC(Z3) #error "TMC_Z_CALIBRATION requires at least one TMC driver on Z axis" #endif diff --git a/Marlin/src/lcd/language/language_an.h b/Marlin/src/lcd/language/language_an.h index 679ed1cf3f93..41bd27251068 100644 --- a/Marlin/src/lcd/language/language_an.h +++ b/Marlin/src/lcd/language/language_an.h @@ -130,6 +130,7 @@ #define MSG_E3STEPS _UxGT("E3 trangos/mm") #define MSG_E4STEPS _UxGT("E4 trangos/mm") #define MSG_E5STEPS _UxGT("E5 trangos/mm") +#define MSG_E6STEPS _UxGT("E6 trangos/mm") #define MSG_TEMPERATURE _UxGT("Temperatura") #define MSG_MOTION _UxGT("Movimiento") #define MSG_FILAMENT _UxGT("Filamento") diff --git a/Marlin/src/lcd/language/language_bg.h b/Marlin/src/lcd/language/language_bg.h index cd86dbe6b2ab..558a98e35134 100644 --- a/Marlin/src/lcd/language/language_bg.h +++ b/Marlin/src/lcd/language/language_bg.h @@ -99,6 +99,7 @@ #define MSG_E3STEPS _UxGT("E3 стъпки/mm") #define MSG_E4STEPS _UxGT("E4 стъпки/mm") #define MSG_E5STEPS _UxGT("E5 стъпки/mm") +#define MSG_E6STEPS _UxGT("E6 стъпки/mm") #define MSG_TEMPERATURE _UxGT("Температура") #define MSG_MOTION _UxGT("Движение") #define MSG_FILAMENT _UxGT("Нишка") diff --git a/Marlin/src/lcd/language/language_ca.h b/Marlin/src/lcd/language/language_ca.h index 31007b735273..8ff6bbf3cff6 100644 --- a/Marlin/src/lcd/language/language_ca.h +++ b/Marlin/src/lcd/language/language_ca.h @@ -132,6 +132,7 @@ #define MSG_E3STEPS _UxGT("E3passos/mm") #define MSG_E4STEPS _UxGT("E4passos/mm") #define MSG_E5STEPS _UxGT("E5passos/mm") +#define MSG_E6STEPS _UxGT("E6passos/mm") #define MSG_TEMPERATURE _UxGT("Temperatura") #define MSG_MOTION _UxGT("Moviment") #define MSG_FILAMENT _UxGT("Filament") diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index bd57e308135c..1a42aa44daf2 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -233,6 +233,7 @@ #define MSG_E3STEPS _UxGT("E3kroků/mm") #define MSG_E4STEPS _UxGT("E4kroků/mm") #define MSG_E5STEPS _UxGT("E5kroků/mm") +#define MSG_E6STEPS _UxGT("E6kroků/mm") #define MSG_TEMPERATURE _UxGT("Teplota") #define MSG_MOTION _UxGT("Pohyb") #define MSG_FILAMENT _UxGT("Filament") diff --git a/Marlin/src/lcd/language/language_da.h b/Marlin/src/lcd/language/language_da.h index 0782b9653129..1bd78c332c75 100644 --- a/Marlin/src/lcd/language/language_da.h +++ b/Marlin/src/lcd/language/language_da.h @@ -130,6 +130,7 @@ #define MSG_E3STEPS _UxGT("E3steps/mm") #define MSG_E4STEPS _UxGT("E4steps/mm") #define MSG_E5STEPS _UxGT("E5steps/mm") +#define MSG_E6STEPS _UxGT("E6steps/mm") #define MSG_TEMPERATURE _UxGT("Temperatur") #define MSG_MOTION _UxGT("Bevægelse") #define MSG_FILAMENT _UxGT("Filament") diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index 75d1d7aa2a9a..d5f9981284bb 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -145,6 +145,7 @@ #define MSG_E3STEPS _UxGT("E3 Steps/mm") #define MSG_E4STEPS _UxGT("E4 Steps/mm") #define MSG_E5STEPS _UxGT("E5 Steps/mm") +#define MSG_E6STEPS _UxGT("E6 Steps/mm") #define MSG_TEMPERATURE _UxGT("Temperatur") #define MSG_MOTION _UxGT("Bewegung") #define MSG_FILAMENT _UxGT("Filament") diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index c96c65997534..d02927bf3f0f 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -154,6 +154,9 @@ #ifndef MSG_PREHEAT_2_SETTINGS #define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" conf") #endif +#ifndef MSG_PREHEAT_CUSTOM + #define MSG_PREHEAT_CUSTOM _UxGT("Preheat Custom") +#endif #ifndef MSG_COOLDOWN #define MSG_COOLDOWN _UxGT("Cooldown") #endif @@ -211,9 +214,24 @@ #ifndef MSG_IDEX_MODE_DUPLICATE #define MSG_IDEX_MODE_DUPLICATE _UxGT("Duplication") #endif +#ifndef MSG_IDEX_MODE_SCALED_COPY + #define MSG_IDEX_MODE_SCALED_COPY _UxGT("Scaled copy") +#endif #ifndef MSG_IDEX_MODE_FULL_CTRL #define MSG_IDEX_MODE_FULL_CTRL _UxGT("Full control") #endif +#ifndef MSG_IDEX_X_OFFSET + #define MSG_IDEX_X_OFFSET _UxGT("2nd nozzle X") +#endif +#ifndef MSG_IDEX_Y_OFFSET + #define MSG_IDEX_Y_OFFSET _UxGT("2nd nozzle Y") +#endif +#ifndef MSG_IDEX_Z_OFFSET + #define MSG_IDEX_Z_OFFSET _UxGT("2nd nozzle Z") +#endif +#ifndef MSG_IDEX_SAVE_OFFSETS + #define MSG_IDEX_SAVE_OFFSETS _UxGT("Save Offsets") +#endif #ifndef MSG_UBL_MANUAL_MESH #define MSG_UBL_MANUAL_MESH _UxGT("Manually Build Mesh") #endif @@ -627,6 +645,12 @@ #ifndef MSG_E5STEPS #define MSG_E5STEPS _UxGT("E5steps/mm") #endif +#ifndef MSG_E6STEPS + #define MSG_E6STEPS _UxGT("E6steps/mm") +#endif +#ifndef MSG_E6STEPS + #define MSG_E6STEPS _UxGT("E6steps/mm") +#endif #ifndef MSG_TEMPERATURE #define MSG_TEMPERATURE _UxGT("Temperature") #endif @@ -1076,6 +1100,9 @@ #ifndef MSG_FILAMENT_CHANGE_INSERT_1 #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insert and Click") #endif + #ifndef MSG_FILAMENT_CHANGE_HEAT_1 + #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Click to heat") + #endif #ifndef MSG_FILAMENT_CHANGE_HEATING_1 #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Heating...") #endif diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index 101f38220b88..84125f96b829 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -125,6 +125,7 @@ #define MSG_E3STEPS _UxGT("E3 pasos/mm") #define MSG_E4STEPS _UxGT("E4 pasos/mm") #define MSG_E5STEPS _UxGT("E5 pasos/mm") +#define MSG_E6STEPS _UxGT("E6 pasos/mm") #define MSG_TEMPERATURE _UxGT("Temperatura") #define MSG_MOTION _UxGT("Movimiento") #define MSG_FILAMENT _UxGT("Filamento") diff --git a/Marlin/src/lcd/language/language_eu.h b/Marlin/src/lcd/language/language_eu.h index 999855ef3700..b0b660557557 100644 --- a/Marlin/src/lcd/language/language_eu.h +++ b/Marlin/src/lcd/language/language_eu.h @@ -224,6 +224,7 @@ #define MSG_E3STEPS _UxGT("E3 pausoak/mm") #define MSG_E4STEPS _UxGT("E4 pausoak/mm") #define MSG_E5STEPS _UxGT("E5 pausoak/mm") +#define MSG_E6STEPS _UxGT("E6 pausoak/mm") #define MSG_TEMPERATURE _UxGT("Tenperatura") #define MSG_MOTION _UxGT("Mugimendua") #define MSG_FILAMENT _UxGT("Harizpia") diff --git a/Marlin/src/lcd/language/language_fi.h b/Marlin/src/lcd/language/language_fi.h index 4a79946f94e7..318d31045971 100644 --- a/Marlin/src/lcd/language/language_fi.h +++ b/Marlin/src/lcd/language/language_fi.h @@ -120,6 +120,7 @@ #define MSG_E3STEPS _UxGT("E3steps/mm") #define MSG_E4STEPS _UxGT("E4steps/mm") #define MSG_E5STEPS _UxGT("E5steps/mm") +#define MSG_E6STEPS _UxGT("E6steps/mm") #define MSG_TEMPERATURE _UxGT("Lämpötila") #define MSG_MOTION _UxGT("Liike") #define MSG_FILAMENT _UxGT("Filament") diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index 0973f64132e1..cf6d85e50416 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -228,6 +228,7 @@ #define MSG_E3STEPS _UxGT("E3 pas/mm") #define MSG_E4STEPS _UxGT("E4 pas/mm") #define MSG_E5STEPS _UxGT("E5 pas/mm") +#define MSG_E6STEPS _UxGT("E6 pas/mm") #define MSG_TEMPERATURE _UxGT("Température") #define MSG_MOTION _UxGT("Mouvement") #define MSG_FILAMENT _UxGT("Filament") diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index 960cc8cacea5..892f8b4a9841 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -129,6 +129,7 @@ #define MSG_E3STEPS _UxGT("E3 pasos/mm") #define MSG_E4STEPS _UxGT("E4 pasos/mm") #define MSG_E5STEPS _UxGT("E5 pasos/mm") +#define MSG_E6STEPS _UxGT("E6 pasos/mm") #define MSG_TEMPERATURE _UxGT("Temperatura") #define MSG_MOTION _UxGT("Movemento") #define MSG_FILAMENT _UxGT("Filamento") diff --git a/Marlin/src/lcd/language/language_hr.h b/Marlin/src/lcd/language/language_hr.h index efdeae8b5b8f..1e972778defd 100644 --- a/Marlin/src/lcd/language/language_hr.h +++ b/Marlin/src/lcd/language/language_hr.h @@ -129,6 +129,7 @@ #define MSG_E3STEPS _UxGT("E3steps/mm") #define MSG_E4STEPS _UxGT("E4steps/mm") #define MSG_E5STEPS _UxGT("E5steps/mm") +#define MSG_E6STEPS _UxGT("E6steps/mm") #define MSG_TEMPERATURE _UxGT("Temperature") #define MSG_MOTION _UxGT("Gibanje") #define MSG_FILAMENT _UxGT("Filament") diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index d19f8a20b511..65edf237ceeb 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -38,10 +38,12 @@ #define MSG_SD_REMOVED _UxGT("SD Card rimossa") #define MSG_LCD_ENDSTOPS _UxGT("Endstop") #define MSG_MAIN _UxGT("Menu principale") +#define MSG_ADVANCED_SETTINGS _UxGT("Impostaz. avanzate") +#define MSG_CONFIGURATION _UxGT("Configurazione") #define MSG_AUTOSTART _UxGT("Autostart") #define MSG_DISABLE_STEPPERS _UxGT("Disabilita Motori") #define MSG_DEBUG_MENU _UxGT("Menu di debug") -#define MSG_PROGRESS_BAR_TEST _UxGT("Test barra avanzamento") +#define MSG_PROGRESS_BAR_TEST _UxGT("Test barra avanzam.") #define MSG_AUTO_HOME _UxGT("Auto Home") #define MSG_AUTO_HOME_X _UxGT("Home asse X") #define MSG_AUTO_HOME_Y _UxGT("Home asse Y") @@ -77,18 +79,21 @@ #define MSG_LEVEL_BED _UxGT("Livella piano") #define MSG_LEVEL_CORNERS _UxGT("Livella spigoli") #define MSG_NEXT_CORNER _UxGT("Prossimo spigolo") -#define MSG_EDITING_STOPPED _UxGT("Modifica Mesh Fermata") +#define MSG_EDITING_STOPPED _UxGT("Modif. Mesh Fermata") #define MSG_USER_MENU _UxGT("Comandi Utente") - #define MSG_UBL_DOING_G29 _UxGT("G29 in corso") #define MSG_UBL_UNHOMED _UxGT("Home XYZ prima") #define MSG_UBL_TOOLS _UxGT("Strumenti UBL") #define MSG_UBL_LEVEL_BED _UxGT("Unified Bed Leveling") +#define MSG_IDEX_MENU _UxGT("Modo IDEX") +#define MSG_IDEX_MODE_AUTOPARK _UxGT("Auto-Park") +#define MSG_IDEX_MODE_DUPLICATE _UxGT("Duplicazione") +#define MSG_IDEX_MODE_FULL_CTRL _UxGT("Pieno controllo") #define MSG_UBL_MANUAL_MESH _UxGT("Mesh Manuale") -#define MSG_UBL_BC_INSERT _UxGT("Metti spessore & misura") +#define MSG_UBL_BC_INSERT _UxGT("Metti spes. e misura") #define MSG_UBL_BC_INSERT2 _UxGT("Misura") -#define MSG_UBL_BC_REMOVE _UxGT("Rimuovi e misura piatto") -#define MSG_UBL_MOVING_TO_NEXT _UxGT("Spostamento sucessivo") +#define MSG_UBL_BC_REMOVE _UxGT("Rimuovi e mis.piatto") +#define MSG_UBL_MOVING_TO_NEXT _UxGT("Spostamento succes.") #define MSG_UBL_ACTIVATE_MESH _UxGT("Attiva UBL") #define MSG_UBL_DEACTIVATE_MESH _UxGT("Disattiva UBL") #define MSG_UBL_SET_BED_TEMP _UxGT("Temp Piatto") @@ -98,18 +103,18 @@ #define MSG_UBL_MESH_EDIT _UxGT("Modifica Mesh") #define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Modif Custom Mesh") #define MSG_UBL_FINE_TUNE_MESH _UxGT("Ritocca Mesh") -#define MSG_UBL_DONE_EDITING_MESH _UxGT("Done Editing Mesh") -#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Crea Custom Mesh") +#define MSG_UBL_DONE_EDITING_MESH _UxGT("Modif.Mesh fatta") +#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Crea Mesh Custom") #define MSG_UBL_BUILD_MESH_MENU _UxGT("Crea Mesh") -#define MSG_UBL_BUILD_PLA_MESH _UxGT("Crea PLA Mesh") -#define MSG_UBL_BUILD_ABS_MESH _UxGT("Crea ABS Mesh") -#define MSG_UBL_BUILD_COLD_MESH _UxGT("Crea Cold Mesh") -#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Aggiusta Altezza Mesh") +#define MSG_UBL_BUILD_PLA_MESH _UxGT("Crea Mesh PLA") +#define MSG_UBL_BUILD_ABS_MESH _UxGT("Crea Mesh ABS") +#define MSG_UBL_BUILD_COLD_MESH _UxGT("Crea Mesh a freddo") +#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Aggiusta Alt. Mesh") #define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Altezza") #define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Valida Mesh") -#define MSG_UBL_VALIDATE_PLA_MESH _UxGT("Valida PLA Mesh") -#define MSG_UBL_VALIDATE_ABS_MESH _UxGT("Valida ABS Mesh") -#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Valida Custom Mesh") +#define MSG_UBL_VALIDATE_PLA_MESH _UxGT("Valida Mesh PLA") +#define MSG_UBL_VALIDATE_ABS_MESH _UxGT("Valida Mesh ABS") +#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Valida Mesh Custom") #define MSG_UBL_CONTINUE_MESH _UxGT("Continua Mesh") #define MSG_UBL_MESH_LEVELING _UxGT("Livell. Mesh") #define MSG_UBL_3POINT_MESH_LEVELING _UxGT("Livell. 3 Punti") @@ -128,7 +133,7 @@ #define MSG_UBL_SMART_FILLIN _UxGT("Riempimento Smart") #define MSG_UBL_FILLIN_MESH _UxGT("Riempimento Mesh") #define MSG_UBL_INVALIDATE_ALL _UxGT("Invalida Tutto") -#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Invalida Punto Vicino") +#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Invalid.Punto Vicino") #define MSG_UBL_FINE_TUNE_ALL _UxGT("Ritocca All") #define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Ritocca Punto Vicino") #define MSG_UBL_STORAGE_MESH_MENU _UxGT("Mesh Salvate") @@ -145,7 +150,7 @@ #define MSG_LED_CONTROL _UxGT("Controllo LED") #define MSG_LEDS _UxGT("Luci") -#define MSG_LED_PRESETS _UxGT("Preset luci") +#define MSG_LED_PRESETS _UxGT("Preset luce") #define MSG_SET_LEDS_RED _UxGT("Rosso") #define MSG_SET_LEDS_ORANGE _UxGT("Arancione") #define MSG_SET_LEDS_YELLOW _UxGT("Giallo") @@ -156,11 +161,11 @@ #define MSG_SET_LEDS_WHITE _UxGT("Bianco") #define MSG_SET_LEDS_DEFAULT _UxGT("Predefinito") #define MSG_CUSTOM_LEDS _UxGT("Luci personalizzate") -#define MSG_INTENSITY_R _UxGT("Intensita rosso") -#define MSG_INTENSITY_G _UxGT("Intensita verde") -#define MSG_INTENSITY_B _UxGT("Intensita blu") -#define MSG_INTENSITY_W _UxGT("Intensita bianco") -#define MSG_LED_BRIGHTNESS _UxGT("Luminosita") +#define MSG_INTENSITY_R _UxGT("Intensità rosso") +#define MSG_INTENSITY_G _UxGT("Intensità verde") +#define MSG_INTENSITY_B _UxGT("Intensità blu") +#define MSG_INTENSITY_W _UxGT("Intensità bianco") +#define MSG_LED_BRIGHTNESS _UxGT("Luminosità") #define MSG_MOVING _UxGT("In movimento...") #define MSG_FREE_XY _UxGT("XY liberi") @@ -169,14 +174,14 @@ #define MSG_MOVE_Z _UxGT("Muovi Z") #define MSG_MOVE_E _UxGT("Estrusore") #define MSG_MOVE_01MM _UxGT("Muovi di 0.1mm") -#define MSG_MOVE_1MM _UxGT("Muovi di 1mm") -#define MSG_MOVE_10MM _UxGT("Muovi di 10mm") +#define MSG_MOVE_1MM _UxGT("Muovi di 1mm") +#define MSG_MOVE_10MM _UxGT("Muovi di 10mm") #define MSG_SPEED _UxGT("Velocità") -#define MSG_BED_Z _UxGT("piatto Z") +#define MSG_BED_Z _UxGT("Piatto Z") #define MSG_NOZZLE _UxGT("Ugello") #define MSG_BED _UxGT("Piatto") -#define MSG_FAN_SPEED _UxGT("Velocita ventola") -#define MSG_EXTRA_FAN_SPEED _UxGT("Magg vel ventola") +#define MSG_FAN_SPEED _UxGT("Velocità ventola") +#define MSG_EXTRA_FAN_SPEED _UxGT("Extra vel. ventola") #define MSG_FLOW _UxGT("Flusso") #define MSG_CONTROL _UxGT("Controllo") #define MSG_MIN LCD_STR_THERMOMETER _UxGT(" Min") @@ -202,6 +207,7 @@ #define MSG_VC_JERK _UxGT("Vz-jerk") #endif #define MSG_VE_JERK _UxGT("Ve-jerk") +#define MSG_JUNCTION_DEVIATION _UxGT("Deviaz. giunzioni") #define MSG_VELOCITY _UxGT("Velocità") #define MSG_VMAX _UxGT("Vmax ") #define MSG_VMIN _UxGT("Vmin") @@ -226,6 +232,7 @@ #define MSG_E3STEPS _UxGT("E3passi/mm") #define MSG_E4STEPS _UxGT("E4passi/mm") #define MSG_E5STEPS _UxGT("E5passi/mm") +#define MSG_E6STEPS _UxGT("E6passi/mm") #define MSG_TEMPERATURE _UxGT("Temperatura") #define MSG_MOTION _UxGT("Movimento") #define MSG_FILAMENT _UxGT("Filamento") @@ -240,17 +247,19 @@ #define MSG_RESTORE_FAILSAFE _UxGT("Ripristina imp.") #define MSG_INIT_EEPROM _UxGT("Inizializza EEPROM") #define MSG_REFRESH _UxGT("Aggiorna") -#define MSG_WATCH _UxGT("Guarda") +#define MSG_WATCH _UxGT("Schermata info") #define MSG_PREPARE _UxGT("Prepara") #define MSG_TUNE _UxGT("Regola") #define MSG_PAUSE_PRINT _UxGT("Pausa") #define MSG_RESUME_PRINT _UxGT("Riprendi stampa") #define MSG_STOP_PRINT _UxGT("Arresta stampa") +#define MSG_POWER_LOSS_RECOVERY _UxGT("Ripresa da PowerLoss") #define MSG_CARD_MENU _UxGT("Stampa da SD") #define MSG_NO_CARD _UxGT("SD non presente") #define MSG_DWELL _UxGT("Sospensione...") #define MSG_USERWAIT _UxGT("Premi tasto..") #define MSG_PRINT_PAUSED _UxGT("Stampa sospesa") +#define MSG_PRINTING _UxGT("Stampa...") #define MSG_PRINT_ABORTED _UxGT("Stampa annullata") #define MSG_NO_MOVE _UxGT("Nessun Movimento") #define MSG_KILLED _UxGT("UCCISO. ") @@ -261,7 +270,7 @@ #define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Salta mm") #define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") #define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Scamb. UnRet mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") #define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V") #define MSG_AUTORETRACT _UxGT("AutoRitrai") #define MSG_FILAMENTCHANGE _UxGT("Cambia filamento") @@ -270,7 +279,7 @@ #define MSG_FILAMENTUNLOAD_ALL _UxGT("Rimuovi tutto") #define MSG_INIT_SDCARD _UxGT("Iniz. SD-Card") #define MSG_CNG_SDCARD _UxGT("Cambia SD-Card") -#define MSG_ZPROBE_OUT _UxGT("Z probe out. bed") +#define MSG_ZPROBE_OUT _UxGT("Z probe fuori piatto") #define MSG_SKEW_FACTOR _UxGT("Fattore distorsione") #define MSG_BLTOUCH _UxGT("BLTouch") #define MSG_BLTOUCH_SELFTEST _UxGT("Autotest BLTouch") @@ -286,12 +295,13 @@ #define MSG_ENDSTOP_ABORT _UxGT("Finecorsa abort") #define MSG_HEATING_FAILED_LCD _UxGT("Riscald. Fallito") #define MSG_HEATING_FAILED_LCD_BED _UxGT("Risc. piatto fallito") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Err: TEMP RIDONDANTI") +#define MSG_ERR_REDUNDANT_TEMP _UxGT("Err: TEMP RIDONDANTE") #define MSG_THERMAL_RUNAWAY _UxGT("TEMP FUORI CONTROLLO") +#define MSG_THERMAL_RUNAWAY_BED _UxGT("TEMP PIAT.FUORI CTRL") #define MSG_ERR_MAXTEMP _UxGT("Err: TEMP MASSIMA") #define MSG_ERR_MINTEMP _UxGT("Err: TEMP MINIMA") -#define MSG_ERR_MAXTEMP_BED _UxGT("Err: TEMP MASSIMA PIATTO") -#define MSG_ERR_MINTEMP_BED _UxGT("Err: TEMP MINIMA PIATTO") +#define MSG_ERR_MAXTEMP_BED _UxGT("Err: TEMP MAX PIATTO") +#define MSG_ERR_MINTEMP_BED _UxGT("Err: TEMP MIN PIATTO") #define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST #define MSG_HALTED _UxGT("STAMPANTE FERMATA") #define MSG_PLEASE_RESET _UxGT("Riavviare prego") @@ -300,17 +310,17 @@ #define MSG_SHORT_MINUTE _UxGT("m") // One character only #define MSG_HEATING _UxGT("Riscaldamento...") #define MSG_COOLING _UxGT("Raffreddamento..") -#define MSG_COOLING_COMPLETE _UxGT("Raff.completato.") #define MSG_BED_HEATING _UxGT("Risc. piatto...") #define MSG_BED_COOLING _UxGT("Raffr. piatto...") #define MSG_DELTA_CALIBRATE _UxGT("Calibraz. Delta") #define MSG_DELTA_CALIBRATE_X _UxGT("Calibra X") #define MSG_DELTA_CALIBRATE_Y _UxGT("Calibra Y") #define MSG_DELTA_CALIBRATE_Z _UxGT("Calibra Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibra Center") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibra centro") #define MSG_DELTA_SETTINGS _UxGT("Impostaz. Delta") #define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto calibrazione") #define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Imp. altezza Delta") +#define MSG_DELTA_Z_OFFSET_CALIBRATE _UxGT("Probe Z-offset") #define MSG_DELTA_DIAG_ROD _UxGT("Barra Diagonale") #define MSG_DELTA_HEIGHT _UxGT("Altezza") #define MSG_DELTA_RADIUS _UxGT("Raggio") @@ -318,8 +328,8 @@ #define MSG_INFO_PRINTER_MENU _UxGT("Info. stampante") #define MSG_3POINT_LEVELING _UxGT("Livel. a 3 punti") #define MSG_LINEAR_LEVELING _UxGT("Livel. Lineare") -#define MSG_BILINEAR_LEVELING _UxGT("Livel. Biliniare") -#define MSG_UBL_LEVELING _UxGT("Livel. UBL") +#define MSG_BILINEAR_LEVELING _UxGT("Livel. Bilineare") +#define MSG_UBL_LEVELING _UxGT("Livel.piatto unific.") #define MSG_MESH_LEVELING _UxGT("Livel. Mesh") #define MSG_INFO_STATS_MENU _UxGT("Statistiche") #define MSG_INFO_BOARD_MENU _UxGT("Info. scheda") @@ -329,7 +339,6 @@ #define MSG_INFO_PROTOCOL _UxGT("Protocollo") #define MSG_CASE_LIGHT _UxGT("Luci Case") #define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Luminosità Luci") - #if LCD_WIDTH >= 20 #define MSG_INFO_PRINT_COUNT _UxGT("Contat. stampa") #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completati") @@ -346,15 +355,13 @@ #define MSG_INFO_MIN_TEMP _UxGT("Temp min") #define MSG_INFO_MAX_TEMP _UxGT("Temp max") #define MSG_INFO_PSU _UxGT("Alimentatore") - #define MSG_DRIVE_STRENGTH _UxGT("Potenza Drive") #define MSG_DAC_PERCENT _UxGT("Driver %") #define MSG_DAC_EEPROM_WRITE _UxGT("Scrivi DAC EEPROM") - #define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("STAMPA IN PAUSA") #define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("CARICA FILAMENTO") #define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("RIMUOVI FILAMENTO") -#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("OPZIONI:") +#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("OPZIONI RIPRESA:") #define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Libera di piu") #define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Riprendi stampa") #define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Ugello: ") @@ -374,7 +381,7 @@ #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("filamento e") #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("premi per cont") #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Premi per") - #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("riscald ugello.") + #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("riscald. ugello") #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Riscald. ugello") #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Attendere...") #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Attendere") diff --git a/Marlin/src/lcd/language/language_nl.h b/Marlin/src/lcd/language/language_nl.h index 128bceaf41a2..44ac63e3abfc 100644 --- a/Marlin/src/lcd/language/language_nl.h +++ b/Marlin/src/lcd/language/language_nl.h @@ -136,6 +136,7 @@ #define MSG_E3STEPS _UxGT("E3steps/mm") #define MSG_E4STEPS _UxGT("E4steps/mm") #define MSG_E5STEPS _UxGT("E5steps/mm") +#define MSG_E6STEPS _UxGT("E6steps/mm") #define MSG_TEMPERATURE _UxGT("Temperatuur") #define MSG_MOTION _UxGT("Beweging") #define MSG_FILAMENT _UxGT("Filament") diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index 6ac55ff47e7b..07fbc1195416 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -129,6 +129,7 @@ #define MSG_E3STEPS _UxGT("krokiE3/mm") #define MSG_E4STEPS _UxGT("krokiE4/mm") #define MSG_E5STEPS _UxGT("krokiE5/mm") +#define MSG_E6STEPS _UxGT("krokiE6/mm") #define MSG_TEMPERATURE _UxGT("Temperatura") #define MSG_MOTION _UxGT("Ruch") #define MSG_FILAMENT _UxGT("Filament") diff --git a/Marlin/src/lcd/language/language_pt-br.h b/Marlin/src/lcd/language/language_pt-br.h index 0d7ffe84c4a6..0763127345fa 100644 --- a/Marlin/src/lcd/language/language_pt-br.h +++ b/Marlin/src/lcd/language/language_pt-br.h @@ -237,6 +237,7 @@ #define MSG_E3STEPS _UxGT("E3/mm") #define MSG_E4STEPS _UxGT("E4/mm") #define MSG_E5STEPS _UxGT("E5/mm") +#define MSG_E6STEPS _UxGT("E6/mm") #define MSG_TEMPERATURE _UxGT("Temperatura") #define MSG_MOTION _UxGT("Movimento") #define MSG_FILAMENT _UxGT("Filamento") diff --git a/Marlin/src/lcd/language/language_pt.h b/Marlin/src/lcd/language/language_pt.h index a3e1256f6aec..67500a087f93 100644 --- a/Marlin/src/lcd/language/language_pt.h +++ b/Marlin/src/lcd/language/language_pt.h @@ -126,6 +126,7 @@ #define MSG_E3STEPS _UxGT("E3 passo/mm") #define MSG_E4STEPS _UxGT("E4 passo/mm") #define MSG_E5STEPS _UxGT("E5 passo/mm") +#define MSG_E6STEPS _UxGT("E6 passo/mm") #define MSG_TEMPERATURE _UxGT("Temperatura") #define MSG_MOTION _UxGT("Movimento") #define MSG_FILAMENT _UxGT("Filamento") diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index 1f419607bdc8..e0135a884bdd 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -227,6 +227,7 @@ #define MSG_E3STEPS _UxGT("E3шаг/мм") #define MSG_E4STEPS _UxGT("E4шаг/мм") #define MSG_E5STEPS _UxGT("E5шаг/мм") +#define MSG_E6STEPS _UxGT("E6шаг/мм") #define MSG_TEMPERATURE _UxGT("Температура") #define MSG_MOTION _UxGT("Движение") #define MSG_FILAMENT _UxGT("Филамент") diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 80ff3324627b..5e18b09d1e37 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -61,11 +61,11 @@ #define MSG_AUTO_HOME_Y _UxGT("Domov os Y") #define MSG_AUTO_HOME_Z _UxGT("Domov os Z") #define MSG_TMC_Z_CALIBRATION _UxGT("Kalibrovať Z") -#define MSG_LEVEL_BED_HOMING _UxGT("Meranie podložky") +#define MSG_LEVEL_BED_HOMING _UxGT("Parkovanie XYZ") #define MSG_LEVEL_BED_WAITING _UxGT("Kliknutím spusťte") #define MSG_LEVEL_BED_NEXT_POINT _UxGT("Ďalší bod") #define MSG_LEVEL_BED_DONE _UxGT("Meranie hotové!") -#define MSG_Z_FADE_HEIGHT _UxGT("Výška merania") +#define MSG_Z_FADE_HEIGHT _UxGT("Výška rovnania") #define MSG_SET_HOME_OFFSETS _UxGT("Nastaviť offsety") #define MSG_HOME_OFFSETS_APPLIED _UxGT("Offsety nastavené") #define MSG_SET_ORIGIN _UxGT("Nastaviť začiatok") @@ -74,13 +74,14 @@ #define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" všetko") #define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" hotend") #define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" podlož") -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" nast") +#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" nast.") #define MSG_PREHEAT_2 _UxGT("Zahriať ABS") #define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") #define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" všetko") #define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" hotend") #define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" podlož") -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" nast") +#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" nast.") +#define MSG_PREHEAT_CUSTOM _UxGT("Vlastné zahriatie") #define MSG_COOLDOWN _UxGT("Schladiť") #define MSG_SWITCH_PS_ON _UxGT("Zapnúť napájanie") #define MSG_SWITCH_PS_OFF _UxGT("Vypnúť napájanie") @@ -93,10 +94,15 @@ #define MSG_NEXT_CORNER _UxGT("Ďalší roh") #define MSG_EDITING_STOPPED _UxGT("Koniec úprav siete") +#define MSG_USER_MENU _UxGT("Vlastné príkazy") #define MSG_UBL_DOING_G29 _UxGT("Vykonávam G29") #define MSG_UBL_UNHOMED _UxGT("Prejdite domov") -#define MSG_UBL_TOOLS _UxGT("UBL nástroje") -#define MSG_UBL_LEVEL_BED _UxGT("Unified Bed Leveling") +#define MSG_UBL_TOOLS _UxGT("Nástroje UBL") +#define MSG_UBL_LEVEL_BED _UxGT("UBL rovnanie") +#define MSG_IDEX_MENU _UxGT("IDEX mód") +#define MSG_IDEX_MODE_AUTOPARK _UxGT("Auto-parkovanie") +#define MSG_IDEX_MODE_DUPLICATE _UxGT("Duplikácia") +#define MSG_IDEX_MODE_FULL_CTRL _UxGT("Plná kontrola") #define MSG_UBL_MANUAL_MESH _UxGT("Manuálna sieť bodov") #define MSG_UBL_BC_INSERT _UxGT("Položte a zmerajte") #define MSG_UBL_BC_INSERT2 _UxGT("Zmerajte") @@ -134,12 +140,12 @@ #define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Exportovať do PC") #define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Exportovať do CSV") #define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Záloha do PC") -#define MSG_UBL_INFO_UBL _UxGT("Info o UBL do PC") +#define MSG_UBL_INFO_UBL _UxGT("Info. o UBL do PC") #define MSG_UBL_EDIT_MESH_MENU _UxGT("Upraviť sieť bodov") #define MSG_UBL_FILLIN_AMOUNT _UxGT("Hustota mriežky") -#define MSG_UBL_MANUAL_FILLIN _UxGT("Ručná hustota") -#define MSG_UBL_SMART_FILLIN _UxGT("Chytrá hustota") -#define MSG_UBL_FILLIN_MESH _UxGT("Zaplniť mriežku") +#define MSG_UBL_MANUAL_FILLIN _UxGT("Ručné vyplnenie") +#define MSG_UBL_SMART_FILLIN _UxGT("Chytré vyplnenie") +#define MSG_UBL_FILLIN_MESH _UxGT("Vyplniť mriežku") #define MSG_UBL_INVALIDATE_ALL _UxGT("Zrušiť všetko") #define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Zrušiť najbližší") #define MSG_UBL_FINE_TUNE_ALL _UxGT("Upraviť všetky") @@ -175,7 +181,6 @@ #define MSG_INTENSITY_W _UxGT("Inten. bielej") #define MSG_LED_BRIGHTNESS _UxGT("Jas") -#define MSG_USER_MENU _UxGT("Vlastné príkazy") #define MSG_MOVING _UxGT("Posúvam...") #define MSG_FREE_XY _UxGT("Uvolniť XY") #define MSG_MOVE_X _UxGT("Posunúť X") @@ -241,6 +246,7 @@ #define MSG_E3STEPS _UxGT("E3krokov/mm") #define MSG_E4STEPS _UxGT("E4krokov/mm") #define MSG_E5STEPS _UxGT("E5krokov/mm") +#define MSG_E6STEPS _UxGT("E6krokov/mm") #define MSG_TEMPERATURE _UxGT("Teplota") #define MSG_MOTION _UxGT("Pohyb") #define MSG_FILAMENT _UxGT("Filament") @@ -338,7 +344,7 @@ #define MSG_3POINT_LEVELING _UxGT("3-bodové rovnanie") #define MSG_LINEAR_LEVELING _UxGT("Lineárne rovnanie") #define MSG_BILINEAR_LEVELING _UxGT("Bilineárne rovnanie") -#define MSG_UBL_LEVELING _UxGT("Unified Bed Leveling") +#define MSG_UBL_LEVELING _UxGT("UBL rovnanie") #define MSG_MESH_LEVELING _UxGT("Mriežkové rovnanie") #define MSG_INFO_STATS_MENU _UxGT("Štatistika") #define MSG_INFO_BOARD_MENU _UxGT("Info. o doske") @@ -409,6 +415,7 @@ #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Čakajte prosím...") #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Vysúvanie...") #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Vložte a kliknite") + #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Kliknite pre ohrev") #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Ohrev...") #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Zavádzanie...") #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Vytlačovanie...") diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index 7b15a57000de..6134b868ac46 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -135,7 +135,8 @@ #define MSG_E2STEPS _UxGT("E2steps/mm") // E2steps/mm #define MSG_E3STEPS _UxGT("E3steps/mm") // E3steps/mm #define MSG_E4STEPS _UxGT("E4steps/mm") // E4steps/mm -#define MSG_E5STEPS _UxGT("E5steps/mm") // E4steps/mm +#define MSG_E5STEPS _UxGT("E5steps/mm") // E5steps/mm +#define MSG_E6STEPS _UxGT("E6steps/mm") // E6steps/mm #define MSG_TEMPERATURE _UxGT("Sıcaklık") // Sıcaklık #define MSG_MOTION _UxGT("Hareket") // Hareket #define MSG_FILAMENT _UxGT("Filaman") // Filaman diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 384a90c669e1..6236320589a1 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -129,6 +129,7 @@ #define MSG_E3STEPS _UxGT("E3кроків/мм") #define MSG_E4STEPS _UxGT("E4кроків/мм") #define MSG_E5STEPS _UxGT("E5кроків/мм") +#define MSG_E6STEPS _UxGT("E6кроків/мм") #define MSG_TEMPERATURE _UxGT("Температура") #define MSG_MOTION _UxGT("Рух") #define MSG_FILAMENT _UxGT("Волокно") diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index 6cf63f6e1d90..3ddd48be6e80 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -226,6 +226,7 @@ #define MSG_E3STEPS _UxGT("挤出机3步数/mm") //"E3steps/mm" #define MSG_E4STEPS _UxGT("挤出机4步数/mm") //"E4steps/mm" #define MSG_E5STEPS _UxGT("挤出机5步数/mm") //"E5steps/mm" +#define MSG_E6STEPS _UxGT("挤出机6步数/mm") //"E6steps/mm" #define MSG_TEMPERATURE _UxGT("温度") //"Temperature" #define MSG_MOTION _UxGT("运动") //"Motion" #define MSG_FILAMENT _UxGT("丝料测容") //"Filament" lcd_control_volumetric_menu @@ -327,17 +328,17 @@ #define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("灯亮度") // "Light BRIGHTNESS" #if LCD_WIDTH > 19 -#define MSG_INFO_PRINT_COUNT _UxGT("打印计数") //"Print Count" -#define MSG_INFO_COMPLETED_PRINTS _UxGT("完成了") //"Completed" -#define MSG_INFO_PRINT_TIME _UxGT("总打印时间") //"Total print time" -#define MSG_INFO_PRINT_LONGEST _UxGT("最长工作时间") //"Longest job time" -#define MSG_INFO_PRINT_FILAMENT _UxGT("总计挤出") //"Extruded total" + #define MSG_INFO_PRINT_COUNT _UxGT("打印计数") //"Print Count" + #define MSG_INFO_COMPLETED_PRINTS _UxGT("完成了") //"Completed" + #define MSG_INFO_PRINT_TIME _UxGT("总打印时间") //"Total print time" + #define MSG_INFO_PRINT_LONGEST _UxGT("最长工作时间") //"Longest job time" + #define MSG_INFO_PRINT_FILAMENT _UxGT("总计挤出") //"Extruded total" #else -#define MSG_INFO_PRINT_COUNT _UxGT("打印数") //"Prints" -#define MSG_INFO_COMPLETED_PRINTS _UxGT("完成") //"Completed" -#define MSG_INFO_PRINT_TIME _UxGT("总共") //"Total" -#define MSG_INFO_PRINT_LONGEST _UxGT("最长") //"Longest" -#define MSG_INFO_PRINT_FILAMENT _UxGT("已挤出") //"Extruded" + #define MSG_INFO_PRINT_COUNT _UxGT("打印数") //"Prints" + #define MSG_INFO_COMPLETED_PRINTS _UxGT("完成") //"Completed" + #define MSG_INFO_PRINT_TIME _UxGT("总共") //"Total" + #define MSG_INFO_PRINT_LONGEST _UxGT("最长") //"Longest" + #define MSG_INFO_PRINT_FILAMENT _UxGT("已挤出") //"Extruded" #endif #define MSG_INFO_MIN_TEMP _UxGT("最低温度") //"Min Temp" @@ -358,33 +359,32 @@ #define MSG_M600_TOO_COLD _UxGT("M600: 太凉") // "M600: Too cold" #if LCD_HEIGHT >= 4 -#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("等待开始") //"Wait for start" -#define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("丝料") //"of the filament" -#define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("变更") //"change" -#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("等待") //"Wait for" -#define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("卸下丝料") //"filament unload" -#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("插入丝料") //"Insert filament" -#define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("并按键") //"and press button" -#define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("来继续 ...") //"to continue..." -#define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("按下按钮来") // "Press button to" -#define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("加热喷嘴.") // "heat nozzle." -#define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("加热喷嘴") // "Heating nozzle" -#define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("请等待 ...") // "Please wait..." -#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("等待") //"Wait for" -#define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("进料") //"filament load" -#define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("等待") // "Wait for" -#define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("丝料清除") // "filament purge" -#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("等待打印") //"Wait for print" -#define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("恢复") //"to resume" - + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("等待开始") //"Wait for start" + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("丝料") //"of the filament" + #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("变更") //"change" + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("等待") //"Wait for" + #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("卸下丝料") //"filament unload" + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("插入丝料") //"Insert filament" + #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("并按键") //"and press button" + #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("来继续 ...") //"to continue..." + #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("按下按钮来") // "Press button to" + #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("加热喷嘴.") // "heat nozzle." + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("加热喷嘴") // "Heating nozzle" + #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("请等待 ...") // "Please wait..." + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("等待") //"Wait for" + #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("进料") //"filament load" + #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("等待") // "Wait for" + #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("丝料清除") // "filament purge" + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("等待打印") //"Wait for print" + #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("恢复") //"to resume" #else // LCD_HEIGHT < 4 -#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("请等待 ...") //"Please wait..." -#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("退出中 ...") //"Ejecting..." -#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("插入并单击") //"Insert and Click" -#define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("加热中 ...") // "Heating..." -#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("装载中 ...") //"Loading..." -#define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("清除中 ...") // "Purging..." -#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("恢复中 ...") //"Resuming..." + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("请等待 ...") //"Please wait..." + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("退出中 ...") //"Ejecting..." + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("插入并单击") //"Insert and Click" + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("加热中 ...") // "Heating..." + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("装载中 ...") //"Loading..." + #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("清除中 ...") // "Purging..." + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("恢复中 ...") //"Resuming..." #endif // LCD_HEIGHT < 4 #endif // LANGUAGE_ZH_CN_H diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h index 8455843773e2..60e1661cf020 100644 --- a/Marlin/src/lcd/language/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -226,6 +226,7 @@ #define MSG_E3STEPS _UxGT("擠出機3步數/mm") //"E3steps/mm" #define MSG_E4STEPS _UxGT("擠出機4步數/mm") //"E4steps/mm" #define MSG_E5STEPS _UxGT("擠出機5步數/mm") //"E5steps/mm" +#define MSG_E6STEPS _UxGT("擠出機6步數/mm") //"E6steps/mm" #define MSG_TEMPERATURE _UxGT("溫度") //"Temperature" #define MSG_MOTION _UxGT("運作") //"Motion" #define MSG_FILAMENT _UxGT("絲料測容") //"Filament" lcd_control_volumetric_menu @@ -327,17 +328,17 @@ #define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("燈亮度") // "Light BRIGHTNESS" #if LCD_WIDTH > 19 -#define MSG_INFO_PRINT_COUNT _UxGT("列印計數") //"Print Count" -#define MSG_INFO_COMPLETED_PRINTS _UxGT("已完成") //"Completed" -#define MSG_INFO_PRINT_TIME _UxGT("總列印時間") //"Total print time" -#define MSG_INFO_PRINT_LONGEST _UxGT("最長工作時間") //"Longest job time" -#define MSG_INFO_PRINT_FILAMENT _UxGT("總計擠出") //"Extruded total" + #define MSG_INFO_PRINT_COUNT _UxGT("列印計數") //"Print Count" + #define MSG_INFO_COMPLETED_PRINTS _UxGT("已完成") //"Completed" + #define MSG_INFO_PRINT_TIME _UxGT("總列印時間") //"Total print time" + #define MSG_INFO_PRINT_LONGEST _UxGT("最長工作時間") //"Longest job time" + #define MSG_INFO_PRINT_FILAMENT _UxGT("總計擠出") //"Extruded total" #else -#define MSG_INFO_PRINT_COUNT _UxGT("列印數") //"Prints" -#define MSG_INFO_COMPLETED_PRINTS _UxGT("完成") //"Completed" -#define MSG_INFO_PRINT_TIME _UxGT("總共") //"Total" -#define MSG_INFO_PRINT_LONGEST _UxGT("最長") //"Longest" -#define MSG_INFO_PRINT_FILAMENT _UxGT("已擠出") //"Extruded" + #define MSG_INFO_PRINT_COUNT _UxGT("列印數") //"Prints" + #define MSG_INFO_COMPLETED_PRINTS _UxGT("完成") //"Completed" + #define MSG_INFO_PRINT_TIME _UxGT("總共") //"Total" + #define MSG_INFO_PRINT_LONGEST _UxGT("最長") //"Longest" + #define MSG_INFO_PRINT_FILAMENT _UxGT("已擠出") //"Extruded" #endif #define MSG_INFO_MIN_TEMP _UxGT("最低溫度") //"Min Temp" @@ -358,33 +359,32 @@ #define MSG_M600_TOO_COLD _UxGT("M600: 太涼") // "M600: Too cold" #if LCD_HEIGHT >= 4 -#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("等待開始") //"Wait for start" -#define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("絲料") //"of the filament" -#define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("變更") //"change" -#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("等待") //"Wait for" -#define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("卸下絲料") //"filament unload" -#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("插入絲料") //"Insert filament" -#define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("並按鍵") //"and press button" -#define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("繼續 ...") //"to continue..." -#define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("按下按鈕來") // "Press button to" -#define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("加熱噴嘴.") // "heat nozzle." -#define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("加熱噴嘴") // "Heating nozzle" -#define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("請等待 ...") // "Please wait..." -#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("等待") //"Wait for" -#define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("進料") //"filament load" -#define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("等待") // "Wait for" -#define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("絲料清除") // "filament purge" -#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("等待列印") //"Wait for print" -#define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("恢復") //"to resume" - + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("等待開始") //"Wait for start" + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("絲料") //"of the filament" + #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("變更") //"change" + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("等待") //"Wait for" + #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("卸下絲料") //"filament unload" + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("插入絲料") //"Insert filament" + #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("並按鍵") //"and press button" + #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("繼續 ...") //"to continue..." + #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("按下按鈕來") // "Press button to" + #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("加熱噴嘴.") // "heat nozzle." + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("加熱噴嘴") // "Heating nozzle" + #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("請等待 ...") // "Please wait..." + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("等待") //"Wait for" + #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("進料") //"filament load" + #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("等待") // "Wait for" + #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("絲料清除") // "filament purge" + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("等待列印") //"Wait for print" + #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("恢復") //"to resume" #else // LCD_HEIGHT < 4 -#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("請等待 ...") //"Please wait..." -#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("退出中 ...") //"Ejecting..." -#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("插入並點擊") //"Insert and Click" -#define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("加熱中 ...") // "Heating..." -#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("載入中 ...") //"Loading..." -#define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("清除中 ...") // "Purging..." -#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("恢復中 ...") //"Resuming..." + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("請等待 ...") //"Please wait..." + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("退出中 ...") //"Ejecting..." + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("插入並點擊") //"Insert and Click" + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("加熱中 ...") // "Heating..." + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("載入中 ...") //"Loading..." + #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("清除中 ...") // "Purging..." + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("恢復中 ...") //"Resuming..." #endif // LCD_HEIGHT < 4 #endif // LANGUAGE_ZH_TW_H diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 66bfbd958a0d..c18ed1fb3b85 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -38,6 +38,8 @@ #include "../gcode/gcode.h" #include "../gcode/queue.h" #include "../module/configuration_store.h" +#include "../module/tool_change.h" + #include "../Marlin.h" @@ -521,7 +523,7 @@ uint16_t max_display_update_time = 0; if (currentScreen == lcd_status_screen) doubleclick_expire_ms = millis() + DOUBLECLICK_MAX_INTERVAL; } - else if (screen == lcd_status_screen && currentScreen == lcd_main_menu && PENDING(millis(), doubleclick_expire_ms) && (planner.movesplanned() || IS_SD_PRINTING)) + else if (screen == lcd_status_screen && currentScreen == lcd_main_menu && PENDING(millis(), doubleclick_expire_ms)/* && (planner.movesplanned() || IS_SD_PRINTING)*/) screen = #if ENABLED(BABYSTEP_ZPROBE_OFFSET) lcd_babystep_zoffset @@ -841,7 +843,7 @@ void lcd_quick_feedback(const bool clear_buttons) { } inline void line_to_current_z() { - planner.buffer_line_kinematic(current_position, MMM_TO_MMS(manual_feedrate_mm_m[Z_AXIS]), active_extruder); + planner.buffer_line(current_position, MMM_TO_MMS(manual_feedrate_mm_m[Z_AXIS]), active_extruder); } inline void line_to_z(const float &z) { @@ -1034,19 +1036,35 @@ void lcd_quick_feedback(const bool clear_buttons) { #endif // HAS_DEBUG_MENU - /** - * IDEX submenu - */ + /** + * IDEX submenu + */ #if ENABLED(DUAL_X_CARRIAGE) + static void _recalc_IDEX_settings() { + if (active_extruder) { // For the 2nd extruder re-home so the next tool-change gets the new offsets. + enqueue_and_echo_commands_P(PSTR("G28")); // In future, we can babystep the 2nd extruder (if active), making homing unnecessary. + active_extruder = 0; + } + } + static void IDEX_menu() { START_MENU(); MENU_BACK(MSG_MAIN); - MENU_ITEM(gcode, MSG_IDEX_MODE_AUTOPARK, PSTR("M605 S1\nG28 X\nG1 X100")); - if (!TEST(axis_known_position, Y_AXIS) || !TEST(axis_known_position, Z_AXIS)) - MENU_ITEM(gcode, MSG_IDEX_MODE_DUPLICATE, PSTR("T0\nG28\nM605 S2 X200\nG28 X\nG1 X100")); // If Y or Z is not homed, a full G28 is done first. - else - MENU_ITEM(gcode, MSG_IDEX_MODE_DUPLICATE, PSTR("T0\nM605 S2 X200\nG28 X\nG1 X100")); // If Y and Z is homed, a full G28 is not needed first. + MENU_ITEM(gcode, MSG_IDEX_MODE_AUTOPARK, PSTR("M605 S1\nG28 X\nG1 X100")); + const bool need_g28 = !(TEST(axis_known_position, Y_AXIS) && TEST(axis_known_position, Z_AXIS)); + MENU_ITEM(gcode, MSG_IDEX_MODE_DUPLICATE, need_g28 + ? PSTR("M605 S1\nT0\nG28\nM605 S2 X200\nG28 X\nG1 X100") // If Y or Z is not homed, do a full G28 first + : PSTR("M605 S1\nT0\nM605 S2 X200\nG28 X\nG1 X100") + ); + //MENU_ITEM(gcode, MSG_IDEX_MODE_SCALED_COPY, need_g28 + // ? PSTR("M605 S1\nT0\nG28\nM605 S2 X200\nG28 X\nG1 X100\nM605 S3 X200") // If Y or Z is not homed, do a full G28 first + // : PSTR("M605 S1\nT0\nM605 S2 X200\nG28 X\nG1 X100\nM605 S3 X200") + //); MENU_ITEM(gcode, MSG_IDEX_MODE_FULL_CTRL, PSTR("M605 S0\nG28 X")); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float52, MSG_IDEX_X_OFFSET , &hotend_offset[X_AXIS][1], MIN(X2_HOME_POS, X2_MAX_POS) - 25.0, MAX(X2_HOME_POS, X2_MAX_POS) + 25.0, _recalc_IDEX_settings); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float52, MSG_IDEX_Y_OFFSET , &hotend_offset[Y_AXIS][1], -10.0, 10.0, _recalc_IDEX_settings); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float52, MSG_IDEX_Z_OFFSET , &hotend_offset[Z_AXIS][1], -10.0, 10.0, _recalc_IDEX_settings); + MENU_ITEM(gcode, MSG_IDEX_SAVE_OFFSETS, PSTR("M500")); END_MENU(); } #endif // DUAL_X_CARRIAGE @@ -1402,6 +1420,9 @@ void lcd_quick_feedback(const bool clear_buttons) { void watch_temp_callback_E3() { _WATCH_FUNC(3); } #if HOTENDS > 4 void watch_temp_callback_E4() { _WATCH_FUNC(4); } + #if HOTENDS > 5 + void watch_temp_callback_E5() { _WATCH_FUNC(5); } + #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 @@ -1434,6 +1455,9 @@ void lcd_quick_feedback(const bool clear_buttons) { inline void _lcd_refresh_e_factor_3() { planner.refresh_e_factor(3); } #if EXTRUDERS > 4 inline void _lcd_refresh_e_factor_4() { planner.refresh_e_factor(4); } + #if EXTRUDERS > 5 + inline void _lcd_refresh_e_factor_5() { planner.refresh_e_factor(5); } + #endif // EXTRUDERS > 5 #endif // EXTRUDERS > 4 #endif // EXTRUDERS > 3 #endif // EXTRUDERS > 2 @@ -1486,6 +1510,9 @@ void lcd_quick_feedback(const bool clear_buttons) { MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N4, &thermalManager.target_temperature[3], 0, HEATER_3_MAXTEMP - 15, watch_temp_callback_E3); #if HOTENDS > 4 MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N5, &thermalManager.target_temperature[4], 0, HEATER_4_MAXTEMP - 15, watch_temp_callback_E4); + #if HOTENDS > 5 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N6, &thermalManager.target_temperature[5], 0, HEATER_5_MAXTEMP - 15, watch_temp_callback_E5); + #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 @@ -1538,6 +1565,9 @@ void lcd_quick_feedback(const bool clear_buttons) { MENU_ITEM_EDIT_CALLBACK(int3, MSG_FLOW MSG_N4, &planner.flow_percentage[3], 10, 999, _lcd_refresh_e_factor_3); #if EXTRUDERS > 4 MENU_ITEM_EDIT_CALLBACK(int3, MSG_FLOW MSG_N5, &planner.flow_percentage[4], 10, 999, _lcd_refresh_e_factor_4); + #if EXTRUDERS > 5 + MENU_ITEM_EDIT_CALLBACK(int3, MSG_FLOW MSG_N6, &planner.flow_percentage[5], 10, 999, _lcd_refresh_e_factor_5); + #endif // EXTRUDERS > 5 #endif // EXTRUDERS > 4 #endif // EXTRUDERS > 3 #endif // EXTRUDERS > 2 @@ -1672,6 +1702,14 @@ void lcd_quick_feedback(const bool clear_buttons) { void lcd_preheat_m1_e4() { _lcd_preheat(4, lcd_preheat_hotend_temp[0], lcd_preheat_bed_temp[0], lcd_preheat_fan_speed[0]); } void lcd_preheat_m2_e4() { _lcd_preheat(4, lcd_preheat_hotend_temp[1], lcd_preheat_bed_temp[1], lcd_preheat_fan_speed[1]); } #endif + #if HOTENDS > 5 + void lcd_preheat_m1_e5_only() { _lcd_preheat(5, lcd_preheat_hotend_temp[0], -1, lcd_preheat_fan_speed[0]); } + void lcd_preheat_m2_e5_only() { _lcd_preheat(5, lcd_preheat_hotend_temp[1], -1, lcd_preheat_fan_speed[1]); } + #if HAS_HEATED_BED + void lcd_preheat_m1_e5() { _lcd_preheat(5, lcd_preheat_hotend_temp[0], lcd_preheat_bed_temp[0], lcd_preheat_fan_speed[0]); } + void lcd_preheat_m2_e5() { _lcd_preheat(5, lcd_preheat_hotend_temp[1], lcd_preheat_bed_temp[1], lcd_preheat_fan_speed[1]); } + #endif + #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 @@ -1685,6 +1723,9 @@ void lcd_quick_feedback(const bool clear_buttons) { thermalManager.setTargetHotend(lcd_preheat_hotend_temp[0], 3); #if HOTENDS > 4 thermalManager.setTargetHotend(lcd_preheat_hotend_temp[0], 4); + #if HOTENDS > 5 + thermalManager.setTargetHotend(lcd_preheat_hotend_temp[0], 5); + #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 @@ -1704,6 +1745,9 @@ void lcd_quick_feedback(const bool clear_buttons) { thermalManager.setTargetHotend(lcd_preheat_hotend_temp[1], 3); #if HOTENDS > 4 thermalManager.setTargetHotend(lcd_preheat_hotend_temp[1], 4); + #if HOTENDS > 5 + thermalManager.setTargetHotend(lcd_preheat_hotend_temp[1], 5); + #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 @@ -1765,6 +1809,14 @@ void lcd_quick_feedback(const bool clear_buttons) { #else MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H5, lcd_preheat_m1_e4_only); #endif + #if HOTENDS > 5 + #if HAS_HEATED_BED + MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H6, lcd_preheat_m1_e5); + MENU_ITEM(function, MSG_PREHEAT_1_END " " MSG_E6, lcd_preheat_m1_e5_only); + #else + MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H6, lcd_preheat_m1_e5_only); + #endif + #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 @@ -1817,6 +1869,14 @@ void lcd_quick_feedback(const bool clear_buttons) { #else MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H5, lcd_preheat_m2_e4_only); #endif + #if HOTENDS > 5 + #if HAS_HEATED_BED + MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H6, lcd_preheat_m2_e5); + MENU_ITEM(function, MSG_PREHEAT_2_END " " MSG_E6, lcd_preheat_m2_e5_only); + #else + MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H6, lcd_preheat_m2_e5_only); + #endif + #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 @@ -1892,7 +1952,7 @@ void lcd_quick_feedback(const bool clear_buttons) { break; #endif } - planner.buffer_line_kinematic(current_position, MMM_TO_MMS(manual_feedrate_mm_m[X_AXIS]), active_extruder); + planner.buffer_line(current_position, MMM_TO_MMS(manual_feedrate_mm_m[X_AXIS]), active_extruder); line_to_z(0.0); if (++bed_corner > 3 #if ENABLED(LEVEL_CENTER_TOO) @@ -2432,7 +2492,7 @@ void lcd_quick_feedback(const bool clear_buttons) { void ubl_map_move_to_xy() { current_position[X_AXIS] = pgm_read_float(&ubl._mesh_index_to_xpos[x_plot]); current_position[Y_AXIS] = pgm_read_float(&ubl._mesh_index_to_ypos[y_plot]); - planner.buffer_line_kinematic(current_position, MMM_TO_MMS(XY_PROBE_SPEED), active_extruder); + planner.buffer_line(current_position, MMM_TO_MMS(XY_PROBE_SPEED), active_extruder); } /** @@ -2846,7 +2906,7 @@ void lcd_quick_feedback(const bool clear_buttons) { MENU_BACK(MSG_MAIN); #if ENABLED(DELTA_AUTO_CALIBRATION) MENU_ITEM(gcode, MSG_DELTA_AUTO_CALIBRATE, PSTR("G33")); - MENU_ITEM(gcode, MSG_DELTA_HEIGHT_CALIBRATE, PSTR("G33 P1")); + MENU_ITEM(gcode, MSG_DELTA_HEIGHT_CALIBRATE, PSTR("G33 S P1")); MENU_ITEM(gcode, MSG_DELTA_Z_OFFSET_CALIBRATE, PSTR("G33 P-1")); #if ENABLED(EEPROM_SETTINGS) MENU_ITEM(function, MSG_STORE_EEPROM, lcd_store_settings); @@ -2911,7 +2971,7 @@ void lcd_quick_feedback(const bool clear_buttons) { #else - planner.buffer_line_kinematic(current_position, MMM_TO_MMS(manual_feedrate_mm_m[manual_move_axis]), manual_move_axis == E_AXIS ? manual_move_e_index : active_extruder); + planner.buffer_line(current_position, MMM_TO_MMS(manual_feedrate_mm_m[manual_move_axis]), manual_move_axis == E_AXIS ? manual_move_e_index : active_extruder); manual_move_axis = (int8_t)NO_AXIS; #endif @@ -3061,6 +3121,9 @@ void lcd_quick_feedback(const bool clear_buttons) { case 3: pos_label = PSTR(MSG_MOVE_E MSG_MOVE_E4); break; #if E_MANUAL > 4 case 4: pos_label = PSTR(MSG_MOVE_E MSG_MOVE_E5); break; + #if E_MANUAL > 5 + case 5: pos_label = PSTR(MSG_MOVE_E MSG_MOVE_E6); break; + #endif // E_MANUAL > 5 #endif // E_MANUAL > 4 #endif // E_MANUAL > 3 #endif // E_MANUAL > 2 @@ -3087,6 +3150,9 @@ void lcd_quick_feedback(const bool clear_buttons) { void lcd_move_e3() { _lcd_move_e(3); } #if E_MANUAL > 4 void lcd_move_e4() { _lcd_move_e(4); } + #if E_MANUAL > 5 + void lcd_move_e5() { _lcd_move_e(5); } + #endif // E_MANUAL > 5 #endif // E_MANUAL > 4 #endif // E_MANUAL > 3 #endif // E_MANUAL > 2 @@ -3147,6 +3213,9 @@ void lcd_quick_feedback(const bool clear_buttons) { void lcd_move_get_e3_amount() { _lcd_move_distance_menu(E_AXIS, lcd_move_e3); } #if E_MANUAL > 4 void lcd_move_get_e4_amount() { _lcd_move_distance_menu(E_AXIS, lcd_move_e4); } + #if E_MANUAL > 5 + void lcd_move_get_e5_amount() { _lcd_move_distance_menu(E_AXIS, lcd_move_e5); } + #endif // E_MANUAL > 5 #endif // E_MANUAL > 4 #endif // E_MANUAL > 3 #endif // E_MANUAL > 2 @@ -3199,7 +3268,16 @@ void lcd_quick_feedback(const bool clear_buttons) { #if ENABLED(SWITCHING_EXTRUDER) || ENABLED(SWITCHING_NOZZLE) - #if EXTRUDERS == 4 + #if EXTRUDERS == 6 + switch (active_extruder) { + case 0: MENU_ITEM(gcode, MSG_SELECT " " MSG_E2, PSTR("T1")); break; + case 1: MENU_ITEM(gcode, MSG_SELECT " " MSG_E1, PSTR("T0")); break; + case 2: MENU_ITEM(gcode, MSG_SELECT " " MSG_E4, PSTR("T3")); break; + case 3: MENU_ITEM(gcode, MSG_SELECT " " MSG_E3, PSTR("T2")); break; + case 4: MENU_ITEM(gcode, MSG_SELECT " " MSG_E6, PSTR("T5")); break; + case 5: MENU_ITEM(gcode, MSG_SELECT " " MSG_E5, PSTR("T4")); break; + } + #elif EXTRUDERS == 5 || EXTRUDERS == 4 switch (active_extruder) { case 0: MENU_ITEM(gcode, MSG_SELECT " " MSG_E2, PSTR("T1")); break; case 1: MENU_ITEM(gcode, MSG_SELECT " " MSG_E1, PSTR("T0")); break; @@ -3253,6 +3331,9 @@ void lcd_quick_feedback(const bool clear_buttons) { MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E4, lcd_move_get_e3_amount); #if E_MANUAL > 4 MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E5, lcd_move_get_e4_amount); + #if E_MANUAL > 5 + MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E6, lcd_move_get_e5_amount); + #endif // E_MANUAL > 5 #endif // E_MANUAL > 4 #endif // E_MANUAL > 3 #endif // E_MANUAL > 2 @@ -3412,6 +3493,9 @@ void lcd_quick_feedback(const bool clear_buttons) { DEFINE_PIDTEMP_FUNCS(3); #if HOTENDS > 4 DEFINE_PIDTEMP_FUNCS(4); + #if HOTENDS > 5 + DEFINE_PIDTEMP_FUNCS(5); + #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 @@ -3444,6 +3528,9 @@ void lcd_quick_feedback(const bool clear_buttons) { MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N4, &thermalManager.target_temperature[3], 0, HEATER_3_MAXTEMP - 15, watch_temp_callback_E3); #if HOTENDS > 4 MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N5, &thermalManager.target_temperature[4], 0, HEATER_4_MAXTEMP - 15, watch_temp_callback_E4); + #if HOTENDS > 5 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N6, &thermalManager.target_temperature[5], 0, HEATER_5_MAXTEMP - 15, watch_temp_callback_E5); + #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 @@ -3568,6 +3655,9 @@ void lcd_quick_feedback(const bool clear_buttons) { PID_MENU_ITEMS(" " MSG_E4, 3); #if HOTENDS > 4 PID_MENU_ITEMS(" " MSG_E5, 4); + #if HOTENDS > 5 + PID_MENU_ITEMS(" " MSG_E6, 5); + #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 @@ -3583,7 +3673,10 @@ void lcd_quick_feedback(const bool clear_buttons) { #if DISABLED(SLIM_LCD_MENUS) void _lcd_configuration_temperature_preheat_settings_menu(const uint8_t material) { - #if HOTENDS > 4 + #if HOTENDS > 5 + #define MINTEMP_ALL MIN5(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP, HEATER_3_MINTEMP, HEATER_4_MINTEMP, HEATER_5_MINTEMP) + #define MAXTEMP_ALL MAX5(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP) + #elif HOTENDS > 4 #define MINTEMP_ALL MIN5(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP, HEATER_3_MINTEMP, HEATER_4_MINTEMP) #define MAXTEMP_ALL MAX5(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP) #elif HOTENDS > 3 @@ -3639,6 +3732,9 @@ void lcd_quick_feedback(const bool clear_buttons) { void _reset_e3_acceleration_rate() { _reset_e_acceleration_rate(3); } #if E_STEPPERS > 4 void _reset_e4_acceleration_rate() { _reset_e_acceleration_rate(4); } + #if E_STEPPERS > 5 + void _reset_e5_acceleration_rate() { _reset_e_acceleration_rate(5); } + #endif // E_STEPPERS > 5 #endif // E_STEPPERS > 4 #endif // E_STEPPERS > 3 #endif // E_STEPPERS > 2 @@ -3660,6 +3756,9 @@ void lcd_quick_feedback(const bool clear_buttons) { void _planner_refresh_e3_positioning() { _planner_refresh_e_positioning(3); } #if E_STEPPERS > 4 void _planner_refresh_e4_positioning() { _planner_refresh_e_positioning(4); } + #if E_STEPPERS > 5 + void _planner_refresh_e5_positioning() { _planner_refresh_e_positioning(5); } + #endif // E_STEPPERS > 5 #endif // E_STEPPERS > 4 #endif // E_STEPPERS > 3 #endif // E_STEPPERS > 2 @@ -3685,6 +3784,9 @@ void lcd_quick_feedback(const bool clear_buttons) { MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E4, &planner.max_feedrate_mm_s[E_AXIS + 3], 1, 999); #if E_STEPPERS > 4 MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E5, &planner.max_feedrate_mm_s[E_AXIS + 4], 1, 999); + #if E_STEPPERS > 5 + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E6, &planner.max_feedrate_mm_s[E_AXIS + 5], 1, 999); + #endif // E_STEPPERS > 5 #endif // E_STEPPERS > 4 #endif // E_STEPPERS > 3 #endif // E_STEPPERS > 2 @@ -3730,6 +3832,9 @@ void lcd_quick_feedback(const bool clear_buttons) { MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E4, &planner.max_acceleration_mm_per_s2[E_AXIS + 3], 100, 99000, _reset_e3_acceleration_rate); #if E_STEPPERS > 4 MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E5, &planner.max_acceleration_mm_per_s2[E_AXIS + 4], 100, 99000, _reset_e4_acceleration_rate); + #if E_STEPPERS > 5 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E6, &planner.max_acceleration_mm_per_s2[E_AXIS + 5], 100, 99000, _reset_e5_acceleration_rate); + #endif // E_STEPPERS > 5 #endif // E_STEPPERS > 4 #endif // E_STEPPERS > 3 #endif // E_STEPPERS > 2 @@ -3746,8 +3851,13 @@ void lcd_quick_feedback(const bool clear_buttons) { MENU_BACK(MSG_ADVANCED_SETTINGS); #if ENABLED(JUNCTION_DEVIATION) - MENU_ITEM_EDIT_CALLBACK(float43, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.01f, 0.3f, planner.recalculate_max_e_jerk); - #else + #if ENABLED(LIN_ADVANCE) + MENU_ITEM_EDIT_CALLBACK(float43, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.01f, 0.3f, planner.recalculate_max_e_jerk); + #else + MENU_ITEM_EDIT(float43, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.01f, 0.3f); + #endif + #endif + #if HAS_CLASSIC_JERK MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VA_JERK, &planner.max_jerk[A_AXIS], 1, 990); MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VB_JERK, &planner.max_jerk[B_AXIS], 1, 990); #if ENABLED(DELTA) @@ -3755,7 +3865,9 @@ void lcd_quick_feedback(const bool clear_buttons) { #else MENU_MULTIPLIER_ITEM_EDIT(float52sign, MSG_VC_JERK, &planner.max_jerk[C_AXIS], 0.1f, 990); #endif - MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VE_JERK, &planner.max_jerk[E_AXIS], 1, 990); + #if DISABLED(JUNCTION_DEVIATION) || DISABLED(LIN_ADVANCE) + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VE_JERK, &planner.max_jerk[E_AXIS], 1, 990); + #endif #endif END_MENU(); @@ -3780,6 +3892,9 @@ void lcd_quick_feedback(const bool clear_buttons) { MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E4STEPS, &planner.axis_steps_per_mm[E_AXIS + 3], 5, 9999, _planner_refresh_e3_positioning); #if E_STEPPERS > 4 MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E5STEPS, &planner.axis_steps_per_mm[E_AXIS + 4], 5, 9999, _planner_refresh_e4_positioning); + #if E_STEPPERS > 5 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E6STEPS, &planner.axis_steps_per_mm[E_AXIS + 5], 5, 9999, _planner_refresh_e5_positioning); + #endif // E_STEPPERS > 5 #endif // E_STEPPERS > 4 #endif // E_STEPPERS > 3 #endif // E_STEPPERS > 2 @@ -3847,7 +3962,24 @@ void lcd_quick_feedback(const bool clear_buttons) { #if DISABLED(NO_VOLUMETRICS) || ENABLED(ADVANCED_PAUSE_FEATURE) MENU_ITEM(submenu, MSG_FILAMENT, lcd_advanced_filament_menu); #elif ENABLED(LIN_ADVANCE) - MENU_ITEM_EDIT(float32, MSG_ADVANCE_K, &planner.extruder_advance_K, 0, 999); + #if EXTRUDERS == 1 + MENU_ITEM_EDIT(float52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999); + #elif EXTRUDERS > 1 + MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E1, &planner.extruder_advance_K[0], 0, 999); + MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E2, &planner.extruder_advance_K[1], 0, 999); + #if EXTRUDERS > 2 + MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E3, &planner.extruder_advance_K[2], 0, 999); + #if EXTRUDERS > 3 + MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E4, &planner.extruder_advance_K[3], 0, 999); + #if EXTRUDERS > 4 + MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E5, &planner.extruder_advance_K[4], 0, 999); + #if EXTRUDERS > 5 + MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E6, &planner.extruder_advance_K[5], 0, 999); + #endif // EXTRUDERS > 5 + #endif // EXTRUDERS > 4 + #endif // EXTRUDERS > 3 + #endif // EXTRUDERS > 2 + #endif // EXTRUDERS > 1 #endif // M540 S - Abort on endstop hit when SD printing @@ -3882,7 +4014,24 @@ void lcd_quick_feedback(const bool clear_buttons) { MENU_BACK(MSG_ADVANCED_SETTINGS); #if ENABLED(LIN_ADVANCE) - MENU_ITEM_EDIT(float52, MSG_ADVANCE_K, &planner.extruder_advance_K, 0, 999); + #if EXTRUDERS == 1 + MENU_ITEM_EDIT(float52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999); + #elif EXTRUDERS > 1 + MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E1, &planner.extruder_advance_K[0], 0, 999); + MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E2, &planner.extruder_advance_K[1], 0, 999); + #if EXTRUDERS > 2 + MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E3, &planner.extruder_advance_K[2], 0, 999); + #if EXTRUDERS > 3 + MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E4, &planner.extruder_advance_K[3], 0, 999); + #if EXTRUDERS > 4 + MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E5, &planner.extruder_advance_K[4], 0, 999); + #if EXTRUDERS > 5 + MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E6, &planner.extruder_advance_K[5], 0, 999); + #endif // EXTRUDERS > 5 + #endif // EXTRUDERS > 4 + #endif // EXTRUDERS > 3 + #endif // EXTRUDERS > 2 + #endif // EXTRUDERS > 1 #endif #if DISABLED(NO_VOLUMETRICS) @@ -3897,10 +4046,13 @@ void lcd_quick_feedback(const bool clear_buttons) { MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E2, &planner.filament_size[1], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); #if EXTRUDERS > 2 MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E3, &planner.filament_size[2], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); - #if EXTRUDERS > 3 - MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E4, &planner.filament_size[3], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); - #if EXTRUDERS > 4 + #if EXTRUDERS > 3 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E4, &planner.filament_size[3], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); + #if EXTRUDERS > 4 MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E5, &planner.filament_size[4], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); + #if EXTRUDERS > 5 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E6, &planner.filament_size[5], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); + #endif // EXTRUDERS > 5 #endif // EXTRUDERS > 4 #endif // EXTRUDERS > 3 #endif // EXTRUDERS > 2 @@ -3925,10 +4077,13 @@ void lcd_quick_feedback(const bool clear_buttons) { MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E2, &filament_change_unload_length[1], 0, extrude_maxlength); #if EXTRUDERS > 2 MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E3, &filament_change_unload_length[2], 0, extrude_maxlength); - #if EXTRUDERS > 3 - MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E4, &filament_change_unload_length[3], 0, extrude_maxlength); - #if EXTRUDERS > 4 + #if EXTRUDERS > 3 + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E4, &filament_change_unload_length[3], 0, extrude_maxlength); + #if EXTRUDERS > 4 MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E5, &filament_change_unload_length[4], 0, extrude_maxlength); + #if EXTRUDERS > 5 + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E6, &filament_change_unload_length[5], 0, extrude_maxlength); + #endif // EXTRUDERS > 5 #endif // EXTRUDERS > 4 #endif // EXTRUDERS > 3 #endif // EXTRUDERS > 2 @@ -3942,10 +4097,13 @@ void lcd_quick_feedback(const bool clear_buttons) { MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E2, &filament_change_load_length[1], 0, extrude_maxlength); #if EXTRUDERS > 2 MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E3, &filament_change_load_length[2], 0, extrude_maxlength); - #if EXTRUDERS > 3 - MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E4, &filament_change_load_length[3], 0, extrude_maxlength); - #if EXTRUDERS > 4 + #if EXTRUDERS > 3 + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E4, &filament_change_load_length[3], 0, extrude_maxlength); + #if EXTRUDERS > 4 MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E5, &filament_change_load_length[4], 0, extrude_maxlength); + #if EXTRUDERS > 5 + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E6, &filament_change_load_length[5], 0, extrude_maxlength); + #endif // EXTRUDERS > 5 #endif // EXTRUDERS > 4 #endif // EXTRUDERS > 3 #endif // EXTRUDERS > 2 @@ -4330,14 +4488,15 @@ void lcd_quick_feedback(const bool clear_buttons) { return PSTR(MSG_FILAMENTCHANGE); } - void _change_filament_temp(const uint8_t index) { + void _change_filament_temp(const uint16_t temperature) { char cmd[11]; sprintf_P(cmd, _change_filament_temp_command(), _change_filament_temp_extruder); - thermalManager.setTargetHotend(index == 1 ? PREHEAT_1_TEMP_HOTEND : PREHEAT_2_TEMP_HOTEND, _change_filament_temp_extruder); + thermalManager.setTargetHotend(temperature, _change_filament_temp_extruder); lcd_enqueue_command(cmd); } - void _lcd_change_filament_temp_1_menu() { _change_filament_temp(1); } - void _lcd_change_filament_temp_2_menu() { _change_filament_temp(2); } + void _lcd_change_filament_temp_1_menu() { _change_filament_temp(PREHEAT_1_TEMP_HOTEND); } + void _lcd_change_filament_temp_2_menu() { _change_filament_temp(PREHEAT_2_TEMP_HOTEND); } + void _lcd_change_filament_temp_custom_menu() { _change_filament_temp(thermalManager.target_temperature[_change_filament_temp_extruder]); } static const char* change_filament_header(const AdvancedPauseMode mode) { switch (mode) { @@ -4358,6 +4517,26 @@ void lcd_quick_feedback(const bool clear_buttons) { MENU_BACK(MSG_FILAMENTCHANGE); MENU_ITEM(submenu, MSG_PREHEAT_1, _lcd_change_filament_temp_1_menu); MENU_ITEM(submenu, MSG_PREHEAT_2, _lcd_change_filament_temp_2_menu); + uint16_t max_temp; + switch (extruder) { + default: max_temp = HEATER_0_MAXTEMP; + #if HOTENDS > 1 + case 1: max_temp = HEATER_1_MAXTEMP; break; + #if HOTENDS > 2 + case 2: max_temp = HEATER_2_MAXTEMP; break; + #if HOTENDS > 3 + case 3: max_temp = HEATER_3_MAXTEMP; break; + #if HOTENDS > 4 + case 4: max_temp = HEATER_4_MAXTEMP; break; + #if HOTENDS > 5 + case 5: max_temp = HEATER_5_MAXTEMP; break; + #endif + #endif + #endif + #endif + #endif + } + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_PREHEAT_CUSTOM, &thermalManager.target_temperature[_change_filament_temp_extruder], EXTRUDE_MINTEMP, max_temp - 15, _lcd_change_filament_temp_custom_menu); END_MENU(); } void lcd_temp_menu_e0_filament_change() { _lcd_temp_menu_filament_op(ADVANCED_PAUSE_MODE_PAUSE_PRINT, 0); } @@ -4433,6 +4612,13 @@ void lcd_quick_feedback(const bool clear_buttons) { MENU_ITEM_P(submenu, msg4, lcd_temp_menu_e4_filament_change); else MENU_ITEM_P(gcode, msg4, PSTR("M600 B0 T4")); + #if E_STEPPERS > 5 + PGM_P msg5 = PSTR(MSG_FILAMENTCHANGE " " MSG_E6); + if (thermalManager.targetTooColdToExtrude(5)) + MENU_ITEM_P(submenu, msg5, lcd_temp_menu_e5_filament_change); + else + MENU_ITEM_P(gcode, msg5, PSTR("M600 B0 T5")); + #endif // E_STEPPERS > 5 #endif // E_STEPPERS > 4 #endif // E_STEPPERS > 3 #endif // E_STEPPERS > 2 @@ -4476,6 +4662,13 @@ void lcd_quick_feedback(const bool clear_buttons) { MENU_ITEM_P(submenu, msg4, lcd_temp_menu_e4_filament_load); else MENU_ITEM_P(gcode, msg4, PSTR("M701 T4")); + #if E_STEPPERS > 5 + PGM_P msg5 = PSTR(MSG_FILAMENTLOAD " " MSG_E6); + if (thermalManager.targetTooColdToExtrude(5)) + MENU_ITEM_P(submenu, msg5, lcd_temp_menu_e5_filament_load); + else + MENU_ITEM_P(gcode, msg5, PSTR("M701 T5")); + #endif // E_STEPPERS > 5 #endif // E_STEPPERS > 4 #endif // E_STEPPERS > 3 #endif // E_STEPPERS > 2 @@ -4498,6 +4691,9 @@ void lcd_quick_feedback(const bool clear_buttons) { && thermalManager.targetHotEnoughToExtrude(3) #if E_STEPPERS > 4 && thermalManager.targetHotEnoughToExtrude(4) + #if E_STEPPERS > 5 + && thermalManager.targetHotEnoughToExtrude(5) + #endif // E_STEPPERS > 5 #endif // E_STEPPERS > 4 #endif // E_STEPPERS > 3 #endif // E_STEPPERS > 2 @@ -4530,6 +4726,12 @@ void lcd_quick_feedback(const bool clear_buttons) { MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E5, PSTR("M702 T4")); else MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E5, lcd_temp_menu_e4_filament_unload); + #if E_STEPPERS > 5 + if (thermalManager.targetHotEnoughToExtrude(5)) + MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E6, PSTR("M702 T5")); + else + MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E6, lcd_temp_menu_e5_filament_unload); + #endif // E_STEPPERS > 5 #endif // E_STEPPERS > 4 #endif // E_STEPPERS > 3 #endif // E_STEPPERS > 2 diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h index 229f4cbce15d..2db4db0910bd 100644 --- a/Marlin/src/lcd/ultralcd.h +++ b/Marlin/src/lcd/ultralcd.h @@ -43,6 +43,7 @@ #if ENABLED(ADVANCED_PAUSE_FEATURE) #include "../feature/pause.h" + #include "../module/motion.h" // for active_extruder #endif bool lcd_hasstatus(); @@ -116,7 +117,6 @@ void lcd_completion_feedback(const bool good=true); #if ENABLED(ADVANCED_PAUSE_FEATURE) - extern uint8_t active_extruder; void lcd_advanced_pause_show_message(const AdvancedPauseMessage message, const AdvancedPauseMode mode=ADVANCED_PAUSE_MODE_PAUSE_PRINT, const uint8_t extruder=active_extruder); diff --git a/Marlin/src/module/configuration_store.cpp b/Marlin/src/module/configuration_store.cpp index 9028df8a26e7..101175b22999 100644 --- a/Marlin/src/module/configuration_store.cpp +++ b/Marlin/src/module/configuration_store.cpp @@ -37,7 +37,7 @@ */ // Change EEPROM version if the structure changes -#define EEPROM_VERSION "V56" +#define EEPROM_VERSION "V58" #define EEPROM_OFFSET 100 // Check the integrity of data offsets. @@ -181,7 +181,7 @@ typedef struct SettingsDataStruct { // // SERVO_ANGLES // - uint16_t servo_angles[MAX_SERVOS][2]; // M281 P L U + uint16_t servo_angles[NUM_SERVO_PLUGS][2]; // M281 P L U // // DELTA / [XYZ]_DUAL_ENDSTOPS @@ -194,10 +194,13 @@ typedef struct SettingsDataStruct { delta_segments_per_second, // M665 S delta_calibration_radius, // M665 B delta_tower_angle_trim[ABC]; // M665 XYZ - #elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) - float x_endstop_adj, // M666 X - y_endstop_adj, // M666 Y - z_endstop_adj; // M666 Z + #elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || Z_MULTI_ENDSTOPS + float x2_endstop_adj, // M666 X + y2_endstop_adj, // M666 Y + z2_endstop_adj; // M666 Z + #if ENABLED(Z_TRIPLE_ENDSTOPS) + float z3_endstop_adj; // M666 Z + #endif #endif // @@ -210,7 +213,7 @@ typedef struct SettingsDataStruct { // // PIDTEMP // - PIDC hotendPID[MAX_EXTRUDERS]; // M301 En PIDC / M303 En U + PIDC hotendPID[HOTENDS]; // M301 En PIDC / M303 En U int16_t lpq_len; // M301 L @@ -241,20 +244,20 @@ typedef struct SettingsDataStruct { // !NO_VOLUMETRIC // bool parser_volumetric_enabled; // M200 D parser.volumetric_enabled - float planner_filament_size[MAX_EXTRUDERS]; // M200 T D planner.filament_size[] + float planner_filament_size[EXTRUDERS]; // M200 T D planner.filament_size[] // // HAS_TRINAMIC // - #define TMC_AXES (MAX_EXTRUDERS + 6) - uint16_t tmc_stepper_current[TMC_AXES]; // M906 X Y Z X2 Y2 Z2 E0 E1 E2 E3 E4 - uint32_t tmc_hybrid_threshold[TMC_AXES]; // M913 X Y Z X2 Y2 Z2 E0 E1 E2 E3 E4 + #define TMC_AXES (MAX_EXTRUDERS + 7) + uint16_t tmc_stepper_current[TMC_AXES]; // M906 X Y Z X2 Y2 Z2 Z3 E0 E1 E2 E3 E4 E5 + uint32_t tmc_hybrid_threshold[TMC_AXES]; // M913 X Y Z X2 Y2 Z2 Z3 E0 E1 E2 E3 E4 E5 int16_t tmc_sgt[XYZ]; // M914 X Y Z // // LIN_ADVANCE // - float planner_extruder_advance_K; // M900 K planner.extruder_advance_K + float planner_extruder_advance_K[EXTRUDERS]; // M900 K planner.extruder_advance_K // // HAS_MOTOR_CURRENT_PWM @@ -276,8 +279,8 @@ typedef struct SettingsDataStruct { // // ADVANCED_PAUSE_FEATURE // - float filament_change_unload_length[MAX_EXTRUDERS], // M603 T U - filament_change_load_length[MAX_EXTRUDERS]; // M603 T L + float filament_change_unload_length[EXTRUDERS], // M603 T U + filament_change_load_length[EXTRUDERS]; // M603 T L } SettingsData; @@ -425,12 +428,20 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(planner.min_feedrate_mm_s); EEPROM_WRITE(planner.min_travel_feedrate_mm_s); - #if ENABLED(JUNCTION_DEVIATION) + #if HAS_CLASSIC_JERK + EEPROM_WRITE(planner.max_jerk); + #if ENABLED(JUNCTION_DEVIATION) && ENABLED(LIN_ADVANCE) + dummy = float(DEFAULT_EJERK); + EEPROM_WRITE(dummy); + #endif + #else const float planner_max_jerk[] = { float(DEFAULT_XJERK), float(DEFAULT_YJERK), float(DEFAULT_ZJERK), float(DEFAULT_EJERK) }; EEPROM_WRITE(planner_max_jerk); + #endif + + #if ENABLED(JUNCTION_DEVIATION) EEPROM_WRITE(planner.junction_deviation_mm); #else - EEPROM_WRITE(planner.max_jerk); dummy = 0.02f; EEPROM_WRITE(dummy); #endif @@ -545,7 +556,7 @@ void MarlinSettings::postprocess() { #if ENABLED(SWITCHING_EXTRUDER) constexpr uint16_t sesa[][2] = SWITCHING_EXTRUDER_SERVO_ANGLES; #endif - constexpr uint16_t servo_angles[MAX_SERVOS][2] = { + constexpr uint16_t servo_angles[NUM_SERVO_PLUGS][2] = { #if ENABLED(SWITCHING_EXTRUDER) [SWITCHING_EXTRUDER_SERVO_NR] = { sesa[0], sesa[1] } #if EXTRUDERS > 3 @@ -574,26 +585,32 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(delta_calibration_radius); // 1 float EEPROM_WRITE(delta_tower_angle_trim); // 3 floats - #elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + #elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || Z_MULTI_ENDSTOPS - _FIELD_TEST(x_endstop_adj); + _FIELD_TEST(x2_endstop_adj); // Write dual endstops in X, Y, Z order. Unused = 0.0 dummy = 0; #if ENABLED(X_DUAL_ENDSTOPS) - EEPROM_WRITE(endstops.x_endstop_adj); // 1 float + EEPROM_WRITE(endstops.x2_endstop_adj); // 1 float #else EEPROM_WRITE(dummy); #endif #if ENABLED(Y_DUAL_ENDSTOPS) - EEPROM_WRITE(endstops.y_endstop_adj); // 1 float + EEPROM_WRITE(endstops.y2_endstop_adj); // 1 float #else EEPROM_WRITE(dummy); #endif - #if ENABLED(Z_DUAL_ENDSTOPS) - EEPROM_WRITE(endstops.z_endstop_adj); // 1 float + #if Z_MULTI_ENDSTOPS + EEPROM_WRITE(endstops.z2_endstop_adj); // 1 float + #else + EEPROM_WRITE(dummy); + #endif + + #if ENABLED(Z_TRIPLE_ENDSTOPS) + EEPROM_WRITE(endstops.z3_endstop_adj); // 1 float #else EEPROM_WRITE(dummy); #endif @@ -612,29 +629,23 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(lcd_preheat_bed_temp); EEPROM_WRITE(lcd_preheat_fan_speed); - for (uint8_t e = 0; e < MAX_EXTRUDERS; e++) { - + for (uint8_t e = 0; e < HOTENDS; e++) { #if ENABLED(PIDTEMP) - if (e < HOTENDS) { - EEPROM_WRITE(PID_PARAM(Kp, e)); - EEPROM_WRITE(PID_PARAM(Ki, e)); - EEPROM_WRITE(PID_PARAM(Kd, e)); - #if ENABLED(PID_EXTRUSION_SCALING) - EEPROM_WRITE(PID_PARAM(Kc, e)); - #else - dummy = 1.0f; // 1.0 = default kc - EEPROM_WRITE(dummy); - #endif - } - else - #endif // !PIDTEMP - { - dummy = DUMMY_PID_VALUE; // When read, will not change the existing value - EEPROM_WRITE(dummy); // Kp - dummy = 0; - for (uint8_t q = 3; q--;) EEPROM_WRITE(dummy); // Ki, Kd, Kc - } - + EEPROM_WRITE(PID_PARAM(Kp, e)); + EEPROM_WRITE(PID_PARAM(Ki, e)); + EEPROM_WRITE(PID_PARAM(Kd, e)); + #if ENABLED(PID_EXTRUSION_SCALING) + EEPROM_WRITE(PID_PARAM(Kc, e)); + #else + dummy = 1.0f; // 1.0 = default kc + EEPROM_WRITE(dummy); + #endif + #else + dummy = DUMMY_PID_VALUE; // When read, will not change the existing value + EEPROM_WRITE(dummy); // Kp + dummy = 0; + for (uint8_t q = 3; q--;) EEPROM_WRITE(dummy); // Ki, Kd, Kc + #endif } // Hotends Loop _FIELD_TEST(lpq_len); @@ -688,17 +699,15 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(parser.volumetric_enabled); // Save filament sizes - for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) { - if (q < COUNT(planner.filament_size)) dummy = planner.filament_size[q]; - EEPROM_WRITE(dummy); - } + for (uint8_t q = 0; q < COUNT(planner.filament_size); q++) + EEPROM_WRITE(planner.filament_size[q]); #else const bool volumetric_enabled = false; dummy = DEFAULT_NOMINAL_FILAMENT_DIA; EEPROM_WRITE(volumetric_enabled); - for (uint8_t q = MAX_EXTRUDERS; q--;) EEPROM_WRITE(dummy); + for (uint8_t q = EXTRUDERS; q--;) EEPROM_WRITE(dummy); #endif @@ -740,31 +749,53 @@ void MarlinSettings::postprocess() { #else 0, #endif - #if AXIS_IS_TMC(E0) - stepperE0.getCurrent(), - #else - 0, - #endif - #if AXIS_IS_TMC(E1) - stepperE1.getCurrent(), + #if AXIS_IS_TMC(Z3) + stepperZ3.getCurrent(), #else 0, #endif - #if AXIS_IS_TMC(E2) - stepperE2.getCurrent(), - #else - 0, - #endif - #if AXIS_IS_TMC(E3) - stepperE3.getCurrent(), - #else - 0, - #endif - #if AXIS_IS_TMC(E4) - stepperE4.getCurrent() - #else - 0 - #endif + #if MAX_EXTRUDERS + #if AXIS_IS_TMC(E0) + stepperE0.getCurrent(), + #else + 0, + #endif + #if MAX_EXTRUDERS > 1 + #if AXIS_IS_TMC(E1) + stepperE1.getCurrent(), + #else + 0, + #endif + #if MAX_EXTRUDERS > 2 + #if AXIS_IS_TMC(E2) + stepperE2.getCurrent(), + #else + 0, + #endif + #if MAX_EXTRUDERS > 3 + #if AXIS_IS_TMC(E3) + stepperE3.getCurrent(), + #else + 0, + #endif + #if MAX_EXTRUDERS > 4 + #if AXIS_IS_TMC(E4) + stepperE4.getCurrent() + #else + 0 + #endif + #if MAX_EXTRUDERS > 5 + #if AXIS_IS_TMC(E5) + stepperE5.getCurrent() + #else + 0 + #endif + #endif // MAX_EXTRUDERS > 5 + #endif // MAX_EXTRUDERS > 4 + #endif // MAX_EXTRUDERS > 3 + #endif // MAX_EXTRUDERS > 2 + #endif // MAX_EXTRUDERS > 1 + #endif // MAX_EXTRUDERS #else 0 #endif @@ -809,35 +840,74 @@ void MarlinSettings::postprocess() { #else Z2_HYBRID_THRESHOLD, #endif - #if AXIS_HAS_STEALTHCHOP(E0) - TMC_GET_PWMTHRS(E, E0), - #else - E0_HYBRID_THRESHOLD, - #endif - #if AXIS_HAS_STEALTHCHOP(E1) - TMC_GET_PWMTHRS(E, E1), + #if AXIS_HAS_STEALTHCHOP(Z3) + TMC_GET_PWMTHRS(Z, Z3), #else - E1_HYBRID_THRESHOLD, - #endif - #if AXIS_HAS_STEALTHCHOP(E2) - TMC_GET_PWMTHRS(E, E2), - #else - E2_HYBRID_THRESHOLD, - #endif - #if AXIS_HAS_STEALTHCHOP(E3) - TMC_GET_PWMTHRS(E, E3), - #else - E3_HYBRID_THRESHOLD, - #endif - #if AXIS_HAS_STEALTHCHOP(E4) - TMC_GET_PWMTHRS(E, E4) - #else - E4_HYBRID_THRESHOLD + Z3_HYBRID_THRESHOLD, #endif + #if MAX_EXTRUDERS + #if AXIS_HAS_STEALTHCHOP(E0) + TMC_GET_PWMTHRS(E, E0), + #else + E0_HYBRID_THRESHOLD, + #endif + #if MAX_EXTRUDERS > 1 + #if AXIS_HAS_STEALTHCHOP(E1) + TMC_GET_PWMTHRS(E, E1), + #else + E1_HYBRID_THRESHOLD, + #endif + #if MAX_EXTRUDERS > 2 + #if AXIS_HAS_STEALTHCHOP(E2) + TMC_GET_PWMTHRS(E, E2), + #else + E2_HYBRID_THRESHOLD, + #endif + #if MAX_EXTRUDERS > 3 + #if AXIS_HAS_STEALTHCHOP(E3) + TMC_GET_PWMTHRS(E, E3), + #else + E3_HYBRID_THRESHOLD, + #endif + #if MAX_EXTRUDERS > 4 + #if AXIS_HAS_STEALTHCHOP(E4) + TMC_GET_PWMTHRS(E, E4) + #else + E4_HYBRID_THRESHOLD + #endif + #if MAX_EXTRUDERS > 5 + #if AXIS_HAS_STEALTHCHOP(E5) + TMC_GET_PWMTHRS(E, E5) + #else + E5_HYBRID_THRESHOLD + #endif + #endif // MAX_EXTRUDERS > 5 + #endif // MAX_EXTRUDERS > 4 + #endif // MAX_EXTRUDERS > 3 + #endif // MAX_EXTRUDERS > 2 + #endif // MAX_EXTRUDERS > 1 + #endif // MAX_EXTRUDERS #else - 100, 100, 3, // X, Y, Z - 100, 100, 3, // X2, Y2, Z2 - 30, 30, 30, 30, 30 // E0, E1, E2, E3, E4 + 100, 100, 3, // X, Y, Z + 100, 100, 3, 3 // X2, Y2, Z2, Z3 + #if MAX_EXTRUDERS + , 30 // E0 + #if MAX_EXTRUDERS > 1 + , 30 // E1 + #if MAX_EXTRUDERS > 2 + , 30 // E2 + #if MAX_EXTRUDERS > 3 + , 30 // E3 + #if MAX_EXTRUDERS > 4 + , 30 // E4 + #if MAX_EXTRUDERS > 5 + , 30 // E5 + #endif + #endif + #endif + #endif + #endif + #endif #endif }; EEPROM_WRITE(tmc_hybrid_threshold); @@ -871,14 +941,13 @@ void MarlinSettings::postprocess() { // // Linear Advance // - _FIELD_TEST(planner_extruder_advance_K); #if ENABLED(LIN_ADVANCE) - EEPROM_WRITE(planner.extruder_advance_K); + LOOP_L_N(i, EXTRUDERS) EEPROM_WRITE(planner.extruder_advance_K[i]); #else dummy = 0; - EEPROM_WRITE(dummy); + LOOP_L_N(i, EXTRUDERS) EEPROM_WRITE(dummy); #endif _FIELD_TEST(motor_current_setting); @@ -925,17 +994,13 @@ void MarlinSettings::postprocess() { _FIELD_TEST(filament_change_unload_length); #if ENABLED(ADVANCED_PAUSE_FEATURE) - for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) { - if (q < COUNT(filament_change_unload_length)) dummy = filament_change_unload_length[q]; - EEPROM_WRITE(dummy); - } - for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) { - if (q < COUNT(filament_change_load_length)) dummy = filament_change_load_length[q]; - EEPROM_WRITE(dummy); + for (uint8_t q = 0; q < COUNT(filament_change_unload_length); q++) { + EEPROM_WRITE(filament_change_unload_length[q]); + EEPROM_WRITE(filament_change_load_length[q]); } #else dummy = 0; - for (uint8_t q = MAX_EXTRUDERS * 2; q--;) EEPROM_WRITE(dummy); + for (uint8_t q = EXTRUDERS * 2; q--;) EEPROM_WRITE(dummy); #endif // @@ -1044,11 +1109,18 @@ void MarlinSettings::postprocess() { EEPROM_READ(planner.min_feedrate_mm_s); EEPROM_READ(planner.min_travel_feedrate_mm_s); - #if ENABLED(JUNCTION_DEVIATION) + #if HAS_CLASSIC_JERK + EEPROM_READ(planner.max_jerk); + #if ENABLED(JUNCTION_DEVIATION) && ENABLED(LIN_ADVANCE) + EEPROM_READ(dummy); + #endif + #else for (uint8_t q = 4; q--;) EEPROM_READ(dummy); + #endif + + #if ENABLED(JUNCTION_DEVIATION) EEPROM_READ(planner.junction_deviation_mm); #else - EEPROM_READ(planner.max_jerk); EEPROM_READ(dummy); #endif @@ -1168,7 +1240,7 @@ void MarlinSettings::postprocess() { // SERVO_ANGLES // #if !HAS_SERVOS || DISABLED(EDITABLE_SERVO_ANGLES) - uint16_t servo_angles[MAX_SERVOS][2]; + uint16_t servo_angles[NUM_SERVO_PLUGS][2]; #endif EEPROM_READ(servo_angles); @@ -1188,22 +1260,27 @@ void MarlinSettings::postprocess() { EEPROM_READ(delta_calibration_radius); // 1 float EEPROM_READ(delta_tower_angle_trim); // 3 floats - #elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + #elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || Z_MULTI_ENDSTOPS - _FIELD_TEST(x_endstop_adj); + _FIELD_TEST(x2_endstop_adj); #if ENABLED(X_DUAL_ENDSTOPS) - EEPROM_READ(endstops.x_endstop_adj); // 1 float + EEPROM_READ(endstops.x2_endstop_adj); // 1 float #else EEPROM_READ(dummy); #endif #if ENABLED(Y_DUAL_ENDSTOPS) - EEPROM_READ(endstops.y_endstop_adj); // 1 float + EEPROM_READ(endstops.y2_endstop_adj); // 1 float #else EEPROM_READ(dummy); #endif - #if ENABLED(Z_DUAL_ENDSTOPS) - EEPROM_READ(endstops.z_endstop_adj); // 1 float + #if Z_MULTI_ENDSTOPS + EEPROM_READ(endstops.z2_endstop_adj); // 1 float + #else + EEPROM_READ(dummy); + #endif + #if ENABLED(Z_TRIPLE_ENDSTOPS) + EEPROM_READ(endstops.z3_endstop_adj); // 1 float #else EEPROM_READ(dummy); #endif @@ -1233,9 +1310,9 @@ void MarlinSettings::postprocess() { // #if ENABLED(PIDTEMP) - for (uint8_t e = 0; e < MAX_EXTRUDERS; e++) { + for (uint8_t e = 0; e < HOTENDS; e++) { EEPROM_READ(dummy); // Kp - if (e < HOTENDS && dummy != DUMMY_PID_VALUE) { + if (dummy != DUMMY_PID_VALUE) { // do not need to scale PID values as the values in EEPROM are already scaled if (!validating) PID_PARAM(Kp, e) = dummy; EEPROM_READ(PID_PARAM(Ki, e)); @@ -1246,13 +1323,12 @@ void MarlinSettings::postprocess() { EEPROM_READ(dummy); #endif } - else { + else for (uint8_t q=3; q--;) EEPROM_READ(dummy); // Ki, Kd, Kc - } } #else // !PIDTEMP // 4 x 4 = 16 slots for PID parameters - for (uint8_t q = MAX_EXTRUDERS * 4; q--;) EEPROM_READ(dummy); // Kp, Ki, Kd, Kc + for (uint8_t q = HOTENDS * 4; q--;) EEPROM_READ(dummy); // Kp, Ki, Kd, Kc #endif // !PIDTEMP // @@ -1321,16 +1397,15 @@ void MarlinSettings::postprocess() { EEPROM_READ(parser.volumetric_enabled); - for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) { + for (uint8_t q = 0; q < COUNT(planner.filament_size); q++) { EEPROM_READ(dummy); - if (!validating && q < COUNT(planner.filament_size)) - planner.filament_size[q] = dummy; + if (!validating) planner.filament_size[q] = dummy; } #else EEPROM_READ(dummyb); - for (uint8_t q=MAX_EXTRUDERS; q--;) EEPROM_READ(dummy); + for (uint8_t q=EXTRUDERS; q--;) EEPROM_READ(dummy); #endif @@ -1366,6 +1441,9 @@ void MarlinSettings::postprocess() { #if AXIS_IS_TMC(Z2) SET_CURR(Z2); #endif + #if AXIS_IS_TMC(Z3) + SET_CURR(Z3); + #endif #if AXIS_IS_TMC(E0) SET_CURR(E0); #endif @@ -1381,6 +1459,9 @@ void MarlinSettings::postprocess() { #if AXIS_IS_TMC(E4) SET_CURR(E4); #endif + #if AXIS_IS_TMC(E5) + SET_CURR(E5); + #endif } #else uint16_t val; @@ -1410,6 +1491,9 @@ void MarlinSettings::postprocess() { #if AXIS_HAS_STEALTHCHOP(Z2) TMC_SET_PWMTHRS(Z, Z2); #endif + #if AXIS_HAS_STEALTHCHOP(Z3) + TMC_SET_PWMTHRS(Z, Z3); + #endif #if AXIS_HAS_STEALTHCHOP(E0) TMC_SET_PWMTHRS(E, E0); #endif @@ -1425,6 +1509,9 @@ void MarlinSettings::postprocess() { #if AXIS_HAS_STEALTHCHOP(E4) TMC_SET_PWMTHRS(E, E4); #endif + #if AXIS_HAS_STEALTHCHOP(E5) + TMC_SET_PWMTHRS(E, E5); + #endif } #else uint32_t thrs_val; @@ -1435,7 +1522,7 @@ void MarlinSettings::postprocess() { * TMC2130 Sensorless homing threshold. * X and X2 use the same value * Y and Y2 use the same value - * Z and Z2 use the same value + * Z, Z2 and Z3 use the same value */ int16_t tmc_sgt[XYZ]; EEPROM_READ(tmc_sgt); @@ -1464,6 +1551,9 @@ void MarlinSettings::postprocess() { #if AXIS_HAS_STALLGUARD(Z2) stepperZ2.sgt(tmc_sgt[2]); #endif + #if AXIS_HAS_STALLGUARD(Z3) + stepperZ3.sgt(tmc_sgt[2]); + #endif #endif } #endif @@ -1471,14 +1561,15 @@ void MarlinSettings::postprocess() { // // Linear Advance // - _FIELD_TEST(planner_extruder_advance_K); - #if ENABLED(LIN_ADVANCE) - EEPROM_READ(planner.extruder_advance_K); - #else - EEPROM_READ(dummy); - #endif + LOOP_L_N(i, EXTRUDERS) { + #if ENABLED(LIN_ADVANCE) + EEPROM_READ(planner.extruder_advance_K[i]); + #else + EEPROM_READ(dummy); + #endif + } // // Motor Current PWM @@ -1532,16 +1623,14 @@ void MarlinSettings::postprocess() { _FIELD_TEST(filament_change_unload_length); #if ENABLED(ADVANCED_PAUSE_FEATURE) - for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) { + for (uint8_t q = 0; q < COUNT(filament_change_unload_length); q++) { EEPROM_READ(dummy); if (!validating && q < COUNT(filament_change_unload_length)) filament_change_unload_length[q] = dummy; - } - for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) { EEPROM_READ(dummy); if (!validating && q < COUNT(filament_change_load_length)) filament_change_load_length[q] = dummy; } #else - for (uint8_t q = MAX_EXTRUDERS * 2; q--;) EEPROM_READ(dummy); + for (uint8_t q = EXTRUDERS * 2; q--;) EEPROM_READ(dummy); #endif eeprom_error = size_error(eeprom_index - (EEPROM_OFFSET)); @@ -1775,11 +1864,15 @@ void MarlinSettings::reset(PORTARG_SOLO) { #if ENABLED(JUNCTION_DEVIATION) planner.junction_deviation_mm = float(JUNCTION_DEVIATION_MM); - #else + #endif + + #if HAS_CLASSIC_JERK planner.max_jerk[X_AXIS] = DEFAULT_XJERK; planner.max_jerk[Y_AXIS] = DEFAULT_YJERK; planner.max_jerk[Z_AXIS] = DEFAULT_ZJERK; - planner.max_jerk[E_AXIS] = DEFAULT_EJERK; + #if DISABLED(JUNCTION_DEVIATION) || DISABLED(LIN_ADVANCE) + planner.max_jerk[E_AXIS] = DEFAULT_EJERK; + #endif #endif #if HAS_HOME_OFFSET @@ -1793,6 +1886,9 @@ void MarlinSettings::reset(PORTARG_SOLO) { "Offsets for the first hotend must be 0.0." ); LOOP_XYZ(i) HOTEND_LOOP() hotend_offset[i][e] = tmp4[i][e]; + #if ENABLED(DUAL_X_CARRIAGE) + hotend_offset[X_AXIS][1] = MAX(X2_HOME_POS, X2_MAX_POS); + #endif #endif // @@ -1860,10 +1956,10 @@ void MarlinSettings::reset(PORTARG_SOLO) { delta_calibration_radius = DELTA_CALIBRATION_RADIUS; COPY(delta_tower_angle_trim, dta); - #elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + #elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || Z_MULTI_ENDSTOPS #if ENABLED(X_DUAL_ENDSTOPS) - endstops.x_endstop_adj = ( + endstops.x2_endstop_adj = ( #ifdef X_DUAL_ENDSTOPS_ADJUSTMENT X_DUAL_ENDSTOPS_ADJUSTMENT #else @@ -1872,7 +1968,7 @@ void MarlinSettings::reset(PORTARG_SOLO) { ); #endif #if ENABLED(Y_DUAL_ENDSTOPS) - endstops.y_endstop_adj = ( + endstops.y2_endstop_adj = ( #ifdef Y_DUAL_ENDSTOPS_ADJUSTMENT Y_DUAL_ENDSTOPS_ADJUSTMENT #else @@ -1881,13 +1977,28 @@ void MarlinSettings::reset(PORTARG_SOLO) { ); #endif #if ENABLED(Z_DUAL_ENDSTOPS) - endstops.z_endstop_adj = ( + endstops.z2_endstop_adj = ( #ifdef Z_DUAL_ENDSTOPS_ADJUSTMENT Z_DUAL_ENDSTOPS_ADJUSTMENT #else 0 #endif ); + #elif ENABLED(Z_TRIPLE_ENDSTOPS) + endstops.z2_endstop_adj = ( + #ifdef Z_TRIPLE_ENDSTOPS_ADJUSTMENT2 + Z_TRIPLE_ENDSTOPS_ADJUSTMENT2 + #else + 0 + #endif + ); + endstops.z3_endstop_adj = ( + #ifdef Z_TRIPLE_ENDSTOPS_ADJUSTMENT3 + Z_TRIPLE_ENDSTOPS_ADJUSTMENT3 + #else + 0 + #endif + ); #endif #endif @@ -1957,7 +2068,7 @@ void MarlinSettings::reset(PORTARG_SOLO) { reset_stepper_drivers(); #if ENABLED(LIN_ADVANCE) - planner.extruder_advance_K = LIN_ADVANCE_K; + LOOP_L_N(i, EXTRUDERS) planner.extruder_advance_K[i] = LIN_ADVANCE_K; #endif #if HAS_MOTOR_CURRENT_PWM @@ -2109,6 +2220,11 @@ void MarlinSettings::reset(PORTARG_SOLO) { CONFIG_ECHO_START; SERIAL_ECHOPAIR_P(port, " M200 T4 D", LINEAR_UNIT(planner.filament_size[4])); SERIAL_EOL_P(port); + #if EXTRUDERS > 5 + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M200 T5 D", LINEAR_UNIT(planner.filament_size[5])); + SERIAL_EOL_P(port); + #endif // EXTRUDERS > 5 #endif // EXTRUDERS > 4 #endif // EXTRUDERS > 3 #endif // EXTRUDERS > 2 @@ -2195,11 +2311,12 @@ void MarlinSettings::reset(PORTARG_SOLO) { SERIAL_ECHOPGM_P(port, "Advanced: B S T"); #if ENABLED(JUNCTION_DEVIATION) SERIAL_ECHOPGM_P(port, " J"); - #else - SERIAL_ECHOPGM_P(port, " X Y Z"); #endif - #if DISABLED(JUNCTION_DEVIATION) || ENABLED(LIN_ADVANCE) - SERIAL_ECHOPGM_P(port, " E"); + #if HAS_CLASSIC_JERK + SERIAL_ECHOPGM_P(port, " X Y Z"); + #if DISABLED(JUNCTION_DEVIATION) || DISABLED(LIN_ADVANCE) + SERIAL_ECHOPGM_P(port, " E"); + #endif #endif SERIAL_EOL_P(port); } @@ -2210,11 +2327,14 @@ void MarlinSettings::reset(PORTARG_SOLO) { #if ENABLED(JUNCTION_DEVIATION) SERIAL_ECHOPAIR_P(port, " J", LINEAR_UNIT(planner.junction_deviation_mm)); - #else + #endif + #if HAS_CLASSIC_JERK SERIAL_ECHOPAIR_P(port, " X", LINEAR_UNIT(planner.max_jerk[X_AXIS])); SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(planner.max_jerk[Y_AXIS])); SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(planner.max_jerk[Z_AXIS])); - SERIAL_ECHOPAIR_P(port, " E", LINEAR_UNIT(planner.max_jerk[E_AXIS])); + #if DISABLED(JUNCTION_DEVIATION) || DISABLED(LIN_ADVANCE) + SERIAL_ECHOPAIR_P(port, " E", LINEAR_UNIT(planner.max_jerk[E_AXIS])); + #endif #endif SERIAL_EOL_P(port); @@ -2391,13 +2511,17 @@ void MarlinSettings::reset(PORTARG_SOLO) { CONFIG_ECHO_START; SERIAL_ECHOPGM_P(port, " M666"); #if ENABLED(X_DUAL_ENDSTOPS) - SERIAL_ECHOPAIR_P(port, " X", LINEAR_UNIT(endstops.x_endstop_adj)); + SERIAL_ECHOPAIR_P(port, " X", LINEAR_UNIT(endstops.x2_endstop_adj)); #endif #if ENABLED(Y_DUAL_ENDSTOPS) - SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(endstops.y_endstop_adj)); + SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(endstops.y2_endstop_adj)); #endif - #if ENABLED(Z_DUAL_ENDSTOPS) - SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(endstops.z_endstop_adj)); + #if ENABLED(Z_TRIPLE_ENDSTOPS) + SERIAL_ECHOLNPAIR_P(port, "S1 Z", LINEAR_UNIT(endstops.z2_endstop_adj)); + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M666 S2 Z", LINEAR_UNIT(endstops.z3_endstop_adj)); + #elif ENABLED(Z_DUAL_ENDSTOPS) + SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(endstops.z2_endstop_adj)); #endif SERIAL_EOL_P(port); @@ -2582,6 +2706,10 @@ void MarlinSettings::reset(PORTARG_SOLO) { #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) SERIAL_EOL_P(port); #endif + #if AXIS_IS_TMC(Z3) + say_M906(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " I2 Z", stepperZ3.getCurrent()); + #endif #if AXIS_IS_TMC(E0) say_M906(PORTVAR_SOLO); SERIAL_ECHOLNPAIR_P(port, " T0 E", stepperE0.getCurrent()); @@ -2602,6 +2730,10 @@ void MarlinSettings::reset(PORTARG_SOLO) { say_M906(PORTVAR_SOLO); SERIAL_ECHOLNPAIR_P(port, " T4 E", stepperE4.getCurrent()); #endif + #if E_STEPPERS > 5 && AXIS_IS_TMC(E5) + say_M906(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " T5 E", stepperE5.getCurrent()); + #endif SERIAL_EOL_P(port); /** @@ -2644,6 +2776,11 @@ void MarlinSettings::reset(PORTARG_SOLO) { #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) SERIAL_EOL_P(port); #endif + #if AXIS_IS_TMC(Z3) + say_M913(PORTVAR_SOLO); + SERIAL_ECHOPGM_P(port, " I2"); + SERIAL_ECHOLNPAIR_P(port, " Z", TMC_GET_PWMTHRS(Z, Z3)); + #endif #if AXIS_IS_TMC(E0) say_M913(PORTVAR_SOLO); SERIAL_ECHOLNPAIR_P(port, " T0 E", TMC_GET_PWMTHRS(E, E0)); @@ -2664,6 +2801,10 @@ void MarlinSettings::reset(PORTARG_SOLO) { say_M913(PORTVAR_SOLO); SERIAL_ECHOLNPAIR_P(port, " T4 E", TMC_GET_PWMTHRS(E, E4)); #endif + #if E_STEPPERS > 5 && AXIS_IS_TMC(E5) + say_M913(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " T5 E", TMC_GET_PWMTHRS(E, E5)); + #endif SERIAL_EOL_P(port); #endif // HYBRID_THRESHOLD @@ -2693,6 +2834,7 @@ void MarlinSettings::reset(PORTARG_SOLO) { #define HAS_X2_SENSORLESS (defined(X_HOMING_SENSITIVITY) && AXIS_HAS_STALLGUARD(X2)) #define HAS_Y2_SENSORLESS (defined(Y_HOMING_SENSITIVITY) && AXIS_HAS_STALLGUARD(Y2)) #define HAS_Z2_SENSORLESS (defined(Z_HOMING_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z2)) + #define HAS_Z3_SENSORLESS (defined(Z_HOMING_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z3)) #if HAS_X2_SENSORLESS || HAS_Y2_SENSORLESS || HAS_Z2_SENSORLESS say_M914(PORTVAR_SOLO); SERIAL_ECHOPGM_P(port, " I1"); @@ -2708,6 +2850,12 @@ void MarlinSettings::reset(PORTARG_SOLO) { SERIAL_EOL_P(port); #endif + #if HAS_Z3_SENSORLESS + say_M914(PORTVAR_SOLO); + SERIAL_ECHOPGM_P(port, " I2"); + SERIAL_ECHOLNPAIR_P(port, " Z", stepperZ3.sgt()); + #endif + #endif // SENSORLESS_HOMING #endif // HAS_TRINAMIC @@ -2720,8 +2868,16 @@ void MarlinSettings::reset(PORTARG_SOLO) { CONFIG_ECHO_START; SERIAL_ECHOLNPGM_P(port, "Linear Advance:"); } + CONFIG_ECHO_START; - SERIAL_ECHOLNPAIR_P(port, " M900 K", planner.extruder_advance_K); + #if EXTRUDERS < 2 + SERIAL_ECHOLNPAIR_P(port, " M900 K", planner.extruder_advance_K[0]); + #else + LOOP_L_N(i, EXTRUDERS) { + SERIAL_ECHOPAIR_P(port, " M900 T", int(i)); + SERIAL_ECHOLNPAIR_P(port, " K", planner.extruder_advance_K[i]); + } + #endif #endif #if HAS_MOTOR_CURRENT_PWM @@ -2772,6 +2928,12 @@ void MarlinSettings::reset(PORTARG_SOLO) { say_M603(PORTVAR_SOLO); SERIAL_ECHOPAIR_P(port, "T4 L", LINEAR_UNIT(filament_change_load_length[4])); SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[4])); + #if EXTRUDERS > 5 + CONFIG_ECHO_START; + say_M603(PORTVAR_SOLO); + SERIAL_ECHOPAIR_P(port, "T5 L", LINEAR_UNIT(filament_change_load_length[5])); + SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[5])); + #endif // EXTRUDERS > 5 #endif // EXTRUDERS > 4 #endif // EXTRUDERS > 3 #endif // EXTRUDERS > 2 diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp index ba4c018f932b..f0832d13a557 100644 --- a/Marlin/src/module/delta.cpp +++ b/Marlin/src/module/delta.cpp @@ -101,7 +101,7 @@ void recalc_delta_settings() { SERIAL_ECHOLNPAIR(" C:", delta[C_AXIS]); \ }while(0) -void inverse_kinematics(const float raw[XYZ]) { +void inverse_kinematics(const float (&raw)[XYZ]) { #if HAS_HOTEND_OFFSET // Delta hotend offsets must be applied in Cartesian space with no "spoofing" const float pos[XYZ] = { @@ -224,6 +224,7 @@ void home_delta() { #endif // Init the current position of all carriages to 0,0,0 ZERO(current_position); + ZERO(destination); sync_plan_position(); // Disable stealthChop if used. Enable diag1 pin on driver. @@ -232,9 +233,8 @@ void home_delta() { #endif // Move all carriages together linearly until an endstop is hit. - current_position[X_AXIS] = current_position[Y_AXIS] = current_position[Z_AXIS] = (delta_height + 10); - feedrate_mm_s = homing_feedrate(X_AXIS); - line_to_current_position(); + destination[Z_AXIS] = (delta_height + 10); + buffer_line_to_destination(homing_feedrate(X_AXIS)); planner.synchronize(); // Re-enable stealthChop if used. Disable diag1 pin on driver. @@ -256,7 +256,7 @@ void home_delta() { // give the impression that they are the same. LOOP_XYZ(i) set_axis_is_at_home((AxisEnum)i); - SYNC_PLAN_POSITION_KINEMATIC(); + sync_plan_position(); #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) DEBUG_POS("<<< home_delta", current_position); diff --git a/Marlin/src/module/delta.h b/Marlin/src/module/delta.h index 2dde72f801e7..52e2c59acc6e 100644 --- a/Marlin/src/module/delta.h +++ b/Marlin/src/module/delta.h @@ -24,8 +24,7 @@ * delta.h - Delta-specific functions */ -#ifndef __DELTA_H__ -#define __DELTA_H__ +#pragma once extern float delta_height, delta_endstop_adj[ABC], @@ -78,7 +77,11 @@ void recalc_delta_settings(); delta[C_AXIS] = DELTA_Z(V, C_AXIS); \ }while(0) -void inverse_kinematics(const float raw[XYZ]); +void inverse_kinematics(const float (&raw)[XYZ]); +FORCE_INLINE void inverse_kinematics(const float (&raw)[XYZE]) { + const float raw_xyz[XYZ] = { raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS] }; + inverse_kinematics(raw_xyz); +} /** * Calculate the highest Z position where the @@ -118,5 +121,3 @@ FORCE_INLINE void forward_kinematics_DELTA(const float (&point)[ABC]) { } void home_delta(); - -#endif // __DELTA_H__ diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index 68886eb84f01..6801c27098cc 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -56,13 +56,16 @@ Endstops::esbits_t Endstops::live_state = 0; // Initialized by settings.load() #if ENABLED(X_DUAL_ENDSTOPS) - float Endstops::x_endstop_adj; + float Endstops::x2_endstop_adj; #endif #if ENABLED(Y_DUAL_ENDSTOPS) - float Endstops::y_endstop_adj; + float Endstops::y2_endstop_adj; #endif -#if ENABLED(Z_DUAL_ENDSTOPS) - float Endstops::z_endstop_adj; +#if Z_MULTI_ENDSTOPS + float Endstops::z2_endstop_adj; +#endif +#if ENABLED(Z_TRIPLE_ENDSTOPS) + float Endstops::z3_endstop_adj; #endif /** @@ -131,6 +134,16 @@ void Endstops::init() { #endif #endif + #if HAS_Z3_MIN + #if ENABLED(ENDSTOPPULLUP_ZMIN) + SET_INPUT_PULLUP(Z3_MIN_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_ZMIN) + SET_INPUT_PULLDOWN(Z3_MIN_PIN); + #else + SET_INPUT(Z3_MIN_PIN); + #endif + #endif + #if HAS_X_MAX #if ENABLED(ENDSTOPPULLUP_XMAX) SET_INPUT_PULLUP(X_MAX_PIN); @@ -191,6 +204,16 @@ void Endstops::init() { #endif #endif + #if HAS_Z3_MAX + #if ENABLED(ENDSTOPPULLUP_ZMAX) + SET_INPUT_PULLUP(Z3_MAX_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_ZMAX) + SET_INPUT_PULLDOWN(Z3_MAX_PIN); + #else + SET_INPUT(Z3_MAX_PIN); + #endif + #endif + #if ENABLED(Z_MIN_PROBE_ENDSTOP) #if ENABLED(ENDSTOPPULLUP_ZMIN_PROBE) SET_INPUT_PULLUP(Z_MIN_PROBE_PIN); @@ -335,12 +358,16 @@ void Endstops::event_handler() { prev_hit_state = hit_state; } // Endstops::report_state -void Endstops::M119() { +static void print_es_state(const bool is_hit, const char * const label=NULL) { + if (label) serialprintPGM(label); + SERIAL_PROTOCOLPGM(": "); + serialprintPGM(is_hit ? PSTR(MSG_ENDSTOP_HIT) : PSTR(MSG_ENDSTOP_OPEN)); + SERIAL_EOL(); +} + +void _O2 Endstops::M119() { SERIAL_PROTOCOLLNPGM(MSG_M119_REPORT); - #define ES_REPORT(AXIS) do{ \ - SERIAL_PROTOCOLPGM(MSG_##AXIS); \ - SERIAL_PROTOCOLLN(((READ(AXIS##_PIN)^AXIS##_ENDSTOP_INVERTING) ? MSG_ENDSTOP_HIT : MSG_ENDSTOP_OPEN)); \ - }while(0) + #define ES_REPORT(S) print_es_state(READ(S##_PIN) == S##_ENDSTOP_INVERTING, PSTR(MSG_##S)) #if HAS_X_MIN ES_REPORT(X_MIN); #endif @@ -371,19 +398,65 @@ void Endstops::M119() { #if HAS_Z2_MIN ES_REPORT(Z2_MIN); #endif + #if HAS_Z3_MIN + ES_REPORT(Z3_MIN); + #endif #if HAS_Z_MAX ES_REPORT(Z_MAX); #endif #if HAS_Z2_MAX ES_REPORT(Z2_MAX); #endif + #if HAS_Z3_MAX + ES_REPORT(Z3_MAX); + #endif #if ENABLED(Z_MIN_PROBE_ENDSTOP) - SERIAL_PROTOCOLPGM(MSG_Z_PROBE); - SERIAL_PROTOCOLLN(((READ(Z_MIN_PROBE_PIN)^Z_MIN_PROBE_ENDSTOP_INVERTING) ? MSG_ENDSTOP_HIT : MSG_ENDSTOP_OPEN)); + print_es_state(READ(Z_MIN_PROBE_PIN) == Z_MIN_PROBE_ENDSTOP_INVERTING, PSTR(MSG_Z_PROBE)); #endif #if ENABLED(FILAMENT_RUNOUT_SENSOR) - SERIAL_PROTOCOLPGM(MSG_FILAMENT_RUNOUT_SENSOR); - SERIAL_PROTOCOLLN(((READ(FIL_RUNOUT_PIN)^FIL_RUNOUT_INVERTING) ? MSG_ENDSTOP_HIT : MSG_ENDSTOP_OPEN)); + #define FRS_COUNT (1 + PIN_EXISTS(FIL_RUNOUT2) + PIN_EXISTS(FIL_RUNOUT3) + PIN_EXISTS(FIL_RUNOUT4) + PIN_EXISTS(FIL_RUNOUT5) + PIN_EXISTS(FIL_RUNOUT6)) + #if FRS_COUNT == 1 + print_es_state(READ(FIL_RUNOUT_PIN) == FIL_RUNOUT_INVERTING, MSG_FILAMENT_RUNOUT_SENSOR); + #else + for (uint8_t i = 1; i <= + #if FRS_COUNT == 6 + 6 + #elif FRS_COUNT == 5 + 5 + #elif FRS_COUNT == 4 + 4 + #elif FRS_COUNT == 3 + 3 + #elif FRS_COUNT == 2 + 2 + #endif + ; i++ + ) { + pin_t pin; + switch (i) { + default: continue; + case 1: pin = FIL_RUNOUT_PIN; break; + #if PIN_EXISTS(FIL_RUNOUT2) + case 2: pin = FIL_RUNOUT2_PIN; break; + #endif + #if PIN_EXISTS(FIL_RUNOUT3) + case 3: pin = FIL_RUNOUT3_PIN; break; + #endif + #if PIN_EXISTS(FIL_RUNOUT4) + case 4: pin = FIL_RUNOUT4_PIN; break; + #endif + #if PIN_EXISTS(FIL_RUNOUT5) + case 5: pin = FIL_RUNOUT5_PIN; break; + #endif + #if PIN_EXISTS(FIL_RUNOUT6) + case 6: pin = FIL_RUNOUT6_PIN; break; + #endif + } + SERIAL_PROTOCOLPGM(MSG_FILAMENT_RUNOUT_SENSOR); + if (i > 1) { SERIAL_CHAR(' '); SERIAL_CHAR('0' + i); } + print_es_state(digitalRead(pin) == FIL_RUNOUT_INVERTING); + } + #endif #endif } // Endstops::M119 @@ -492,13 +565,20 @@ void Endstops::update() { #endif #if HAS_Z_MIN - #if ENABLED(Z_DUAL_ENDSTOPS) + #if Z_MULTI_ENDSTOPS UPDATE_ENDSTOP_BIT(Z, MIN); #if HAS_Z2_MIN UPDATE_ENDSTOP_BIT(Z2, MIN); #else COPY_LIVE_STATE(Z_MIN, Z2_MIN); #endif + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #if HAS_Z3_MIN + UPDATE_ENDSTOP_BIT(Z3, MIN); + #else + COPY_LIVE_STATE(Z_MIN, Z3_MIN); + #endif + #endif #elif ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) UPDATE_ENDSTOP_BIT(Z, MIN); #elif Z_HOME_DIR < 0 @@ -513,13 +593,20 @@ void Endstops::update() { #if HAS_Z_MAX // Check both Z dual endstops - #if ENABLED(Z_DUAL_ENDSTOPS) + #if Z_MULTI_ENDSTOPS UPDATE_ENDSTOP_BIT(Z, MAX); #if HAS_Z2_MAX UPDATE_ENDSTOP_BIT(Z2, MAX); #else COPY_LIVE_STATE(Z_MAX, Z2_MAX); #endif + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #if HAS_Z3_MAX + UPDATE_ENDSTOP_BIT(Z3, MAX); + #else + COPY_LIVE_STATE(Z_MAX, Z3_MAX); + #endif + #endif #elif DISABLED(Z_MIN_PROBE_ENDSTOP) || Z_MAX_PIN != Z_MIN_PROBE_PIN // If this pin isn't the bed probe it's the Z endstop UPDATE_ENDSTOP_BIT(Z, MAX); @@ -569,7 +656,17 @@ void Endstops::update() { if (dual_hit) { \ _ENDSTOP_HIT(AXIS1, MINMAX); \ /* if not performing home or if both endstops were trigged during homing... */ \ - if (!stepper.homing_dual_axis || dual_hit == 0b11) \ + if (!stepper.separate_multi_axis || dual_hit == 0b11) \ + planner.endstop_triggered(_AXIS(AXIS1)); \ + } \ + }while(0) + + #define PROCESS_TRIPLE_ENDSTOP(AXIS1, AXIS2, AXIS3, MINMAX) do { \ + const byte triple_hit = TEST_ENDSTOP(_ENDSTOP(AXIS1, MINMAX)) | (TEST_ENDSTOP(_ENDSTOP(AXIS2, MINMAX)) << 1) | (TEST_ENDSTOP(_ENDSTOP(AXIS3, MINMAX)) << 2); \ + if (triple_hit) { \ + _ENDSTOP_HIT(AXIS1, MINMAX); \ + /* if not performing home or if both endstops were trigged during homing... */ \ + if (!stepper.separate_multi_axis || triple_hit == 0x7) \ planner.endstop_triggered(_AXIS(AXIS1)); \ } \ }while(0) @@ -632,7 +729,9 @@ void Endstops::update() { if (stepper.axis_is_moving(Z_AXIS)) { if (stepper.motor_direction(Z_AXIS_HEAD)) { // Z -direction. Gantry down, bed up. #if HAS_Z_MIN - #if ENABLED(Z_DUAL_ENDSTOPS) + #if ENABLED(Z_TRIPLE_ENDSTOPS) + PROCESS_TRIPLE_ENDSTOP(Z, Z2, Z3, MIN); + #elif ENABLED(Z_DUAL_ENDSTOPS) PROCESS_DUAL_ENDSTOP(Z, Z2, MIN); #else #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) @@ -652,7 +751,9 @@ void Endstops::update() { } else { // Z +direction. Gantry up, bed down. #if HAS_Z_MAX - #if ENABLED(Z_DUAL_ENDSTOPS) + #if ENABLED(Z_TRIPLE_ENDSTOPS) + PROCESS_TRIPLE_ENDSTOP(Z, Z2, Z3, MAX); + #elif ENABLED(Z_DUAL_ENDSTOPS) PROCESS_DUAL_ENDSTOP(Z, Z2, MAX); #elif DISABLED(Z_MIN_PROBE_ENDSTOP) || Z_MAX_PIN != Z_MIN_PROBE_PIN // If this pin is not hijacked for the bed probe @@ -723,6 +824,12 @@ void Endstops::update() { #if HAS_Z2_MAX if (READ(Z2_MAX_PIN)) SBI(live_state_local, Z2_MAX); #endif + #if HAS_Z3_MIN + if (READ(Z3_MIN_PIN)) SBI(live_state_local, Z3_MIN); + #endif + #if HAS_Z3_MAX + if (READ(Z3_MAX_PIN)) SBI(live_state_local, Z3_MAX); + #endif uint16_t endstop_change = live_state_local ^ old_live_state_local; @@ -766,6 +873,12 @@ void Endstops::update() { #if HAS_Z2_MAX if (TEST(endstop_change, Z2_MAX)) SERIAL_PROTOCOLPAIR(" Z2_MAX:", TEST(live_state_local, Z2_MAX)); #endif + #if HAS_Z3_MIN + if (TEST(endstop_change, Z3_MIN)) SERIAL_PROTOCOLPAIR(" Z3_MIN:", TEST(live_state_local, Z3_MIN)); + #endif + #if HAS_Z3_MAX + if (TEST(endstop_change, Z3_MAX)) SERIAL_PROTOCOLPAIR(" Z3_MAX:", TEST(live_state_local, Z3_MAX)); + #endif SERIAL_PROTOCOLPGM("\n\n"); analogWrite(LED_PIN, local_LED_status); local_LED_status ^= 255; diff --git a/Marlin/src/module/endstops.h b/Marlin/src/module/endstops.h index 8e10579de08e..cf3f0df7c536 100644 --- a/Marlin/src/module/endstops.h +++ b/Marlin/src/module/endstops.h @@ -45,7 +45,9 @@ enum EndstopEnum : char { Y2_MIN, Y2_MAX, Z2_MIN, - Z2_MAX + Z2_MAX, + Z3_MIN, + Z3_MAX }; class Endstops { @@ -54,16 +56,19 @@ class Endstops { static bool enabled, enabled_globally; - #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || Z_MULTI_ENDSTOPS typedef uint16_t esbits_t; #if ENABLED(X_DUAL_ENDSTOPS) - static float x_endstop_adj; + static float x2_endstop_adj; #endif #if ENABLED(Y_DUAL_ENDSTOPS) - static float y_endstop_adj; + static float y2_endstop_adj; #endif - #if ENABLED(Z_DUAL_ENDSTOPS) - static float z_endstop_adj; + #if Z_MULTI_ENDSTOPS + static float z2_endstop_adj; + #endif + #if ENABLED(Z_TRIPLE_ENDSTOPS) + static float z3_endstop_adj; #endif #else typedef uint8_t esbits_t; diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 32e13879a49e..caab4f73ab20 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -75,7 +75,7 @@ bool relative_mode; // = false; * Cartesian Current Position * Used to track the native machine position as moves are queued. * Used by 'buffer_line_to_current_position' to do a move after changing it. - * Used by 'SYNC_PLAN_POSITION_KINEMATIC' to update 'planner.position'. + * Used by 'sync_plan_position' to update 'planner.position'. */ float current_position[XYZE] = { 0 }; @@ -87,9 +87,10 @@ float current_position[XYZE] = { 0 }; */ float destination[XYZE] = { 0 }; - // The active extruder (tool). Set with T command. -uint8_t active_extruder; // = 0; +#if EXTRUDERS > 1 + uint8_t active_extruder; // = 0 +#endif // Extruder offsets #if HAS_HOTEND_OFFSET @@ -217,15 +218,22 @@ void get_cartesian_from_steppers() { * may have been applied. * * To prevent small shifts in axis position always call - * SYNC_PLAN_POSITION_KINEMATIC after updating axes with this. + * sync_plan_position after updating axes with this. * * To keep hosts in sync, always call report_current_position * after updating the current_position. */ void set_current_from_steppers_for_axis(const AxisEnum axis) { get_cartesian_from_steppers(); - #if PLANNER_LEVELING - planner.unapply_leveling(cartes); + + #if HAS_POSITION_MODIFIERS + float pos[XYZE] = { cartes[X_AXIS], cartes[Y_AXIS], cartes[Z_AXIS], current_position[E_AXIS] }; + planner.unapply_modifiers(pos + #if HAS_LEVELING + , true + #endif + ); + const float (&cartes)[XYZE] = pos; #endif if (axis == ALL_AXES) COPY(current_position, cartes); @@ -251,13 +259,6 @@ void buffer_line_to_destination(const float fr_mm_s) { #if IS_KINEMATIC - void sync_plan_position_kinematic() { - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_POS("sync_plan_position_kinematic", current_position); - #endif - planner.set_position_mm_kinematic(current_position); - } - /** * Calculate delta, start a line, and set current_position to destination */ @@ -276,7 +277,7 @@ void buffer_line_to_destination(const float fr_mm_s) { && current_position[E_AXIS] == destination[E_AXIS] ) return; - planner.buffer_line_kinematic(destination, MMS_SCALED(fr_mm_s ? fr_mm_s : feedrate_mm_s), active_extruder); + planner.buffer_line(destination, MMS_SCALED(fr_mm_s ? fr_mm_s : feedrate_mm_s), active_extruder); #endif set_current_from_destination(); @@ -537,7 +538,7 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS }, // If the move is only in Z/E don't split up the move if (!xdiff && !ydiff) { - planner.buffer_line_kinematic(rtarget, _feedrate_mm_s, active_extruder); + planner.buffer_line(rtarget, _feedrate_mm_s, active_extruder); return false; // caller will update current_position } @@ -579,53 +580,22 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS }, ydiff * inv_segments, zdiff * inv_segments, ediff * inv_segments - }; + }, + cartesian_segment_mm = cartesian_mm * inv_segments; - #if !HAS_FEEDRATE_SCALING - const float cartesian_segment_mm = cartesian_mm * inv_segments; + #if ENABLED(SCARA_FEEDRATE_SCALING) + const float inv_duration = _feedrate_mm_s / cartesian_segment_mm; #endif /* SERIAL_ECHOPAIR("mm=", cartesian_mm); SERIAL_ECHOPAIR(" seconds=", seconds); SERIAL_ECHOPAIR(" segments=", segments); - #if !HAS_FEEDRATE_SCALING - SERIAL_ECHOPAIR(" segment_mm=", cartesian_segment_mm); - #endif + SERIAL_ECHOPAIR(" segment_mm=", cartesian_segment_mm); SERIAL_EOL(); //*/ - #if HAS_FEEDRATE_SCALING - // SCARA needs to scale the feed rate from mm/s to degrees/s - // i.e., Complete the angular vector in the given time. - const float segment_length = cartesian_mm * inv_segments, - inv_segment_length = 1.0f / segment_length, // 1/mm/segs - inverse_secs = inv_segment_length * _feedrate_mm_s; - - float oldA = planner.position_float[A_AXIS], - oldB = planner.position_float[B_AXIS] - #if ENABLED(DELTA_FEEDRATE_SCALING) - , oldC = planner.position_float[C_AXIS] - #endif - ; - - /* - SERIAL_ECHOPGM("Scaled kinematic move: "); - SERIAL_ECHOPAIR(" segment_length (inv)=", segment_length); - SERIAL_ECHOPAIR(" (", inv_segment_length); - SERIAL_ECHOPAIR(") _feedrate_mm_s=", _feedrate_mm_s); - SERIAL_ECHOPAIR(" inverse_secs=", inverse_secs); - SERIAL_ECHOPAIR(" oldA=", oldA); - SERIAL_ECHOPAIR(" oldB=", oldB); - #if ENABLED(DELTA_FEEDRATE_SCALING) - SERIAL_ECHOPAIR(" oldC=", oldC); - #endif - SERIAL_EOL(); - safe_delay(5); - //*/ - #endif - - // Get the current position as starting point + // Get the current position as starting point float raw[XYZE]; COPY(raw, current_position); @@ -641,78 +611,20 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS }, LOOP_XYZE(i) raw[i] += segment_distance[i]; - #if ENABLED(DELTA) && HOTENDS < 2 - DELTA_IK(raw); // Delta can inline its kinematics - #else - inverse_kinematics(raw); - #endif - ADJUST_DELTA(raw); // Adjust Z if bed leveling is enabled - - #if ENABLED(SCARA_FEEDRATE_SCALING) - // For SCARA scale the feed rate from mm/s to degrees/s - // i.e., Complete the angular vector in the given time. - if (!planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], raw[Z_AXIS], raw[E_AXIS], HYPOT(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB) * inverse_secs, active_extruder, segment_length)) - break; - /* - SERIAL_ECHO(segments); - SERIAL_ECHOPAIR(": X=", raw[X_AXIS]); SERIAL_ECHOPAIR(" Y=", raw[Y_AXIS]); - SERIAL_ECHOPAIR(" A=", delta[A_AXIS]); SERIAL_ECHOPAIR(" B=", delta[B_AXIS]); - SERIAL_ECHOLNPAIR(" F", HYPOT(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB) * inverse_secs * 60); - safe_delay(5); - //*/ - oldA = delta[A_AXIS]; oldB = delta[B_AXIS]; - #elif ENABLED(DELTA_FEEDRATE_SCALING) - // For DELTA scale the feed rate from Effector mm/s to Carriage mm/s - // i.e., Complete the linear vector in the given time. - if (!planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], raw[E_AXIS], SQRT(sq(delta[A_AXIS] - oldA) + sq(delta[B_AXIS] - oldB) + sq(delta[C_AXIS] - oldC)) * inverse_secs, active_extruder, segment_length)) - break; - /* - SERIAL_ECHO(segments); - SERIAL_ECHOPAIR(": X=", raw[X_AXIS]); SERIAL_ECHOPAIR(" Y=", raw[Y_AXIS]); - SERIAL_ECHOPAIR(" A=", delta[A_AXIS]); SERIAL_ECHOPAIR(" B=", delta[B_AXIS]); SERIAL_ECHOPAIR(" C=", delta[C_AXIS]); - SERIAL_ECHOLNPAIR(" F", SQRT(sq(delta[A_AXIS] - oldA) + sq(delta[B_AXIS] - oldB) + sq(delta[C_AXIS] - oldC)) * inverse_secs * 60); - safe_delay(5); - //*/ - oldA = delta[A_AXIS]; oldB = delta[B_AXIS]; oldC = delta[C_AXIS]; - #else - if (!planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], raw[E_AXIS], _feedrate_mm_s, active_extruder, cartesian_segment_mm)) - break; - #endif + if (!planner.buffer_line(raw, _feedrate_mm_s, active_extruder, cartesian_segment_mm + #if ENABLED(SCARA_FEEDRATE_SCALING) + , inv_duration + #endif + )) + break; } // Ensure last segment arrives at target location. - #if HAS_FEEDRATE_SCALING - inverse_kinematics(rtarget); - ADJUST_DELTA(rtarget); - #endif - - #if ENABLED(SCARA_FEEDRATE_SCALING) - const float diff2 = HYPOT2(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB); - if (diff2) { - planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], rtarget[Z_AXIS], rtarget[E_AXIS], SQRT(diff2) * inverse_secs, active_extruder, segment_length); - /* - SERIAL_ECHOPAIR("final: A=", delta[A_AXIS]); SERIAL_ECHOPAIR(" B=", delta[B_AXIS]); - SERIAL_ECHOPAIR(" adiff=", delta[A_AXIS] - oldA); SERIAL_ECHOPAIR(" bdiff=", delta[B_AXIS] - oldB); - SERIAL_ECHOLNPAIR(" F", SQRT(diff2) * inverse_secs * 60); - SERIAL_EOL(); - safe_delay(5); - //*/ - } - #elif ENABLED(DELTA_FEEDRATE_SCALING) - const float diff2 = sq(delta[A_AXIS] - oldA) + sq(delta[B_AXIS] - oldB) + sq(delta[C_AXIS] - oldC); - if (diff2) { - planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], rtarget[E_AXIS], SQRT(diff2) * inverse_secs, active_extruder, segment_length); - /* - SERIAL_ECHOPAIR("final: A=", delta[A_AXIS]); SERIAL_ECHOPAIR(" B=", delta[B_AXIS]); SERIAL_ECHOPAIR(" C=", delta[C_AXIS]); - SERIAL_ECHOPAIR(" adiff=", delta[A_AXIS] - oldA); SERIAL_ECHOPAIR(" bdiff=", delta[B_AXIS] - oldB); SERIAL_ECHOPAIR(" cdiff=", delta[C_AXIS] - oldC); - SERIAL_ECHOLNPAIR(" F", SQRT(diff2) * inverse_secs * 60); - SERIAL_EOL(); - safe_delay(5); - //*/ - } - #else - planner.buffer_line_kinematic(rtarget, _feedrate_mm_s, active_extruder, cartesian_segment_mm); - #endif + planner.buffer_line(rtarget, _feedrate_mm_s, active_extruder, cartesian_segment_mm + #if ENABLED(SCARA_FEEDRATE_SCALING) + , inv_duration + #endif + ); return false; // caller will update current_position } @@ -735,7 +647,7 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS }, // If the move is only in Z/E don't split up the move if (!xdiff && !ydiff) { - planner.buffer_line_kinematic(destination, fr_mm_s, active_extruder); + planner.buffer_line(destination, fr_mm_s, active_extruder); return; } @@ -765,6 +677,10 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS }, ediff * inv_segments }; + #if ENABLED(SCARA_FEEDRATE_SCALING) + const float inv_duration = _feedrate_mm_s / cartesian_segment_mm; + #endif + // SERIAL_ECHOPAIR("mm=", cartesian_mm); // SERIAL_ECHOLNPAIR(" segments=", segments); // SERIAL_ECHOLNPAIR(" segment_mm=", cartesian_segment_mm); @@ -782,13 +698,21 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS }, idle(); } LOOP_XYZE(i) raw[i] += segment_distance[i]; - if (!planner.buffer_line_kinematic(raw, fr_mm_s, active_extruder, cartesian_segment_mm)) + if (!planner.buffer_line(raw, fr_mm_s, active_extruder, cartesian_segment_mm + #if ENABLED(SCARA_FEEDRATE_SCALING) + , inv_duration + #endif + )) break; } // Since segment_distance is only approximate, // the final move must be to the exact destination. - planner.buffer_line_kinematic(destination, fr_mm_s, active_extruder, cartesian_segment_mm); + planner.buffer_line(destination, fr_mm_s, active_extruder, cartesian_segment_mm + #if ENABLED(SCARA_FEEDRATE_SCALING) + , inv_duration + #endif + ); } #endif // SEGMENT_LEVELED_MOVES @@ -836,7 +760,7 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS }, #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) bool extruder_duplication_enabled = false, // Used in Dual X mode 2 & 3 - symmetric_duplication_mode = false; // Used in Dual X mode 2 & 3 + scaled_duplication_mode = false; // Used in Dual X mode 2 & 3 #endif #if ENABLED(DUAL_X_CARRIAGE) @@ -894,8 +818,6 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS }, #define RAISED_Y raised_parked_position[Y_AXIS] #define RAISED_Z raised_parked_position[Z_AXIS] - //SERIAL_ECHOLNPGM("dual_x_carriage_unpark()\n"); - if ( planner.buffer_line(RAISED_X, RAISED_Y, RAISED_Z, CUR_E, planner.max_feedrate_mm_s[Z_AXIS], active_extruder)) if (planner.buffer_line( CUR_X, CUR_Y, RAISED_Z, CUR_E, PLANNER_XY_FEEDRATE(), active_extruder)) planner.buffer_line( CUR_X, CUR_Y, CUR_Z, CUR_E, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); @@ -905,6 +827,7 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS }, if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Clear active_extruder_parked"); #endif break; + case DXC_SCALED_DUPLICATION_MODE: case DXC_DUPLICATION_MODE: if (active_extruder == 0) { #if ENABLED(DEBUG_LEVELING_FEATURE) @@ -915,13 +838,15 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS }, #endif // move duplicate extruder into correct duplication position. planner.set_position_mm(inactive_extruder_x_pos, current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); + if (!planner.buffer_line( - current_position[X_AXIS] + duplicate_extruder_x_offset, - current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], - planner.max_feedrate_mm_s[X_AXIS], 1) + dual_x_carriage_mode == DXC_DUPLICATION_MODE ? duplicate_extruder_x_offset + current_position[X_AXIS] : inactive_extruder_x_pos, + current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], + planner.max_feedrate_mm_s[X_AXIS], 1 + ) ) break; planner.synchronize(); - SYNC_PLAN_POSITION_KINEMATIC(); + sync_plan_position(); extruder_duplication_enabled = true; active_extruder_parked = false; #if ENABLED(DEBUG_LEVELING_FEATURE) @@ -936,6 +861,7 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS }, break; } } + stepper.set_directions(); return false; } @@ -982,9 +908,9 @@ void prepare_move_to_destination() { if ( #if UBL_SEGMENTED -// ubl.prepare_segmented_line_to(destination, MMS_SCALED(feedrate_mm_s)) // This does not seem to work correctly on UBL. - #if ENABLED(DELTA) // A Delta case and a Cartesian case can work - ubl.prepare_segmented_line_to(destination, MMS_SCALED(feedrate_mm_s)) // around the problem until it is fixed. + //ubl.prepare_segmented_line_to(destination, MMS_SCALED(feedrate_mm_s)) // This doesn't seem to work correctly on UBL. + #if IS_KINEMATIC // Use Kinematic / Cartesian cases as a workaround for now. + ubl.prepare_segmented_line_to(destination, MMS_SCALED(feedrate_mm_s)) #else prepare_move_to_destination_cartesian() #endif @@ -1091,7 +1017,7 @@ inline float get_homing_bump_feedrate(const AxisEnum axis) { /** * Home an individual linear axis */ -static void do_homing_move(const AxisEnum axis, const float distance, const float fr_mm_s=0.0) { +void do_homing_move(const AxisEnum axis, const float distance, const float fr_mm_s=0.0) { #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) { @@ -1138,18 +1064,29 @@ static void do_homing_move(const AxisEnum axis, const float distance, const floa #endif } - // Tell the planner the axis is at 0 - current_position[axis] = 0; - #if IS_SCARA - SYNC_PLAN_POSITION_KINEMATIC(); + // Tell the planner the axis is at 0 + current_position[axis] = 0; + sync_plan_position(); current_position[axis] = distance; - inverse_kinematics(current_position); - planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], current_position[E_AXIS], fr_mm_s ? fr_mm_s : homing_feedrate(axis), active_extruder); + planner.buffer_line(current_position, fr_mm_s ? fr_mm_s : homing_feedrate(axis), active_extruder); #else - sync_plan_position(); - current_position[axis] = distance; // Set delta/cartesian axes directly - planner.buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], fr_mm_s ? fr_mm_s : homing_feedrate(axis), active_extruder); + float target[ABCE] = { planner.get_axis_position_mm(A_AXIS), planner.get_axis_position_mm(B_AXIS), planner.get_axis_position_mm(C_AXIS), planner.get_axis_position_mm(E_AXIS) }; + target[axis] = 0; + planner.set_machine_position_mm(target); + target[axis] = distance; + + #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) + const float delta_mm_cart[XYZE] = {0, 0, 0, 0}; + #endif + + // Set delta/cartesian axes directly + planner.buffer_segment(target + #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) + , delta_mm_cart + #endif + , fr_mm_s ? fr_mm_s : homing_feedrate(axis), active_extruder + ); #endif planner.synchronize(); @@ -1312,7 +1249,7 @@ void homeaxis(const AxisEnum axis) { #endif // Set flags for X, Y, Z motor locking - #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || Z_MULTI_ENDSTOPS switch (axis) { #if ENABLED(X_DUAL_ENDSTOPS) case X_AXIS: @@ -1323,7 +1260,17 @@ void homeaxis(const AxisEnum axis) { #if ENABLED(Z_DUAL_ENDSTOPS) case Z_AXIS: #endif - stepper.set_homing_dual_axis(true); + stepper.set_separate_multi_axis(true); + default: break; + } + #endif + + #if ENABLED(Z_TRIPLE_ENDSTOPS) + switch (axis) { + #if ENABLED(Z_TRIPLE_ENDSTOPS) + case Z_AXIS: + #endif + stepper.set_separate_multi_axis(true); default: break; } #endif @@ -1338,7 +1285,14 @@ void homeaxis(const AxisEnum axis) { if (axis == Z_AXIS && set_bltouch_deployed(true)) return; #endif - do_homing_move(axis, 1.5f * max_length(axis) * axis_home_dir); + do_homing_move(axis, 1.5f * max_length( + #if ENABLED(DELTA) + Z_AXIS + #else + axis + #endif + ) * axis_home_dir + ); #if HOMING_Z_WITH_PROBE && ENABLED(BLTOUCH) // BLTOUCH needs to be stowed after trigger to rearm itself @@ -1383,13 +1337,13 @@ void homeaxis(const AxisEnum axis) { #endif } - #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || Z_MULTI_ENDSTOPS const bool pos_dir = axis_home_dir > 0; #if ENABLED(X_DUAL_ENDSTOPS) if (axis == X_AXIS) { - const float adj = ABS(endstops.x_endstop_adj); + const float adj = ABS(endstops.x2_endstop_adj); if (adj) { - if (pos_dir ? (endstops.x_endstop_adj > 0) : (endstops.x_endstop_adj < 0)) stepper.set_x_lock(true); else stepper.set_x2_lock(true); + if (pos_dir ? (endstops.x2_endstop_adj > 0) : (endstops.x2_endstop_adj < 0)) stepper.set_x_lock(true); else stepper.set_x2_lock(true); do_homing_move(axis, pos_dir ? -adj : adj); stepper.set_x_lock(false); stepper.set_x2_lock(false); @@ -1398,9 +1352,9 @@ void homeaxis(const AxisEnum axis) { #endif #if ENABLED(Y_DUAL_ENDSTOPS) if (axis == Y_AXIS) { - const float adj = ABS(endstops.y_endstop_adj); + const float adj = ABS(endstops.y2_endstop_adj); if (adj) { - if (pos_dir ? (endstops.y_endstop_adj > 0) : (endstops.y_endstop_adj < 0)) stepper.set_y_lock(true); else stepper.set_y2_lock(true); + if (pos_dir ? (endstops.y2_endstop_adj > 0) : (endstops.y2_endstop_adj < 0)) stepper.set_y_lock(true); else stepper.set_y2_lock(true); do_homing_move(axis, pos_dir ? -adj : adj); stepper.set_y_lock(false); stepper.set_y2_lock(false); @@ -1409,22 +1363,68 @@ void homeaxis(const AxisEnum axis) { #endif #if ENABLED(Z_DUAL_ENDSTOPS) if (axis == Z_AXIS) { - const float adj = ABS(endstops.z_endstop_adj); + const float adj = ABS(endstops.z2_endstop_adj); if (adj) { - if (pos_dir ? (endstops.z_endstop_adj > 0) : (endstops.z_endstop_adj < 0)) stepper.set_z_lock(true); else stepper.set_z2_lock(true); + if (pos_dir ? (endstops.z2_endstop_adj > 0) : (endstops.z2_endstop_adj < 0)) stepper.set_z_lock(true); else stepper.set_z2_lock(true); do_homing_move(axis, pos_dir ? -adj : adj); stepper.set_z_lock(false); stepper.set_z2_lock(false); } } #endif - stepper.set_homing_dual_axis(false); + #if ENABLED(Z_TRIPLE_ENDSTOPS) + if (axis == Z_AXIS) { + // we push the function pointers for the stepper lock function into an array + void (*lock[3]) (bool)= {&stepper.set_z_lock, &stepper.set_z2_lock, &stepper.set_z3_lock}; + float adj[3] = {0, endstops.z2_endstop_adj, endstops.z3_endstop_adj}; + + void (*tempLock) (bool); + float tempAdj; + + // manual bubble sort by adjust value + if (adj[1] < adj[0]) { + tempLock = lock[0], tempAdj = adj[0]; + lock[0] = lock[1], adj[0] = adj[1]; + lock[1] = tempLock, adj[1] = tempAdj; + } + if (adj[2] < adj[1]) { + tempLock = lock[1], tempAdj = adj[1]; + lock[1] = lock[2], adj[1] = adj[2]; + lock[2] = tempLock, adj[2] = tempAdj; + } + if (adj[1] < adj[0]) { + tempLock = lock[0], tempAdj = adj[0]; + lock[0] = lock[1], adj[0] = adj[1]; + lock[1] = tempLock, adj[1] = tempAdj; + } + + if (pos_dir) { + // normalize adj to smallest value and do the first move + (*lock[0])(true); + do_homing_move(axis, adj[1] - adj[0]); + // lock the second stepper for the final correction + (*lock[1])(true); + do_homing_move(axis, adj[2] - adj[1]); + } + else { + (*lock[2])(true); + do_homing_move(axis, adj[1] - adj[2]); + (*lock[1])(true); + do_homing_move(axis, adj[0] - adj[1]); + } + + stepper.set_z_lock(false); + stepper.set_z2_lock(false); + stepper.set_z3_lock(false); + } + #endif + #endif #if IS_SCARA set_axis_is_at_home(axis); - SYNC_PLAN_POSITION_KINEMATIC(); + sync_plan_position(); #elif ENABLED(DELTA) @@ -1462,7 +1462,7 @@ void homeaxis(const AxisEnum axis) { // Clear retracted status if homing the Z axis #if ENABLED(FWRETRACT) - if (axis == Z_AXIS) fwretract.hop_amount = 0.0; + if (axis == Z_AXIS) fwretract.current_hop = 0.0; #endif #if ENABLED(DEBUG_LEVELING_FEATURE) @@ -1501,7 +1501,7 @@ void homeaxis(const AxisEnum axis) { soft_endstop_min[X_AXIS] = X2_MIN_POS; soft_endstop_max[X_AXIS] = dual_max_x; } - else if (dual_x_carriage_mode == DXC_DUPLICATION_MODE) { + else if (dxc_is_duplicating()) { // In Duplication Mode, T0 can move as far left as X_MIN_POS // but not so far to the right that T1 would move past the end soft_endstop_min[X_AXIS] = base_min_pos(X_AXIS); diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 5bceeaded400..1b4f727c8e77 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -76,7 +76,12 @@ extern float feedrate_mm_s; extern int16_t feedrate_percentage; #define MMS_SCALED(MM_S) ((MM_S)*feedrate_percentage*0.01f) -extern uint8_t active_extruder; +// The active extruder (tool). Set with T command. +#if EXTRUDERS > 1 + extern uint8_t active_extruder; +#else + constexpr uint8_t active_extruder = 0; +#endif #if HAS_HOTEND_OFFSET extern float hotend_offset[XYZ][HOTENDS]; @@ -124,13 +129,6 @@ void set_current_from_steppers_for_axis(const AxisEnum axis); void sync_plan_position(); void sync_plan_position_e(); -#if IS_KINEMATIC - void sync_plan_position_kinematic(); - #define SYNC_PLAN_POSITION_KINEMATIC() sync_plan_position_kinematic() -#else - #define SYNC_PLAN_POSITION_KINEMATIC() sync_plan_position() -#endif - /** * Move the planner to the current position from wherever it last moved * (or from wherever it has been told it is located). @@ -307,7 +305,7 @@ void homeaxis(const AxisEnum axis); */ #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) extern bool extruder_duplication_enabled, // Used in Dual X mode 2 - symmetric_duplication_mode; // Used in Dual X mode 2 + scaled_duplication_mode; // Used in Dual X mode 3 #endif /** @@ -316,9 +314,10 @@ void homeaxis(const AxisEnum axis); #if ENABLED(DUAL_X_CARRIAGE) enum DualXMode : char { - DXC_FULL_CONTROL_MODE, // DUAL_X_CARRIAGE only - DXC_AUTO_PARK_MODE, // DUAL_X_CARRIAGE only - DXC_DUPLICATION_MODE + DXC_FULL_CONTROL_MODE, + DXC_AUTO_PARK_MODE, + DXC_DUPLICATION_MODE, + DXC_SCALED_DUPLICATION_MODE }; extern DualXMode dual_x_carriage_mode; @@ -329,6 +328,8 @@ void homeaxis(const AxisEnum axis); extern millis_t delayed_move_time; // used in mode 1 extern int16_t duplicate_extruder_temp_offset; // used in mode 2 & 3 + FORCE_INLINE bool dxc_is_duplicating() { return dual_x_carriage_mode >= DXC_DUPLICATION_MODE; } + float x_home_pos(const int extruder); FORCE_INLINE int x_home_dir(const uint8_t extruder) { return extruder ? X2_HOME_DIR : X_HOME_DIR; } @@ -349,20 +350,4 @@ void homeaxis(const AxisEnum axis); void set_home_offset(const AxisEnum axis, const float v); #endif -#if ENABLED(AUTO_BED_LEVELING_BILINEAR) - #if ENABLED(DELTA) - #define ADJUST_DELTA(V) \ - if (planner.leveling_active) { \ - const float zadj = bilinear_z_offset(V); \ - delta[A_AXIS] += zadj; \ - delta[B_AXIS] += zadj; \ - delta[C_AXIS] += zadj; \ - } - #else - #define ADJUST_DELTA(V) if (planner.leveling_active) { delta[Z_AXIS] += bilinear_z_offset(V); } - #endif -#else - #define ADJUST_DELTA(V) NOOP -#endif - #endif // MOTION_H diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 43f7a40a41f4..26a386a5f917 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -133,8 +133,13 @@ float Planner::max_feedrate_mm_s[XYZE_N], // (mm/s) M203 XYZE - Max speeds float Planner::max_e_jerk; #endif #endif -#else - float Planner::max_jerk[XYZE]; // (mm/s^2) M205 XYZE - The largest speed change requiring no acceleration. +#endif +#if HAS_CLASSIC_JERK + #if ENABLED(JUNCTION_DEVIATION) && ENABLED(LIN_ADVANCE) + float Planner::max_jerk[XYZ]; // (mm/s^2) M205 XYZ - The largest speed change requiring no acceleration. + #else + float Planner::max_jerk[XYZE]; // (mm/s^2) M205 XYZE - The largest speed change requiring no acceleration. + #endif #endif #if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) @@ -213,13 +218,17 @@ float Planner::previous_speed[NUM_AXIS], #endif #if ENABLED(LIN_ADVANCE) - float Planner::extruder_advance_K; // Initialized by settings.load() + float Planner::extruder_advance_K[EXTRUDERS]; // Initialized by settings.load() #endif #if HAS_POSITION_FLOAT float Planner::position_float[XYZE]; // Needed for accurate maths. Steps cannot be used! #endif +#if IS_KINEMATIC + float Planner::position_cart[XYZE]; +#endif + #if ENABLED(ULTRA_LCD) volatile uint32_t Planner::block_buffer_runtime_us = 0; #endif @@ -235,6 +244,9 @@ void Planner::init() { #if HAS_POSITION_FLOAT ZERO(position_float); #endif + #if IS_KINEMATIC + ZERO(position_cart); + #endif ZERO(previous_speed); previous_nominal_speed_sqr = 0; #if ABL_PLANAR @@ -1082,7 +1094,7 @@ void Planner::recalculate_trapezoids() { calculate_trapezoid_for_block(current, current_entry_speed * nomr, next_entry_speed * nomr); #if ENABLED(LIN_ADVANCE) if (current->use_advance_lead) { - const float comp = current->e_D_ratio * extruder_advance_K * axis_steps_per_mm[E_AXIS]; + const float comp = current->e_D_ratio * extruder_advance_K[active_extruder] * axis_steps_per_mm[E_AXIS]; current->max_adv_steps = current_nominal_speed * comp; current->final_adv_steps = next_entry_speed * comp; } @@ -1121,7 +1133,7 @@ void Planner::recalculate_trapezoids() { calculate_trapezoid_for_block(next, next_entry_speed * nomr, float(MINIMUM_PLANNER_SPEED) * nomr); #if ENABLED(LIN_ADVANCE) if (next->use_advance_lead) { - const float comp = next->e_D_ratio * extruder_advance_K * axis_steps_per_mm[E_AXIS]; + const float comp = next->e_D_ratio * extruder_advance_K[active_extruder] * axis_steps_per_mm[E_AXIS]; next->max_adv_steps = next_nominal_speed * comp; next->final_adv_steps = (MINIMUM_PLANNER_SPEED) * comp; } @@ -1354,17 +1366,12 @@ void Planner::check_axes_activity() { } #endif -#if PLANNER_LEVELING || HAS_UBL_AND_CURVES +#if HAS_LEVELING /** * rx, ry, rz - Cartesian positions in mm * Leveled XYZ on completion */ void Planner::apply_leveling(float &rx, float &ry, float &rz) { - - #if ENABLED(SKEW_CORRECTION) - skew(rx, ry, rz); - #endif - if (!leveling_active) return; #if ABL_PLANAR @@ -1406,10 +1413,6 @@ void Planner::check_axes_activity() { #endif } -#endif - -#if PLANNER_LEVELING - void Planner::unapply_leveling(float raw[XYZ]) { if (leveling_active) { @@ -1456,7 +1459,23 @@ void Planner::check_axes_activity() { #endif } -#endif // PLANNER_LEVELING +#endif // HAS_LEVELING + +#if ENABLED(FWRETRACT) + /** + * rz, e - Cartesian positions in mm + */ + void Planner::apply_retract(float &rz, float &e) { + rz += fwretract.current_hop; + e -= fwretract.current_retract[active_extruder]; + } + + void Planner::unapply_retract(float &rz, float &e) { + rz -= fwretract.current_hop; + e += fwretract.current_retract[active_extruder]; + } + +#endif void Planner::quick_stop() { @@ -1539,7 +1558,14 @@ float Planner::get_axis_position_mm(const AxisEnum axis) { /** * Block until all buffered steps are executed / cleaned */ -void Planner::synchronize() { while (has_blocks_queued() || cleaning_buffer_counter) idle(); } +void Planner::synchronize() { + while ( + has_blocks_queued() || cleaning_buffer_counter + #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + || !READ(CLOSED_LOOP_MOVE_COMPLETE_PIN) + #endif + ) idle(); +} /** * Planner::_buffer_steps @@ -1547,6 +1573,7 @@ void Planner::synchronize() { while (has_blocks_queued() || cleaning_buffer_coun * Add a new linear movement to the planner queue (in terms of steps). * * target - target position in steps units + * target_float - target position in direct (mm, degrees) units. optional * fr_mm_s - (target) speed of the move * extruder - target extruder * millimeters - the length of the movement, if known @@ -1555,7 +1582,10 @@ void Planner::synchronize() { while (has_blocks_queued() || cleaning_buffer_coun */ bool Planner::_buffer_steps(const int32_t (&target)[XYZE] #if HAS_POSITION_FLOAT - , const float (&target_float)[XYZE] + , const float (&target_float)[ABCE] + #endif + #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) + , const float (&delta_mm_cart)[XYZE] #endif , float fr_mm_s, const uint8_t extruder, const float &millimeters ) { @@ -1572,6 +1602,9 @@ bool Planner::_buffer_steps(const int32_t (&target)[XYZE] #if HAS_POSITION_FLOAT , target_float #endif + #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) + , delta_mm_cart + #endif , fr_mm_s, extruder, millimeters )) { // Movement was not queued, probably because it was too short. @@ -1611,9 +1644,12 @@ bool Planner::_buffer_steps(const int32_t (&target)[XYZE] * Returns true is movement is acceptable, false otherwise */ bool Planner::_populate_block(block_t * const block, bool split_move, - const int32_t (&target)[XYZE] + const int32_t (&target)[ABCE] #if HAS_POSITION_FLOAT - , const float (&target_float)[XYZE] + , const float (&target_float)[ABCE] + #endif + #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) + , const float (&delta_mm_cart)[XYZE] #endif , float fr_mm_s, const uint8_t extruder, const float &millimeters/*=0.0*/ ) { @@ -1752,7 +1788,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move, block->e_to_p_pressure = baricuda_e_to_p_pressure; #endif - block->active_extruder = extruder; + #if EXTRUDERS > 1 + block->active_extruder = extruder; + #endif #if ENABLED(AUTO_POWER_CONTROL) if (block->steps[X_AXIS] || block->steps[Y_AXIS] || block->steps[Z_AXIS]) @@ -1811,6 +1849,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move, DISABLE_IDLE_E(3); #if EXTRUDERS > 4 DISABLE_IDLE_E(4); + #if EXTRUDERS > 5 + DISABLE_IDLE_E(5); + #endif // EXTRUDERS > 5 #endif // EXTRUDERS > 4 #endif // EXTRUDERS > 3 #endif // EXTRUDERS > 2 @@ -1833,6 +1874,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move, DISABLE_IDLE_E(3); #if EXTRUDERS > 4 DISABLE_IDLE_E(4); + #if EXTRUDERS > 5 + DISABLE_IDLE_E(5); + #endif // EXTRUDERS > 5 #endif // EXTRUDERS > 4 #endif // EXTRUDERS > 3 #endif // EXTRUDERS > 2 @@ -1847,6 +1891,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move, DISABLE_IDLE_E(3); #if EXTRUDERS > 4 DISABLE_IDLE_E(4); + #if EXTRUDERS > 5 + DISABLE_IDLE_E(5); + #endif #endif #endif enable_E2(); @@ -1859,6 +1906,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move, DISABLE_IDLE_E(2); #if EXTRUDERS > 4 DISABLE_IDLE_E(4); + #if EXTRUDERS > 5 + DISABLE_IDLE_E(5); + #endif #endif enable_E3(); g_uc_extruder_last_move[3] = (BLOCK_BUFFER_SIZE) * 2; @@ -1869,9 +1919,23 @@ bool Planner::_populate_block(block_t * const block, bool split_move, DISABLE_IDLE_E(1); DISABLE_IDLE_E(2); DISABLE_IDLE_E(3); + #if EXTRUDERS > 5 + DISABLE_IDLE_E(5); + #endif enable_E4(); g_uc_extruder_last_move[4] = (BLOCK_BUFFER_SIZE) * 2; break; + #if EXTRUDERS > 5 + case 5: + DISABLE_IDLE_E(0); + DISABLE_IDLE_E(1); + DISABLE_IDLE_E(2); + DISABLE_IDLE_E(3); + DISABLE_IDLE_E(4); + enable_E5(); + g_uc_extruder_last_move[5] = (BLOCK_BUFFER_SIZE) * 2; + break; + #endif // EXTRUDERS > 5 #endif // EXTRUDERS > 4 #endif // EXTRUDERS > 3 #endif // EXTRUDERS > 2 @@ -1883,6 +1947,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, enable_E2(); enable_E3(); enable_E4(); + enable_E5(); #endif } @@ -2123,12 +2188,12 @@ bool Planner::_populate_block(block_t * const block, bool split_move, * * esteps : This is a print move, because we checked for A, B, C steps before. * - * extruder_advance_K : There is an advance factor set. + * extruder_advance_K[active_extruder] : There is an advance factor set for this extruder. * * de > 0 : Extruder is running forward (e.g., for "Wipe while retracting" (Slic3r) or "Combing" (Cura) moves) */ block->use_advance_lead = esteps - && extruder_advance_K + && extruder_advance_K[active_extruder] && de > 0; if (block->use_advance_lead) { @@ -2147,7 +2212,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, if (block->e_D_ratio > 3.0f) block->use_advance_lead = false; else { - const uint32_t max_accel_steps_per_s2 = MAX_E_JERK / (extruder_advance_K * block->e_D_ratio) * steps_per_mm; + const uint32_t max_accel_steps_per_s2 = MAX_E_JERK / (extruder_advance_K[active_extruder] * block->e_D_ratio) * steps_per_mm; #if ENABLED(LA_DEBUG) if (accel > max_accel_steps_per_s2) SERIAL_ECHOLNPGM("Acceleration limited."); #endif @@ -2183,9 +2248,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move, #endif #if ENABLED(LIN_ADVANCE) if (block->use_advance_lead) { - block->advance_speed = (STEPPER_TIMER_RATE) / (extruder_advance_K * block->e_D_ratio * block->acceleration * axis_steps_per_mm[E_AXIS_N]); + block->advance_speed = (STEPPER_TIMER_RATE) / (extruder_advance_K[active_extruder] * block->e_D_ratio * block->acceleration * axis_steps_per_mm[E_AXIS_N]); #if ENABLED(LA_DEBUG) - if (extruder_advance_K * block->e_D_ratio * block->acceleration * 2 < SQRT(block->nominal_speed_sqr) * block->e_D_ratio) + if (extruder_advance_K[active_extruder] * block->e_D_ratio * block->acceleration * 2 < SQRT(block->nominal_speed_sqr) * block->e_D_ratio) SERIAL_ECHOLNPGM("More than 2 steps per eISR loop executed."); if (block->advance_speed < 200) SERIAL_ECHOLNPGM("eISR running at > 10kHz."); @@ -2234,12 +2299,21 @@ bool Planner::_populate_block(block_t * const block, bool split_move, // Unit vector of previous path line segment static float previous_unit_vec[XYZE]; - float unit_vec[] = { - delta_mm[A_AXIS] * inverse_millimeters, - delta_mm[B_AXIS] * inverse_millimeters, - delta_mm[C_AXIS] * inverse_millimeters, - delta_mm[E_AXIS] * inverse_millimeters - }; + #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) + float unit_vec[] = { + delta_mm_cart[X_AXIS] * inverse_millimeters, + delta_mm_cart[Y_AXIS] * inverse_millimeters, + delta_mm_cart[Z_AXIS] * inverse_millimeters, + delta_mm_cart[E_AXIS] * inverse_millimeters + }; + #else + float unit_vec[] = { + delta_mm[X_AXIS] * inverse_millimeters, + delta_mm[Y_AXIS] * inverse_millimeters, + delta_mm[Z_AXIS] * inverse_millimeters, + delta_mm[E_AXIS] * inverse_millimeters + }; + #endif // Skip first block or when previous_nominal_speed is used as a flag for homing and offset cycles. if (moves_queued && !UNEAR_ZERO(previous_nominal_speed_sqr)) { @@ -2293,7 +2367,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move, COPY(previous_unit_vec, unit_vec); - #else // Classic Jerk Limiting + #endif + + #if HAS_CLASSIC_JERK /** * Adapted from Průša MKS firmware @@ -2308,7 +2384,12 @@ bool Planner::_populate_block(block_t * const block, bool split_move, float safe_speed = nominal_speed; uint8_t limited = 0; - LOOP_XYZE(i) { + #if ENABLED(JUNCTION_DEVIATION) && ENABLED(LIN_ADVANCE) + LOOP_XYZ(i) + #else + LOOP_XYZE(i) + #endif + { const float jerk = ABS(current_speed[i]), // cs : Starting from zero, change in speed for this axis maxj = max_jerk[i]; // mj : The max jerk setting for this axis if (jerk > maxj) { // cs > mj : New current speed too fast? @@ -2340,7 +2421,12 @@ bool Planner::_populate_block(block_t * const block, bool split_move, // Now limit the jerk in all axes. const float smaller_speed_factor = vmax_junction / previous_nominal_speed; - LOOP_XYZE(axis) { + #if ENABLED(JUNCTION_DEVIATION) && ENABLED(LIN_ADVANCE) + LOOP_XYZ(axis) + #else + LOOP_XYZE(axis) + #endif + { // Limit an axis. We have to differentiate: coasting, reversal of an axis, full stop. float v_exit = previous_speed[axis] * smaller_speed_factor, v_entry = current_speed[axis]; @@ -2372,7 +2458,12 @@ bool Planner::_populate_block(block_t * const block, bool split_move, vmax_junction = safe_speed; previous_safe_speed = safe_speed; - vmax_junction_sqr = sq(vmax_junction); + + #if ENABLED(JUNCTION_DEVIATION) + vmax_junction_sqr = MIN(vmax_junction_sqr, sq(vmax_junction)); + #else + vmax_junction_sqr = sq(vmax_junction); + #endif #endif // Classic Jerk Limiting @@ -2457,7 +2548,12 @@ void Planner::buffer_sync_block() { * extruder - target extruder * millimeters - the length of the movement, if known */ -bool Planner::buffer_segment(const float &a, const float &b, const float &c, const float &e, const float &fr_mm_s, const uint8_t extruder, const float &millimeters/*=0.0*/) { +bool Planner::buffer_segment(const float &a, const float &b, const float &c, const float &e + #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) + , const float (&delta_mm_cart)[XYZE] + #endif + , const float &fr_mm_s, const uint8_t extruder, const float &millimeters/*=0.0*/ +) { // If we are cleaning, do not accept queuing of movements if (cleaning_buffer_counter) return false; @@ -2525,6 +2621,9 @@ bool Planner::buffer_segment(const float &a, const float &b, const float &c, con #if HAS_POSITION_FLOAT , target_float #endif + #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) + , delta_mm_cart + #endif , fr_mm_s, extruder, millimeters ) ) return false; @@ -2534,24 +2633,84 @@ bool Planner::buffer_segment(const float &a, const float &b, const float &c, con } // buffer_segment() /** - * Directly set the planner XYZ position (and stepper positions) + * Add a new linear movement to the buffer. + * The target is cartesian, it's translated to delta/scara if + * needed. + * + * + * rx,ry,rz,e - target position in mm or degrees + * fr_mm_s - (target) speed of the move (mm/s) + * extruder - target extruder + * millimeters - the length of the movement, if known + * inv_duration - the reciprocal if the duration of the movement, if known (kinematic only if feeedrate scaling is enabled) + */ +bool Planner::buffer_line(const float &rx, const float &ry, const float &rz, const float &e, const float &fr_mm_s, const uint8_t extruder, const float millimeters + #if ENABLED(SCARA_FEEDRATE_SCALING) + , const float &inv_duration + #endif +) { + float raw[XYZE] = { rx, ry, rz, e }; + #if HAS_POSITION_MODIFIERS + apply_modifiers(raw); + #endif + + #if IS_KINEMATIC + const float delta_mm_cart[] = { + rx - position_cart[X_AXIS], + ry - position_cart[Y_AXIS], + rz - position_cart[Z_AXIS] + #if ENABLED(JUNCTION_DEVIATION) + , e - position_cart[E_AXIS] + #endif + }; + + float mm = millimeters; + if (mm == 0.0) + mm = (delta_mm_cart[X_AXIS] != 0.0 || delta_mm_cart[Y_AXIS] != 0.0) ? SQRT(sq(delta_mm_cart[X_AXIS]) + sq(delta_mm_cart[Y_AXIS]) + sq(delta_mm_cart[Z_AXIS])) : ABS(delta_mm_cart[Z_AXIS]); + + inverse_kinematics(raw); + + #if ENABLED(SCARA_FEEDRATE_SCALING) + // For SCARA scale the feed rate from mm/s to degrees/s + // i.e., Complete the angular vector in the given time. + const float duration_recip = inv_duration ? inv_duration : fr_mm_s / mm, + feedrate = HYPOT(delta[A_AXIS] - position_float[A_AXIS], delta[B_AXIS] - position_float[B_AXIS]) * duration_recip; + #else + const float feedrate = fr_mm_s; + #endif + if (buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], raw[E_AXIS] + #if ENABLED(JUNCTION_DEVIATION) + , delta_mm_cart + #endif + , feedrate, extruder, mm + )) { + position_cart[X_AXIS] = rx; + position_cart[Y_AXIS] = ry; + position_cart[Z_AXIS] = rz; + position_cart[E_AXIS] = e; + return true; + } + else + return false; + #else + return buffer_segment(raw, fr_mm_s, extruder, millimeters); + #endif +} // buffer_line() + +/** + * Directly set the planner ABC position (and stepper positions) * converting mm (or angles for SCARA) into steps. * - * On CORE machines stepper ABC will be translated from the given XYZ. + * The provided ABC position is in machine units. */ -void Planner::_set_position_mm(const float &a, const float &b, const float &c, const float &e) { +void Planner::set_machine_position_mm(const float &a, const float &b, const float &c, const float &e) { #if ENABLED(DISTINCT_E_FACTORS) last_extruder = active_extruder; #endif position[A_AXIS] = LROUND(a * axis_steps_per_mm[A_AXIS]); position[B_AXIS] = LROUND(b * axis_steps_per_mm[B_AXIS]); - position[C_AXIS] = LROUND(axis_steps_per_mm[C_AXIS] * (c +( - #if !IS_KINEMATIC && ENABLED(AUTO_BED_LEVELING_UBL) - leveling_active ? ubl.get_z_correction(a, b) : - #endif - 0) - )); + position[C_AXIS] = LROUND(c * axis_steps_per_mm[C_AXIS]); position[E_AXIS] = LROUND(e * axis_steps_per_mm[_EINDEX]); #if HAS_POSITION_FLOAT position_float[A_AXIS] = a; @@ -2568,44 +2727,54 @@ void Planner::_set_position_mm(const float &a, const float &b, const float &c, c stepper.set_position(position[A_AXIS], position[B_AXIS], position[C_AXIS], position[E_AXIS]); } -void Planner::set_position_mm_kinematic(const float (&cart)[XYZE]) { - #if PLANNER_LEVELING - float raw[XYZ] = { cart[X_AXIS], cart[Y_AXIS], cart[Z_AXIS] }; - apply_leveling(raw); - #else - const float (&raw)[XYZE] = cart; +void Planner::set_position_mm(const float &rx, const float &ry, const float &rz, const float &e) { + float raw[XYZE] = { rx, ry, rz, e }; + #if HAS_POSITION_MODIFIERS + apply_modifiers(raw + #if HAS_LEVELING + , true + #endif + ); #endif #if IS_KINEMATIC + position_cart[X_AXIS] = rx; + position_cart[Y_AXIS] = ry; + position_cart[Z_AXIS] = rz; + position_cart[E_AXIS] = e; + inverse_kinematics(raw); - _set_position_mm(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], cart[E_AXIS]); + set_machine_position_mm(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], raw[E_AXIS]); #else - _set_position_mm(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS], cart[E_AXIS]); + set_machine_position_mm(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS], raw[E_AXIS]); #endif } /** * Setters for planner position (also setting stepper position). */ -void Planner::set_position_mm(const AxisEnum axis, const float &v) { +void Planner::set_e_position_mm(const float &e) { #if ENABLED(DISTINCT_E_FACTORS) - const uint8_t axis_index = axis + (axis == E_AXIS ? active_extruder : 0); + const uint8_t axis_index = E_AXIS + active_extruder; last_extruder = active_extruder; #else - const uint8_t axis_index = axis; + const uint8_t axis_index = E_AXIS; #endif - position[axis] = LROUND(axis_steps_per_mm[axis_index] * (v + ( - #if ENABLED(AUTO_BED_LEVELING_UBL) - axis == Z_AXIS && leveling_active ? ubl.get_z_correction(current_position[X_AXIS], current_position[Y_AXIS]) : - #endif - 0) - )); + #if ENABLED(FWRETRACT) + float e_new = e - fwretract.current_retract[active_extruder]; + #else + const float e_new = e; + #endif + position[E_AXIS] = LROUND(axis_steps_per_mm[axis_index] * e_new); #if HAS_POSITION_FLOAT - position_float[axis] = v; + position_float[E_AXIS] = e_new; + #endif + #if IS_KINEMATIC + position_cart[E_AXIS] = e; #endif if (has_blocks_queued()) buffer_sync_block(); else - stepper.set_position(axis, position[axis]); + stepper.set_position(E_AXIS, position[E_AXIS]); } // Recalculate the steps/s^2 acceleration rates, based on the mm/s^2 @@ -2629,7 +2798,7 @@ void Planner::reset_acceleration_rates() { // Recalculate position, steps_to_mm if axis_steps_per_mm changes! void Planner::refresh_positioning() { LOOP_XYZE_N(i) steps_to_mm[i] = 1.0f / axis_steps_per_mm[i]; - set_position_mm_kinematic(current_position); + set_position_mm(current_position); reset_acceleration_rates(); } diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index 8a639a0431bb..acdfbd816c60 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -45,6 +45,10 @@ #include "../libs/vector_3.h" #endif +#if ENABLED(FWRETRACT) + #include "../feature/fwretract.h" +#endif + enum BlockFlagBit : char { // Recalculate trapezoids on entry junction. For optimization. BLOCK_BIT_RECALCULATE, @@ -101,7 +105,9 @@ typedef struct { }; uint32_t step_event_count; // The number of step events required to complete this block - uint8_t active_extruder; // The extruder to move (if E move) + #if EXTRUDERS > 1 + uint8_t active_extruder; // The extruder to move (if E move) + #endif #if ENABLED(MIXING_EXTRUDER) uint32_t mix_steps[MIXING_STEPPERS]; // Scaled steps[E_AXIS] for the mixing steppers @@ -149,7 +155,7 @@ typedef struct { } block_t; -#define HAS_POSITION_FLOAT (ENABLED(LIN_ADVANCE) || HAS_FEEDRATE_SCALING) +#define HAS_POSITION_FLOAT (ENABLED(LIN_ADVANCE) || ENABLED(SCARA_FEEDRATE_SCALING)) #define BLOCK_MOD(n) ((n)&(BLOCK_BUFFER_SIZE-1)) @@ -208,14 +214,22 @@ class Planner { #if ENABLED(JUNCTION_DEVIATION) static float junction_deviation_mm; // (mm) M205 J #if ENABLED(LIN_ADVANCE) - #if ENABLED(DISTINCT_E_FACTORS) - static float max_e_jerk[EXTRUDERS]; // Calculated from junction_deviation_mm + static float max_e_jerk // Calculated from junction_deviation_mm + #if ENABLED(DISTINCT_E_FACTORS) + [EXTRUDERS] + #endif + ; + #endif + #endif + + #if HAS_CLASSIC_JERK + static float max_jerk[ + #if ENABLED(JUNCTION_DEVIATION) && ENABLED(LIN_ADVANCE) + XYZ // (mm/s^2) M205 XYZ - The largest speed change requiring no acceleration. #else - static float max_e_jerk; + XYZE // (mm/s^2) M205 XYZE - The largest speed change requiring no acceleration. #endif - #endif - #else - static float max_jerk[XYZE]; // (mm/s^2) M205 XYZE - The largest speed change requiring no acceleration. + ]; #endif #if HAS_LEVELING @@ -231,13 +245,17 @@ class Planner { #endif #if ENABLED(LIN_ADVANCE) - static float extruder_advance_K; + static float extruder_advance_K[EXTRUDERS]; #endif #if HAS_POSITION_FLOAT static float position_float[XYZE]; #endif + #if IS_KINEMATIC + static float position_cart[XYZE]; + #endif + #if ENABLED(SKEW_CORRECTION) #if ENABLED(SKEW_CORRECTION_GCODE) static float xy_skew_factor; @@ -408,6 +426,8 @@ class Planner { } } } + FORCE_INLINE static void skew(float (&raw)[XYZ]) { skew(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); } + FORCE_INLINE static void skew(float (&raw)[XYZE]) { skew(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); } FORCE_INLINE static void unskew(float &cx, float &cy, const float &cz) { if (WITHIN(cx, X_MIN_POS, X_MAX_POS) && WITHIN(cy, Y_MIN_POS, Y_MAX_POS)) { @@ -418,29 +438,76 @@ class Planner { } } } + FORCE_INLINE static void unskew(float (&raw)[XYZ]) { unskew(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); } + FORCE_INLINE static void unskew(float (&raw)[XYZE]) { unskew(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); } #endif // SKEW_CORRECTION - #if PLANNER_LEVELING || HAS_UBL_AND_CURVES + #if HAS_LEVELING /** * Apply leveling to transform a cartesian position * as it will be given to the planner and steppers. */ static void apply_leveling(float &rx, float &ry, float &rz); FORCE_INLINE static void apply_leveling(float (&raw)[XYZ]) { apply_leveling(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); } - #endif + FORCE_INLINE static void apply_leveling(float (&raw)[XYZE]) { apply_leveling(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); } - #if PLANNER_LEVELING - #define ARG_X float rx - #define ARG_Y float ry - #define ARG_Z float rz static void unapply_leveling(float raw[XYZ]); - #else - #define ARG_X const float &rx - #define ARG_Y const float &ry - #define ARG_Z const float &rz #endif + #if ENABLED(FWRETRACT) + static void apply_retract(float &rz, float &e); + FORCE_INLINE static void apply_retract(float (&raw)[XYZE]) { apply_retract(raw[Z_AXIS], raw[E_AXIS]); } + static void unapply_retract(float &rz, float &e); + FORCE_INLINE static void unapply_retract(float (&raw)[XYZE]) { unapply_retract(raw[Z_AXIS], raw[E_AXIS]); } + #endif + + #if HAS_POSITION_MODIFIERS + FORCE_INLINE static void apply_modifiers(float (&pos)[XYZE] + #if HAS_LEVELING + , bool leveling = + #if PLANNER_LEVELING + true + #else + false + #endif + #endif + ) { + #if ENABLED(SKEW_CORRECTION) + skew(pos); + #endif + #if HAS_LEVELING + if (leveling) + apply_leveling(pos); + #endif + #if ENABLED(FWRETRACT) + apply_retract(pos); + #endif + } + + FORCE_INLINE static void unapply_modifiers(float (&pos)[XYZE] + #if HAS_LEVELING + , bool leveling = + #if PLANNER_LEVELING + true + #else + false + #endif + #endif + ) { + #if ENABLED(FWRETRACT) + unapply_retract(pos); + #endif + #if HAS_LEVELING + if (leveling) + unapply_leveling(pos); + #endif + #if ENABLED(SKEW_CORRECTION) + unskew(pos); + #endif + } + #endif // HAS_POSITION_MODIFIERS + // Number of moves currently in the planner including the busy block, if any FORCE_INLINE static uint8_t movesplanned() { return BLOCK_MOD(block_buffer_head - block_buffer_tail); } @@ -487,7 +554,10 @@ class Planner { */ static bool _buffer_steps(const int32_t (&target)[XYZE] #if HAS_POSITION_FLOAT - , const float (&target_float)[XYZE] + , const float (&target_float)[ABCE] + #endif + #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) + , const float (&delta_mm_cart)[XYZE] #endif , float fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 ); @@ -509,6 +579,9 @@ class Planner { #if HAS_POSITION_FLOAT , const float (&target_float)[XYZE] #endif + #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) + , const float (&delta_mm_cart)[XYZE] + #endif , float fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 ); @@ -518,6 +591,13 @@ class Planner { */ static void buffer_sync_block(); + #if IS_KINEMATIC + private: + + // Allow do_homing_move to access internal functions, such as buffer_segment. + friend void do_homing_move(const AxisEnum, const float, const float); + #endif + /** * Planner::buffer_segment * @@ -530,74 +610,83 @@ class Planner { * extruder - target extruder * millimeters - the length of the movement, if known */ - static bool buffer_segment(const float &a, const float &b, const float &c, const float &e, const float &fr_mm_s, const uint8_t extruder, const float &millimeters=0.0); - - static void _set_position_mm(const float &a, const float &b, const float &c, const float &e); + static bool buffer_segment(const float &a, const float &b, const float &c, const float &e + #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) + , const float (&delta_mm_cart)[XYZE] + #endif + , const float &fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 + ); - /** - * Add a new linear movement to the buffer. - * The target is NOT translated to delta/scara - * - * Leveling will be applied to input on cartesians. - * Kinematic machines should call buffer_line_kinematic (for leveled moves). - * (Cartesians may also call buffer_line_kinematic.) - * - * rx,ry,rz,e - target position in mm or degrees - * fr_mm_s - (target) speed of the move (mm/s) - * extruder - target extruder - * millimeters - the length of the movement, if known - */ - FORCE_INLINE static bool buffer_line(ARG_X, ARG_Y, ARG_Z, const float &e, const float &fr_mm_s, const uint8_t extruder, const float millimeters = 0.0) { - #if PLANNER_LEVELING && IS_CARTESIAN - apply_leveling(rx, ry, rz); + FORCE_INLINE static bool buffer_segment(const float (&abce)[ABCE] + #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) + , const float (&delta_mm_cart)[XYZE] #endif - return buffer_segment(rx, ry, rz, e, fr_mm_s, extruder, millimeters); + , const float &fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 + ) { + return buffer_segment(abce[A_AXIS], abce[B_AXIS], abce[C_AXIS], abce[E_AXIS] + #if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION) + , delta_mm_cart + #endif + , fr_mm_s, extruder, millimeters); } + public: + /** * Add a new linear movement to the buffer. * The target is cartesian, it's translated to delta/scara if * needed. * - * cart - x,y,z,e CARTESIAN target in mm + * + * rx,ry,rz,e - target position in mm or degrees * fr_mm_s - (target) speed of the move (mm/s) * extruder - target extruder * millimeters - the length of the movement, if known + * inv_duration - the reciprocal if the duration of the movement, if known (kinematic only if feeedrate scaling is enabled) */ - FORCE_INLINE static bool buffer_line_kinematic(const float (&cart)[XYZE], const float &fr_mm_s, const uint8_t extruder, const float millimeters = 0.0) { - #if PLANNER_LEVELING - float raw[XYZ] = { cart[X_AXIS], cart[Y_AXIS], cart[Z_AXIS] }; - apply_leveling(raw); - #else - const float (&raw)[XYZE] = cart; + static bool buffer_line(const float &rx, const float &ry, const float &rz, const float &e, const float &fr_mm_s, const uint8_t extruder, const float millimeters=0.0 + #if ENABLED(SCARA_FEEDRATE_SCALING) + , const float &inv_duration=0.0 #endif - #if IS_KINEMATIC - inverse_kinematics(raw); - return buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], cart[E_AXIS], fr_mm_s, extruder, millimeters); - #else - return buffer_segment(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS], cart[E_AXIS], fr_mm_s, extruder, millimeters); + ); + + FORCE_INLINE static bool buffer_line(const float (&cart)[XYZE], const float &fr_mm_s, const uint8_t extruder, const float millimeters=0.0 + #if ENABLED(SCARA_FEEDRATE_SCALING) + , const float &inv_duration=0.0 #endif + ) { + return buffer_line(cart[X_AXIS], cart[Y_AXIS], cart[Z_AXIS], cart[E_AXIS], fr_mm_s, extruder, millimeters + #if ENABLED(SCARA_FEEDRATE_SCALING) + , inv_duration + #endif + ); } /** * Set the planner.position and individual stepper positions. * Used by G92, G28, G29, and other procedures. * + * The supplied position is in the cartesian coordinate space and is + * translated in to machine space as needed. Modifiers such as leveling + * and skew are also applied. + * * Multiplies by axis_steps_per_mm[] and does necessary conversion * for COREXY / COREXZ / COREYZ to set the corresponding stepper positions. * * Clears previous speed values. */ - FORCE_INLINE static void set_position_mm(ARG_X, ARG_Y, ARG_Z, const float &e) { - #if PLANNER_LEVELING && IS_CARTESIAN - apply_leveling(rx, ry, rz); - #endif - _set_position_mm(rx, ry, rz, e); - } - static void set_position_mm_kinematic(const float (&cart)[XYZE]); - static void set_position_mm(const AxisEnum axis, const float &v); - FORCE_INLINE static void set_z_position_mm(const float &z) { set_position_mm(Z_AXIS, z); } - FORCE_INLINE static void set_e_position_mm(const float &e) { set_position_mm(E_AXIS, e); } + static void set_position_mm(const float &rx, const float &ry, const float &rz, const float &e); + FORCE_INLINE static void set_position_mm(const float (&cart)[XYZE]) { set_position_mm(cart[X_AXIS], cart[Y_AXIS], cart[Z_AXIS], cart[E_AXIS]); } + static void set_e_position_mm(const float &e); + + /** + * Set the planner.position and individual stepper positions. + * + * The supplied position is in machine space, and no additional + * conversions are applied. + */ + static void set_machine_position_mm(const float &a, const float &b, const float &c, const float &e); + FORCE_INLINE static void set_machine_position_mm(const float (&abce)[ABCE]) { set_machine_position_mm(abce[A_AXIS], abce[B_AXIS], abce[C_AXIS], abce[E_AXIS]); } /** * Get an axis position according to stepper position(s) @@ -754,16 +843,14 @@ class Planner { static void autotemp_M104_M109(); #endif - #if ENABLED(JUNCTION_DEVIATION) + #if ENABLED(JUNCTION_DEVIATION) && ENABLED(LIN_ADVANCE) FORCE_INLINE static void recalculate_max_e_jerk() { #define GET_MAX_E_JERK(N) SQRT(SQRT(0.5) * junction_deviation_mm * (N) * RECIPROCAL(1.0 - SQRT(0.5))) - #if ENABLED(LIN_ADVANCE) - #if ENABLED(DISTINCT_E_FACTORS) - for (uint8_t i = 0; i < EXTRUDERS; i++) - max_e_jerk[i] = GET_MAX_E_JERK(max_acceleration_mm_per_s2[E_AXIS + i]); - #else - max_e_jerk = GET_MAX_E_JERK(max_acceleration_mm_per_s2[E_AXIS]); - #endif + #if ENABLED(DISTINCT_E_FACTORS) + for (uint8_t i = 0; i < EXTRUDERS; i++) + max_e_jerk[i] = GET_MAX_E_JERK(max_acceleration_mm_per_s2[E_AXIS + i]); + #else + max_e_jerk = GET_MAX_E_JERK(max_acceleration_mm_per_s2[E_AXIS]); #endif } #endif diff --git a/Marlin/src/module/planner_bezier.cpp b/Marlin/src/module/planner_bezier.cpp index 6ff6808a79f6..a547e2308620 100644 --- a/Marlin/src/module/planner_bezier.cpp +++ b/Marlin/src/module/planner_bezier.cpp @@ -190,15 +190,15 @@ void cubic_b_spline(const float position[NUM_AXIS], const float target[NUM_AXIS] bez_target[E_AXIS] = interp(position[E_AXIS], target[E_AXIS], t); clamp_to_software_endstops(bez_target); - #if HAS_UBL_AND_CURVES - float pos[XYZ] = { bez_target[X_AXIS], bez_target[Y_AXIS], bez_target[Z_AXIS] }; + #if HAS_LEVELING && !PLANNER_LEVELING + float pos[XYZE] = { bez_target[X_AXIS], bez_target[Y_AXIS], bez_target[Z_AXIS], bez_target[E_AXIS] }; planner.apply_leveling(pos); - if (!planner.buffer_segment(pos[X_AXIS], pos[Y_AXIS], pos[Z_AXIS], bez_target[E_AXIS], fr_mm_s, active_extruder)) - break; #else - if (!planner.buffer_line_kinematic(bez_target, fr_mm_s, extruder)) - break; + const float (&pos)[XYZE] = bez_target; #endif + + if (!planner.buffer_line(pos, fr_mm_s, active_extruder, step)) + break; } } diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index ed2ff0b9aa45..c4d4bc22d4ff 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -537,7 +537,7 @@ static bool do_probe_move(const float z, const float fr_mm_s) { set_current_from_steppers_for_axis(Z_AXIS); // Tell the planner where we actually are - SYNC_PLAN_POSITION_KINEMATIC(); + sync_plan_position(); #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) DEBUG_POS("<<< do_probe_move", current_position); diff --git a/Marlin/src/module/scara.cpp b/Marlin/src/module/scara.cpp index 222bf9cbe49d..225e4a25d8ec 100644 --- a/Marlin/src/module/scara.cpp +++ b/Marlin/src/module/scara.cpp @@ -104,7 +104,7 @@ void forward_kinematics_SCARA(const float &a, const float &b) { * Maths and first version by QHARLEY. * Integrated into Marlin and slightly restructured by Joachim Cerny. */ -void inverse_kinematics(const float raw[XYZ]) { +void inverse_kinematics(const float (&raw)[XYZ]) { static float C2, S2, SK1, SK2, THETA, PSI; diff --git a/Marlin/src/module/scara.h b/Marlin/src/module/scara.h index 501c46dc2864..fc7049997ad2 100644 --- a/Marlin/src/module/scara.h +++ b/Marlin/src/module/scara.h @@ -24,8 +24,7 @@ * scara.h - SCARA-specific functions */ -#ifndef __SCARA_H__ -#define __SCARA_H__ +#pragma once #include "../core/macros.h" @@ -38,9 +37,11 @@ float constexpr L1 = SCARA_LINKAGE_1, L2 = SCARA_LINKAGE_2, void scara_set_axis_is_at_home(const AxisEnum axis); -void inverse_kinematics(const float raw[XYZ]); +void inverse_kinematics(const float (&raw)[XYZ]); +FORCE_INLINE void inverse_kinematics(const float (&raw)[XYZE]) { + const float raw_xyz[XYZ] = { raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS] }; + inverse_kinematics(raw_xyz); +} void forward_kinematics_SCARA(const float &a, const float &b); void scara_report_positions(); - -#endif // __SCARA_H__ diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 6dcf52741c49..76c068977f5e 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -107,8 +107,8 @@ Stepper stepper; // Singleton // public: -#if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) - bool Stepper::homing_dual_axis = false; +#if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || Z_MULTI_ENDSTOPS + bool Stepper::separate_multi_axis = false; #endif #if HAS_MOTOR_CURRENT_PWM @@ -124,7 +124,7 @@ uint8_t Stepper::last_direction_bits = 0, bool Stepper::abort_current_block; -#if DISABLED(MIXING_EXTRUDER) +#if DISABLED(MIXING_EXTRUDER) && EXTRUDERS > 1 uint8_t Stepper::last_moved_extruder = 0xFF; #endif @@ -134,9 +134,12 @@ bool Stepper::abort_current_block; #if ENABLED(Y_DUAL_ENDSTOPS) bool Stepper::locked_Y_motor = false, Stepper::locked_Y2_motor = false; #endif -#if ENABLED(Z_DUAL_ENDSTOPS) +#if Z_MULTI_ENDSTOPS bool Stepper::locked_Z_motor = false, Stepper::locked_Z2_motor = false; #endif +#if ENABLED(Z_TRIPLE_ENDSTOPS) + bool Stepper::locked_Z3_motor = false; +#endif uint32_t Stepper::acceleration_time, Stepper::deceleration_time; uint8_t Stepper::steps_per_isr; @@ -159,8 +162,8 @@ uint32_t Stepper::advance_dividend[XYZE] = { 0 }, int32_t Stepper::delta_error_m[MIXING_STEPPERS]; uint32_t Stepper::advance_dividend_m[MIXING_STEPPERS], Stepper::advance_divisor_m; -#else - int8_t Stepper::active_extruder; // Active extruder +#elif EXTRUDERS > 1 + uint8_t Stepper::active_extruder; // Active extruder #endif #if ENABLED(S_CURVE_ACCELERATION) @@ -202,23 +205,40 @@ volatile int32_t Stepper::endstops_trigsteps[XYZ]; volatile int32_t Stepper::count_position[NUM_AXIS] = { 0 }; int8_t Stepper::count_direction[NUM_AXIS] = { 0, 0, 0, 0 }; -#if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) - #define DUAL_ENDSTOP_APPLY_STEP(A,V) \ - if (homing_dual_axis) { \ - if (A##_HOME_DIR < 0) { \ - if (!(TEST(endstops.state(), A##_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##_motor) A##_STEP_WRITE(V); \ - if (!(TEST(endstops.state(), A##2_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ - } \ - else { \ - if (!(TEST(endstops.state(), A##_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##_motor) A##_STEP_WRITE(V); \ - if (!(TEST(endstops.state(), A##2_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ - } \ - } \ - else { \ - A##_STEP_WRITE(V); \ - A##2_STEP_WRITE(V); \ - } -#endif +#define DUAL_ENDSTOP_APPLY_STEP(A,V) \ + if (separate_multi_axis) { \ + if (A##_HOME_DIR < 0) { \ + if (!(TEST(endstops.state(), A##_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##_motor) A##_STEP_WRITE(V); \ + if (!(TEST(endstops.state(), A##2_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ + } \ + else { \ + if (!(TEST(endstops.state(), A##_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##_motor) A##_STEP_WRITE(V); \ + if (!(TEST(endstops.state(), A##2_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ + } \ + } \ + else { \ + A##_STEP_WRITE(V); \ + A##2_STEP_WRITE(V); \ + } + +#define TRIPLE_ENDSTOP_APPLY_STEP(A,V) \ + if (separate_multi_axis) { \ + if (A##_HOME_DIR < 0) { \ + if (!(TEST(endstops.state(), A##_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##_motor) A##_STEP_WRITE(V); \ + if (!(TEST(endstops.state(), A##2_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ + if (!(TEST(endstops.state(), A##3_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##3_motor) A##3_STEP_WRITE(V); \ + } \ + else { \ + if (!(TEST(endstops.state(), A##_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##_motor) A##_STEP_WRITE(V); \ + if (!(TEST(endstops.state(), A##2_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ + if (!(TEST(endstops.state(), A##3_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##3_motor) A##3_STEP_WRITE(V); \ + } \ + } \ + else { \ + A##_STEP_WRITE(V); \ + A##2_STEP_WRITE(V); \ + A##3_STEP_WRITE(V); \ + } #if ENABLED(X_DUAL_STEPPER_DRIVERS) #define X_APPLY_DIR(v,Q) do{ X_DIR_WRITE(v); X2_DIR_WRITE((v) != INVERT_X2_VS_X_DIR); }while(0) @@ -231,7 +251,7 @@ int8_t Stepper::count_direction[NUM_AXIS] = { 0, 0, 0, 0 }; #define X_APPLY_DIR(v,ALWAYS) \ if (extruder_duplication_enabled || ALWAYS) { \ X_DIR_WRITE(v); \ - X2_DIR_WRITE(bool(v)); \ + X2_DIR_WRITE(v); \ } \ else { \ if (movement_extruder()) X2_DIR_WRITE(v); else X_DIR_WRITE(v); \ @@ -261,7 +281,14 @@ int8_t Stepper::count_direction[NUM_AXIS] = { 0, 0, 0, 0 }; #define Y_APPLY_STEP(v,Q) Y_STEP_WRITE(v) #endif -#if ENABLED(Z_DUAL_STEPPER_DRIVERS) +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + #define Z_APPLY_DIR(v,Q) do{ Z_DIR_WRITE(v); Z2_DIR_WRITE(v); Z3_DIR_WRITE(v); }while(0) + #if ENABLED(Z_TRIPLE_ENDSTOPS) + #define Z_APPLY_STEP(v,Q) TRIPLE_ENDSTOP_APPLY_STEP(Z,v) + #else + #define Z_APPLY_STEP(v,Q) do{ Z_STEP_WRITE(v); Z2_STEP_WRITE(v); Z3_STEP_WRITE(v); }while(0) + #endif +#elif ENABLED(Z_DUAL_STEPPER_DRIVERS) #define Z_APPLY_DIR(v,Q) do{ Z_DIR_WRITE(v); Z2_DIR_WRITE(v); }while(0) #if ENABLED(Z_DUAL_ENDSTOPS) #define Z_APPLY_STEP(v,Q) DUAL_ENDSTOP_APPLY_STEP(Z,v) @@ -1485,16 +1512,10 @@ uint32_t Stepper::stepper_block_phase_isr() { #if ENABLED(LIN_ADVANCE) if (LA_use_advance_lead) { - // Wake up eISR on first acceleration loop and fire ISR if final adv_rate is reached - if (step_events_completed == steps_per_isr || (LA_steps && LA_isr_rate != current_block->advance_speed)) { - nextAdvanceISR = 0; - LA_isr_rate = current_block->advance_speed; - } - } - else { - LA_isr_rate = LA_ADV_NEVER; - if (LA_steps) nextAdvanceISR = 0; + // Fire ISR if final adv_rate is reached + if (LA_steps && LA_isr_rate != current_block->advance_speed) nextAdvanceISR = 0; } + else if (LA_steps) nextAdvanceISR = 0; #endif // LIN_ADVANCE } // Are we in Deceleration phase ? @@ -1536,17 +1557,13 @@ uint32_t Stepper::stepper_block_phase_isr() { #if ENABLED(LIN_ADVANCE) if (LA_use_advance_lead) { - if (step_events_completed <= decelerate_after + steps_per_isr || - (LA_steps && LA_isr_rate != current_block->advance_speed) - ) { - nextAdvanceISR = 0; // Wake up eISR on first deceleration loop + // Wake up eISR on first deceleration loop and fire ISR if final adv_rate is reached + if (step_events_completed <= decelerate_after + steps_per_isr || (LA_steps && LA_isr_rate != current_block->advance_speed)) { + nextAdvanceISR = 0; LA_isr_rate = current_block->advance_speed; } } - else { - LA_isr_rate = LA_ADV_NEVER; - if (LA_steps) nextAdvanceISR = 0; - } + else if (LA_steps) nextAdvanceISR = 0; #endif // LIN_ADVANCE } // We must be in cruise phase otherwise @@ -1712,7 +1729,7 @@ uint32_t Stepper::stepper_block_phase_isr() { advance_dividend_m[i] = current_block->mix_steps[i] << 1; } advance_divisor_m = e_steps << 1; - #else + #elif EXTRUDERS > 1 active_extruder = current_block->active_extruder; #endif @@ -1726,7 +1743,11 @@ uint32_t Stepper::stepper_block_phase_isr() { if ((LA_use_advance_lead = current_block->use_advance_lead)) { LA_final_adv_steps = current_block->final_adv_steps; LA_max_adv_steps = current_block->max_adv_steps; + //Start the ISR + nextAdvanceISR = 0; + LA_isr_rate = current_block->advance_speed; } + else LA_isr_rate = LA_ADV_NEVER; #endif if (current_block->direction_bits != last_direction_bits @@ -1735,7 +1756,7 @@ uint32_t Stepper::stepper_block_phase_isr() { #endif ) { last_direction_bits = current_block->direction_bits; - #if DISABLED(MIXING_EXTRUDER) + #if DISABLED(MIXING_EXTRUDER) && EXTRUDERS > 1 last_moved_extruder = active_extruder; #endif set_directions(); @@ -1939,9 +1960,12 @@ void Stepper::init() { #endif #if HAS_Z_DIR Z_DIR_INIT; - #if ENABLED(Z_DUAL_STEPPER_DRIVERS) && HAS_Z2_DIR + #if Z_MULTI_STEPPER_DRIVERS && HAS_Z2_DIR Z2_DIR_INIT; #endif + #if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) && HAS_Z3_DIR + Z3_DIR_INIT; + #endif #endif #if HAS_E0_DIR E0_DIR_INIT; @@ -1958,6 +1982,9 @@ void Stepper::init() { #if HAS_E4_DIR E4_DIR_INIT; #endif + #if HAS_E5_DIR + E5_DIR_INIT; + #endif // Init Enable Pins - steppers default to disabled. #if HAS_X_ENABLE @@ -1979,10 +2006,14 @@ void Stepper::init() { #if HAS_Z_ENABLE Z_ENABLE_INIT; if (!Z_ENABLE_ON) Z_ENABLE_WRITE(HIGH); - #if ENABLED(Z_DUAL_STEPPER_DRIVERS) && HAS_Z2_ENABLE + #if Z_MULTI_STEPPER_DRIVERS && HAS_Z2_ENABLE Z2_ENABLE_INIT; if (!Z_ENABLE_ON) Z2_ENABLE_WRITE(HIGH); #endif + #if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) && HAS_Z3_ENABLE + Z3_ENABLE_INIT; + if (!Z_ENABLE_ON) Z3_ENABLE_WRITE(HIGH); + #endif #endif #if HAS_E0_ENABLE E0_ENABLE_INIT; @@ -2004,6 +2035,10 @@ void Stepper::init() { E4_ENABLE_INIT; if (!E_ENABLE_ON) E4_ENABLE_WRITE(HIGH); #endif + #if HAS_E5_ENABLE + E5_ENABLE_INIT; + if (!E_ENABLE_ON) E5_ENABLE_WRITE(HIGH); + #endif #define _STEP_INIT(AXIS) AXIS ##_STEP_INIT #define _WRITE_STEP(AXIS, HIGHLOW) AXIS ##_STEP_WRITE(HIGHLOW) @@ -2034,10 +2069,14 @@ void Stepper::init() { #endif #if HAS_Z_STEP - #if ENABLED(Z_DUAL_STEPPER_DRIVERS) + #if Z_MULTI_STEPPER_DRIVERS Z2_STEP_INIT; Z2_STEP_WRITE(INVERT_Z_STEP_PIN); #endif + #if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + Z3_STEP_INIT; + Z3_STEP_WRITE(INVERT_Z_STEP_PIN); + #endif AXIS_INIT(Z, Z); #endif @@ -2056,6 +2095,9 @@ void Stepper::init() { #if E_STEPPERS > 4 && HAS_E4_STEP E_AXIS_INIT(4); #endif + #if E_STEPPERS > 5 && HAS_E5_STEP + E_AXIS_INIT(5); + #endif // Init Stepper ISR to 122 Hz for quick starting HAL_timer_start(STEP_TIMER_NUM, 122); @@ -2492,6 +2534,10 @@ void Stepper::report_positions() { SET_OUTPUT(E4_MS1_PIN); SET_OUTPUT(E4_MS2_PIN); #endif + #if HAS_E5_MICROSTEPS + SET_OUTPUT(E5_MS1_PIN); + SET_OUTPUT(E5_MS2_PIN); + #endif static const uint8_t microstep_modes[] = MICROSTEP_MODES; for (uint16_t i = 0; i < COUNT(microstep_modes); i++) microstep_mode(i, microstep_modes[i]); @@ -2521,6 +2567,9 @@ void Stepper::report_positions() { #if HAS_E4_MICROSTEPS case 7: WRITE(E4_MS1_PIN, ms1); break; #endif + #if HAS_E5_MICROSTEPS + case 8: WRITE(E5_MS1_PIN, ms1); break; + #endif } if (ms2 >= 0) switch (driver) { case 0: WRITE(X_MS2_PIN, ms2); break; @@ -2545,6 +2594,9 @@ void Stepper::report_positions() { #if HAS_E4_MICROSTEPS case 7: WRITE(E4_MS2_PIN, ms2); break; #endif + #if HAS_E5_MICROSTEPS + case 8: WRITE(E5_MS2_PIN, ms2); break; + #endif } } @@ -2606,6 +2658,11 @@ void Stepper::report_positions() { SERIAL_PROTOCOL(READ(E4_MS1_PIN)); SERIAL_PROTOCOLLN(READ(E4_MS2_PIN)); #endif + #if HAS_E5_MICROSTEPS + SERIAL_PROTOCOLPGM("E5: "); + SERIAL_PROTOCOL(READ(E5_MS1_PIN)); + SERIAL_PROTOCOLLN(READ(E5_MS2_PIN)); + #endif } #endif // HAS_MICROSTEPS diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h index 7e9f9cbe170f..0ebe1d6e205e 100644 --- a/Marlin/src/module/stepper.h +++ b/Marlin/src/module/stepper.h @@ -234,8 +234,8 @@ class Stepper { public: - #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) - static bool homing_dual_axis; + #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || Z_MULTI_ENDSTOPS + static bool separate_multi_axis; #endif #if HAS_MOTOR_CURRENT_PWM @@ -254,8 +254,11 @@ class Stepper { static bool abort_current_block; // Signals to the stepper that current block should be aborted - #if DISABLED(MIXING_EXTRUDER) - static uint8_t last_moved_extruder; // Last-moved extruder, as set when the last movement was fetched from planner + // Last-moved extruder, as set when the last movement was fetched from planner + #if EXTRUDERS < 2 + static constexpr uint8_t last_moved_extruder = 0; + #elif DISABLED(MIXING_EXTRUDER) + static uint8_t last_moved_extruder; #endif #if ENABLED(X_DUAL_ENDSTOPS) @@ -264,9 +267,12 @@ class Stepper { #if ENABLED(Y_DUAL_ENDSTOPS) static bool locked_Y_motor, locked_Y2_motor; #endif - #if ENABLED(Z_DUAL_ENDSTOPS) + #if Z_MULTI_ENDSTOPS static bool locked_Z_motor, locked_Z2_motor; #endif + #if ENABLED(Z_TRIPLE_ENDSTOPS) + static bool locked_Z3_motor; + #endif static uint32_t acceleration_time, deceleration_time; // time measured in Stepper Timer ticks static uint8_t steps_per_isr; // Count of steps to perform per Stepper ISR call @@ -293,8 +299,10 @@ class Stepper { advance_divisor_m; #define MIXING_STEPPERS_LOOP(VAR) \ for (uint8_t VAR = 0; VAR < MIXING_STEPPERS; VAR++) + #elif EXTRUDERS > 1 + static uint8_t active_extruder; #else - static int8_t active_extruder; // Active extruder + static constexpr uint8_t active_extruder = 0; #endif #if ENABLED(S_CURVE_ACCELERATION) @@ -385,7 +393,7 @@ class Stepper { // The extruder associated to the last movement FORCE_INLINE static uint8_t movement_extruder() { return - #if ENABLED(MIXING_EXTRUDER) + #if ENABLED(MIXING_EXTRUDER) || EXTRUDERS < 2 0 #else last_moved_extruder @@ -410,8 +418,8 @@ class Stepper { static void microstep_readings(); #endif - #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) - FORCE_INLINE static void set_homing_dual_axis(const bool state) { homing_dual_axis = state; } + #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || Z_MULTI_ENDSTOPS + FORCE_INLINE static void set_separate_multi_axis(const bool state) { separate_multi_axis = state; } #endif #if ENABLED(X_DUAL_ENDSTOPS) FORCE_INLINE static void set_x_lock(const bool state) { locked_X_motor = state; } @@ -421,10 +429,13 @@ class Stepper { FORCE_INLINE static void set_y_lock(const bool state) { locked_Y_motor = state; } FORCE_INLINE static void set_y2_lock(const bool state) { locked_Y2_motor = state; } #endif - #if ENABLED(Z_DUAL_ENDSTOPS) + #if Z_MULTI_ENDSTOPS FORCE_INLINE static void set_z_lock(const bool state) { locked_Z_motor = state; } FORCE_INLINE static void set_z2_lock(const bool state) { locked_Z2_motor = state; } #endif + #if ENABLED(Z_TRIPLE_ENDSTOPS) + FORCE_INLINE static void set_z3_lock(const bool state) { locked_Z3_motor = state; } + #endif #if ENABLED(BABYSTEPPING) static void babystep(const AxisEnum axis, const bool direction); // perform a short step with a single stepper motor, outside of any convention @@ -461,14 +472,14 @@ class Stepper { #endif } + // Set direction bits for all steppers + static void set_directions(); + private: // Set the current position in steps static void _set_position(const int32_t &a, const int32_t &b, const int32_t &c, const int32_t &e); - // Set direction bits for all steppers - static void set_directions(); - FORCE_INLINE static uint32_t calc_timer_interval(uint32_t step_rate, uint8_t scale, uint8_t* loops) { uint32_t timer; diff --git a/Marlin/src/module/stepper_indirection.cpp b/Marlin/src/module/stepper_indirection.cpp index abd28eb65a60..e6bd0abf2dbd 100644 --- a/Marlin/src/module/stepper_indirection.cpp +++ b/Marlin/src/module/stepper_indirection.cpp @@ -35,6 +35,8 @@ #include "../inc/MarlinConfig.h" +#include "../module/stepper.h" + // // TMC26X Driver objects and inits // @@ -67,6 +69,9 @@ #if AXIS_DRIVER_TYPE(Z2, TMC26X) _TMC26X_DEFINE(Z2); #endif + #if AXIS_DRIVER_TYPE(Z3, TMC26X) + _TMC26X_DEFINE(Z3); + #endif #if AXIS_DRIVER_TYPE(E0, TMC26X) _TMC26X_DEFINE(E0); #endif @@ -82,6 +87,9 @@ #if AXIS_DRIVER_TYPE(E4, TMC26X) _TMC26X_DEFINE(E4); #endif + #if AXIS_DRIVER_TYPE(E5, TMC26X) + _TMC26X_DEFINE(E5); + #endif #define _TMC26X_INIT(A) do{ \ stepper##A.setMicrosteps(A##_MICROSTEPS); \ @@ -107,6 +115,9 @@ #if AXIS_DRIVER_TYPE(Z2, TMC26X) _TMC26X_INIT(Z2); #endif + #if AXIS_DRIVER_TYPE(Z3, TMC26X) + _TMC26X_INIT(Z3); + #endif #if AXIS_DRIVER_TYPE(E0, TMC26X) _TMC26X_INIT(E0); #endif @@ -122,6 +133,9 @@ #if AXIS_DRIVER_TYPE(E4, TMC26X) _TMC26X_INIT(E4); #endif + #if AXIS_DRIVER_TYPE(E5, TMC26X) + _TMC26X_INIT(E5); + #endif } #endif // TMC26X @@ -164,6 +178,9 @@ #if AXIS_DRIVER_TYPE(Z2, TMC2130) _TMC2130_DEFINE(Z2); #endif + #if AXIS_DRIVER_TYPE(Z3, TMC2130) + _TMC2130_DEFINE(Z3); + #endif #if AXIS_DRIVER_TYPE(E0, TMC2130) _TMC2130_DEFINE(E0); #endif @@ -179,6 +196,9 @@ #if AXIS_DRIVER_TYPE(E4, TMC2130) _TMC2130_DEFINE(E4); #endif + #if AXIS_DRIVER_TYPE(E5, TMC2130) + _TMC2130_DEFINE(E5); + #endif // Use internal reference voltage for current calculations. This is the default. // Following values from Trinamic's spreadsheet with values for a NEMA17 (42BYGHW609) @@ -231,6 +251,9 @@ #if AXIS_DRIVER_TYPE(Z2, TMC2130) _TMC2130_INIT(Z2, planner.axis_steps_per_mm[Z_AXIS]); #endif + #if AXIS_DRIVER_TYPE(Z3, TMC2130) + _TMC2130_INIT(Z3, planner.axis_steps_per_mm[Z_AXIS]); + #endif #if AXIS_DRIVER_TYPE(E0, TMC2130) _TMC2130_INIT(E0, planner.axis_steps_per_mm[E_AXIS]); #endif @@ -272,6 +295,9 @@ #if AXIS_DRIVER_TYPE(Z2, TMC2130) stepperZ2.sgt(Z_HOMING_SENSITIVITY); #endif + #if ENABLED(Z3_IS_TMC2130) + stepperZ3.sgt(Z_HOMING_SENSITIVITY); + #endif #endif #endif } @@ -335,6 +361,13 @@ _TMC2208_DEFINE_SOFTWARE(Z2); #endif #endif + #if AXIS_DRIVER_TYPE(Z3, TMC2208) + #ifdef Z3_HARDWARE_SERIAL + _TMC2208_DEFINE_HARDWARE(Z3); + #else + _TMC2208_DEFINE_SOFTWARE(Z3); + #endif + #endif #if AXIS_DRIVER_TYPE(E0, TMC2208) #ifdef E0_HARDWARE_SERIAL _TMC2208_DEFINE_HARDWARE(E0); @@ -370,6 +403,13 @@ _TMC2208_DEFINE_SOFTWARE(E4); #endif #endif + #if AXIS_DRIVER_TYPE(E5, TMC2208) + #ifdef E5_HARDWARE_SERIAL + _TMC2208_DEFINE_HARDWARE(E5); + #else + _TMC2208_DEFINE_SOFTWARE(E5); + #endif + #endif void tmc2208_serial_begin() { #if AXIS_DRIVER_TYPE(X, TMC2208) @@ -414,6 +454,13 @@ stepperZ2.beginSerial(115200); #endif #endif + #if AXIS_DRIVER_TYPE(Z3, TMC2208) + #ifdef Z3_HARDWARE_SERIAL + Z3_HARDWARE_SERIAL.begin(115200); + #else + stepperZ3.beginSerial(115200); + #endif + #endif #if AXIS_DRIVER_TYPE(E0, TMC2208) #ifdef E0_HARDWARE_SERIAL E0_HARDWARE_SERIAL.begin(115200); @@ -449,6 +496,13 @@ stepperE4.beginSerial(115200); #endif #endif + #if AXIS_DRIVER_TYPE(E5, TMC2208) + #ifdef E5_HARDWARE_SERIAL + E5_HARDWARE_SERIAL.begin(115200); + #else + stepperE5.beginSerial(115200); + #endif + #endif } // Use internal reference voltage for current calculations. This is the default. @@ -508,6 +562,9 @@ #if AXIS_DRIVER_TYPE(Z2, TMC2208) _TMC2208_INIT(Z2, planner.axis_steps_per_mm[Z_AXIS]); #endif + #if AXIS_DRIVER_TYPE(Z3, TMC2208) + _TMC2208_INIT(Z3, planner.axis_steps_per_mm[Z_AXIS]); + #endif #if AXIS_DRIVER_TYPE(E0, TMC2208) _TMC2208_INIT(E0, planner.axis_steps_per_mm[E_AXIS]); #endif @@ -545,6 +602,9 @@ void restore_stepper_drivers() { #if AXIS_IS_TMC(Z2) stepperZ2.push(); #endif + #if AXIS_IS_TMC(Z3) + stepperZ3.push(); + #endif #if AXIS_IS_TMC(E0) stepperE0.push(); #endif @@ -560,6 +620,9 @@ void restore_stepper_drivers() { #if AXIS_IS_TMC(E4) stepperE4.push(); #endif + #if AXIS_IS_TMC(E5) + stepperE5.push(); + #endif } void reset_stepper_drivers() { @@ -580,6 +643,7 @@ void reset_stepper_drivers() { #if HAS_DRIVER(L6470) L6470_init_to_defaults(); #endif + stepper.set_directions(); } // @@ -611,6 +675,9 @@ void reset_stepper_drivers() { #if AXIS_DRIVER_TYPE(Z2, L6470) _L6470_DEFINE(Z2); #endif + #if AXIS_DRIVER_TYPE(Z3, L6470) + _L6470_DEFINE(Z3); + #endif #if AXIS_DRIVER_TYPE(E0, L6470) _L6470_DEFINE(E0); #endif @@ -626,6 +693,9 @@ void reset_stepper_drivers() { #if AXIS_DRIVER_TYPE(E4, L6470) _L6470_DEFINE(E4); #endif + #if AXIS_DRIVER_TYPE(E5, L6470) + _L6470_DEFINE(E5); + #endif #define _L6470_INIT(A) do{ \ stepper##A.init(); \ @@ -654,6 +724,9 @@ void reset_stepper_drivers() { #if AXIS_DRIVER_TYPE(Z2, L6470) _L6470_INIT(Z2); #endif + #if AXIS_DRIVER_TYPE(Z3, L6470) + _L6470_INIT(Z3); + #endif #if AXIS_DRIVER_TYPE(E0, L6470) _L6470_INIT(E0); #endif @@ -669,6 +742,9 @@ void reset_stepper_drivers() { #if AXIS_DRIVER_TYPE(E4, L6470) _L6470_INIT(E4); #endif + #if AXIS_DRIVER_TYPE(E5, L6470) + _L6470_INIT(E5); + #endif } #endif // L6470 diff --git a/Marlin/src/module/stepper_indirection.h b/Marlin/src/module/stepper_indirection.h index 8ac4a0d8e951..1a615e395ccf 100644 --- a/Marlin/src/module/stepper_indirection.h +++ b/Marlin/src/module/stepper_indirection.h @@ -282,6 +282,41 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #define Z2_STEP_READ READ(Z2_STEP_PIN) #endif +// Z3 Stepper +#if HAS_Z3_ENABLE + #if ENABLED(Z3_IS_L6470) + extern L6470 stepperZ3; + #define Z3_ENABLE_INIT NOOP + #define Z3_ENABLE_WRITE(STATE) do{ if (STATE) stepperZ3.Step_Clock(stepperZ3.getStatus() & STATUS_HIZ); else stepperZ3.softFree(); }while(0) + #define Z3_ENABLE_READ (stepperZ3.getStatus() & STATUS_HIZ) + #define Z3_DIR_INIT NOOP + #define Z3_DIR_WRITE(STATE) stepperZ3.Step_Clock(STATE) + #define Z3_DIR_READ (stepperZ3.getStatus() & STATUS_DIR) + #else + #if ENABLED(Z3_IS_TMC26X) + extern TMC26XStepper stepperZ3; + #define Z3_ENABLE_INIT NOOP + #define Z3_ENABLE_WRITE(STATE) stepperZ3.setEnabled(STATE) + #define Z3_ENABLE_READ stepperZ3.isEnabled() + #else + #if ENABLED(Z3_IS_TMC2130) + extern TMC2130Stepper stepperZ3; + #elif ENABLED(Z3_IS_TMC2208) + extern TMC2208Stepper stepperZ3; + #endif + #define Z3_ENABLE_INIT SET_OUTPUT(Z3_ENABLE_PIN) + #define Z3_ENABLE_WRITE(STATE) WRITE(Z3_ENABLE_PIN,STATE) + #define Z3_ENABLE_READ READ(Z3_ENABLE_PIN) + #endif + #define Z3_DIR_INIT SET_OUTPUT(Z3_DIR_PIN) + #define Z3_DIR_WRITE(STATE) WRITE(Z3_DIR_PIN,STATE) + #define Z3_DIR_READ READ(Z3_DIR_PIN) + #endif + #define Z3_STEP_INIT SET_OUTPUT(Z3_STEP_PIN) + #define Z3_STEP_WRITE(STATE) WRITE(Z3_STEP_PIN,STATE) + #define Z3_STEP_READ READ(Z3_STEP_PIN) +#endif + // E0 Stepper #if AXIS_DRIVER_TYPE(E0, L6470) extern L6470 stepperE0; @@ -447,11 +482,48 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #define E4_STEP_WRITE(STATE) WRITE(E4_STEP_PIN,STATE) #define E4_STEP_READ READ(E4_STEP_PIN) +// E5 Stepper +#if AXIS_DRIVER_TYPE(E5, L6470) + extern L6470 stepperE5; + #define E5_ENABLE_INIT NOOP + #define E5_ENABLE_WRITE(STATE) do{ if (STATE) stepperE5.Step_Clock(stepperE5.getStatus() & STATUS_HIZ); else stepperE5.softFree(); }while(0) + #define E5_ENABLE_READ (stepperE5.getStatus() & STATUS_HIZ) + #define E5_DIR_INIT NOOP + #define E5_DIR_WRITE(STATE) stepperE5.Step_Clock(STATE) + #define E5_DIR_READ (stepperE5.getStatus() & STATUS_DIR) +#else + #if AXIS_DRIVER_TYPE(E5, TMC26X) + extern TMC26XStepper stepperE5; + #define E5_ENABLE_INIT NOOP + #define E5_ENABLE_WRITE(STATE) stepperE5.setEnabled(STATE) + #define E5_ENABLE_READ stepperE5.isEnabled() + #else + #if AXIS_DRIVER_TYPE(E5, TMC2130) + extern TMC2130Stepper stepperE5; + #elif AXIS_DRIVER_TYPE(E5, TMC2208) + extern TMC2208Stepper stepperE5; + #endif + #define E5_ENABLE_INIT SET_OUTPUT(E5_ENABLE_PIN) + #define E5_ENABLE_WRITE(STATE) WRITE(E5_ENABLE_PIN,STATE) + #define E5_ENABLE_READ READ(E5_ENABLE_PIN) + #endif + #define E5_DIR_INIT SET_OUTPUT(E5_DIR_PIN) + #define E5_DIR_WRITE(STATE) WRITE(E5_DIR_PIN,STATE) + #define E5_DIR_READ READ(E5_DIR_PIN) +#endif +#define E5_STEP_INIT SET_OUTPUT(E5_STEP_PIN) +#define E5_STEP_WRITE(STATE) WRITE(E5_STEP_PIN,STATE) +#define E5_STEP_READ READ(E5_STEP_PIN) + /** * Extruder indirection for the single E axis */ #if ENABLED(SWITCHING_EXTRUDER) // One stepper driver per two extruders, reversed on odd index - #if EXTRUDERS > 4 + #if EXTRUDERS > 5 + #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else { E2_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); break; case 4: E2_DIR_WRITE(!INVERT_E2_DIR); case 5: E2_DIR_WRITE( INVERT_E2_DIR); } }while(0) + #define REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 4: E2_DIR_WRITE( INVERT_E2_DIR); case 5: E2_DIR_WRITE(!INVERT_E2_DIR); } }while(0) + #elif EXTRUDERS > 4 #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else { E2_STEP_WRITE(V); } }while(0) #define NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); break; case 4: E2_DIR_WRITE(!INVERT_E2_DIR); } }while(0) #define REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 4: E2_DIR_WRITE( INVERT_E2_DIR); } }while(0) @@ -472,6 +544,10 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) #define NORM_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? !INVERT_E0_DIR: INVERT_E0_DIR); }while(0) #define REV_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? INVERT_E0_DIR: !INVERT_E0_DIR); }while(0) +#elif E_STEPPERS > 5 + #define E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; case 4: E4_STEP_WRITE(V); case 5: E5_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; case 4: E4_DIR_WRITE(!INVERT_E4_DIR); case 5: E5_DIR_WRITE(!INVERT_E5_DIR); } }while(0) + #define REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); break; case 4: E4_DIR_WRITE( INVERT_E4_DIR); case 5: E5_DIR_WRITE( INVERT_E5_DIR); } }while(0) #elif E_STEPPERS > 4 #define E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; case 4: E4_STEP_WRITE(V); } }while(0) #define NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; case 4: E4_DIR_WRITE(!INVERT_E4_DIR); } }while(0) @@ -486,9 +562,18 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #define REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; case 2: E2_DIR_WRITE( INVERT_E2_DIR); } }while(0) #elif E_STEPPERS > 1 #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) - #define E_STEP_WRITE(E,V) do{ if (extruder_duplication_enabled) { E0_STEP_WRITE(V); E1_STEP_WRITE(V); } else if (E == 0) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) - #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { E0_DIR_WRITE(!INVERT_E0_DIR); E1_DIR_WRITE(!INVERT_E1_DIR); } else if (E == 0) { E0_DIR_WRITE(!INVERT_E0_DIR); } else { E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0) - #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { E0_DIR_WRITE( INVERT_E0_DIR); E1_DIR_WRITE( INVERT_E1_DIR); } else if (E == 0) { E0_DIR_WRITE( INVERT_E0_DIR); } else { E1_DIR_WRITE( INVERT_E1_DIR); } }while(0) + + #define E_STEP_WRITE(E,V) do{ if (extruder_duplication_enabled) { E0_STEP_WRITE(V); E1_STEP_WRITE(V); } \ + else if ((E) == 0) { E0_STEP_WRITE(V); } \ + else { E1_STEP_WRITE(V); } }while(0) + + #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { E0_DIR_WRITE(!INVERT_E0_DIR); E1_DIR_WRITE(!INVERT_E1_DIR); } \ + else if ((E) == 0) { E0_DIR_WRITE(!INVERT_E0_DIR); } \ + else { E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0) + + #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { E0_DIR_WRITE( INVERT_E0_DIR); E1_DIR_WRITE( INVERT_E1_DIR); } \ + else if ((E) == 0) { E0_DIR_WRITE( INVERT_E0_DIR); } \ + else { E1_DIR_WRITE( INVERT_E1_DIR); } }while(0) #else #define E_STEP_WRITE(E,V) do{ if (E == 0) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) #define NORM_E_DIR(E) do{ if (E == 0) { E0_DIR_WRITE(!INVERT_E0_DIR); } else { E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 1c4d101e996e..6a91f8a1b966 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -74,6 +74,7 @@ Temperature thermalManager; (HOTENDS > 2 && (E) == 2) ? PSTR(MSG_E3 " " MSG) : \ (HOTENDS > 3 && (E) == 3) ? PSTR(MSG_E4 " " MSG) : \ (HOTENDS > 4 && (E) == 4) ? PSTR(MSG_E5 " " MSG) : \ + (HOTENDS > 5 && (E) == 5) ? PSTR(MSG_E6 " " MSG) : \ PSTR(MSG_E1 " " MSG) #else #define TEMP_ERR_PSTR(MSG, E) \ @@ -81,6 +82,7 @@ Temperature thermalManager; (HOTENDS > 2 && (E) == 2) ? PSTR(MSG_E3 " " MSG) : \ (HOTENDS > 3 && (E) == 3) ? PSTR(MSG_E4 " " MSG) : \ (HOTENDS > 4 && (E) == 4) ? PSTR(MSG_E5 " " MSG) : \ + (HOTENDS > 5 && (E) == 5) ? PSTR(MSG_E6 " " MSG) : \ PSTR(MSG_E1 " " MSG) #endif @@ -149,7 +151,7 @@ int16_t Temperature::current_temperature_raw[HOTENDS] = { 0 }, #endif #if ENABLED(BABYSTEPPING) - volatile int Temperature::babystepsTodo[XYZ] = { 0 }; + volatile int16_t Temperature::babystepsTodo[XYZ] = { 0 }; #endif #if WATCH_HOTENDS @@ -527,13 +529,14 @@ int Temperature::getHeaterPower(const int heater) { #if HAS_AUTO_FAN void Temperature::checkExtruderAutoFans() { - static const pin_t fanPin[] PROGMEM = { E0_AUTO_FAN_PIN, E1_AUTO_FAN_PIN, E2_AUTO_FAN_PIN, E3_AUTO_FAN_PIN, E4_AUTO_FAN_PIN, CHAMBER_AUTO_FAN_PIN }; + static const pin_t fanPin[] PROGMEM = { E0_AUTO_FAN_PIN, E1_AUTO_FAN_PIN, E2_AUTO_FAN_PIN, E3_AUTO_FAN_PIN, E4_AUTO_FAN_PIN, E5_AUTO_FAN_PIN, CHAMBER_AUTO_FAN_PIN }; static const uint8_t fanBit[] PROGMEM = { 0, AUTO_1_IS_0 ? 0 : 1, AUTO_2_IS_0 ? 0 : AUTO_2_IS_1 ? 1 : 2, AUTO_3_IS_0 ? 0 : AUTO_3_IS_1 ? 1 : AUTO_3_IS_2 ? 2 : 3, - AUTO_4_IS_0 ? 0 : AUTO_4_IS_1 ? 1 : AUTO_4_IS_2 ? 2 : AUTO_4_IS_3 ? 3 : 4, + AUTO_4_IS_0 ? 0 : AUTO_4_IS_1 ? 1 : AUTO_4_IS_2 ? 2 : AUTO_4_IS_3 ? 3 : 4, + AUTO_5_IS_0 ? 0 : AUTO_5_IS_1 ? 1 : AUTO_5_IS_2 ? 2 : AUTO_5_IS_3 ? 3 : AUTO_5_IS_4 ? 4 : 5, AUTO_CHAMBER_IS_0 ? 0 : AUTO_CHAMBER_IS_1 ? 1 : AUTO_CHAMBER_IS_2 ? 2 : AUTO_CHAMBER_IS_3 ? 3 : AUTO_CHAMBER_IS_4 ? 4 : 5 }; uint8_t fanState = 0; @@ -1193,6 +1196,9 @@ void Temperature::init() { #if HAS_TEMP_ADC_4 HAL_ANALOG_SELECT(TEMP_4_PIN); #endif + #if HAS_TEMP_ADC_5 + HAL_ANALOG_SELECT(TEMP_5_PIN); + #endif #if HAS_HEATED_BED HAL_ANALOG_SELECT(TEMP_BED_PIN); #endif @@ -1226,7 +1232,7 @@ void Temperature::init() { SET_OUTPUT(E1_AUTO_FAN_PIN); #endif #endif - #if HAS_AUTO_FAN_2 && !AUTO_2_IS_0 && !AUTO_2_IS_1 + #if HAS_AUTO_FAN_2 && !(AUTO_2_IS_0 || AUTO_2_IS_1) #if E2_AUTO_FAN_PIN == FAN1_PIN SET_OUTPUT(E2_AUTO_FAN_PIN); #if ENABLED(FAST_PWM_FAN) @@ -1236,7 +1242,7 @@ void Temperature::init() { SET_OUTPUT(E2_AUTO_FAN_PIN); #endif #endif - #if HAS_AUTO_FAN_3 && !AUTO_3_IS_0 && !AUTO_3_IS_1 && !AUTO_3_IS_2 + #if HAS_AUTO_FAN_3 && !(AUTO_3_IS_0 || AUTO_3_IS_1 || AUTO_3_IS_2) #if E3_AUTO_FAN_PIN == FAN1_PIN SET_OUTPUT(E3_AUTO_FAN_PIN); #if ENABLED(FAST_PWM_FAN) @@ -1246,7 +1252,7 @@ void Temperature::init() { SET_OUTPUT(E3_AUTO_FAN_PIN); #endif #endif - #if HAS_AUTO_FAN_4 && !AUTO_4_IS_0 && !AUTO_4_IS_1 && !AUTO_4_IS_2 && !AUTO_4_IS_3 + #if HAS_AUTO_FAN_4 && !(AUTO_4_IS_0 || AUTO_4_IS_1 || AUTO_4_IS_2 || AUTO_4_IS_3) #if E4_AUTO_FAN_PIN == FAN1_PIN SET_OUTPUT(E4_AUTO_FAN_PIN); #if ENABLED(FAST_PWM_FAN) @@ -1256,7 +1262,17 @@ void Temperature::init() { SET_OUTPUT(E4_AUTO_FAN_PIN); #endif #endif - #if HAS_AUTO_CHAMBER_FAN && !AUTO_CHAMBER_IS_0 && !AUTO_CHAMBER_IS_1 && !AUTO_CHAMBER_IS_2 && !AUTO_CHAMBER_IS_3 && ! AUTO_CHAMBER_IS_4 + #if HAS_AUTO_FAN_5 && !(AUTO_5_IS_0 || AUTO_5_IS_1 || AUTO_5_IS_2 || AUTO_5_IS_3 || AUTO_5_IS_4) + #if E5_AUTO_FAN_PIN == FAN1_PIN + SET_OUTPUT(E5_AUTO_FAN_PIN); + #if ENABLED(FAST_PWM_FAN) + setPwmFrequency(E5_AUTO_FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8 + #endif + #else + SET_OUTPUT(E5_AUTO_FAN_PIN); + #endif + #endif + #if HAS_AUTO_CHAMBER_FAN && !(AUTO_CHAMBER_IS_0 || AUTO_CHAMBER_IS_1 || AUTO_CHAMBER_IS_2 || AUTO_CHAMBER_IS_3 || AUTO_CHAMBER_IS_4 || AUTO_CHAMBER_IS_5) #if CHAMBER_AUTO_FAN_PIN == FAN1_PIN SET_OUTPUT(CHAMBER_AUTO_FAN_PIN); #if ENABLED(FAST_PWM_FAN) @@ -1321,6 +1337,14 @@ void Temperature::init() { #ifdef HEATER_4_MAXTEMP TEMP_MAX_ROUTINE(4); #endif + #if HOTENDS > 5 + #ifdef HEATER_5_MINTEMP + TEMP_MIN_ROUTINE(5); + #endif + #ifdef HEATER_5_MAXTEMP + TEMP_MAX_ROUTINE(5); + #endif + #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 @@ -1539,6 +1563,9 @@ void Temperature::disable_all_heaters() { DISABLE_HEATER(3); #if HOTENDS > 4 DISABLE_HEATER(4); + #if HOTENDS > 5 + DISABLE_HEATER(5); + #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 @@ -1665,10 +1692,13 @@ void Temperature::set_current_temp_raw() { current_temperature_raw[3] = raw_temp_value[3]; #if HAS_TEMP_ADC_4 current_temperature_raw[4] = raw_temp_value[4]; - #endif - #endif - #endif - #endif + #if HAS_TEMP_ADC_5 + current_temperature_raw[5] = raw_temp_value[5]; + #endif // HAS_TEMP_ADC_5 + #endif // HAS_TEMP_ADC_4 + #endif // HAS_TEMP_ADC_3 + #endif // HAS_TEMP_ADC_2 + #endif // HAS_TEMP_ADC_1 #if HAS_HEATED_BED current_temperature_bed_raw = raw_temp_bed_value; @@ -1679,6 +1709,10 @@ void Temperature::set_current_temp_raw() { temp_meas_ready = true; } +#if ENABLED(FILAMENT_WIDTH_SENSOR) + uint32_t raw_filwidth_value; // = 0 +#endif + void Temperature::readings_ready() { // Update the raw values if they've been read. Else we could be updating them during reading. if (!temp_meas_ready) set_current_temp_raw(); @@ -1714,6 +1748,9 @@ void Temperature::readings_ready() { , TEMPDIR(3) #if HOTENDS > 4 , TEMPDIR(4) + #if HOTENDS > 5 + , TEMPDIR(5) + #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 @@ -1811,6 +1848,9 @@ void Temperature::isr() { ISR_STATICS(3); #if HOTENDS > 4 ISR_STATICS(4); + #if HOTENDS > 5 + ISR_STATICS(5); + #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 @@ -1819,10 +1859,6 @@ void Temperature::isr() { ISR_STATICS(BED); #endif - #if ENABLED(FILAMENT_WIDTH_SENSOR) - static unsigned long raw_filwidth_value = 0; - #endif - #if DISABLED(SLOW_PWM_HEATERS) constexpr uint8_t pwm_mask = #if ENABLED(SOFT_PWM_DITHER) @@ -1851,6 +1887,10 @@ void Temperature::isr() { #if HOTENDS > 4 soft_pwm_count_4 = (soft_pwm_count_4 & pwm_mask) + soft_pwm_amount[4]; WRITE_HEATER_4(soft_pwm_count_4 > pwm_mask ? HIGH : LOW); + #if HOTENDS > 5 + soft_pwm_count_5 = (soft_pwm_count_5 & pwm_mask) + soft_pwm_amount[5]; + WRITE_HEATER_5(soft_pwm_count_5 > pwm_mask ? HIGH : LOW); + #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 @@ -1886,6 +1926,9 @@ void Temperature::isr() { if (soft_pwm_count_3 <= pwm_count_tmp) WRITE_HEATER_3(LOW); #if HOTENDS > 4 if (soft_pwm_count_4 <= pwm_count_tmp) WRITE_HEATER_4(LOW); + #if HOTENDS > 5 + if (soft_pwm_count_5 <= pwm_count_tmp) WRITE_HEATER_5(LOW); + #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 @@ -1968,6 +2011,9 @@ void Temperature::isr() { SLOW_PWM_ROUTINE(3); #if HOTENDS > 4 SLOW_PWM_ROUTINE(4); + #if HOTENDS > 5 + SLOW_PWM_ROUTINE(5); + #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 @@ -1987,6 +2033,9 @@ void Temperature::isr() { PWM_OFF_ROUTINE(3); #if HOTENDS > 4 PWM_OFF_ROUTINE(4); + #if HOTENDS > 5 + PWM_OFF_ROUTINE(5); + #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 @@ -2047,6 +2096,9 @@ void Temperature::isr() { if (state_timer_heater_3 > 0) state_timer_heater_3--; #if HOTENDS > 4 if (state_timer_heater_4 > 0) state_timer_heater_4--; + #if HOTENDS > 5 + if (state_timer_heater_5 > 0) state_timer_heater_5--; + #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 @@ -2169,6 +2221,15 @@ void Temperature::isr() { break; #endif + #if HAS_TEMP_ADC_5 + case PrepareTemp_5: + HAL_START_ADC(TEMP_5_PIN); + break; + case MeasureTemp_5: + ACCUMULATE_ADC(raw_temp_value[5]); + break; + #endif + #if ENABLED(FILAMENT_WIDTH_SENSOR) case Prepare_FILWIDTH: HAL_START_ADC(FILWIDTH_PIN); @@ -2177,8 +2238,8 @@ void Temperature::isr() { if (!HAL_ADC_READY()) next_sensor_state = adc_sensor_state; // redo this state else if (HAL_READ_ADC() > 102) { // Make sure ADC is reading > 0.5 volts, otherwise don't read. - raw_filwidth_value -= (raw_filwidth_value >> 7); // Subtract 1/128th of the raw_filwidth_value - raw_filwidth_value += ((unsigned long)HAL_READ_ADC() << 7); // Add new ADC reading, scaled by 128 + raw_filwidth_value -= raw_filwidth_value >> 7; // Subtract 1/128th of the raw_filwidth_value + raw_filwidth_value += uint32_t(HAL_READ_ADC()) << 7; // Add new ADC reading, scaled by 128 } break; #endif @@ -2218,7 +2279,7 @@ void Temperature::isr() { #if ENABLED(BABYSTEPPING) LOOP_XYZ(axis) { - const int curTodo = babystepsTodo[axis]; // get rid of volatile for performance + const int16_t curTodo = babystepsTodo[axis]; // get rid of volatile for performance if (curTodo) { stepper.babystep((AxisEnum)axis, curTodo > 0); if (curTodo > 0) babystepsTodo[axis]--; diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index e8b80f97b58e..f91de03b570b 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -163,7 +163,7 @@ class Temperature { #endif #if ENABLED(BABYSTEPPING) - static volatile int babystepsTodo[3]; + static volatile int16_t babystepsTodo[3]; #endif #if ENABLED(PREVENT_COLD_EXTRUSION) diff --git a/Marlin/src/module/thermistor/thermistor_501.h b/Marlin/src/module/thermistor/thermistor_501.h index 512ac0d8d80c..ac40d119b39d 100644 --- a/Marlin/src/module/thermistor/thermistor_501.h +++ b/Marlin/src/module/thermistor/thermistor_501.h @@ -28,8 +28,8 @@ const short temptable_501[][2] PROGMEM = { {OV( 19), 280}, {OV( 23), 270}, {OV( 27), 260}, - {OV( 32), 250}, - {OV( 30), 240}, + {OV( 31), 250}, + {OV( 37), 240}, {OV( 47), 230}, {OV( 57), 220}, {OV( 68), 210}, diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 13f391eda409..a1e6f3c17c67 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -134,7 +134,7 @@ #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) DEBUG_POS("(1) Raise Z-Axis", current_position); #endif - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); + planner.buffer_line(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); planner.synchronize(); // STEP 2 @@ -145,7 +145,7 @@ DEBUG_POS("Moving ParkPos", current_position); } #endif - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); + planner.buffer_line(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); planner.synchronize(); // STEP 3 @@ -158,12 +158,12 @@ #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("(4) Move to position near new extruder"); #endif - current_position[X_AXIS] += (active_extruder == 0 ? 10 : -10); // move 10mm away from parked extruder + current_position[X_AXIS] += active_extruder ? -10 : 10; // move 10mm away from parked extruder #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) DEBUG_POS("Move away from parked extruder", current_position); #endif - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); + planner.buffer_line(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); planner.synchronize(); // STEP 5 @@ -177,13 +177,13 @@ pe_activate_magnet(tmp_extruder); // STEP 6 - current_position[X_AXIS] = grabpos + (tmp_extruder == 0 ? (+10) : (-10)); - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); + current_position[X_AXIS] = grabpos + (tmp_extruder ? -10 : 10); + planner.buffer_line(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); current_position[X_AXIS] = grabpos; #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) DEBUG_POS("(6) Unpark extruder", current_position); #endif - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS]/2, active_extruder); + planner.buffer_line(current_position, planner.max_feedrate_mm_s[X_AXIS]/2, active_extruder); planner.synchronize(); // Step 7 @@ -191,7 +191,7 @@ #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) DEBUG_POS("(7) Move midway between hotends", current_position); #endif - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); + planner.buffer_line(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); planner.synchronize(); #if ENABLED(DEBUG_LEVELING_FEATURE) SERIAL_ECHOLNPGM("Autopark done."); @@ -241,7 +241,7 @@ #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) DEBUG_POS("(1) Raise Z-Axis", current_position); #endif - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); + planner.buffer_line(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); planner.synchronize(); // STEP 2 @@ -252,14 +252,14 @@ DEBUG_POS("Move X SwitchPos", current_position); } #endif - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); + planner.buffer_line(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); planner.synchronize(); current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS - SWITCHING_TOOLHEAD_Y_SECURITY; #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) DEBUG_POS("Move Y SwitchPos + Security", current_position); #endif - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Y_AXIS], active_extruder); + planner.buffer_line(current_position, planner.max_feedrate_mm_s[Y_AXIS], active_extruder); planner.synchronize(); // STEP 3 @@ -273,14 +273,14 @@ #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) DEBUG_POS("Move Y SwitchPos", current_position); #endif - planner.buffer_line_kinematic(current_position,(planner.max_feedrate_mm_s[Y_AXIS] * 0.5), active_extruder); + planner.buffer_line(current_position,(planner.max_feedrate_mm_s[Y_AXIS] * 0.5), active_extruder); planner.synchronize(); safe_delay(200); current_position[Y_AXIS] -= SWITCHING_TOOLHEAD_Y_CLEAR; #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) DEBUG_POS("Move back Y clear", current_position); #endif - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Y_AXIS], active_extruder); // move away from docked toolhead + planner.buffer_line(current_position, planner.max_feedrate_mm_s[Y_AXIS], active_extruder); // move away from docked toolhead planner.synchronize(); // STEP 4 @@ -291,13 +291,13 @@ #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) DEBUG_POS("Move to new toolhead X", current_position); #endif - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); + planner.buffer_line(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); planner.synchronize(); current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS - SWITCHING_TOOLHEAD_Y_SECURITY; #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) DEBUG_POS("Move Y SwitchPos + Security", current_position); #endif - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Y_AXIS], active_extruder); + planner.buffer_line(current_position, planner.max_feedrate_mm_s[Y_AXIS], active_extruder); planner.synchronize(); // STEP 5 @@ -308,7 +308,7 @@ #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) DEBUG_POS("Move Y SwitchPos", current_position); #endif - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Y_AXIS] * 0.5, active_extruder); + planner.buffer_line(current_position, planner.max_feedrate_mm_s[Y_AXIS] * 0.5, active_extruder); planner.synchronize(); safe_delay(200); @@ -319,7 +319,7 @@ #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) DEBUG_POS("Move back Y clear", current_position); #endif - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Y_AXIS], active_extruder); // move away from docked toolhead + planner.buffer_line(current_position, planner.max_feedrate_mm_s[Y_AXIS], active_extruder); // move away from docked toolhead planner.synchronize(); // STEP 6 @@ -366,6 +366,8 @@ inline void invalid_extruder_error(const uint8_t e) { switch (dual_x_carriage_mode) { case DXC_FULL_CONTROL_MODE: SERIAL_ECHOLNPGM("DXC_FULL_CONTROL_MODE"); break; case DXC_AUTO_PARK_MODE: SERIAL_ECHOLNPGM("DXC_AUTO_PARK_MODE"); break; + case DXC_DUPLICATION_MODE: SERIAL_ECHOLNPGM("DXC_DUPLICATION_MODE"); break; + case DXC_SCALED_DUPLICATION_MODE: SERIAL_ECHOLNPGM("DXC_SCALED_DUPLICATION_MODE"); break; } } #endif @@ -393,9 +395,9 @@ inline void invalid_extruder_error(const uint8_t e) { #define CUR_Z current_position[Z_AXIS] #define CUR_E current_position[E_AXIS] - planner.buffer_line( CUR_X, CUR_Y, raised_z, CUR_E, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); - planner.buffer_line( xhome, CUR_Y, raised_z, CUR_E, planner.max_feedrate_mm_s[X_AXIS], active_extruder); - planner.buffer_line( xhome, CUR_Y, CUR_Z, CUR_E, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); + planner.buffer_line(CUR_X, CUR_Y, raised_z, CUR_E, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); + planner.buffer_line(xhome, CUR_Y, raised_z, CUR_E, planner.max_feedrate_mm_s[X_AXIS], active_extruder); + planner.buffer_line(xhome, CUR_Y, CUR_Z, CUR_E, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); planner.synchronize(); } @@ -455,9 +457,8 @@ inline void invalid_extruder_error(const uint8_t e) { void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool no_move/*=false*/) { planner.synchronize(); - #if ENABLED(DUAL_X_CARRIAGE) - // Only T0 allowed in DXC_DUPLICATION_MODE - if (tmp_extruder != 0 && dual_x_carriage_mode == DXC_DUPLICATION_MODE) + #if ENABLED(DUAL_X_CARRIAGE) // Only T0 allowed if the Printer is in DXC_DUPLICATION_MODE or DXC_SCALED_DUPLICATION_MODE + if (tmp_extruder != 0 && dxc_is_duplicating()) return invalid_extruder_error(tmp_extruder); #endif @@ -524,7 +525,7 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n #if ENABLED(SWITCHING_NOZZLE) // Always raise by at least 1 to avoid workpiece current_position[Z_AXIS] += MAX(-zdiff, 0.0) + 1; - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); + planner.buffer_line(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); move_nozzle_servo(tmp_extruder); #endif #endif @@ -549,7 +550,7 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n #endif // !DUAL_X_CARRIAGE // Tell the planner the new "current position" - SYNC_PLAN_POSITION_KINEMATIC(); + sync_plan_position(); #if ENABLED(DELTA) //LOOP_XYZ(i) update_software_endstops(i); // or modify the constrain function @@ -563,7 +564,7 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n #if DISABLED(SWITCHING_NOZZLE) // Do a small lift to avoid the workpiece in the move back (below) current_position[Z_AXIS] += 1.0; - planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); + planner.buffer_line(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); #endif #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) DEBUG_POS("Move back", destination); @@ -607,8 +608,10 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n select_multiplexed_stepper(tmp_extruder); #endif - // Set the new active extruder - active_extruder = tmp_extruder; + #if EXTRUDERS > 1 + // Set the new active extruder + active_extruder = tmp_extruder; + #endif #endif // HOTENDS <= 1 @@ -627,7 +630,7 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n #endif SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(MSG_ACTIVE_EXTRUDER, (int)active_extruder); + SERIAL_ECHOLNPAIR(MSG_ACTIVE_EXTRUDER, int(active_extruder)); #endif // !MIXING_EXTRUDER || MIXING_VIRTUAL_TOOLS <= 1 } diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 76c58576bdfb..03d336baa5c7 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -468,6 +468,15 @@ #ifndef E4_MS3_PIN #define E4_MS3_PIN -1 #endif +#ifndef E5_MS1_PIN + #define E5_MS1_PIN -1 +#endif +#ifndef E5_MS2_PIN + #define E5_MS2_PIN -1 +#endif +#ifndef E5_MS3_PIN + #define E5_MS3_PIN -1 +#endif #ifndef E0_STEP_PIN #define E0_STEP_PIN -1 @@ -514,6 +523,15 @@ #ifndef E4_ENABLE_PIN #define E4_ENABLE_PIN -1 #endif +#ifndef E5_STEP_PIN + #define E5_STEP_PIN -1 +#endif +#ifndef E5_DIR_PIN + #define E5_DIR_PIN -1 +#endif +#ifndef E5_ENABLE_PIN + #define E5_ENABLE_PIN -1 +#endif #ifndef X_CS_PIN #define X_CS_PIN -1 @@ -539,6 +557,9 @@ #ifndef E4_CS_PIN #define E4_CS_PIN -1 #endif +#ifndef E5_CS_PIN + #define E5_CS_PIN -1 +#endif #ifndef FAN_PIN #define FAN_PIN -1 @@ -578,6 +599,9 @@ #ifndef HEATER_4_PIN #define HEATER_4_PIN -1 #endif +#ifndef HEATER_5_PIN + #define HEATER_5_PIN -1 +#endif #ifndef HEATER_BED_PIN #define HEATER_BED_PIN -1 #endif @@ -597,6 +621,9 @@ #ifndef TEMP_4_PIN #define TEMP_4_PIN -1 #endif +#ifndef TEMP_5_PIN + #define TEMP_5_PIN -1 +#endif #ifndef TEMP_BED_PIN #define TEMP_BED_PIN -1 #endif @@ -627,8 +654,8 @@ #define MAX_EXTRUDERS 5 #endif -#ifndef MAX_SERVOS - #define MAX_SERVOS 4 +#ifndef NUM_SERVO_PLUGS + #define NUM_SERVO_PLUGS 4 #endif // @@ -669,6 +696,13 @@ #define E4_AUTO_FAN_PIN -1 #endif #endif +#ifndef E5_AUTO_FAN_PIN + #ifdef ORIG_E5_AUTO_FAN_PIN + #define E5_AUTO_FAN_PIN ORIG_E5_AUTO_FAN_PIN + #else + #define E5_AUTO_FAN_PIN -1 + #endif +#endif #ifndef CHAMBER_AUTO_FAN_PIN #ifdef ORIG_CHAMBER_AUTO_FAN_PIN #define CHAMBER_AUTO_FAN_PIN ORIG_CHAMBER_AUTO_FAN_PIN @@ -683,6 +717,7 @@ #define _E2_PINS #define _E3_PINS #define _E4_PINS +#define _E5_PINS #if ENABLED(SWITCHING_EXTRUDER) // Tools 0 and 1 use E0 @@ -706,6 +741,10 @@ #if EXTRUDERS > 4 #undef _E4_PINS #define _E4_PINS E4_STEP_PIN, E4_DIR_PIN, E4_ENABLE_PIN, E4_MS1_PIN, E4_MS2_PIN, E4_MS3_PIN, E4_CS_PIN, + #if EXTRUDERS > 5 + #undef _E5_PINS + #define _E5_PINS E5_STEP_PIN, E5_DIR_PIN, E5_ENABLE_PIN, E5_MS1_PIN, E5_MS2_PIN, E5_MS3_PIN, E5_CS_PIN, + #endif // EXTRUDERS > 5 #endif // EXTRUDERS > 4 #endif // EXTRUDERS > 3 #endif // EXTRUDERS > 2 @@ -716,6 +755,7 @@ #define _H2_PINS #define _H3_PINS #define _H4_PINS +#define _H5_PINS #if HOTENDS > 1 #undef _H1_PINS @@ -728,7 +768,11 @@ #define _H3_PINS HEATER_3_PIN, E3_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_3_PIN), #if HOTENDS > 4 #undef _H4_PINS - #define _H4_PINS HEATER_4_PIN, analogInputToDigitalPin(TEMP_4_PIN), + #define _H4_PINS HEATER_4_PIN, E4_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_4_PIN), + #if HOTENDS > 5 + #undef _H5_PINS + #define _H5_PINS HEATER_5_PIN, E5_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_5_PIN), + #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 @@ -744,6 +788,10 @@ #if MIXING_STEPPERS > 4 #undef _E4_PINS #define _E4_PINS E4_STEP_PIN, E4_DIR_PIN, E4_ENABLE_PIN, E4_MS1_PIN, E4_MS2_PIN, E4_CS_PIN, + #if MIXING_STEPPERS > 5 + #undef _E5_PINS + #define _E5_PINS E5_STEP_PIN, E5_DIR_PIN, E5_ENABLE_PIN, E5_MS1_PIN, E5_MS2_PIN, E5_CS_PIN, + #endif // MIXING_STEPPERS > 5 #endif // MIXING_STEPPERS > 4 #endif // MIXING_STEPPERS > 3 #endif // MIXING_STEPPERS > 2 @@ -842,6 +890,7 @@ #define _X2_PINS #define _Y2_PINS #define _Z2_PINS +#define _Z3_PINS #define __EPIN(p,q) E##p##_##q##_PIN #define _EPIN(p,q) __EPIN(p,q) @@ -855,7 +904,7 @@ #ifndef X2_CS_PIN #define X2_CS_PIN _EPIN(E_STEPPERS, CS) #endif - #if E_STEPPERS > 4 || !PIN_EXISTS(X2_ENABLE) + #if E_STEPPERS > MAX_EXTRUDERS || !PIN_EXISTS(X2_ENABLE) #error "No E stepper plug left for X2!" #endif #endif @@ -880,7 +929,7 @@ #ifndef Y2_CS_PIN #define Y2_CS_PIN _EPIN(Y2_E_INDEX, CS) #endif - #if Y2_E_INDEX > 4 || !PIN_EXISTS(Y2_ENABLE) + #if Y2_E_INDEX > MAX_EXTRUDERS || !PIN_EXISTS(Y2_ENABLE) #error "No E stepper plug left for Y2!" #endif #endif @@ -897,7 +946,7 @@ #endif // The Z2 axis, if any, should be the next open extruder port -#if ENABLED(Z_DUAL_STEPPER_DRIVERS) +#if Z_MULTI_STEPPER_DRIVERS #ifndef Z2_STEP_PIN #define Z2_STEP_PIN _EPIN(Z2_E_INDEX, STEP) #define Z2_DIR_PIN _EPIN(Z2_E_INDEX, DIR) @@ -905,7 +954,7 @@ #ifndef Z2_CS_PIN #define Z2_CS_PIN _EPIN(Z2_E_INDEX, CS) #endif - #if Z2_E_INDEX > 4 || !PIN_EXISTS(Z2_ENABLE) + #if Z2_E_INDEX > MAX_EXTRUDERS || !PIN_EXISTS(Z2_ENABLE) #error "No E stepper plug left for Z2!" #endif #endif @@ -916,6 +965,30 @@ #else #define _Z2_PINS __Z2_PINS #endif + #define Z3_E_INDEX INCREMENT(Z2_E_INDEX) +#else + #define Z3_E_INDEX Z2_E_INDEX +#endif + +#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS) + #ifndef Z3_STEP_PIN + #define Z3_STEP_PIN _EPIN(Z3_E_INDEX, STEP) + #define Z3_DIR_PIN _EPIN(Z3_E_INDEX, DIR) + #define Z3_ENABLE_PIN _EPIN(Z3_E_INDEX, ENABLE) + #ifndef Z3_CS_PIN + #define Z3_CS_PIN _EPIN(Z3_E_INDEX, CS) + #endif + #if Z3_E_INDEX > 4 || !PIN_EXISTS(Z3_ENABLE) + #error "No E stepper plug left for Z3!" + #endif + #endif + #undef _Z3_PINS + #define __Z3_PINS Z3_STEP_PIN, Z3_DIR_PIN, Z3_ENABLE_PIN, + #ifdef Z3_CS_PIN + #define _Z3_PINS __Z3_PINS Z3_CS_PIN, + #else + #define _Z3_PINS __Z3_PINS + #endif #endif #ifndef HAL_SENSITIVE_PINS @@ -927,9 +1000,9 @@ Y_STEP_PIN, Y_DIR_PIN, Y_ENABLE_PIN, Y_MIN_PIN, Y_MAX_PIN, Y_MS1_PIN, Y_MS2_PIN, Y_CS_PIN, \ Z_STEP_PIN, Z_DIR_PIN, Z_ENABLE_PIN, Z_MIN_PIN, Z_MAX_PIN, Z_MS1_PIN, Z_MS2_PIN, Z_MS3_PIN, Z_CS_PIN, Z_MIN_PROBE_PIN, \ PS_ON_PIN, HEATER_BED_PIN, FAN_PIN, FAN1_PIN, FAN2_PIN, CONTROLLER_FAN_PIN, \ - _E0_PINS _E1_PINS _E2_PINS _E3_PINS _E4_PINS BED_PINS \ - _H0_PINS _H1_PINS _H2_PINS _H3_PINS _H4_PINS \ - _X2_PINS _Y2_PINS _Z2_PINS \ + _E0_PINS _E1_PINS _E2_PINS _E3_PINS _E4_PINS _E5_PINS BED_PINS \ + _H0_PINS _H1_PINS _H2_PINS _H3_PINS _H4_PINS _H5_PINS \ + _X2_PINS _Y2_PINS _Z2_PINS _Z3_PINS \ HAL_SENSITIVE_PINS \ } diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h index 4ea33dd5a6bc..e6ac174c17fb 100644 --- a/Marlin/src/pins/pinsDebug_list.h +++ b/Marlin/src/pins/pinsDebug_list.h @@ -361,6 +361,30 @@ #if PIN_EXISTS(E4_STEP) REPORT_NAME_DIGITAL(__LINE__, E4_STEP_PIN) #endif +#if PIN_EXISTS(E5_AUTO_FAN) + REPORT_NAME_DIGITAL(__LINE__, E5_AUTO_FAN_PIN) +#endif +#if PIN_EXISTS(E5_CS) + REPORT_NAME_DIGITAL(__LINE__, E5_CS_PIN) +#endif +#if PIN_EXISTS(E5_DIR) + REPORT_NAME_DIGITAL(__LINE__, E5_DIR_PIN) +#endif +#if PIN_EXISTS(E5_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, E5_ENABLE_PIN) +#endif +#if PIN_EXISTS(E5_MS1) + REPORT_NAME_DIGITAL(__LINE__, E5_MS1_PIN) +#endif +#if PIN_EXISTS(E5_MS2) + REPORT_NAME_DIGITAL(__LINE__, E5_MS2_PIN) +#endif +#if PIN_EXISTS(E5_MS3) + REPORT_NAME_DIGITAL(__LINE__, E5_MS3_PIN) +#endif +#if PIN_EXISTS(E5_STEP) + REPORT_NAME_DIGITAL(__LINE__, E5_STEP_PIN) +#endif #if defined(ENET_CRS) && ENET_CRS >= 0 REPORT_NAME_DIGITAL(__LINE__, ENET_CRS) #endif @@ -443,6 +467,21 @@ #if PIN_EXISTS(FIL_RUNOUT) REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT_PIN) #endif +#if PIN_EXISTS(FIL_RUNOUT2) + REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT2_PIN) +#endif +#if PIN_EXISTS(FIL_RUNOUT3) + REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT3_PIN) +#endif +#if PIN_EXISTS(FIL_RUNOUT4) + REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT4_PIN) +#endif +#if PIN_EXISTS(FIL_RUNOUT5) + REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT5_PIN) +#endif +#if PIN_EXISTS(FIL_RUNOUT6) + REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT6_PIN) +#endif #if PIN_EXISTS(HEATER_0) REPORT_NAME_DIGITAL(__LINE__, HEATER_0_PIN) #endif @@ -578,6 +617,9 @@ #if PIN_EXISTS(ORIG_E4_AUTO_FAN) REPORT_NAME_DIGITAL(__LINE__, ORIG_E4_AUTO_FAN_PIN) #endif +#if PIN_EXISTS(ORIG_E5_AUTO_FAN) + REPORT_NAME_DIGITAL(__LINE__, ORIG_E5_AUTO_FAN_PIN) +#endif #if PIN_EXISTS(PHOTOGRAPH) REPORT_NAME_DIGITAL(__LINE__, PHOTOGRAPH_PIN) #endif @@ -689,6 +731,9 @@ #if PIN_EXISTS(SOL4) REPORT_NAME_DIGITAL(__LINE__, SOL4_PIN) #endif +#if PIN_EXISTS(SOL5) + REPORT_NAME_DIGITAL(__LINE__, SOL5_PIN) +#endif #if defined(SPARE_IO) && SPARE_IO >= 0 REPORT_NAME_DIGITAL(__LINE__, SPARE_IO) #endif @@ -944,6 +989,27 @@ #if PIN_EXISTS(Z2_STEP) REPORT_NAME_DIGITAL(__LINE__, Z2_STEP_PIN) #endif +#if PIN_EXISTS(Z3_CS) + REPORT_NAME_DIGITAL(__LINE__, Z3_CS_PIN) +#endif +#if PIN_EXISTS(Z3_DIR) + REPORT_NAME_DIGITAL(__LINE__, Z3_DIR_PIN) +#endif +#if PIN_EXISTS(Z3_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, Z3_ENABLE_PIN) +#endif +#if PIN_EXISTS(Z3_MS1) + REPORT_NAME_DIGITAL(__LINE__, Z3_MS1_PIN) +#endif +#if PIN_EXISTS(Z3_MS2) + REPORT_NAME_DIGITAL(__LINE__, Z3_MS2_PIN) +#endif +#if PIN_EXISTS(Z3_MS3) + REPORT_NAME_DIGITAL(__LINE__, Z3_MS3_PIN) +#endif +#if PIN_EXISTS(Z3_STEP) + REPORT_NAME_DIGITAL(__LINE__, Z3_STEP_PIN) +#endif #if PIN_EXISTS(ZRIB_V20_D6) REPORT_NAME_DIGITAL(__LINE__, ZRIB_V20_D6_PIN) #endif @@ -986,6 +1052,12 @@ #if PIN_EXISTS(Z2_SERIAL_RX) REPORT_NAME_DIGITAL(__LINE__, Z2_SERIAL_RX_PIN) #endif +#if PIN_EXISTS(Z3_SERIAL_TX) + REPORT_NAME_DIGITAL(__LINE__, Z3_SERIAL_TX_PIN) +#endif +#if PIN_EXISTS(Z3_SERIAL_RX) + REPORT_NAME_DIGITAL(__LINE__, Z3_SERIAL_RX_PIN) +#endif #if PIN_EXISTS(E0_SERIAL_TX) REPORT_NAME_DIGITAL(__LINE__, E0_SERIAL_TX_PIN) #endif @@ -1016,3 +1088,9 @@ #if PIN_EXISTS(E4_SERIAL_RX) REPORT_NAME_DIGITAL(__LINE__, E4_SERIAL_RX_PIN) #endif +#if PIN_EXISTS(E5_SERIAL_TX) + REPORT_NAME_DIGITAL(__LINE__, E5_SERIAL_TX_PIN) +#endif +#if PIN_EXISTS(E5_SERIAL_RX) + REPORT_NAME_DIGITAL(__LINE__, E5_SERIAL_RX_PIN) +#endif diff --git a/Marlin/src/pins/pins_FORMBOT_TREX2.h b/Marlin/src/pins/pins_FORMBOT_TREX2.h index 9af13bdb383e..f98bb37a1343 100644 --- a/Marlin/src/pins/pins_FORMBOT_TREX2.h +++ b/Marlin/src/pins/pins_FORMBOT_TREX2.h @@ -28,8 +28,8 @@ #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." #endif -#if E_STEPPERS > 3 || HOTENDS > 3 - #error "Formbot supports up to 3 hotends / E-steppers. Comment this line to keep going." +#if E_STEPPERS > 2 || HOTENDS > 2 + #error "Formbot supports up to 2 hotends / E-steppers. Comment this line to keep going." #endif #define DEFAULT_MACHINE_NAME "Formbot" @@ -143,17 +143,15 @@ #define HEATER_BED_PIN 58 #define FAN_PIN 9 -#define FAN1_PIN 4 +//#define FAN1_PIN 4 #if DISABLED(ICSP_PORT_SWITCHES) - #define FIL_RUNOUT_PIN 22 - #define FIL_RUNOUT2_PIN 21 -#else - #if ENABLED(FILAMENT_RUNOUT_SENSOR) - #define FIL_RUNOUT_PIN 52 - #define FIL_RUNOUT2_PIN 50 - #endif + //#define FIL_RUNOUT_PIN 22 + //#define FIL_RUNOUT2_PIN 21 +#elif ENABLED(FILAMENT_RUNOUT_SENSOR) + #define FIL_RUNOUT_PIN 52 + #define FIL_RUNOUT2_PIN 50 #endif // @@ -162,8 +160,8 @@ #define CASE_LIGHT_PIN 8 #define SDSS 53 #ifndef ROXYs_TRex - #define LED_PIN 13 -#endif + #define LED_PIN 13 // The Formbot v 1 board has almost no unassigned pins on it. The Board's LED +#endif // is a good place to get a signal to control the Max7219 LED Matrix. // Use the RAMPS 1.4 Analog input 5 on the AUX2 connector #define FILWIDTH_PIN 5 // Analog Input diff --git a/Marlin/src/pins/pins_FORMBOT_TREX3.h b/Marlin/src/pins/pins_FORMBOT_TREX3.h index 322e0f2ea02a..5591edcbfeb8 100644 --- a/Marlin/src/pins/pins_FORMBOT_TREX3.h +++ b/Marlin/src/pins/pins_FORMBOT_TREX3.h @@ -28,8 +28,8 @@ #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." #endif -#if E_STEPPERS > 3 || HOTENDS > 3 - #error "Formbot supports up to 3 hotends / E-steppers. Comment this line to keep going." +#if E_STEPPERS > 2 || HOTENDS > 2 + #error "Formbot supports up to 2 hotends / E-steppers. Comment this line to keep going." #endif #define DEFAULT_MACHINE_NAME "Formbot" @@ -143,18 +143,10 @@ #define HEATER_BED_PIN 8 #define FAN_PIN 9 -#define FAN1_PIN 4 +//#define FAN1_PIN 4 - -#if DISABLED(ICSP_PORT_SWITCHES) - #define FIL_RUNOUT_PIN 22 - #define FIL_RUNOUT2_PIN 21 -#else - #if ENABLED(FILAMENT_RUNOUT_SENSOR) - #define FIL_RUNOUT_PIN 52 - #define FIL_RUNOUT2_PIN 50 - #endif -#endif +#define FIL_RUNOUT_PIN 23 +#define FIL_RUNOUT2_PIN 21 // // Misc. Functions diff --git a/Marlin/src/pins/pins_RADDS.h b/Marlin/src/pins/pins_RADDS.h index d17bc72b17b9..be168981037a 100644 --- a/Marlin/src/pins/pins_RADDS.h +++ b/Marlin/src/pins/pins_RADDS.h @@ -100,38 +100,65 @@ #define E2_CS_PIN 35 #endif -// -// Extension Board V2 -// http://doku.radds.org/dokumentation/extension-board -// -//#define RADDS_EXTENSION -#if ENABLED(RADDS_EXTENSION) - #define E3_STEP_PIN 35 - #define E3_DIR_PIN 33 - #define E3_ENABLE_PIN 37 +/** + * RADDS Extension Board V2 / V3 + * http://doku.radds.org/dokumentation/extension-board + */ +//#define RADDS_EXTENSION 2 +#if RADDS_EXTENSION >= 2 + #define E3_DIR_PIN 33 + #define E3_STEP_PIN 35 + #define E3_ENABLE_PIN 37 #ifndef E3_CS_PIN - #define E3_CS_PIN 6 + #define E3_CS_PIN 6 #endif - #define E3_MS1_PIN 67 - #define E3_MS2_PIN 68 - #define E3_MS3_PIN 69 + #if RADDS_EXTENSION == 3 - #define Z2_STEP_PIN 29 - #define Z2_DIR_PIN 27 - #define Z2_ENABLE_PIN 31 - #ifndef Z2_CS_PIN - #define Z2_CS_PIN 39 - #endif + #define E4_DIR_PIN 27 + #define E4_STEP_PIN 29 + #define E4_ENABLE_PIN 31 + #ifndef E4_CS_PIN + #define E4_CS_PIN 39 + #endif + + #define E5_DIR_PIN 66 + #define E5_STEP_PIN 67 + #define E5_ENABLE_PIN 68 + #ifndef E5_CS_PIN + #define E5_CS_PIN 6 + #endif + + #define RADDS_EXT_MSI_PIN 69 - #define Z2_MS1_PIN 67 // shared with E3_MS1_PIN - #define Z2_MS2_PIN 68 // shared with E3_MS2_PIN - #define Z2_MS3_PIN 69 // shared with E3_MS3_PIN + #define MAX_EXTRUDERS 6 + #define BOARD_INIT() OUT_WRITE(RADDS_EXT_VDD_PIN, HIGH) + + #else + + #define E4_DIR_PIN 27 + #define E4_STEP_PIN 29 + #define E4_ENABLE_PIN 31 + #ifndef E4_CS_PIN + #define E4_CS_PIN 39 + #endif + + // E3 and E4 share the same MSx pins + #define E3_MS1_PIN 67 + #define E4_MS1_PIN 67 + #define E3_MS2_PIN 68 + #define E4_MS2_PIN 68 + #define E3_MS3_PIN 69 + #define E4_MS3_PIN 69 + + #define RADDS_EXT_VDD2_PIN 66 + + #define BOARD_INIT() do{ OUT_WRITE(RADDS_EXT_VDD_PIN, HIGH); OUT_WRITE(RADDS_EXT_VDD2_PIN, HIGH); }while(0) + + #endif - #define RADDS_EXT_VDD1_PIN 25 - #define RADDS_EXT_VDD2_PIN 66 + #define RADDS_EXT_VDD_PIN 25 - #define BOARD_INIT() OUT_WRITE(RADDS_EXT_VDD1_PIN, HIGH); OUT_WRITE(RADDS_EXT_VDD2_PIN, HIGH) #endif // @@ -168,6 +195,7 @@ // Misc. Functions // #define SDSS 4 +#define SD_DETECT_PIN 14 #define PS_ON_PIN 40 // SERVO3_PIN #ifndef FIL_RUNOUT_PIN diff --git a/Marlin/src/pins/pins_RAMPS_FD_V1.h b/Marlin/src/pins/pins_RAMPS_FD_V1.h index b6266fab8368..3b8294ef86ac 100644 --- a/Marlin/src/pins/pins_RAMPS_FD_V1.h +++ b/Marlin/src/pins/pins_RAMPS_FD_V1.h @@ -108,8 +108,6 @@ #define TEMP_0_PIN 1 // Analog Input #define TEMP_1_PIN 2 // Analog Input #define TEMP_2_PIN 3 // Analog Input -#define TEMP_3_PIN -1 // fewer compiler warnings -#define TEMP_4_PIN -1 // fewer compiler warnings #define TEMP_BED_PIN 0 // Analog Input // SPI for Max6675 or Max31855 Thermocouple @@ -130,7 +128,6 @@ #ifndef FAN_PIN #define FAN_PIN 12 #endif -#define CONTROLLER_FAN_PIN -1 // // Misc. Functions @@ -170,9 +167,9 @@ #define STAT_LED_BLUE_PIN 29 #define STAT_LED_RED_PIN 23 #define DOGLCD_CS 17 - #define DOGLCD_SCK 76 //SCK_PIN - required so that the DUE hardware SPI will be used - #define DOGLCD_MOSI 75 //MOSI_PIN - required so that the DUE hardware SPI will be used - #define DOGLCD_MISO 74 //MISO_PIN + #define DOGLCD_SCK 76 // SCK_PIN - These are required for DUE Hardware SPI + #define DOGLCD_MOSI 75 // MOSI_PIN + #define DOGLCD_MISO 74 // MISO_PIN #endif diff --git a/Marlin/src/pins/pins_RIGIDBOARD.h b/Marlin/src/pins/pins_RIGIDBOARD.h index e985963505a9..f783d83c61e8 100644 --- a/Marlin/src/pins/pins_RIGIDBOARD.h +++ b/Marlin/src/pins/pins_RIGIDBOARD.h @@ -36,6 +36,7 @@ // // MOSFET changes // +#define RAMPS_D9_PIN 8 // FAN (by default) #define RAMPS_D10_PIN 9 // EXTRUDER 1 #define MOSFET_D_PIN 12 // EXTRUDER 2 or FAN diff --git a/Marlin/src/pins/pins_TRIGORILLA_14.h b/Marlin/src/pins/pins_TRIGORILLA_14.h index 70b0a930a91a..80ce3bc98c63 100644 --- a/Marlin/src/pins/pins_TRIGORILLA_14.h +++ b/Marlin/src/pins/pins_TRIGORILLA_14.h @@ -30,7 +30,52 @@ #define IS_RAMPS_EFB -#define FAN2_PIN 44 -#define ORIG_E0_AUTO_FAN_PIN 44 +// FAN0 / D9 - Typically used for the part fan on Anycubic Delta devices +#define FAN_PIN 9 + +// FAN1 / D7 - Typically unused, can be allocated as Case Fan + +// FAN2 / D44 - Typical Extruder Fan on Anycubic Delta devices +#define FAN2_PIN 44 +#define ORIG_E0_AUTO_FAN_PIN 44 #include "pins_RAMPS.h" + +// TODO 1.4 boards do have an E1 stepper driver. However the pin definitions +// from pins_RAMPS.h are incorrect for this board. e.g., Pin 44 is the Extruder fan. +#undef E1_STEP_PIN +#undef E1_DIR_PIN +#undef E1_ENABLE_PIN +#undef E1_CS_PIN + +// +// AnyCubic made the following changes to 1.1.0-RC8 +// If these are appropriate for your LCD let us know. +// +#if 0 && ENABLED(ULTRA_LCD) + + // LCD Display output pins + #if ENABLED(NEWPANEL) && ENABLED(PANEL_ONE) + #undef LCD_PINS_D6 + #define LCD_PINS_D6 57 + #endif + + // LCD Display input pins + #if ENABLED(NEWPANEL) + #if ENABLED(VIKI2) || ENABLED(miniVIKI) + #undef DOGLCD_A0 + #define DOGLCD_A0 23 + #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + #undef BEEPER_PIN + #define BEEPER_PIN 33 + #undef LCD_BACKLIGHT_PIN + #define LCD_BACKLIGHT_PIN 67 + #endif + #elif ENABLED(MINIPANEL) + #undef BEEPER_PIN + #define BEEPER_PIN 33 + #undef DOGLCD_A0 + #define DOGLCD_A0 42 + #endif + +#endif // ULTRA_LCD diff --git a/buildroot/share/tests/DUE_tests b/buildroot/share/tests/DUE_tests index 100cdd570bcf..9ebfa2289227 100755 --- a/buildroot/share/tests/DUE_tests +++ b/buildroot/share/tests/DUE_tests @@ -9,3 +9,15 @@ opt_enable S_CURVE_ACCELERATION EEPROM_SETTINGS opt_set E0_AUTO_FAN_PIN 8 opt_set EXTRUDER_AUTO_FAN_SPEED 100 exec_test $1 $2 "RAMPS4DUE_EFB S_CURVE_ACCELERATION EEPROM_SETTINGS" + +restore_configs +opt_set MOTHERBOARD BOARD_RADDS +opt_enable USE_XMAX_PLUG USE_YMAX_PLUG +opt_enable_adv Z_TRIPLE_STEPPER_DRIVERS Z_TRIPLE_ENDSTOPS +opt_add_adv Z2_MAX_ENDSTOP_INVERTING false +opt_add_adv Z3_MAX_ENDSTOP_INVERTING false +pins_set RAMPS X_MAX_PIN -1 +pins_set RAMPS Y_MAX_PIN -1 +opt_add_adv Z2_MAX_PIN 2 +opt_add_adv Z3_MAX_PIN 3 +exec_test $1 $2 "RADDS Z_TRIPLE" diff --git a/buildroot/share/tests/teensy35_tests b/buildroot/share/tests/teensy35_tests index 0adb977cbc69..c20fbfdd03a6 100755 --- a/buildroot/share/tests/teensy35_tests +++ b/buildroot/share/tests/teensy35_tests @@ -92,5 +92,5 @@ opt_add_adv Z2_MAX_PIN 2 opt_enable USE_XMAX_PLUG exec_test $1 $2 "Z_DUAL_STEPPER_DRIVERS, Z_DUAL_ENDSTOPS" -#cleanup +# Clean up restore_configs diff --git a/platformio.ini b/platformio.ini index 85d43abb91af..77756c664067 100644 --- a/platformio.ini +++ b/platformio.ini @@ -32,7 +32,7 @@ lib_deps = https://github.com/MarlinFirmware/U8glib-HAL/archive/dev.zip LiquidCrystal@1.3.4 TMC2130Stepper - https://github.com/teemuatlut/TMC2208Stepper/archive/v0.2.3.zip + https://github.com/teemuatlut/TMC2208Stepper/archive/v0.2.5.zip Adafruit NeoPixel@1.1.3 https://github.com/lincomatic/LiquidTWI2/archive/30aa480.zip https://github.com/ameyer/Arduino-L6470/archive/master.zip @@ -105,7 +105,7 @@ board = at90usb1286 build_flags = ${common.build_flags} lib_deps = ${common.lib_deps} lib_ldf_mode = deep+ -src_filter = ${common.default_src_filter} +src_filter = ${common.default_src_filter} + extra_scripts = pre:buildroot/share/atom/create_custom_upload_command_DFU.py monitor_speed = 250000 @@ -163,7 +163,6 @@ lib_extra_dirs = frameworks lib_deps = CMSIS-LPC1768 https://github.com/MarlinFirmware/U8glib-HAL/archive/dev.zip TMC2130Stepper@>=2.2.1 - TMC2208Stepper@=0.2.1 extra_scripts = Marlin/src/HAL/HAL_LPC1768/debug_extra_script.py, Marlin/src/HAL/HAL_LPC1768/lpc1768_flag_script.py, Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py src_filter = ${common.default_src_filter} + monitor_speed = 250000