Fix FILAMENT_WIDTH_SENSOR measurement
Only measure and store filament width when E is going forward.
This commit is contained in:
parent
74effedbf5
commit
865dcf3fb4
|
@ -341,8 +341,7 @@ extern bool axis_homed[3]; // axis[n].is_homed
|
||||||
extern bool filament_sensor; //indicates that filament sensor readings should control extrusion
|
extern bool filament_sensor; //indicates that filament sensor readings should control extrusion
|
||||||
extern float filament_width_meas; //holds the filament diameter as accurately measured
|
extern float filament_width_meas; //holds the filament diameter as accurately measured
|
||||||
extern int8_t measurement_delay[]; //ring buffer to delay measurement
|
extern int8_t measurement_delay[]; //ring buffer to delay measurement
|
||||||
extern int delay_index1, delay_index2; //ring buffer index. used by planner, temperature, and main code
|
extern int filwidth_delay_index1, filwidth_delay_index2; //ring buffer index. used by planner, temperature, and main code
|
||||||
extern float delay_dist; //delay distance counter
|
|
||||||
extern int meas_delay_cm; //delay distance
|
extern int meas_delay_cm; //delay distance
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -411,9 +411,8 @@ static uint8_t target_extruder;
|
||||||
bool filament_sensor = false; //M405 turns on filament_sensor control, M406 turns it off
|
bool filament_sensor = false; //M405 turns on filament_sensor control, M406 turns it off
|
||||||
float filament_width_meas = DEFAULT_MEASURED_FILAMENT_DIA; //Stores the measured filament diameter
|
float filament_width_meas = DEFAULT_MEASURED_FILAMENT_DIA; //Stores the measured filament diameter
|
||||||
int8_t measurement_delay[MAX_MEASUREMENT_DELAY + 1]; //ring buffer to delay measurement store extruder factor after subtracting 100
|
int8_t measurement_delay[MAX_MEASUREMENT_DELAY + 1]; //ring buffer to delay measurement store extruder factor after subtracting 100
|
||||||
int delay_index1 = 0; //index into ring buffer
|
int filwidth_delay_index1 = 0; //index into ring buffer
|
||||||
int delay_index2 = -1; //index into ring buffer - set to -1 on startup to indicate ring buffer needs to be initialized
|
int filwidth_delay_index2 = -1; //index into ring buffer - set to -1 on startup to indicate ring buffer needs to be initialized
|
||||||
float delay_dist = 0; //delay distance counter
|
|
||||||
int meas_delay_cm = MEASUREMENT_DELAY_CM; //distance delay setting
|
int meas_delay_cm = MEASUREMENT_DELAY_CM; //distance delay setting
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -5428,13 +5427,13 @@ inline void gcode_M400() { st_synchronize(); }
|
||||||
if (code_seen('D')) meas_delay_cm = code_value();
|
if (code_seen('D')) meas_delay_cm = code_value();
|
||||||
NOMORE(meas_delay_cm, MAX_MEASUREMENT_DELAY);
|
NOMORE(meas_delay_cm, MAX_MEASUREMENT_DELAY);
|
||||||
|
|
||||||
if (delay_index2 == -1) { //initialize the ring buffer if it has not been done since startup
|
if (filwidth_delay_index2 == -1) { // Initialize the ring buffer if not done since startup
|
||||||
int temp_ratio = widthFil_to_size_ratio();
|
int temp_ratio = widthFil_to_size_ratio();
|
||||||
|
|
||||||
for (delay_index1 = 0; delay_index1 < (int)COUNT(measurement_delay); ++delay_index1)
|
for (uint8_t i = 0; i < COUNT(measurement_delay); ++i)
|
||||||
measurement_delay[delay_index1] = temp_ratio - 100; //subtract 100 to scale within a signed byte
|
measurement_delay[i] = temp_ratio - 100; // Subtract 100 to scale within a signed byte
|
||||||
|
|
||||||
delay_index1 = delay_index2 = 0;
|
filwidth_delay_index1 = filwidth_delay_index2 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
filament_sensor = true;
|
filament_sensor = true;
|
||||||
|
|
|
@ -852,25 +852,34 @@ float junction_deviation = 0.1;
|
||||||
block->nominal_rate = ceil(block->step_event_count * inverse_second); // (step/sec) Always > 0
|
block->nominal_rate = ceil(block->step_event_count * inverse_second); // (step/sec) Always > 0
|
||||||
|
|
||||||
#if ENABLED(FILAMENT_WIDTH_SENSOR)
|
#if ENABLED(FILAMENT_WIDTH_SENSOR)
|
||||||
|
static float filwidth_e_count = 0, filwidth_delay_dist = 0;
|
||||||
|
|
||||||
//FMM update ring buffer used for delay with filament measurements
|
//FMM update ring buffer used for delay with filament measurements
|
||||||
if (extruder == FILAMENT_SENSOR_EXTRUDER_NUM && delay_index2 > -1) { //only for extruder with filament sensor and if ring buffer is initialized
|
if (extruder == FILAMENT_SENSOR_EXTRUDER_NUM && filwidth_delay_index2 >= 0) { //only for extruder with filament sensor and if ring buffer is initialized
|
||||||
|
|
||||||
const int MMD = MAX_MEASUREMENT_DELAY + 1, MMD10 = MMD * 10;
|
const int MMD_CM = MAX_MEASUREMENT_DELAY + 1, MMD_MM = MMD_CM * 10;
|
||||||
|
|
||||||
delay_dist += delta_mm[E_AXIS]; // increment counter with next move in e axis
|
// increment counters with next move in e axis
|
||||||
while (delay_dist >= MMD10) delay_dist -= MMD10; // loop around the buffer
|
filwidth_e_count += delta_mm[E_AXIS];
|
||||||
while (delay_dist < 0) delay_dist += MMD10;
|
filwidth_delay_dist += delta_mm[E_AXIS];
|
||||||
|
|
||||||
delay_index1 = delay_dist / 10.0; // calculate index
|
// Only get new measurements on forward E movement
|
||||||
delay_index1 = constrain(delay_index1, 0, MAX_MEASUREMENT_DELAY); // (already constrained above)
|
if (filwidth_e_count > 0.0001) {
|
||||||
|
|
||||||
if (delay_index1 != delay_index2) { // moved index
|
// Loop the delay distance counter (modulus by the mm length)
|
||||||
|
while (filwidth_delay_dist >= MMD_MM) filwidth_delay_dist -= MMD_MM;
|
||||||
|
|
||||||
|
// Convert into an index into the measurement array
|
||||||
|
filwidth_delay_index1 = (int)(filwidth_delay_dist / 10.0 + 0.0001);
|
||||||
|
|
||||||
|
// If the index has changed (must have gone forward)...
|
||||||
|
if (filwidth_delay_index1 != filwidth_delay_index2) {
|
||||||
|
filwidth_e_count = 0; // Reset the E movement counter
|
||||||
int8_t meas_sample = widthFil_to_size_ratio() - 100; // Subtract 100 to reduce magnitude - to store in a signed char
|
int8_t meas_sample = widthFil_to_size_ratio() - 100; // Subtract 100 to reduce magnitude - to store in a signed char
|
||||||
while (delay_index1 != delay_index2) {
|
do {
|
||||||
// Increment and loop around buffer
|
filwidth_delay_index2 = (filwidth_delay_index2 + 1) % MMD_CM; // The next unused slot
|
||||||
if (++delay_index2 >= MMD) delay_index2 -= MMD;
|
measurement_delay[filwidth_delay_index2] = meas_sample; // Store the measurement
|
||||||
delay_index2 = constrain(delay_index2, 0, MAX_MEASUREMENT_DELAY);
|
} while (filwidth_delay_index1 != filwidth_delay_index2); // More slots to fill?
|
||||||
measurement_delay[delay_index2] = meas_sample;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -705,7 +705,7 @@ void manage_heater() {
|
||||||
// Control the extruder rate based on the width sensor
|
// Control the extruder rate based on the width sensor
|
||||||
#if ENABLED(FILAMENT_WIDTH_SENSOR)
|
#if ENABLED(FILAMENT_WIDTH_SENSOR)
|
||||||
if (filament_sensor) {
|
if (filament_sensor) {
|
||||||
meas_shift_index = delay_index1 - meas_delay_cm;
|
meas_shift_index = filwidth_delay_index1 - meas_delay_cm;
|
||||||
if (meas_shift_index < 0) meas_shift_index += MAX_MEASUREMENT_DELAY + 1; //loop around buffer if needed
|
if (meas_shift_index < 0) meas_shift_index += MAX_MEASUREMENT_DELAY + 1; //loop around buffer if needed
|
||||||
|
|
||||||
// Get the delayed info and add 100 to reconstitute to a percent of
|
// Get the delayed info and add 100 to reconstitute to a percent of
|
||||||
|
|
Loading…
Reference in a new issue