Skip to content
Snippets Groups Projects
Configuration_adv.h 138 KiB
Newer Older
  • Learn to ignore specific revisions
  •  * Marlin 3D Printer Firmware
    
    Scott Lahteine's avatar
    Scott Lahteine committed
     * Copyright (c) 2020 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 <http://www.gnu.org/licenses/>.
     *
     */
    
    /**
     * 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
     *
     */
    
    #define CONFIGURATION_ADV_H_VERSION 020006
    
    //===========================================================================
    
    Scott Lahteine's avatar
    Scott Lahteine committed
    //============================= Thermal Settings ============================
    
    //===========================================================================
    
    
    /**
     * Thermocouple sensors are quite sensitive to noise.  Any noise induced in
     * the sensor wires, such as by stepper motor wires run in parallel to them,
     * may result in the thermocouple sensor reporting spurious errors.  This
     * value is the number of errors which can occur in a row before the error
     * is reported.  This allows us to ignore intermittent error conditions while
     * still detecting an actual failure, which should result in a continuous
     * stream of errors from the sensor.
    
    Scott Lahteine's avatar
    Scott Lahteine committed
     *
    
     * Set this value to 0 to fail on the first error to occur.
     */
    #define THERMOCOUPLE_MAX_ERRORS 15
    
    
    //
    // Custom Thermistor 1000 parameters
    //
    #if TEMP_SENSOR_0 == 1000
      #define HOTEND0_PULLUP_RESISTOR_OHMS 4700    // Pullup resistor
      #define HOTEND0_RESISTANCE_25C_OHMS  100000  // Resistance at 25C
      #define HOTEND0_BETA                 3950    // Beta value
    #endif
    
    #if TEMP_SENSOR_1 == 1000
      #define HOTEND1_PULLUP_RESISTOR_OHMS 4700    // Pullup resistor
      #define HOTEND1_RESISTANCE_25C_OHMS  100000  // Resistance at 25C
      #define HOTEND1_BETA                 3950    // Beta value
    #endif
    
    #if TEMP_SENSOR_2 == 1000
      #define HOTEND2_PULLUP_RESISTOR_OHMS 4700    // Pullup resistor
      #define HOTEND2_RESISTANCE_25C_OHMS  100000  // Resistance at 25C
      #define HOTEND2_BETA                 3950    // Beta value
    #endif
    
    #if TEMP_SENSOR_3 == 1000
      #define HOTEND3_PULLUP_RESISTOR_OHMS 4700    // Pullup resistor
      #define HOTEND3_RESISTANCE_25C_OHMS  100000  // Resistance at 25C
      #define HOTEND3_BETA                 3950    // Beta value
    #endif
    
    #if TEMP_SENSOR_4 == 1000
      #define HOTEND4_PULLUP_RESISTOR_OHMS 4700    // Pullup resistor
      #define HOTEND4_RESISTANCE_25C_OHMS  100000  // Resistance at 25C
      #define HOTEND4_BETA                 3950    // Beta value
    #endif
    
    #if TEMP_SENSOR_5 == 1000
      #define HOTEND5_PULLUP_RESISTOR_OHMS 4700    // Pullup resistor
      #define HOTEND5_RESISTANCE_25C_OHMS  100000  // Resistance at 25C
      #define HOTEND5_BETA                 3950    // Beta value
    #endif
    
    
    #if TEMP_SENSOR_6 == 1000
      #define HOTEND6_PULLUP_RESISTOR_OHMS 4700    // Pullup resistor
      #define HOTEND6_RESISTANCE_25C_OHMS  100000  // Resistance at 25C
      #define HOTEND6_BETA                 3950    // Beta value
    #endif
    
    #if TEMP_SENSOR_7 == 1000
      #define HOTEND7_PULLUP_RESISTOR_OHMS 4700    // Pullup resistor
      #define HOTEND7_RESISTANCE_25C_OHMS  100000  // Resistance at 25C
      #define HOTEND7_BETA                 3950    // Beta value
    #endif
    
    
    #if TEMP_SENSOR_BED == 1000
      #define BED_PULLUP_RESISTOR_OHMS     4700    // Pullup resistor
      #define BED_RESISTANCE_25C_OHMS      100000  // Resistance at 25C
      #define BED_BETA                     3950    // Beta value
    #endif
    
    #if TEMP_SENSOR_CHAMBER == 1000
      #define CHAMBER_PULLUP_RESISTOR_OHMS 4700    // Pullup resistor
      #define CHAMBER_RESISTANCE_25C_OHMS  100000  // Resistance at 25C
      #define CHAMBER_BETA                 3950    // Beta value
    #endif
    
    
    //
    // 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
    
    
    /**
     * Heated Chamber settings
     */
    #if TEMP_SENSOR_CHAMBER
      #define CHAMBER_MINTEMP             5
      #define CHAMBER_MAXTEMP            60
      #define TEMP_CHAMBER_HYSTERESIS     1   // (°C) Temperature proximity considered "close enough" to the target
      //#define CHAMBER_LIMIT_SWITCHING
      //#define HEATER_CHAMBER_PIN       44   // Chamber heater on/off pin
      //#define HEATER_CHAMBER_INVERTING false
    #endif
    
    
    #if DISABLED(PIDTEMPBED)
    
    Scott Lahteine's avatar
    Scott Lahteine committed
      #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
    
     * 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
    
    
      //#define ADAPTIVE_FAN_SLOWING              // Slow part cooling fan if temperature drops
    
      #if BOTH(ADAPTIVE_FAN_SLOWING, PIDTEMP)
    
        //#define NO_FAN_SLOWING_IN_PID_TUNING    // Don't slow fan speed during M303
      #endif
    
       * 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
    
     * 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
    
    /**
     * Thermal Protection parameters for the heated chamber.
     */
    #if ENABLED(THERMAL_PROTECTION_CHAMBER)
    
      #define THERMAL_PROTECTION_CHAMBER_PERIOD    20 // Seconds
    
      #define THERMAL_PROTECTION_CHAMBER_HYSTERESIS 2 // Degrees Celsius
    
      /**
       * Heated chamber watch settings (M141/M191).
       */
    
      #define WATCH_CHAMBER_TEMP_PERIOD            60 // Seconds
      #define WATCH_CHAMBER_TEMP_INCREASE           2 // Degrees Celsius
    
    #if ENABLED(PIDTEMP)
    
      // Add an experimental additional term to the heater power, proportional to the extrusion speed.
      // A well-chosen Kc value should add just enough power to melt the increased material volume.
    
      //#define PID_EXTRUSION_SCALING
      #if ENABLED(PID_EXTRUSION_SCALING)
    
        #define DEFAULT_Kc (100) // heating power = Kc * e_speed
    
        #define LPQ_MAX_LEN 50
    
    
      /**
       * Add an experimental additional term to the heater power, proportional to the fan speed.
       * A well-chosen Kf value should add just enough power to compensate for power-loss from the cooling fan.
       * You can either just add a constant compensation with the DEFAULT_Kf value
       * or follow the instruction below to get speed-dependent compensation.
       *
       * Constant compensation (use only with fanspeeds of 0% and 100%)
       * ---------------------------------------------------------------------
       * A good starting point for the Kf-value comes from the calculation:
       *   kf = (power_fan * eff_fan) / power_heater * 255
       * where eff_fan is between 0.0 and 1.0, based on fan-efficiency and airflow to the nozzle / heater.
       *
       * Example:
       *   Heater: 40W, Fan: 0.1A * 24V = 2.4W, eff_fan = 0.8
       *   Kf = (2.4W * 0.8) / 40W * 255 = 12.24
       *
       * Fan-speed dependent compensation
       * --------------------------------
       * 1. To find a good Kf value, set the hotend temperature, wait for it to settle, and enable the fan (100%).
       *    Make sure PID_FAN_SCALING_LIN_FACTOR is 0 and PID_FAN_SCALING_ALTERNATIVE_DEFINITION is not enabled.
       *    If you see the temperature drop repeat the test, increasing the Kf value slowly, until the temperature
       *    drop goes away. If the temperature overshoots after enabling the fan, the Kf value is too big.
       * 2. Note the Kf-value for fan-speed at 100%
       * 3. Determine a good value for PID_FAN_SCALING_MIN_SPEED, which is around the speed, where the fan starts moving.
       * 4. Repeat step 1. and 2. for this fan speed.
       * 5. Enable PID_FAN_SCALING_ALTERNATIVE_DEFINITION and enter the two identified Kf-values in
       *    PID_FAN_SCALING_AT_FULL_SPEED and PID_FAN_SCALING_AT_MIN_SPEED. Enter the minimum speed in PID_FAN_SCALING_MIN_SPEED
       */
      //#define PID_FAN_SCALING
      #if ENABLED(PID_FAN_SCALING)
        //#define PID_FAN_SCALING_ALTERNATIVE_DEFINITION
        #if ENABLED(PID_FAN_SCALING_ALTERNATIVE_DEFINITION)
          // The alternative definition is used for an easier configuration.
          // Just figure out Kf at fullspeed (255) and PID_FAN_SCALING_MIN_SPEED.
          // DEFAULT_Kf and PID_FAN_SCALING_LIN_FACTOR are calculated accordingly.
    
          #define PID_FAN_SCALING_AT_FULL_SPEED 13.0        //=PID_FAN_SCALING_LIN_FACTOR*255+DEFAULT_Kf
          #define PID_FAN_SCALING_AT_MIN_SPEED 6.0          //=PID_FAN_SCALING_LIN_FACTOR*PID_FAN_SCALING_MIN_SPEED+DEFAULT_Kf
          #define PID_FAN_SCALING_MIN_SPEED 10.0            // Minimum fan speed at which to enable PID_FAN_SCALING
    
          #define DEFAULT_Kf (255.0*PID_FAN_SCALING_AT_MIN_SPEED-PID_FAN_SCALING_AT_FULL_SPEED*PID_FAN_SCALING_MIN_SPEED)/(255.0-PID_FAN_SCALING_MIN_SPEED)
          #define PID_FAN_SCALING_LIN_FACTOR (PID_FAN_SCALING_AT_FULL_SPEED-DEFAULT_Kf)/255.0
    
        #else
          #define PID_FAN_SCALING_LIN_FACTOR (0)             // Power loss due to cooling = Kf * (fan_speed)
          #define DEFAULT_Kf 10                              // A constant value added to the PID-tuner
          #define PID_FAN_SCALING_MIN_SPEED 10               // Minimum fan speed at which to enable PID_FAN_SCALING
        #endif
      #endif
    
     * Automatic Temperature Mode
     *
     * Dynamically adjust the hotend target temperature based on planned E moves.
     *
     * (Contrast with PID_EXTRUSION_SCALING, which tracks E movement and adjusts PID
     *  behavior using an additional kC value.)
     *
     * Autotemp is calculated by (mintemp + factor * mm_per_sec), capped to maxtemp.
     *
     * Enable Autotemp Mode with M104/M109 F<factor> S<mintemp> B<maxtemp>.
     * Disable by sending M104/M109 with no F parameter (or F0 with AUTOTEMP_PROPORTIONAL).
    
    #if ENABLED(AUTOTEMP)
    
      #define AUTOTEMP_OLDWEIGHT    0.98
      // Turn on AUTOTEMP on M104/M109 by default using proportions set here
      //#define AUTOTEMP_PROPORTIONAL
      #if ENABLED(AUTOTEMP_PROPORTIONAL)
        #define AUTOTEMP_MIN_P      0 // (°C) Added to the target temperature
        #define AUTOTEMP_MAX_P      5 // (°C) Added to the target temperature
        #define AUTOTEMP_FACTOR_P   1 // Apply this F parameter by default (overridden by M104/M109 F)
      #endif
    
    // Show Temperature ADC value
    // Enable for M105 to include ADC values read from temperature sensors.
    
    Alex Borro's avatar
    Alex Borro committed
    //#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
    
    
    // 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
    
    Scott Lahteine's avatar
    Scott Lahteine committed
      #define EXTRUDER_RUNOUT_SPEED 1500  // (mm/m)
      #define EXTRUDER_RUNOUT_EXTRUDE 5   // (mm)
    
    /**
     * Hotend Idle Timeout
     * Prevent filament in the nozzle from charring and causing a critical jam.
     */
    //#define HOTEND_IDLE_TIMEOUT
    #if ENABLED(HOTEND_IDLE_TIMEOUT)
    
      #define HOTEND_IDLE_TIMEOUT_SEC (5*60)    // (seconds) Time without extruder movement to trigger protection
    
      #define HOTEND_IDLE_MIN_TRIGGER   180     // (°C) Minimum temperature to enable hotend protection
      #define HOTEND_IDLE_NOZZLE_TARGET   0     // (°C) Safe temperature for the nozzle after timeout
      #define HOTEND_IDLE_BED_TARGET      0     // (°C) Safe temperature for the bed after timeout
    #endif
    
    
    // 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 turns on automatically whenever any driver is enabled and turns
     * off (or reduces to idle speed) shortly after drivers 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 CONTROLLER_FAN_USE_Z_ONLY    // With this option only the Z axis is considered
      #define CONTROLLERFAN_SPEED_MIN      0 // (0-255) Minimum speed. (If set below this value the fan is turned off.)
      #define CONTROLLERFAN_SPEED_ACTIVE 255 // (0-255) Active speed, used when any motor is enabled
      #define CONTROLLERFAN_SPEED_IDLE     0 // (0-255) Idle speed, used when motors are disabled
      #define CONTROLLERFAN_IDLE_TIME     60 // (seconds) Extra time to keep the fan running after disabling motors
      //#define CONTROLLER_FAN_EDITABLE      // Enable M710 configurable settings
      #if ENABLED(CONTROLLER_FAN_EDITABLE)
        #define CONTROLLER_FAN_MENU          // Enable the Controller Fan submenu
      #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
    
    // Some coolers may require a non-zero "off" state.
    //#define FAN_OFF_PWM  1
    
    
    /**
     * 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_MAX_PWM 128
    
    /**
     * FAST PWM FAN Settings
     *
     * Use to change the FAST FAN PWM frequency (if enabled in Configuration.h)
     * Combinations of PWM Modes, prescale values and TOP resolutions are used internally to produce a
     * frequency as close as possible to the desired frequency.
     *
     * FAST_PWM_FAN_FREQUENCY [undefined by default]
     *   Set this to your desired frequency.
     *   If left undefined this defaults to F = F_CPU/(2*255*1)
    
     *   i.e., F = 31.4kHz on 16MHz microcontrollers or F = 39.2kHz on 20MHz microcontrollers.
    
     *   These defaults are the same as with the old FAST_PWM_FAN implementation - no migration is required
    
     *   NOTE: Setting very low frequencies (< 10 Hz) may result in unexpected timer behavior.
    
     *
     * USE_OCR2A_AS_TOP [undefined by default]
     *   Boards that use TIMER2 for PWM have limitations resulting in only a few possible frequencies on TIMER2:
     *   16MHz MCUs: [62.5KHz, 31.4KHz (default), 7.8KHz, 3.92KHz, 1.95KHz, 977Hz, 488Hz, 244Hz, 60Hz, 122Hz, 30Hz]
     *   20MHz MCUs: [78.1KHz, 39.2KHz (default), 9.77KHz, 4.9KHz, 2.44KHz, 1.22KHz, 610Hz, 305Hz, 153Hz, 76Hz, 38Hz]
     *   A greater range can be achieved by enabling USE_OCR2A_AS_TOP. But note that this option blocks the use of
     *   PWM on pin OC2A. Only use this option if you don't need PWM on 0C2A. (Check your schematic.)
     *   USE_OCR2A_AS_TOP sacrifices duty cycle control resolution to achieve this broader range of frequencies.
     */
    #if ENABLED(FAST_PWM_FAN)
      //#define FAST_PWM_FAN_FREQUENCY 31400
      //#define USE_OCR2A_AS_TOP
    #endif
    
    
    /**
     * 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 E6_AUTO_FAN_PIN -1
    #define E7_AUTO_FAN_PIN -1
    
    #define CHAMBER_AUTO_FAN_PIN -1
    
    #define EXTRUDER_AUTO_FAN_TEMPERATURE 50
    
    #define EXTRUDER_AUTO_FAN_SPEED 255   // 255 == full speed
    
    #define CHAMBER_AUTO_FAN_TEMPERATURE 30
    #define CHAMBER_AUTO_FAN_SPEED 255
    
    /**
     * Part-Cooling Fan Multiplexer
    
    Scott Lahteine's avatar
    Scott Lahteine committed
     *
    
     * 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
    
    
    Scott Lahteine's avatar
    Scott Lahteine committed
    /**
     * 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 CASE_LIGHT_MAX_PWM 128            // Limit pwm
    
      //#define CASE_LIGHT_MENU                   // Add Case Light options to the LCD menu
      //#define CASE_LIGHT_NO_BRIGHTNESS          // Disable brightness control. Enable for non-PWM lighting.
    
      //#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
    
    Stanley's avatar
    Stanley committed
    
    
    // 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
    
    //#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
     *
     * 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<offset> Y<offset> Z<offset>'.
     */
    
    
    //#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 X2_ENDSTOP_ADJUSTMENT  0
    
    Scott Lahteine's avatar
    Scott Lahteine committed
    //#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 Y2_ENDSTOP_ADJUSTMENT  0
    
    //
    // For Z set the number of stepper drivers
    //
    #define NUM_Z_STEPPER_DRIVERS 1   // (1-4) Z options change based on how many
    
    #if NUM_Z_STEPPER_DRIVERS > 1
      //#define Z_MULTI_ENDSTOPS
      #if ENABLED(Z_MULTI_ENDSTOPS)
        #define Z2_USE_ENDSTOP          _XMAX_
        #define Z2_ENDSTOP_ADJUSTMENT   0
        #if NUM_Z_STEPPER_DRIVERS >= 3
          #define Z3_USE_ENDSTOP        _YMAX_
          #define Z3_ENDSTOP_ADJUSTMENT 0
        #endif
        #if NUM_Z_STEPPER_DRIVERS >= 4
          #define Z4_USE_ENDSTOP        _ZMAX_
          #define Z4_ENDSTOP_ADJUSTMENT 0
        #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.
    
     * The following Dual X Carriage modes can be selected with M605 S<mode>:
    
     *   0 : (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)
    
     *   1 : (AUTO_PARK) The firmware automatically parks and unparks the X-carriages on tool-change so
     *       that additional slicer support is not required. (M605 S1)
    
     *   2 : (DUPLICATION) The firmware moves the second X-carriage and extruder in synchronization with
     *       the first X-carriage and extruder, to print 2 copies of the same object at the same time.
     *       Set the constant X-offset and temperature differential with M605 S2 X[offs] R[deg] and
     *       follow with M605 S2 to initiate duplicated movement.
    
     *   3 : (MIRRORED) Formbot/Vivedino-inspired mirrored mode in which the second extruder duplicates
     *       the movement of the first except the second extruder is reversed in the X axis.
     *       Set the initial X offset and temperature differential with M605 S2 X[offs] R[deg] and
     *       follow with M605 S3 to initiate mirrored movement.
    
    //#define DUAL_X_CARRIAGE
    
    #if ENABLED(DUAL_X_CARRIAGE)
    
      #define X1_MIN_POS X_MIN_POS   // Set to X_MIN_POS
      #define X1_MAX_POS X_BED_SIZE  // Set a maximum so the first X-carriage can't hit the parked second X-carriage
      #define X2_MIN_POS    80       // Set a minimum to ensure the  second X-carriage can't hit the parked first X-carriage
      #define X2_MAX_POS   353       // Set this to the distance between toolheads when both heads are homed
      #define X2_HOME_DIR    1       // Set to 1. The second X-carriage always homes to the maximum endstop position
      #define X2_HOME_POS X2_MAX_POS // Default X2 home position. Set to X2_MAX_POS.
                          // 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.
    
    
      // This is the default power-up mode which can be later using M605.
    
      #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_AUTO_PARK_MODE
    
    
      // Default x offset in duplication mode (typically set to half print bed width)
      #define DEFAULT_DUPLICATION_X_OFFSET 100
    
    George Fu's avatar
    George Fu committed
    #endif
    
    
    // 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
    
    George Fu's avatar
    George Fu committed
    /**
     * Homing Procedure
     * Homing (G28) does an indefinite move towards the endstops to establish
     * the position of the toolhead relative to the workspace.
     */
    
    //#define SENSORLESS_BACKOFF_MM  { 2, 2 }     // (mm) Backoff from endstops before sensorless homing
    
    George Fu's avatar
    George Fu committed
    #define HOMING_BUMP_MM      { 5, 5, 2 }       // (mm) Backoff from endstops after first bump
    #define HOMING_BUMP_DIVISOR { 2, 2, 4 }       // Re-Bump Speed Divisor (Divides the Homing Feedrate)
    
    George Fu's avatar
    George Fu committed
    //#define HOMING_BACKOFF_POST_MM { 2, 2, 2 }  // (mm) Backoff from endstops after homing
    
    //#define QUICK_HOME                          // If G28 contains XY do a diagonal move first
    //#define HOME_Y_BEFORE_X                     // If G28 contains XY home Y before X
    //#define CODEPENDENT_XY_HOMING               // If X/Y can't home without homing Y/X first
    
    // @section bltouch
    
    #if ENABLED(BLTOUCH)
      /**
       * Either: Use the defaults (recommended) or: For special purposes, use the following DEFINES
       * Do not activate settings that the probe might not understand. Clones might misunderstand
       * advanced commands.
       *
       * Note: If the probe is not deploying, check a "Cmd: Reset" and "Cmd: Self-Test" and then
       *       check the wiring of the BROWN, RED and ORANGE wires.
       *
       * Note: If the trigger signal of your probe is not being recognized, it has been very often
       *       because the BLACK and WHITE wires needed to be swapped. They are not "interchangeable"
       *       like they would be with a real switch. So please check the wiring first.
       *
       * Settings for all BLTouch and clone probes:
       */
    
      // Safety: The probe needs time to recognize the command.
      //         Minimum command delay (ms). Enable and increase if needed.
      //#define BLTOUCH_DELAY 500
    
      /**
       * Settings for BLTOUCH Classic 1.2, 1.3 or BLTouch Smart 1.0, 2.0, 2.2, 3.0, 3.1, and most clones:
       */
    
      // Feature: Switch into SW mode after a deploy. It makes the output pulse longer. Can be useful
      //          in special cases, like noisy or filtered input configurations.
      //#define BLTOUCH_FORCE_SW_MODE
    
      /**
       * Settings for BLTouch Smart 3.0 and 3.1
       * Summary:
       *   - Voltage modes: 5V and OD (open drain - "logic voltage free") output modes
       *   - High-Speed mode
       *   - Disable LCD voltage options
       */
    
      /**
       * Danger: Don't activate 5V mode unless attached to a 5V-tolerant controller!
       * V3.0 or 3.1: Set default mode to 5V mode at Marlin startup.
       * If disabled, OD mode is the hard-coded default on 3.0
       * On startup, Marlin will compare its eeprom to this vale. If the selected mode
       * differs, a mode set eeprom write will be completed at initialization.
       * Use the option below to force an eeprom write to a V3.1 probe regardless.
       */
      //#define BLTOUCH_SET_5V_MODE
    
      /**
       * Safety: Activate if connecting a probe with an unknown voltage mode.
       * V3.0: Set a probe into mode selected above at Marlin startup. Required for 5V mode on 3.0
       * V3.1: Force a probe with unknown mode into selected mode at Marlin startup ( = Probe EEPROM write )
       * To preserve the life of the probe, use this once then turn it off and re-flash.
       */
      //#define BLTOUCH_FORCE_MODE_SET
    
      /**
       * Use "HIGH SPEED" mode for probing.
       * Danger: Disable if your probe sometimes fails. Only suitable for stable well-adjusted systems.
       * This feature was designed for Delta's with very fast Z moves however higher speed cartesians may function
       * If the machine cannot raise the probe fast enough after a trigger, it may enter a fault state.
       */
      //#define BLTOUCH_HS_MODE
    
      // Safety: Enable voltage mode settings in the LCD menu.
      //#define BLTOUCH_LCD_VOLTAGE_MENU
    
    #endif // BLTOUCH
    
    
    George Fu's avatar
    George Fu committed
    // @section extras
    
    
    /**
     * Z Steppers Auto-Alignment
     * Add the G34 command to align multiple Z steppers using a bed probe.
     */
    
    //#define Z_STEPPER_AUTO_ALIGN
    #if ENABLED(Z_STEPPER_AUTO_ALIGN)
    
      // Define probe X and Y positions for Z1, Z2 [, Z3 [, Z4]]
      // If not defined, probe limits will be used.
      // Override with 'M422 S<index> X<pos> Y<pos>'
      //#define Z_STEPPER_ALIGN_XY { {  10, 190 }, { 100,  10 }, { 190, 190 } }
    
      /**
       * Orientation for the automatically-calculated probe positions.
       * Override Z stepper align points with 'M422 S<index> X<pos> Y<pos>'
       *
       * 2 Steppers:  (0)     (1)
       *               |       |   2   |
       *               | 1   2 |       |
       *               |       |   1   |
       *
       * 3 Steppers:  (0)     (1)     (2)     (3)
       *               |   3   | 1     | 2   1 |     2 |
       *               |       |     3 |       | 3     |
       *               | 1   2 | 2     |   3   |     1 |
       *
       * 4 Steppers:  (0)     (1)     (2)     (3)
       *               | 4   3 | 1   4 | 2   1 | 3   2 |
       *               |       |       |       |       |
       *               | 1   2 | 2   3 | 3   4 | 4   1 |
       *
       */
      #ifndef Z_STEPPER_ALIGN_XY
        //#define Z_STEPPERS_ORIENTATION 0
      #endif
    
    
      // Provide Z stepper positions for more rapid convergence in bed alignment.
    
      // Requires triple stepper drivers (i.e., set NUM_Z_STEPPER_DRIVERS to 3)
    
      //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS
      #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
        // Define Stepper XY positions for Z1, Z2, Z3 corresponding to
        // the Z screw positions in the bed carriage.
        // Define one position per Z stepper in stepper driver order.
        #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } }
      #else
    
        // Amplification factor. Used to scale the correction step up or down in case
        // the stepper (spindle) position is farther out than the test point.
        #define Z_STEPPER_ALIGN_AMP 1.0       // Use a value > 1.0 NOTE: This may cause instability!
    
      // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm
    
      #define G34_MAX_GRADE              5    // (%) Maximum incline that G34 will handle
      #define Z_STEPPER_ALIGN_ITERATIONS 5    // Number of iterations to apply during alignment
      #define Z_STEPPER_ALIGN_ACC        0.02 // Stop iterating early if the accuracy is better than this
      #define RESTORE_LEVELING_AFTER_G34      // Restore leveling after G34 is done?
    
      // After G34, re-home Z (G28 Z) or just calculate it from the last probe heights?
      // Re-homing might be more precise in reproducing the actual 'G28 Z' homing height, especially on an uneven bed.
      #define HOME_AFTER_G34
    
    //
    // Add the G35 command to read bed corners to help adjust screws.
    //
    //#define ASSISTED_TRAMMING
    #if ENABLED(ASSISTED_TRAMMING)
    
      // Define positions for probing points, use the hotend as reference not the sensor.
      #define TRAMMING_POINT_XY { {  20, 20 }, { 200,  20 }, { 200, 200 }, { 20, 200 } }
    
      // Define positions names for probing points.
      #define TRAMMING_POINT_NAME_1 "Front-Left"
      #define TRAMMING_POINT_NAME_2 "Front-Right"
      #define TRAMMING_POINT_NAME_3 "Back-Right"
      #define TRAMMING_POINT_NAME_4 "Back-Left"
    
      // Enable to restore leveling setup after operation
      #define RESTORE_LEVELING_AFTER_G35
    
      /**
       * Screw thread:
       *   M3: 30 = Clockwise, 31 = Counter-Clockwise
       *   M4: 40 = Clockwise, 41 = Counter-Clockwise
       *   M5: 50 = Clockwise, 51 = Counter-Clockwise
       */
      #define TRAMMING_SCREW_THREAD 30
    
    #endif
    
    
    // @section motion
    
    #define AXIS_RELATIVE_MODES { false, false, false, false }
    
    // Add a Duplicate option for well-separated conjoined nozzles
    //#define MULTI_NOZZLE_DUPLICATION
    
    
    // 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.
    
    Scott Lahteine's avatar
    Scott Lahteine committed
    #define DEFAULT_STEPPER_DEACTIVE_TIME 120
    
    #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
    
    
    Brian's avatar
    Brian committed
    //#define HOME_AFTER_DEACTIVATE  // Require rehoming after steppers are deactivated
    
    
    // Minimum time that a segment needs to take if the buffer is emptied
    
    #define DEFAULT_MINSEGMENTTIME        20000   // (µs)
    
    // Slow down the machine if the look ahead buffer is (by default) half full.
    // Increase the slowdown divisor for larger buffer sizes.
    
    Scott Lahteine's avatar
    Scott Lahteine committed
    #define SLOWDOWN
    
    #if ENABLED(SLOWDOWN)
      #define SLOWDOWN_DIVISOR 2
    #endif
    
    /**
     * XY Frequency limit
     * Reduce resonance by limiting the frequency of small zigzag infill moves.
     * See http://hydraraptor.blogspot.com/2010/12/frequency-limit.html
     * Use M201 F<freq> G<min%> to change limits at runtime.
     */
    //#define XY_FREQUENCY_LIMIT      10 // (Hz) Maximum frequency of small zigzag infill moves. Set with M201 F<hertz>.
    #ifdef XY_FREQUENCY_LIMIT
      #define XY_FREQUENCY_MIN_PERCENT 5 // (percent) Minimum FR percentage to apply. Set with M201 G<min%>.
    #endif
    
    
    // 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/s)
    
    //
    // Backlash Compensation
    // Adds extra movement to axes on direction-changes to account for backlash.
    //
    //#define BACKLASH_COMPENSATION
    #if ENABLED(BACKLASH_COMPENSATION)
      // Define values for backlash distance and correction.
      // If BACKLASH_GCODE is enabled these values are the defaults.
      #define BACKLASH_DISTANCE_MM { 0, 0, 0 } // (mm)
      #define BACKLASH_CORRECTION    0.0       // 0.0 = no correction; 1.0 = full correction
    
      // Set BACKLASH_SMOOTHING_MM to spread backlash correction over multiple segments
      // to reduce print artifacts. (Enabling this is costly in memory and computation!)
      //#define BACKLASH_SMOOTHING_MM 3 // (mm)
    
      // Add runtime configuration and tuning of backlash values (M425)
      //#define BACKLASH_GCODE
    
      #if ENABLED(BACKLASH_GCODE)
        // Measure the Z backlash when probing (G29) and set with "M425 Z"
        #define MEASURE_BACKLASH_WHEN_PROBING
    
        #if ENABLED(MEASURE_BACKLASH_WHEN_PROBING)
          // When measuring, the probe will move up to BACKLASH_MEASUREMENT_LIMIT
          // mm away from point of contact in BACKLASH_MEASUREMENT_RESOLUTION
          // increments while checking for the contact to be broken.
          #define BACKLASH_MEASUREMENT_LIMIT       0.5   // (mm)
          #define BACKLASH_MEASUREMENT_RESOLUTION  0.005 // (mm)
          #define BACKLASH_MEASUREMENT_FEEDRATE    Z_PROBE_SPEED_SLOW // (mm/m)
        #endif
      #endif
    #endif
    
    
    /**
     * Automatic backlash, position and hotend offset calibration
     *
     * Enable G425 to run automatic calibration using an electrically-
     * conductive cube, bolt, or washer mounted on the bed.
     *
     * G425 uses the probe to touch the top and sides of the calibration object
     * on the bed and measures and/or correct positional offsets, axis backlash
     * and hotend offsets.
     *
     * Note: HOTEND_OFFSET and CALIBRATION_OBJECT_CENTER must be set to within
     *       ±5mm of true values for G425 to succeed.
     */
    //#define CALIBRATION_GCODE
    #if ENABLED(CALIBRATION_GCODE)
    
      #define CALIBRATION_MEASUREMENT_RESOLUTION     0.01 // mm
    
      #define CALIBRATION_FEEDRATE_SLOW             60    // mm/m
      #define CALIBRATION_FEEDRATE_FAST           1200    // mm/m
      #define CALIBRATION_FEEDRATE_TRAVEL         3000    // mm/m
    
      // The following parameters refer to the conical section of the nozzle tip.
      #define CALIBRATION_NOZZLE_TIP_HEIGHT          1.0  // mm
      #define CALIBRATION_NOZZLE_OUTER_DIAMETER      2.0  // mm
    
      // Uncomment to enable reporting (required for "G425 V", but consumes PROGMEM).
      //#define CALIBRATION_REPORTING
    
      // The true location and dimension the cube/bolt/washer on the bed.
    
    Scott Lahteine's avatar
    Scott Lahteine committed
      #define CALIBRATION_OBJECT_CENTER     { 264.0, -22.0,  -2.0 } // mm
      #define CALIBRATION_OBJECT_DIMENSIONS {  10.0,  10.0,  10.0 } // mm
    
    
      // Comment out any sides which are unreachable by the probe. For best
      // auto-calibration results, all sides must be reachable.
      #define CALIBRATION_MEASURE_RIGHT
      #define CALIBRATION_MEASURE_FRONT
      #define CALIBRATION_MEASURE_LEFT
      #define CALIBRATION_MEASURE_BACK
    
      // Probing at the exact top center only works if the center is flat. If
      // probing on a screwhead or hollow washer, probe near the edges.
      //#define CALIBRATION_MEASURE_AT_TOP_EDGES
    
    
      // Define the pin to read during calibration
    
        //#define CALIBRATION_PIN -1            // Define here to override the default pin
        #define CALIBRATION_PIN_INVERTING false // Set to true to invert the custom pin
    
        //#define CALIBRATION_PIN_PULLDOWN
        #define CALIBRATION_PIN_PULLUP
      #endif
    #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
    
    
    /**
     * Custom Microstepping
     * Override as-needed for your setup. Up to 3 MS pins are supported.
     */
    //#define MICROSTEP1 LOW,LOW,LOW
    //#define MICROSTEP2 HIGH,LOW,LOW
    //#define MICROSTEP4 LOW,HIGH,LOW
    //#define MICROSTEP8 HIGH,HIGH,LOW
    //#define MICROSTEP16 LOW,LOW,HIGH
    //#define MICROSTEP32 HIGH,LOW,HIGH
    
    
    Scott Lahteine's avatar
    Scott Lahteine committed
    // Microstep settings (Requires a board with pins named X_MS1, X_MS2, etc.)
    
    #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
    
    /**
     * I2C-based DIGIPOTs (e.g., Azteeg X3 Pro)
     */
    //#define DIGIPOT_MCP4018             // Requires https://github.com/stawel/SlowSoftI2CMaster
    //#define DIGIPOT_MCP4451
    #if EITHER(DIGIPOT_MCP4018, DIGIPOT_MCP4451)
      #define DIGIPOT_I2C_NUM_CHANNELS 8  // 5DPRINT:4   AZTEEG_X3_PRO:8   MKS_SBASE:5   MIGHTYBOARD_REVE: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
    
    
      //#define DIGIPOT_USE_RAW_VALUES    // Use DIGIPOT_MOTOR_CURRENT raw wiper values (instead of A4988 motor currents)
    
    
      /**
       * Common slave addresses:
       *
    
       *                        A   (A shifted)   B   (B shifted)  IC