Browse Source

Prevent filament runout false positives (#9946)

Scott Lahteine 6 years ago
parent
commit
eb867817b5
No account linked to committer's email address
3 changed files with 16 additions and 11 deletions
  1. 2
    2
      .travis.yml
  2. 2
    1
      Marlin/src/feature/runout.cpp
  3. 12
    8
      Marlin/src/feature/runout.h

+ 2
- 2
.travis.yml View File

65
   - opt_set POWER_SUPPLY 1
65
   - opt_set POWER_SUPPLY 1
66
   - opt_enable PIDTEMPBED FIX_MOUNTED_PROBE Z_SAFE_HOMING ARC_P_CIRCLES CNC_WORKSPACE_PLANES CNC_COORDINATE_SYSTEMS
66
   - opt_enable PIDTEMPBED FIX_MOUNTED_PROBE Z_SAFE_HOMING ARC_P_CIRCLES CNC_WORKSPACE_PLANES CNC_COORDINATE_SYSTEMS
67
   - opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT EEPROM_SETTINGS
67
   - opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT EEPROM_SETTINGS
68
-  - opt_enable BLINKM PCA9632 RGB_LED NEOPIXEL_LED AUTO_POWER_CONTROL
68
+  - opt_enable BLINKM PCA9632 RGB_LED NEOPIXEL_LED AUTO_POWER_CONTROL NOZZLE_PARK_FEATURE FILAMENT_RUNOUT_SENSOR
69
   - opt_enable AUTO_BED_LEVELING_LINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE
69
   - opt_enable AUTO_BED_LEVELING_LINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE
70
-  - opt_enable_adv FWRETRACT MAX7219_DEBUG LED_CONTROL_MENU CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CODEPENDENT_XY_HOMING
70
+  - opt_enable_adv FWRETRACT MAX7219_DEBUG LED_CONTROL_MENU CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CODEPENDENT_XY_HOMING ADVANCED_PAUSE_FEATURE
71
   - opt_set ABL_GRID_POINTS_X 16
71
   - opt_set ABL_GRID_POINTS_X 16
72
   - opt_set ABL_GRID_POINTS_Y 16
72
   - opt_set ABL_GRID_POINTS_Y 16
73
   - opt_set_adv FANMUX0_PIN 53
73
   - opt_set_adv FANMUX0_PIN 53

+ 2
- 1
Marlin/src/feature/runout.cpp View File

32
 
32
 
33
 FilamentRunoutSensor runout;
33
 FilamentRunoutSensor runout;
34
 
34
 
35
-bool FilamentRunoutSensor::filament_ran_out; // = false;
35
+bool FilamentRunoutSensor::filament_ran_out; // = false
36
+uint8_t FilamentRunoutSensor::runout_count; // = 0
36
 
37
 
37
 void FilamentRunoutSensor::setup() {
38
 void FilamentRunoutSensor::setup() {
38
 
39
 

+ 12
- 8
Marlin/src/feature/runout.h View File

34
 
34
 
35
 #include "../inc/MarlinConfig.h"
35
 #include "../inc/MarlinConfig.h"
36
 
36
 
37
+#define FIL_RUNOUT_THRESHOLD 5
38
+
37
 class FilamentRunoutSensor {
39
 class FilamentRunoutSensor {
38
   public:
40
   public:
39
     FilamentRunoutSensor() {}
41
     FilamentRunoutSensor() {}
40
 
42
 
41
     static void setup();
43
     static void setup();
42
 
44
 
43
-    FORCE_INLINE static void reset() { filament_ran_out = false; }
45
+    FORCE_INLINE static void reset() { runout_count = 0; filament_ran_out = false; }
44
 
46
 
45
     FORCE_INLINE static void run() {
47
     FORCE_INLINE static void run() {
46
       if ((IS_SD_PRINTING || print_job_timer.isRunning()) && check() && !filament_ran_out) {
48
       if ((IS_SD_PRINTING || print_job_timer.isRunning()) && check() && !filament_ran_out) {
51
     }
53
     }
52
   private:
54
   private:
53
     static bool filament_ran_out;
55
     static bool filament_ran_out;
56
+    static uint8_t runout_count;
54
 
57
 
55
     FORCE_INLINE static bool check() {
58
     FORCE_INLINE static bool check() {
56
       #if NUM_RUNOUT_SENSORS < 2
59
       #if NUM_RUNOUT_SENSORS < 2
57
         // A single sensor applying to all extruders
60
         // A single sensor applying to all extruders
58
-        return READ(FIL_RUNOUT_PIN) == FIL_RUNOUT_INVERTING;
61
+        const bool is_out = READ(FIL_RUNOUT_PIN) == FIL_RUNOUT_INVERTING;
59
       #else
62
       #else
60
         // Read the sensor for the active extruder
63
         // Read the sensor for the active extruder
64
+        bool is_out;
61
         switch (active_extruder) {
65
         switch (active_extruder) {
62
-          case 0: return READ(FIL_RUNOUT_PIN) == FIL_RUNOUT_INVERTING;
63
-          case 1: return READ(FIL_RUNOUT2_PIN) == FIL_RUNOUT_INVERTING;
66
+          case 0: is_out = READ(FIL_RUNOUT_PIN) == FIL_RUNOUT_INVERTING; break;
67
+          case 1: is_out = READ(FIL_RUNOUT2_PIN) == FIL_RUNOUT_INVERTING; break;
64
           #if NUM_RUNOUT_SENSORS > 2
68
           #if NUM_RUNOUT_SENSORS > 2
65
-            case 2: return READ(FIL_RUNOUT3_PIN) == FIL_RUNOUT_INVERTING;
69
+            case 2: is_out = READ(FIL_RUNOUT3_PIN) == FIL_RUNOUT_INVERTING; break;
66
             #if NUM_RUNOUT_SENSORS > 3
70
             #if NUM_RUNOUT_SENSORS > 3
67
-              case 3: return READ(FIL_RUNOUT4_PIN) == FIL_RUNOUT_INVERTING;
71
+              case 3: is_out = READ(FIL_RUNOUT4_PIN) == FIL_RUNOUT_INVERTING; break;
68
               #if NUM_RUNOUT_SENSORS > 4
72
               #if NUM_RUNOUT_SENSORS > 4
69
-                case 4: return READ(FIL_RUNOUT5_PIN) == FIL_RUNOUT_INVERTING;
73
+                case 4: is_out = READ(FIL_RUNOUT5_PIN) == FIL_RUNOUT_INVERTING; break;
70
               #endif
74
               #endif
71
             #endif
75
             #endif
72
           #endif
76
           #endif
73
         }
77
         }
74
       #endif
78
       #endif
75
-      return false;
79
+      return (is_out ? ++runout_count : (runout_count = 0)) > FIL_RUNOUT_THRESHOLD;
76
     }
80
     }
77
 };
81
 };
78
 
82
 

Loading…
Cancel
Save