PR26881
Fix planner wrong trap generation If the planner `entry_rate` or `final_rate` are larger thanthe `block->nominal_rate` then the trapezoid entry ramp continuously accelerates. Only happens if feed rate is less than MAXIMAL_STEP_RATE. Update planner.cpp removed Update planner.h Moved MINIMAL_STEP_RATE to this file. Update planner.h Added calc for MINIMAL_STEP_RATE Update planner.h fix minimal_step_rate calc Update planner.h Remove MINIMAL_STEP_RATE Revert "Update planner.cpp" This reverts commit 5e0158a8ee1340e5b0e6a7313eb5f5f7058bfa15. Revert "Update planner.h" This reverts commit 3da5d0c00102620dc7eddf46a30044773770a667. Update planner.cpp Update planner.h Update planner.cpp ws Apply to min_step_rate
This commit is contained in:
committed by
InsanityAutomation
parent
f6b52a80d6
commit
6ae43349f7
@@ -53,12 +53,11 @@ typedef uint64_t hal_timer_t;
|
||||
#if ENABLED(I2S_STEPPER_STREAM)
|
||||
#define STEPPER_TIMER_PRESCALE 1
|
||||
#define STEPPER_TIMER_RATE 250000 // 250khz, 4µs pulses of i2s word clock
|
||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs // wrong would be 0.25
|
||||
#else
|
||||
#define STEPPER_TIMER_PRESCALE 40
|
||||
#define STEPPER_TIMER_RATE ((HAL_TIMER_RATE) / (STEPPER_TIMER_PRESCALE)) // frequency of stepper timer, 2MHz
|
||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
|
||||
#endif
|
||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
|
||||
|
||||
#define STEP_TIMER_MIN_INTERVAL 8 // minimum time in µs between stepper interrupts
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ typedef uint32_t hal_timer_t;
|
||||
#define FTM0_TIMER_PRESCALE_BITS 0b011
|
||||
#define FTM1_TIMER_PRESCALE_BITS 0b010
|
||||
|
||||
#define FTM0_TIMER_RATE (F_BUS / (FTM0_TIMER_PRESCALE)) // 60MHz / 8 = 7500kHz
|
||||
#define FTM0_TIMER_RATE (F_BUS / (FTM0_TIMER_PRESCALE)) // 60MHz / 8 = 7.5MHz
|
||||
#define FTM1_TIMER_RATE (F_BUS / (FTM1_TIMER_PRESCALE)) // 60MHz / 4 = 15MHz
|
||||
|
||||
#define HAL_TIMER_RATE (FTM0_TIMER_RATE)
|
||||
|
||||
@@ -730,8 +730,6 @@ void Planner::init() {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define MINIMAL_STEP_RATE 120
|
||||
|
||||
/**
|
||||
* Get the current block for processing
|
||||
* and mark the block as busy.
|
||||
@@ -784,9 +782,10 @@ block_t* Planner::get_current_block() {
|
||||
|
||||
/**
|
||||
* Calculate trapezoid parameters, multiplying the entry- and exit-speeds
|
||||
* by the provided factors. Requires that initial_rate and final_rate are
|
||||
* no less than sqrt(block->acceleration_steps_per_s2 / 2), which is ensured
|
||||
* through minimum_planner_speed_sqr in _populate_block().
|
||||
* by the provided factors.
|
||||
* The factors come from the current and next entry speeds divided by the nominal speed,
|
||||
* which is the top speed achievable during the move. Since entry and exit are presumed to
|
||||
* be smaller, these factors should always be <= 1.0.
|
||||
**
|
||||
* ############ VERY IMPORTANT ############
|
||||
* NOTE that the PRECONDITION to call this function is that the block is
|
||||
@@ -807,6 +806,15 @@ void Planner::calculate_trapezoid_for_block(block_t * const block, const_float_t
|
||||
NOLESS(final_rate, uint32_t(MINIMAL_STEP_RATE));
|
||||
NOMORE(initial_rate, block->nominal_rate); // NOTE: The nominal rate may be less than MINIMAL_STEP_RATE!
|
||||
NOMORE(final_rate, block->nominal_rate);
|
||||
NOLESS(block->nominal_rate, (uint32_t)MINIMAL_STEP_RATE);
|
||||
|
||||
// Limit minimal step rate (Otherwise the timer will overflow.)
|
||||
NOLESS(initial_rate, MINIMAL_STEP_RATE);
|
||||
NOLESS(final_rate, MINIMAL_STEP_RATE);
|
||||
NOLESS(block->nominal_rate, MINIMAL_STEP_RATE);
|
||||
|
||||
//NOMORE(initial_rate, block->nominal_rate);
|
||||
//NOMORE(final_rate, block->nominal_rate);
|
||||
|
||||
#if ANY(S_CURVE_ACCELERATION, LIN_ADVANCE)
|
||||
// If we have some plateau time, the cruise rate will be the nominal rate
|
||||
|
||||
@@ -78,6 +78,14 @@
|
||||
#include "../feature/closedloop.h"
|
||||
#endif
|
||||
|
||||
constexpr uint32_t MINIMAL_STEP_RATE = (
|
||||
#ifdef CPU_32_BIT
|
||||
_MAX((STEPPER_TIMER_RATE) / HAL_TIMER_TYPE_MAX, 1U) // 32-bit shouldn't go below 1
|
||||
#else
|
||||
(F_CPU) / 500000U // AVR shouldn't go below 32 (16MHz) or 40 (20MHz)
|
||||
#endif
|
||||
);
|
||||
|
||||
// Feedrate for manual moves
|
||||
#ifdef MANUAL_FEEDRATE
|
||||
constexpr xyze_feedrate_t manual_feedrate_mm_m = MANUAL_FEEDRATE,
|
||||
|
||||
@@ -2198,15 +2198,15 @@ void Stepper::pulse_phase_isr() {
|
||||
// Calculate timer interval, with all limits applied.
|
||||
hal_timer_t Stepper::calc_timer_interval(uint32_t step_rate) {
|
||||
|
||||
constexpr uint32_t min_step_rate = MINIMAL_STEP_RATE;
|
||||
|
||||
#ifdef CPU_32_BIT
|
||||
|
||||
// A fast processor can just do integer division
|
||||
constexpr uint32_t min_step_rate = uint32_t(STEPPER_TIMER_RATE) / HAL_TIMER_TYPE_MAX;
|
||||
return step_rate > min_step_rate ? uint32_t(STEPPER_TIMER_RATE) / step_rate : HAL_TIMER_TYPE_MAX;
|
||||
|
||||
#else
|
||||
|
||||
constexpr uint32_t min_step_rate = (F_CPU) / 500000U; // i.e., 32 or 40
|
||||
if (step_rate >= 0x0800) { // higher step rate
|
||||
// AVR is able to keep up at around 65kHz Stepping ISR rate at most.
|
||||
// So values for step_rate > 65535 might as well be truncated.
|
||||
|
||||
Reference in New Issue
Block a user