mirror of
https://github.com/MarlinFirmware/Marlin.git
synced 2025-07-25 07:33:56 -06:00
🔧 Expose MULTISTEPPING_LIMIT option
Co-Authored-By: tombrazier <68918209+tombrazier@users.noreply.github.com>
This commit is contained in:
parent
549419e084
commit
3365172e7c
6 changed files with 52 additions and 16 deletions
|
@ -1267,6 +1267,12 @@
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Multi-stepping sends steps in bursts to reduce MCU usage for high step-rates.
|
||||||
|
* This allows higher feedrates than the MCU could otherwise support.
|
||||||
|
*/
|
||||||
|
#define MULTISTEPPING_LIMIT 16 //: [1, 2, 4, 8, 16, 32, 64, 128]
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies
|
* 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
|
* below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible
|
||||||
|
|
|
@ -1219,3 +1219,9 @@
|
||||||
#undef TC_GCODE_USE_GLOBAL_Y
|
#undef TC_GCODE_USE_GLOBAL_Y
|
||||||
#undef TC_GCODE_USE_GLOBAL_Z
|
#undef TC_GCODE_USE_GLOBAL_Z
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Multi-Stepping Limit
|
||||||
|
#ifndef MULTISTEPPING_LIMIT
|
||||||
|
#define MULTISTEPPING_LIMIT 128
|
||||||
|
#define MULTISTEPPING_LIMIT_WARNING 1
|
||||||
|
#endif
|
||||||
|
|
|
@ -4500,6 +4500,9 @@ static_assert(_PLUS_TEST(4), "HOMING_FEEDRATE_MM_M values must be positive.");
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Multi-Stepping Limit
|
||||||
|
static_assert(WITHIN(MULTISTEPPING_LIMIT, 1, 128) && IS_POWER_OF_2(MULTISTEPPING_LIMIT), "MULTISTEPPING_LIMIT must be 1, 2, 4, 8, 16, 32, 64, or 128.");
|
||||||
|
|
||||||
// Misc. Cleanup
|
// Misc. Cleanup
|
||||||
#undef _TEST_PWM
|
#undef _TEST_PWM
|
||||||
#undef _NUM_AXES_STR
|
#undef _NUM_AXES_STR
|
||||||
|
|
|
@ -797,3 +797,7 @@
|
||||||
#if HAS_SHAPING && ANY(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX)
|
#if HAS_SHAPING && ANY(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX)
|
||||||
#warning "Input Shaping for CORE / MARKFORGED kinematic axes is still experimental."
|
#warning "Input Shaping for CORE / MARKFORGED kinematic axes is still experimental."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if MULTISTEPPING_LIMIT_WARNING
|
||||||
|
#warning "MULTISTEPPING_LIMIT has been automatically set to 128. Use a lower value if the machine is slow to respond."
|
||||||
|
#endif
|
||||||
|
|
|
@ -189,7 +189,10 @@ bool Stepper::abort_current_block;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint32_t Stepper::acceleration_time, Stepper::deceleration_time;
|
uint32_t Stepper::acceleration_time, Stepper::deceleration_time;
|
||||||
uint8_t Stepper::steps_per_isr = 1; // Count of steps to perform per Stepper ISR call
|
|
||||||
|
#if MULTISTEPPING_LIMIT > 1
|
||||||
|
uint8_t Stepper::steps_per_isr = 1; // Count of steps to perform per Stepper ISR call
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ENABLED(FREEZE_FEATURE)
|
#if ENABLED(FREEZE_FEATURE)
|
||||||
bool Stepper::frozen; // = false
|
bool Stepper::frozen; // = false
|
||||||
|
@ -2089,7 +2092,7 @@ hal_timer_t Stepper::calc_timer_interval(uint32_t step_rate) {
|
||||||
|
|
||||||
// Get the timer interval and the number of loops to perform per tick
|
// Get the timer interval and the number of loops to perform per tick
|
||||||
hal_timer_t Stepper::calc_multistep_timer_interval(uint32_t step_rate) {
|
hal_timer_t Stepper::calc_multistep_timer_interval(uint32_t step_rate) {
|
||||||
#if ENABLED(DISABLE_MULTI_STEPPING)
|
#if MULTISTEPPING_LIMIT == 1
|
||||||
|
|
||||||
// Just make sure the step rate is doable
|
// Just make sure the step rate is doable
|
||||||
NOMORE(step_rate, uint32_t(MAX_STEP_ISR_FREQUENCY_1X));
|
NOMORE(step_rate, uint32_t(MAX_STEP_ISR_FREQUENCY_1X));
|
||||||
|
@ -2098,19 +2101,31 @@ hal_timer_t Stepper::calc_multistep_timer_interval(uint32_t step_rate) {
|
||||||
|
|
||||||
// The stepping frequency limits for each multistepping rate
|
// The stepping frequency limits for each multistepping rate
|
||||||
static const uint32_t limit[] PROGMEM = {
|
static const uint32_t limit[] PROGMEM = {
|
||||||
( MAX_STEP_ISR_FREQUENCY_1X ),
|
( MAX_STEP_ISR_FREQUENCY_1X )
|
||||||
( MAX_STEP_ISR_FREQUENCY_2X >> 1),
|
, ( MAX_STEP_ISR_FREQUENCY_2X >> 1)
|
||||||
( MAX_STEP_ISR_FREQUENCY_4X >> 2),
|
#if MULTISTEPPING_LIMIT >= 4
|
||||||
( MAX_STEP_ISR_FREQUENCY_8X >> 3),
|
, ( MAX_STEP_ISR_FREQUENCY_4X >> 2)
|
||||||
( MAX_STEP_ISR_FREQUENCY_16X >> 4),
|
#endif
|
||||||
( MAX_STEP_ISR_FREQUENCY_32X >> 5),
|
#if MULTISTEPPING_LIMIT >= 8
|
||||||
( MAX_STEP_ISR_FREQUENCY_64X >> 6),
|
, ( MAX_STEP_ISR_FREQUENCY_8X >> 3)
|
||||||
(MAX_STEP_ISR_FREQUENCY_128X >> 7)
|
#endif
|
||||||
|
#if MULTISTEPPING_LIMIT >= 16
|
||||||
|
, ( MAX_STEP_ISR_FREQUENCY_16X >> 4)
|
||||||
|
#endif
|
||||||
|
#if MULTISTEPPING_LIMIT >= 32
|
||||||
|
, ( MAX_STEP_ISR_FREQUENCY_32X >> 5)
|
||||||
|
#endif
|
||||||
|
#if MULTISTEPPING_LIMIT >= 64
|
||||||
|
, ( MAX_STEP_ISR_FREQUENCY_64X >> 6)
|
||||||
|
#endif
|
||||||
|
#if MULTISTEPPING_LIMIT >= 128
|
||||||
|
, (MAX_STEP_ISR_FREQUENCY_128X >> 7)
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
// Find a doable step rate using multistepping
|
// Find a doable step rate using multistepping
|
||||||
uint8_t multistep = 1;
|
uint8_t multistep = 1;
|
||||||
for (uint8_t i = 0; i < 7 && step_rate > uint32_t(pgm_read_dword(&limit[i])); ++i) {
|
for (uint8_t i = 0; i < COUNT(limit) && step_rate > uint32_t(pgm_read_dword(&limit[i])); ++i) {
|
||||||
step_rate >>= 1;
|
step_rate >>= 1;
|
||||||
multistep <<= 1;
|
multistep <<= 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,9 +49,6 @@
|
||||||
#include "stepper/speed_lookuptable.h"
|
#include "stepper/speed_lookuptable.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Disable multiple steps per ISR
|
|
||||||
//#define DISABLE_MULTI_STEPPING
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Estimate the amount of time the Stepper ISR will take to execute
|
// Estimate the amount of time the Stepper ISR will take to execute
|
||||||
//
|
//
|
||||||
|
@ -259,7 +256,7 @@
|
||||||
|
|
||||||
// The minimum step ISR rate used by ADAPTIVE_STEP_SMOOTHING to target 50% CPU usage
|
// The minimum step ISR rate used by ADAPTIVE_STEP_SMOOTHING to target 50% CPU usage
|
||||||
// This does not account for the possibility of multi-stepping.
|
// This does not account for the possibility of multi-stepping.
|
||||||
// Perhaps DISABLE_MULTI_STEPPING should be required with ADAPTIVE_STEP_SMOOTHING.
|
// Should a MULTISTEPPING_LIMIT of 1 should be required with ADAPTIVE_STEP_SMOOTHING?
|
||||||
#define MIN_STEP_ISR_FREQUENCY (MAX_STEP_ISR_FREQUENCY_1X / 2)
|
#define MIN_STEP_ISR_FREQUENCY (MAX_STEP_ISR_FREQUENCY_1X / 2)
|
||||||
|
|
||||||
#define ENABLE_COUNT (NUM_AXES + E_STEPPERS)
|
#define ENABLE_COUNT (NUM_AXES + E_STEPPERS)
|
||||||
|
@ -543,7 +540,12 @@ class Stepper {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static uint32_t acceleration_time, deceleration_time; // time measured in Stepper Timer ticks
|
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
|
|
||||||
|
#if MULTISTEPPING_LIMIT == 1
|
||||||
|
static constexpr uint8_t steps_per_isr = 1; // Count of steps to perform per Stepper ISR call
|
||||||
|
#else
|
||||||
|
static uint8_t steps_per_isr;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ENABLED(ADAPTIVE_STEP_SMOOTHING)
|
#if ENABLED(ADAPTIVE_STEP_SMOOTHING)
|
||||||
static uint8_t oversampling_factor; // Oversampling factor (log2(multiplier)) to increase temporal resolution of axis
|
static uint8_t oversampling_factor; // Oversampling factor (log2(multiplier)) to increase temporal resolution of axis
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue