Skip to content

Commit 4e698f1

Browse files
committed
Experimental S-curve
(cherry picked from commit 5348de1) # Conflicts: # Marlin/src/inc/SanityCheck.h # Marlin/src/module/stepper.cpp
1 parent 4e2a5d0 commit 4e698f1

File tree

3 files changed

+50
-11
lines changed

3 files changed

+50
-11
lines changed

Marlin/src/inc/SanityCheck.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -866,8 +866,6 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L
866866
#if ENABLED(SMOOTH_LIN_ADVANCE)
867867
#ifndef CPU_32_BIT
868868
#error "SMOOTH_LIN_ADVANCE requires a 32-bit CPU."
869-
#elif ENABLED(S_CURVE_ACCELERATION)
870-
#error "SMOOTH_LIN_ADVANCE is not compatible with S_CURVE_ACCELERATION."
871869
#elif ENABLED(NONLINEAR_EXTRUSION)
872870
#error "SMOOTH_LIN_ADVANCE doesn't currently support NONLINEAR_EXTRUSION."
873871
#elif ENABLED(INPUT_SHAPING_E_SYNC) && NONE(INPUT_SHAPING_X, INPUT_SHAPING_Y)

Marlin/src/module/stepper.cpp

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2929,14 +2929,42 @@ hal_timer_t Stepper::block_phase_isr() {
29292929
}
29302930

29312931
#endif // INPUT_SHAPING_E_SYNC
2932+
#if ENABLED(S_CURVE_ACCELERATION)
2933+
static int32_t bezier_A_backup;
2934+
static int32_t bezier_B_backup;
2935+
static int32_t bezier_C_backup;
2936+
static uint32_t bezier_F_backup;
2937+
static uint32_t bezier_AV_backup;
2938+
void Stepper::backup_bezier(){
2939+
bezier_A_backup = bezier_A;
2940+
bezier_B_backup = bezier_B;
2941+
bezier_C_backup = bezier_C;
2942+
bezier_F_backup = bezier_F;
2943+
bezier_AV_backup = bezier_AV;
2944+
}
2945+
void Stepper::recover_bezier(){
2946+
bezier_A = bezier_A_backup;
2947+
bezier_B = bezier_B_backup;
2948+
bezier_C = bezier_C_backup;
2949+
bezier_F = bezier_F_backup;
2950+
bezier_AV = bezier_AV_backup;
2951+
}
2952+
#endif
29322953

29332954
int32_t smooth_lin_adv_lookahead(uint32_t stepper_ticks) {
29342955
for (uint8_t i = 0; block_t *block = planner.get_future_block(i); i++) {
29352956
if (block->is_sync()) continue;
29362957
if (stepper_ticks <= block->acceleration_time) {
29372958
if (!block->use_advance_lead) return 0;
2938-
uint32_t rate = STEP_MULTIPLY(stepper_ticks, block->acceleration_rate) + block->initial_rate;
2939-
NOMORE(rate, block->nominal_rate);
2959+
#if ENABLED(S_CURVE_ACCELERATION)
2960+
Stepper::backup_bezier();
2961+
Stepper::_calc_bezier_curve_coeffs(block->initial_rate, block->cruise_rate, block->acceleration_time_inverse);
2962+
uint32_t rate = Stepper::_eval_bezier_curve(stepper_ticks);
2963+
Stepper::recover_bezier();
2964+
#else
2965+
uint32_t rate = STEP_MULTIPLY(stepper_ticks, block->acceleration_rate) + block->initial_rate;
2966+
NOMORE(rate, block->nominal_rate);
2967+
#endif
29402968
return MULT_Q(30, rate, block->e_step_ratio_q30);
29412969
}
29422970
stepper_ticks -= block->acceleration_time;
@@ -2949,13 +2977,20 @@ hal_timer_t Stepper::block_phase_isr() {
29492977

29502978
if (stepper_ticks <= block->deceleration_time) {
29512979
if (!block->use_advance_lead) return 0;
2952-
uint32_t rate = STEP_MULTIPLY(stepper_ticks, block->acceleration_rate);
2953-
if (rate < block->cruise_rate) {
2954-
rate = block->cruise_rate - rate;
2955-
NOLESS(rate, block->final_rate);
2956-
}
2957-
else
2958-
rate = block->final_rate;
2980+
#if ENABLED(S_CURVE_ACCELERATION)
2981+
Stepper::backup_bezier();
2982+
Stepper::_calc_bezier_curve_coeffs(block->cruise_rate, block->final_rate, block->deceleration_time_inverse);
2983+
uint32_t rate = Stepper::_eval_bezier_curve(stepper_ticks);
2984+
Stepper::recover_bezier();
2985+
#else
2986+
uint32_t rate = STEP_MULTIPLY(stepper_ticks, block->acceleration_rate);
2987+
if (rate < block->cruise_rate) {
2988+
rate = block->cruise_rate - rate;
2989+
NOLESS(rate, block->final_rate);
2990+
}
2991+
else
2992+
rate = block->final_rate;
2993+
#endif
29592994
return MULT_Q(30, rate, block->e_step_ratio_q30);
29602995
}
29612996
stepper_ticks -= block->deceleration_time;

Marlin/src/module/stepper.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,10 @@ class Stepper {
533533
#if ENABLED(SMOOTH_LIN_ADVANCE)
534534
static void set_la_interval(const int32_t rate);
535535
static hal_timer_t smooth_lin_adv_isr();
536+
#if ENABLED(S_CURVE_ACCELERATION)
537+
static void backup_bezier();
538+
static void recover_bezier();
539+
#endif
536540
#endif
537541
#endif
538542

@@ -743,8 +747,10 @@ class Stepper {
743747
#endif
744748

745749
#if ENABLED(S_CURVE_ACCELERATION)
750+
public:
746751
static void _calc_bezier_curve_coeffs(const int32_t v0, const int32_t v1, const uint32_t av);
747752
static int32_t _eval_bezier_curve(const uint32_t curr_step);
753+
private:
748754
#endif
749755

750756
#if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM

0 commit comments

Comments
 (0)