Prevent filament runout false positives (#9946)

This commit is contained in:
Scott Lahteine 2018-03-05 01:49:30 -06:00 committed by GitHub
parent 36262a0479
commit eb867817b5
Signed by: GitHub
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 11 deletions

View file

@ -65,9 +65,9 @@ script:
- opt_set POWER_SUPPLY 1 - opt_set POWER_SUPPLY 1
- opt_enable PIDTEMPBED FIX_MOUNTED_PROBE Z_SAFE_HOMING ARC_P_CIRCLES CNC_WORKSPACE_PLANES CNC_COORDINATE_SYSTEMS - opt_enable PIDTEMPBED FIX_MOUNTED_PROBE Z_SAFE_HOMING ARC_P_CIRCLES CNC_WORKSPACE_PLANES CNC_COORDINATE_SYSTEMS
- opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT EEPROM_SETTINGS - opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT EEPROM_SETTINGS
- opt_enable BLINKM PCA9632 RGB_LED NEOPIXEL_LED AUTO_POWER_CONTROL - opt_enable BLINKM PCA9632 RGB_LED NEOPIXEL_LED AUTO_POWER_CONTROL NOZZLE_PARK_FEATURE FILAMENT_RUNOUT_SENSOR
- opt_enable AUTO_BED_LEVELING_LINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE - opt_enable AUTO_BED_LEVELING_LINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE
- opt_enable_adv FWRETRACT MAX7219_DEBUG LED_CONTROL_MENU CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CODEPENDENT_XY_HOMING - opt_enable_adv FWRETRACT MAX7219_DEBUG LED_CONTROL_MENU CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CODEPENDENT_XY_HOMING ADVANCED_PAUSE_FEATURE
- opt_set ABL_GRID_POINTS_X 16 - opt_set ABL_GRID_POINTS_X 16
- opt_set ABL_GRID_POINTS_Y 16 - opt_set ABL_GRID_POINTS_Y 16
- opt_set_adv FANMUX0_PIN 53 - opt_set_adv FANMUX0_PIN 53

View file

@ -32,7 +32,8 @@
FilamentRunoutSensor runout; FilamentRunoutSensor runout;
bool FilamentRunoutSensor::filament_ran_out; // = false; bool FilamentRunoutSensor::filament_ran_out; // = false
uint8_t FilamentRunoutSensor::runout_count; // = 0
void FilamentRunoutSensor::setup() { void FilamentRunoutSensor::setup() {

View file

@ -34,13 +34,15 @@
#include "../inc/MarlinConfig.h" #include "../inc/MarlinConfig.h"
#define FIL_RUNOUT_THRESHOLD 5
class FilamentRunoutSensor { class FilamentRunoutSensor {
public: public:
FilamentRunoutSensor() {} FilamentRunoutSensor() {}
static void setup(); static void setup();
FORCE_INLINE static void reset() { filament_ran_out = false; } FORCE_INLINE static void reset() { runout_count = 0; filament_ran_out = false; }
FORCE_INLINE static void run() { FORCE_INLINE static void run() {
if ((IS_SD_PRINTING || print_job_timer.isRunning()) && check() && !filament_ran_out) { if ((IS_SD_PRINTING || print_job_timer.isRunning()) && check() && !filament_ran_out) {
@ -51,28 +53,30 @@ class FilamentRunoutSensor {
} }
private: private:
static bool filament_ran_out; static bool filament_ran_out;
static uint8_t runout_count;
FORCE_INLINE static bool check() { FORCE_INLINE static bool check() {
#if NUM_RUNOUT_SENSORS < 2 #if NUM_RUNOUT_SENSORS < 2
// A single sensor applying to all extruders // A single sensor applying to all extruders
return READ(FIL_RUNOUT_PIN) == FIL_RUNOUT_INVERTING; const bool is_out = READ(FIL_RUNOUT_PIN) == FIL_RUNOUT_INVERTING;
#else #else
// Read the sensor for the active extruder // Read the sensor for the active extruder
bool is_out;
switch (active_extruder) { switch (active_extruder) {
case 0: return READ(FIL_RUNOUT_PIN) == FIL_RUNOUT_INVERTING; case 0: is_out = READ(FIL_RUNOUT_PIN) == FIL_RUNOUT_INVERTING; break;
case 1: return READ(FIL_RUNOUT2_PIN) == FIL_RUNOUT_INVERTING; case 1: is_out = READ(FIL_RUNOUT2_PIN) == FIL_RUNOUT_INVERTING; break;
#if NUM_RUNOUT_SENSORS > 2 #if NUM_RUNOUT_SENSORS > 2
case 2: return READ(FIL_RUNOUT3_PIN) == FIL_RUNOUT_INVERTING; case 2: is_out = READ(FIL_RUNOUT3_PIN) == FIL_RUNOUT_INVERTING; break;
#if NUM_RUNOUT_SENSORS > 3 #if NUM_RUNOUT_SENSORS > 3
case 3: return READ(FIL_RUNOUT4_PIN) == FIL_RUNOUT_INVERTING; case 3: is_out = READ(FIL_RUNOUT4_PIN) == FIL_RUNOUT_INVERTING; break;
#if NUM_RUNOUT_SENSORS > 4 #if NUM_RUNOUT_SENSORS > 4
case 4: return READ(FIL_RUNOUT5_PIN) == FIL_RUNOUT_INVERTING; case 4: is_out = READ(FIL_RUNOUT5_PIN) == FIL_RUNOUT_INVERTING; break;
#endif #endif
#endif #endif
#endif #endif
} }
#endif #endif
return false; return (is_out ? ++runout_count : (runout_count = 0)) > FIL_RUNOUT_THRESHOLD;
} }
}; };