From a847f37d43e4571ddc848172caa71e49c087eebe Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 19 Jul 2020 19:53:29 -0700 Subject: [PATCH] Reduce Step Smoothing ceiling to 50% CPU usage (#18719) --- Marlin/src/module/stepper.cpp | 6 +++--- Marlin/src/module/stepper.h | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 16ff134923..2a9e4dae21 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2099,11 +2099,11 @@ uint32_t Stepper::block_phase_isr() { #if ENABLED(ADAPTIVE_STEP_SMOOTHING) uint8_t oversampling = 0; // Assume no axis smoothing (via oversampling) // Decide if axis smoothing is possible - uint32_t max_rate = current_block->nominal_rate; // Get the maximum rate (maximum event speed) + uint32_t max_rate = current_block->nominal_rate; // Get the step event rate while (max_rate < MIN_STEP_ISR_FREQUENCY) { // As long as more ISRs are possible... max_rate <<= 1; // Try to double the rate - if (max_rate >= MAX_STEP_ISR_FREQUENCY_1X) break; // Don't exceed the estimated ISR limit - ++oversampling; // Increase the oversampling (used for left-shift) + if (max_rate < MIN_STEP_ISR_FREQUENCY) // Don't exceed the estimated ISR limit + ++oversampling; // Increase the oversampling (used for left-shift) } oversampling_factor = oversampling; // For all timer interval calculations #else diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h index 6ae5076cd2..4665f2dc01 100644 --- a/Marlin/src/module/stepper.h +++ b/Marlin/src/module/stepper.h @@ -229,8 +229,10 @@ #define MAX_STEP_ISR_FREQUENCY_2X ((F_CPU) / ISR_EXECUTION_CYCLES(2)) #define MAX_STEP_ISR_FREQUENCY_1X ((F_CPU) / ISR_EXECUTION_CYCLES(1)) -// The minimum allowable frequency for step smoothing will be 1/10 of the maximum nominal frequency (in Hz) -#define MIN_STEP_ISR_FREQUENCY MAX_STEP_ISR_FREQUENCY_1X +// 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. +// Perhaps DISABLE_MULTI_STEPPING should be required with ADAPTIVE_STEP_SMOOTHING. +#define MIN_STEP_ISR_FREQUENCY (MAX_STEP_ISR_FREQUENCY_1X / 2) // // Stepper class definition