LIN_ADVANCE bug fix and optimization
.) long to int: Extruder stalls at 10kHz / 20kHz step limits with long. .) Take the delta_adv_steps calculation out of the step_loops loop. Wasted calculation performance if done inside. .) >> 2 replaced by 3: Is divide by 8. Reason: Timer 0 runs at 16/8=2MHz, Timer 1 at 16/64=0.25MHz. ==> 2/0.25=8.
This commit is contained in:
parent
fc93796e42
commit
a448cedbc5
2 changed files with 22 additions and 23 deletions
|
@ -95,7 +95,7 @@ volatile uint32_t Stepper::step_events_completed = 0; // The number of step even
|
||||||
volatile unsigned char Stepper::eISR_Rate = 200; // Keep the ISR at a low rate until needed
|
volatile unsigned char Stepper::eISR_Rate = 200; // Keep the ISR at a low rate until needed
|
||||||
|
|
||||||
#if ENABLED(LIN_ADVANCE)
|
#if ENABLED(LIN_ADVANCE)
|
||||||
volatile long Stepper::e_steps[E_STEPPERS];
|
volatile int Stepper::e_steps[E_STEPPERS];
|
||||||
int Stepper::extruder_advance_k = LIN_ADVANCE_K,
|
int Stepper::extruder_advance_k = LIN_ADVANCE_K,
|
||||||
Stepper::final_estep_rate,
|
Stepper::final_estep_rate,
|
||||||
Stepper::current_estep_rate[E_STEPPERS],
|
Stepper::current_estep_rate[E_STEPPERS],
|
||||||
|
@ -391,7 +391,7 @@ void Stepper::isr() {
|
||||||
|
|
||||||
#if ENABLED(MIXING_EXTRUDER)
|
#if ENABLED(MIXING_EXTRUDER)
|
||||||
// Step mixing steppers proportionally
|
// Step mixing steppers proportionally
|
||||||
bool dir = motor_direction(E_AXIS);
|
const bool dir = motor_direction(E_AXIS);
|
||||||
MIXING_STEPPERS_LOOP(j) {
|
MIXING_STEPPERS_LOOP(j) {
|
||||||
counter_m[j] += current_block->steps[E_AXIS];
|
counter_m[j] += current_block->steps[E_AXIS];
|
||||||
if (counter_m[j] > 0) {
|
if (counter_m[j] > 0) {
|
||||||
|
@ -401,22 +401,6 @@ void Stepper::isr() {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (current_block->use_advance_lead) {
|
|
||||||
int delta_adv_steps = (((long)extruder_advance_k * current_estep_rate[TOOL_E_INDEX]) >> 9) - current_adv_steps[TOOL_E_INDEX];
|
|
||||||
#if ENABLED(MIXING_EXTRUDER)
|
|
||||||
// Mixing extruders apply advance lead proportionally
|
|
||||||
MIXING_STEPPERS_LOOP(j) {
|
|
||||||
int steps = delta_adv_steps * current_block->step_event_count / current_block->mix_event_count[j];
|
|
||||||
e_steps[j] += steps;
|
|
||||||
current_adv_steps[j] += steps;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
// For most extruders, advance the single E stepper
|
|
||||||
e_steps[TOOL_E_INDEX] += delta_adv_steps;
|
|
||||||
current_adv_steps[TOOL_E_INDEX] += delta_adv_steps;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif ENABLED(ADVANCE)
|
#elif ENABLED(ADVANCE)
|
||||||
|
|
||||||
// Always count the unified E axis
|
// Always count the unified E axis
|
||||||
|
@ -432,7 +416,7 @@ void Stepper::isr() {
|
||||||
#if ENABLED(MIXING_EXTRUDER)
|
#if ENABLED(MIXING_EXTRUDER)
|
||||||
|
|
||||||
// Step mixing steppers proportionally
|
// Step mixing steppers proportionally
|
||||||
bool dir = motor_direction(E_AXIS);
|
const bool dir = motor_direction(E_AXIS);
|
||||||
MIXING_STEPPERS_LOOP(j) {
|
MIXING_STEPPERS_LOOP(j) {
|
||||||
counter_m[j] += current_block->steps[E_AXIS];
|
counter_m[j] += current_block->steps[E_AXIS];
|
||||||
if (counter_m[j] > 0) {
|
if (counter_m[j] > 0) {
|
||||||
|
@ -536,6 +520,21 @@ void Stepper::isr() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if ENABLED(LIN_ADVANCE)
|
||||||
|
if (current_block->use_advance_lead) {
|
||||||
|
int delta_adv_steps = (((long)extruder_advance_k * current_estep_rate[TOOL_E_INDEX]) >> 9) - current_adv_steps[TOOL_E_INDEX];
|
||||||
|
current_adv_steps[TOOL_E_INDEX] += delta_adv_steps;
|
||||||
|
#if ENABLED(MIXING_EXTRUDER)
|
||||||
|
// Mixing extruders apply advance lead proportionally
|
||||||
|
MIXING_STEPPERS_LOOP(j)
|
||||||
|
e_steps[j] += delta_adv_steps * current_block->step_event_count / current_block->mix_event_count[j];
|
||||||
|
#else
|
||||||
|
// For most extruders, advance the single E stepper
|
||||||
|
e_steps[TOOL_E_INDEX] += delta_adv_steps;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ENABLED(ADVANCE) || ENABLED(LIN_ADVANCE)
|
#if ENABLED(ADVANCE) || ENABLED(LIN_ADVANCE)
|
||||||
// If we have esteps to execute, fire the next advance_isr "now"
|
// If we have esteps to execute, fire the next advance_isr "now"
|
||||||
if (e_steps[TOOL_E_INDEX]) OCR0A = TCNT0 + 2;
|
if (e_steps[TOOL_E_INDEX]) OCR0A = TCNT0 + 2;
|
||||||
|
@ -593,7 +592,7 @@ void Stepper::isr() {
|
||||||
#endif // ADVANCE or LIN_ADVANCE
|
#endif // ADVANCE or LIN_ADVANCE
|
||||||
|
|
||||||
#if ENABLED(ADVANCE) || ENABLED(LIN_ADVANCE)
|
#if ENABLED(ADVANCE) || ENABLED(LIN_ADVANCE)
|
||||||
eISR_Rate = (timer >> 2) * step_loops / abs(e_steps[TOOL_E_INDEX]);
|
eISR_Rate = (timer >> 3) * step_loops / abs(e_steps[TOOL_E_INDEX]); //>> 3 is divide by 8. Reason: Timer 0 runs at 16/8=2MHz, Timer 1 at 16/64=0.25MHz. ==> 2/0.25=8.
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else if (step_events_completed > (uint32_t)current_block->decelerate_after) {
|
else if (step_events_completed > (uint32_t)current_block->decelerate_after) {
|
||||||
|
@ -643,7 +642,7 @@ void Stepper::isr() {
|
||||||
#endif // ADVANCE or LIN_ADVANCE
|
#endif // ADVANCE or LIN_ADVANCE
|
||||||
|
|
||||||
#if ENABLED(ADVANCE) || ENABLED(LIN_ADVANCE)
|
#if ENABLED(ADVANCE) || ENABLED(LIN_ADVANCE)
|
||||||
eISR_Rate = (timer >> 2) * step_loops / abs(e_steps[TOOL_E_INDEX]);
|
eISR_Rate = (timer >> 3) * step_loops / abs(e_steps[TOOL_E_INDEX]);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -653,7 +652,7 @@ void Stepper::isr() {
|
||||||
if (current_block->use_advance_lead)
|
if (current_block->use_advance_lead)
|
||||||
current_estep_rate[TOOL_E_INDEX] = final_estep_rate;
|
current_estep_rate[TOOL_E_INDEX] = final_estep_rate;
|
||||||
|
|
||||||
eISR_Rate = (OCR1A_nominal >> 2) * step_loops_nominal / abs(e_steps[TOOL_E_INDEX]);
|
eISR_Rate = (OCR1A_nominal >> 3) * step_loops_nominal / abs(e_steps[TOOL_E_INDEX]);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -108,7 +108,7 @@ class Stepper {
|
||||||
static unsigned char old_OCR0A;
|
static unsigned char old_OCR0A;
|
||||||
static volatile unsigned char eISR_Rate;
|
static volatile unsigned char eISR_Rate;
|
||||||
#if ENABLED(LIN_ADVANCE)
|
#if ENABLED(LIN_ADVANCE)
|
||||||
static volatile long e_steps[E_STEPPERS];
|
static volatile int e_steps[E_STEPPERS];
|
||||||
static int extruder_advance_k;
|
static int extruder_advance_k;
|
||||||
static int final_estep_rate;
|
static int final_estep_rate;
|
||||||
static int current_estep_rate[E_STEPPERS]; // Actual extruder speed [steps/s]
|
static int current_estep_rate[E_STEPPERS]; // Actual extruder speed [steps/s]
|
||||||
|
|
Reference in a new issue