diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index a443d4b302..e3624654d1 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1354,6 +1354,8 @@ #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits #endif +//#define MAX_PRINT_FEEDRATE_MM_S 1000 // (mm/s) Adjustable maximum feedrate for printing moves + /** * Default Max Acceleration (speed change with time) (linear=mm/(s^2), rotational=°/(s^2)) * (Maximum start speed for accelerated moves) diff --git a/Marlin/src/gcode/config/M200-M205.cpp b/Marlin/src/gcode/config/M200-M205.cpp index 53d0b4b4a8..a5ca0030eb 100644 --- a/Marlin/src/gcode/config/M200-M205.cpp +++ b/Marlin/src/gcode/config/M200-M205.cpp @@ -200,12 +200,20 @@ void GcodeSuite::M201_report(const bool forReplay/*=true*/) { * With multiple extruders use T to specify which one. */ void GcodeSuite::M203() { - if (!parser.seen("T" STR_AXES_LOGICAL)) + if (!parser.seen("T" TERN_(HAS_MAX_PRINT_FEEDRATE, "P") STR_AXES_LOGICAL)) return M203_report(); const int8_t target_extruder = get_target_extruder_from_command(); if (target_extruder < 0) return; + #if HAS_MAX_PRINT_FEEDRATE + // Set the max Printing feedrate, applying only to moves with extrusion. + if (parser.seenval('P')) { + const float p = parser.value_linear_units(); + if (p == 0 || p > 100) planner.settings.max_print_feedrate_mm_s = p; + } + #endif + LOOP_LOGICAL_AXES(i) if (parser.seenval(AXIS_CHAR(i))) { const AxisEnum a = TERN(HAS_EXTRUDERS, (i == E_AXIS ? E_AXIS_N(target_extruder) : (AxisEnum)i), (AxisEnum)i); @@ -240,6 +248,10 @@ void GcodeSuite::M203_report(const bool forReplay/*=true*/) { SERIAL_ECHOPGM_P(SP_E_STR, VOLUMETRIC_UNIT(planner.settings.max_feedrate_mm_s[E_AXIS])); #endif + #if HAS_MAX_PRINT_FEEDRATE + SERIAL_ECHOPGM_P(SP_P_STR, LINEAR_UNIT(planner.settings.max_print_feedrate_mm_s)); + #endif + if (eol) SERIAL_EOL(); #if ENABLED(DISTINCT_E_FACTORS) diff --git a/Marlin/src/inc/Conditionals-1-axes.h b/Marlin/src/inc/Conditionals-1-axes.h index d81aa2c746..31ce575a0b 100644 --- a/Marlin/src/inc/Conditionals-1-axes.h +++ b/Marlin/src/inc/Conditionals-1-axes.h @@ -69,6 +69,7 @@ #undef FILAMENT_MOTION_SENSOR #undef FILAMENT_MOTION_DISTANCE_MM #undef DISABLE_OTHER_EXTRUDERS + #undef MAX_PRINT_FEEDRATE_MM_S #endif #define E_OPTARG(N) OPTARG(HAS_MULTI_EXTRUDER, N) diff --git a/Marlin/src/inc/Conditionals-3-etc.h b/Marlin/src/inc/Conditionals-3-etc.h index f5568b669a..469c1762c9 100644 --- a/Marlin/src/inc/Conditionals-3-etc.h +++ b/Marlin/src/inc/Conditionals-3-etc.h @@ -634,3 +634,7 @@ #if ANY(PID_DEBUG, PID_BED_DEBUG, PID_CHAMBER_DEBUG) #define HAS_PID_DEBUG 1 #endif + +#ifdef MAX_PRINT_FEEDRATE_MM_S + #define HAS_MAX_PRINT_FEEDRATE 1 +#endif diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 559b3e339d..d8a8cb6a52 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -446,6 +446,7 @@ namespace LanguageNarrow_en { LSTR MSG_JUNCTION_DEVIATION = _UxGT("Junction Dev"); LSTR MSG_STEP_SMOOTHING = _UxGT("Step Smoothing"); LSTR MSG_MAX_SPEED = _UxGT("Max Speed (mm/s)"); + LSTR MSG_MAX_PRINT_SPEED = _UxGT("Max Print Speed"); LSTR MSG_VMAX_A = _UxGT("Max ") STR_A _UxGT(" Speed"); LSTR MSG_VMAX_B = _UxGT("Max ") STR_B _UxGT(" Speed"); LSTR MSG_VMAX_C = _UxGT("Max ") STR_C _UxGT(" Speed"); diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 0ef1ed1b3f..8c52bcad4f 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -716,6 +716,11 @@ void menu_advanced_settings() { // M203 / M205 - Feedrate items SUBMENU(MSG_MAX_SPEED, menu_advanced_velocity); + #if HAS_MAX_PRINT_FEEDRATE + const float max_rate = 1.4142135f * _MAX(planner.settings.max_feedrate_mm_s[X_AXIS], planner.settings.max_feedrate_mm_s[Y_AXIS]); + EDIT_ITEM_FAST(float5, MSG_MAX_PRINT_SPEED, &planner.max_print_feedrate_mm_s, 0, max_rate); + #endif + // M201 - Acceleration items SUBMENU(MSG_ACCELERATION, menu_advanced_acceleration); diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index b11740b00a..887557f54c 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -189,6 +189,10 @@ uint32_t Planner::max_acceleration_steps_per_s2[DISTINCT_AXES]; // (steps/s^2) D Planner::volumetric_extruder_feedrate_limit[EXTRUDERS]; // pre calculated extruder feedrate limit based on volumetric_extruder_limit; pre-calculated to reduce computation in the planner #endif +#if HAS_MAX_PRINT_FEEDRATE + feedRate_t Planner::max_print_feedrate_mm_s; // (mm/s) M203 P - Maximum feedrate when printing +#endif + #ifdef MAX7219_DEBUG_SLOWDOWN uint8_t Planner::slowdown_count = 0; #endif @@ -2303,7 +2307,17 @@ bool Planner::_populate_block( } } #endif + + #if HAS_MAX_PRINT_FEEDRATE + if (max_print_feedrate_mm_s > 0 && current_speed.e) { + const feedRate_t ps2 = HYPOT2(current_speed.x, current_speed.y); + if (ps2 > sq(max_print_feedrate_mm_s)) + NOMORE(speed_factor, max_print_feedrate_mm_s / SQRT(ps2)); // Multiply by ISQRT? + } + #endif + } + #endif // HAS_EXTRUDERS #ifdef XY_FREQUENCY_LIMIT diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index 2838fb90c3..63188249a6 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -493,6 +493,10 @@ class Planner { volumetric_extruder_feedrate_limit[EXTRUDERS]; // (mm/s) Feedrate limit calculated from volume limit #endif + #if HAS_MAX_PRINT_FEEDRATE + static feedRate_t max_print_feedrate_mm_s; // (mm/s) M203 P - Maximum feedrate when printing + #endif + static planner_settings_t settings; #if ENABLED(LASER_FEATURE) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index e48b215b77..86931d1d51 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -485,6 +485,13 @@ typedef struct SettingsDataStruct { float planner_filament_size[EXTRUDERS]; // M200 T D planner.filament_size[] float planner_volumetric_extruder_limit[EXTRUDERS]; // M200 T L planner.volumetric_extruder_limit[] + // + // Max Print Feedrate + // + #if HAS_MAX_PRINT_FEEDRATE + feedRate_t max_print_feedrate_mm_s; // M203 P planner.max_print_feedrate_mm_s + #endif + // // HAS_TRINAMIC_CONFIG // @@ -1399,6 +1406,13 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(homing_current_mA); #endif + // + // Max Print Feedrate + // + #if HAS_MAX_PRINT_FEEDRATE + EEPROM_WRITE(planner.max_print_feedrate_mm_s); + #endif + // // Volumetric & Filament Size // @@ -2489,6 +2503,13 @@ void MarlinSettings::postprocess() { EEPROM_READ(homing_current_mA); #endif + // + // Max Print Feedrate + // + #if HAS_MAX_PRINT_FEEDRATE + EEPROM_READ(planner.max_print_feedrate_mm_s); + #endif + // // Volumetric & Filament Size // @@ -3615,6 +3636,14 @@ void MarlinSettings::reset() { homing_current_mA = base_homing_current_mA; #endif + // + // Max Print Feedrate + // + #if HAS_MAX_PRINT_FEEDRATE + planner.max_print_feedrate_mm_s = MAX_PRINT_FEEDRATE_MM_S; + #endif + + // // // Volumetric & Filament Size //