diff --git a/dda.c b/dda.c index 0884263..0fa3cf2 100644 --- a/dda.c +++ b/dda.c @@ -111,7 +111,7 @@ void dda_init(void) { if (startpoint.F == 0) startpoint.F = next_target.target.F = SEARCH_FEEDRATE_Z; if (startpoint.e_multiplier == 0) - startpoint.e_multiplier = next_target.target.e_multiplier = 100; + startpoint.e_multiplier = next_target.target.e_multiplier = 256; } /*! Distribute a new startpoint to DDA's internal structures without any movement. @@ -219,9 +219,11 @@ void dda_create(DDA *dda, TARGET *target) { steps[E] = um_to_steps(target->axis[E], E); // Apply extrusion multiplier. + if (target->e_multiplier != 256) { steps[E] *= target->e_multiplier; - steps[E] += 50; - steps[E] /= 100; + steps[E] += 128; + steps[E] /= 256; + } if ( ! target->e_relative) { int32_t delta_steps; diff --git a/dda.h b/dda.h index 4eaef1a..e580709 100644 --- a/dda.h +++ b/dda.h @@ -41,7 +41,7 @@ typedef struct { axes_int32_t axis; uint32_t F; - uint8_t e_multiplier; + uint16_t e_multiplier; uint8_t e_relative :1; ///< bool: e axis relative? Overrides all_relative } TARGET; diff --git a/gcode_process.c b/gcode_process.c index b87f2d5..1cb50be 100644 --- a/gcode_process.c +++ b/gcode_process.c @@ -797,7 +797,8 @@ void process_gcode_command() { //? --- M221: Control the extruders flow --- if ( ! next_target.seen_S) break; - next_target.target.e_multiplier = next_target.S; + // Scale 100% = 256 + next_target.target.e_multiplier = (next_target.S * 64 + 12) / 25; break; #ifdef DEBUG