Browse Source

Add Chamber servo vent, auto fan (#19519)

ladismrkolj 3 years ago
parent
commit
2c99c1e06f
No account linked to committer's email address

+ 35
- 10
Marlin/Configuration_adv.h View File

@@ -32,11 +32,10 @@
32 32
  */
33 33
 #define CONFIGURATION_ADV_H_VERSION 020007
34 34
 
35
-// @section temperature
36
-
37 35
 //===========================================================================
38 36
 //============================= Thermal Settings ============================
39 37
 //===========================================================================
38
+// @section temperature
40 39
 
41 40
 /**
42 41
  * Thermocouple sensors are quite sensitive to noise.  Any noise induced in
@@ -125,9 +124,19 @@
125 124
   #define HEATER_BED_INVERTING true
126 125
 #endif
127 126
 
128
-/**
129
- * Heated Chamber settings
130
- */
127
+//
128
+// Heated Bed Bang-Bang options
129
+//
130
+#if DISABLED(PIDTEMPBED)
131
+  #define BED_CHECK_INTERVAL 5000   // (ms) Interval between checks in bang-bang control
132
+  #if ENABLED(BED_LIMIT_SWITCHING)
133
+    #define BED_HYSTERESIS 2        // (°C) Only set the relevant heater state when ABS(T-target) > BED_HYSTERESIS
134
+  #endif
135
+#endif
136
+
137
+//
138
+// Heated Chamber options
139
+//
131 140
 #if TEMP_SENSOR_CHAMBER
132 141
   #define CHAMBER_MINTEMP             5
133 142
   #define CHAMBER_MAXTEMP            60
@@ -135,12 +144,28 @@
135 144
   //#define CHAMBER_LIMIT_SWITCHING
136 145
   //#define HEATER_CHAMBER_PIN       44   // Chamber heater on/off pin
137 146
   //#define HEATER_CHAMBER_INVERTING false
138
-#endif
139 147
 
140
-#if DISABLED(PIDTEMPBED)
141
-  #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control
142
-  #if ENABLED(BED_LIMIT_SWITCHING)
143
-    #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS
148
+  //#define CHAMBER_FAN               // Enable a fan on the chamber
149
+  #if ENABLED(CHAMBER_FAN)
150
+    #define CHAMBER_FAN_MODE 2        // Fan control mode: 0=Static; 1=Linear increase when temp is higher than target; 2=V-shaped curve.
151
+    #if CHAMBER_FAN_MODE == 0
152
+      #define CHAMBER_FAN_BASE  255   // Chamber fan PWM (0-255)
153
+    #elif CHAMBER_FAN_MODE == 1
154
+      #define CHAMBER_FAN_BASE  128   // Base chamber fan PWM (0-255); turns on when chamber temperature is above the target
155
+      #define CHAMBER_FAN_FACTOR 25   // PWM increase per °C above target
156
+    #elif CHAMBER_FAN_MODE == 2
157
+      #define CHAMBER_FAN_BASE  128   // Minimum chamber fan PWM (0-255)
158
+      #define CHAMBER_FAN_FACTOR 25   // PWM increase per °C difference from target
159
+    #endif
160
+  #endif
161
+
162
+  //#define CHAMBER_VENT              // Enable a servo-controlled vent on the chamber
163
+  #if ENABLED(CHAMBER_VENT)
164
+    #define CHAMBER_VENT_SERVO_NR  1  // Index of the vent servo
165
+    #define HIGH_EXCESS_HEAT_LIMIT 5  // How much above target temp to consider there is excess heat in the chamber
166
+    #define LOW_EXCESS_HEAT_LIMIT 3
167
+    #define MIN_COOLING_SLOPE_TIME_CHAMBER_VENT 20
168
+    #define MIN_COOLING_SLOPE_DEG_CHAMBER_VENT 1.5
144 169
   #endif
145 170
 #endif
146 171
 

+ 1
- 16
Marlin/src/inc/Conditionals_LCD.h View File

@@ -603,10 +603,6 @@
603 603
   #define DO_SWITCH_EXTRUDER 1
604 604
 #endif
605 605
 
606
-#ifdef SWITCHING_NOZZLE_E1_SERVO_NR
607
-  #define SWITCHING_NOZZLE_TWO_SERVOS 1
608
-#endif
609
-
610 606
 /**
611 607
  * Default hotend offsets, if not defined
612 608
  */
@@ -657,14 +653,7 @@
657 653
   #ifndef Z_PROBE_SERVO_NR
658 654
     #define Z_PROBE_SERVO_NR 0
659 655
   #endif
660
-  #ifndef NUM_SERVOS
661
-    #define NUM_SERVOS (Z_PROBE_SERVO_NR + 1)
662
-  #endif
663 656
   #undef DEACTIVATE_SERVOS_AFTER_MOVE
664
-  #if NUM_SERVOS == 1
665
-    #undef SERVO_DELAY
666
-    #define SERVO_DELAY { 50 }
667
-  #endif
668 657
 
669 658
   // Always disable probe pin inverting for BLTouch
670 659
   #undef Z_MIN_PROBE_ENDSTOP_INVERTING
@@ -675,14 +664,10 @@
675 664
   #endif
676 665
 #endif
677 666
 
678
-#ifndef NUM_SERVOS
679
-  #define NUM_SERVOS 0
680
-#endif
681
-
682 667
 /**
683 668
  * Set a flag for a servo probe (or BLTouch)
684 669
  */
685
-#if defined(Z_PROBE_SERVO_NR) && Z_PROBE_SERVO_NR >= 0
670
+#ifdef Z_PROBE_SERVO_NR
686 671
   #define HAS_Z_SERVO_PROBE 1
687 672
 #endif
688 673
 #if ANY(HAS_Z_SERVO_PROBE, SWITCHING_EXTRUDER, SWITCHING_NOZZLE)

+ 45
- 0
Marlin/src/inc/Conditionals_adv.h View File

@@ -26,6 +26,51 @@
26 26
  * Defines that depend on advanced configuration.
27 27
  */
28 28
 
29
+#ifdef SWITCHING_NOZZLE_E1_SERVO_NR
30
+  #define SWITCHING_NOZZLE_TWO_SERVOS 1
31
+#endif
32
+
33
+// Determine NUM_SERVOS if none was supplied
34
+#ifndef NUM_SERVOS
35
+  #define NUM_SERVOS 0
36
+  #if ANY(CHAMBER_VENT, HAS_Z_SERVO_PROBE, SWITCHING_EXTRUDER, SWITCHING_NOZZLE)
37
+    #if NUM_SERVOS <= Z_PROBE_SERVO_NR
38
+      #undef NUM_SERVOS
39
+      #define NUM_SERVOS (Z_PROBE_SERVO_NR + 1)
40
+    #endif
41
+    #if NUM_SERVOS <= CHAMBER_VENT_SERVO_NR
42
+      #undef NUM_SERVOS
43
+      #define NUM_SERVOS (CHAMBER_VENT_SERVO_NR + 1)
44
+    #endif
45
+    #if NUM_SERVOS <= SWITCHING_TOOLHEAD_SERVO_NR
46
+      #undef NUM_SERVOS
47
+      #define NUM_SERVOS (SWITCHING_TOOLHEAD_SERVO_NR + 1)
48
+    #endif
49
+    #if NUM_SERVOS <= SWITCHING_NOZZLE_SERVO_NR
50
+      #undef NUM_SERVOS
51
+      #define NUM_SERVOS (SWITCHING_NOZZLE_SERVO_NR + 1)
52
+    #endif
53
+    #if NUM_SERVOS <= SWITCHING_NOZZLE_E1_SERVO_NR
54
+      #undef NUM_SERVOS
55
+      #define NUM_SERVOS (SWITCHING_NOZZLE_E1_SERVO_NR + 1)
56
+    #endif
57
+    #if NUM_SERVOS <= SWITCHING_EXTRUDER_SERVO_NR
58
+      #undef NUM_SERVOS
59
+      #define NUM_SERVOS (SWITCHING_EXTRUDER_SERVO_NR + 1)
60
+    #endif
61
+    #if NUM_SERVOS <= SWITCHING_EXTRUDER_E23_SERVO_NR
62
+      #undef NUM_SERVOS
63
+      #define NUM_SERVOS (SWITCHING_EXTRUDER_E23_SERVO_NR + 1)
64
+    #endif
65
+  #endif
66
+#endif
67
+
68
+// Convenience override for a BLTouch alone
69
+#if ENABLED(BLTOUCH) && NUM_SERVOS == 1
70
+  #undef SERVO_DELAY
71
+  #define SERVO_DELAY { 50 }
72
+#endif
73
+
29 74
 #if EXTRUDERS == 0
30 75
   #define NO_VOLUMETRICS
31 76
   #undef TEMP_SENSOR_0

+ 28
- 4
Marlin/src/inc/SanityCheck.h View File

@@ -1249,8 +1249,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
1249 1249
    * NUM_SERVOS is required for a Z servo probe
1250 1250
    */
1251 1251
   #if HAS_Z_SERVO_PROBE
1252
-    #ifndef NUM_SERVOS
1253
-      #error "You must set NUM_SERVOS for a Z servo probe (Z_PROBE_SERVO_NR)."
1252
+    #if !NUM_SERVOS
1253
+      #error "NUM_SERVOS is required for a Z servo probe (Z_PROBE_SERVO_NR)."
1254
+    #elif Z_PROBE_SERVO_NR >= NUM_SERVOS
1255
+      #error "Z_PROBE_SERVO_NR must be smaller than NUM_SERVOS."
1254 1256
     #elif Z_PROBE_SERVO_NR == 0 && !PIN_EXISTS(SERVO0)
1255 1257
       #error "SERVO0_PIN must be defined for your servo or BLTOUCH probe."
1256 1258
     #elif Z_PROBE_SERVO_NR == 1 && !PIN_EXISTS(SERVO1)
@@ -1259,8 +1261,6 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
1259 1261
       #error "SERVO2_PIN must be defined for your servo or BLTOUCH probe."
1260 1262
     #elif Z_PROBE_SERVO_NR == 3 && !PIN_EXISTS(SERVO3)
1261 1263
       #error "SERVO3_PIN must be defined for your servo or BLTOUCH probe."
1262
-    #elif Z_PROBE_SERVO_NR >= NUM_SERVOS
1263
-      #error "Z_PROBE_SERVO_NR must be smaller than NUM_SERVOS."
1264 1264
     #endif
1265 1265
   #endif
1266 1266
 
@@ -1807,6 +1807,30 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal
1807 1807
   #error "TEMP_SENSOR_CHAMBER requires TEMP_CHAMBER_PIN. Please add it to your configuration."
1808 1808
 #endif
1809 1809
 
1810
+#if ENABLED(CHAMBER_FAN) && !(defined(CHAMBER_FAN_MODE) && WITHIN(CHAMBER_FAN_MODE, 0, 2))
1811
+  #error "CHAMBER_FAN_MODE must be between 0 and 2. Please update your Configuration_adv.h."
1812
+#endif
1813
+
1814
+#if ENABLED(CHAMBER_VENT)
1815
+  #ifndef CHAMBER_VENT_SERVO_NR
1816
+    #error "CHAMBER_VENT_SERVO_NR is required for CHAMBER SERVO. Update your Configuration_adv.h."
1817
+  #elif !NUM_SERVOS
1818
+    #error "NUM_SERVOS is required for a Heated Chamber vent servo (CHAMBER_VENT_SERVO_NR)."
1819
+  #elif CHAMBER_VENT_SERVO_NR >= NUM_SERVOS
1820
+    #error "CHAMBER_VENT_SERVO_NR must be smaller than NUM_SERVOS."
1821
+  #elif HAS_Z_SERVO_PROBE && CHAMBER_VENT_SERVO_NR == Z_PROBE_SERVO_NR
1822
+    #error "CHAMBER SERVO is already used by BLTOUCH. Please change."
1823
+  #elif CHAMBER_VENT_SERVO_NR == 0 && !PIN_EXISTS(SERVO0)
1824
+    #error "SERVO0_PIN must be defined for your Heated Chamber vent servo."
1825
+  #elif CHAMBER_VENT_SERVO_NR == 1 && !PIN_EXISTS(SERVO1)
1826
+    #error "SERVO1_PIN must be defined for your Heated Chamber vent servo."
1827
+  #elif CHAMBER_VENT_SERVO_NR == 2 && !PIN_EXISTS(SERVO2)
1828
+    #error "SERVO2_PIN must be defined for your Heated Chamber vent servo."
1829
+  #elif CHAMBER_VENT_SERVO_NR == 3 && !PIN_EXISTS(SERVO3)
1830
+    #error "SERVO3_PIN must be defined for your Heated Chamber vent servo."
1831
+  #endif
1832
+#endif
1833
+
1810 1834
 #if TEMP_SENSOR_PROBE
1811 1835
   #if !PIN_EXISTS(TEMP_PROBE)
1812 1836
     #error "TEMP_SENSOR_PROBE requires TEMP_PROBE_PIN. Please add it to your configuration."

+ 83
- 9
Marlin/src/module/temperature.cpp View File

@@ -111,6 +111,9 @@
111 111
   #include "../libs/buzzer.h"
112 112
 #endif
113 113
 
114
+#if HAS_SERVOS
115
+  #include "./servo.h"
116
+#endif
114 117
 #if HOTEND_USES_THERMISTOR
115 118
   #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)
116 119
     static const temp_entry_t* heater_ttbl_map[2] = { HEATER_0_TEMPTABLE, HEATER_1_TEMPTABLE };
@@ -271,6 +274,11 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY,
271 274
 #if HAS_TEMP_CHAMBER
272 275
   chamber_info_t Temperature::temp_chamber; // = { 0 }
273 276
   #if HAS_HEATED_CHAMBER
277
+    int16_t fan_chamber_pwm;
278
+    bool flag_chamber_off;
279
+    bool flag_chamber_excess_heat = false;
280
+    millis_t next_cool_check_ms_2 = 0;
281
+    float old_temp = 9999;
274 282
     #ifdef CHAMBER_MINTEMP
275 283
       int16_t Temperature::mintemp_raw_CHAMBER = HEATER_CHAMBER_RAW_LO_TEMP;
276 284
     #endif
@@ -1189,18 +1197,84 @@ void Temperature::manage_heater() {
1189 1197
       }
1190 1198
     #endif
1191 1199
 
1200
+    #if EITHER(CHAMBER_FAN, CHAMBER_VENT)
1201
+      if (temp_chamber.target > CHAMBER_MINTEMP) {
1202
+        flag_chamber_off = false;
1203
+
1204
+        #if ENABLED(CHAMBER_FAN)
1205
+          #if CHAMBER_FAN_MODE == 0
1206
+            fan_chamber_pwm = CHAMBER_FAN_BASE
1207
+          #elif CHAMBER_FAN_MODE == 1
1208
+            fan_chamber_pwm = temp_chamber.celsius > temp_chamber.target ? CHAMBER_FAN_BASE + ((temp_chamber.celsius - temp_chamber.target)  * CHAMBER_FAN_FACTOR ) : 0;
1209
+          #elif CHAMBER_FAN_MODE == 2
1210
+            fan_chamber_pwm = (CHAMBER_FAN_BASE) + (CHAMBER_FAN_FACTOR) * ABS(temp_chamber.celsius - temp_chamber.target);
1211
+            if (temp_chamber.soft_pwm_amount)
1212
+              fan_chamber_pwm += (CHAMBER_FAN_FACTOR) * 2;
1213
+          #endif
1214
+          fan_chamber_pwm = _MIN(225, fan_chamber_pwm);
1215
+          thermalManager.set_fan_speed(2, fan_chamber_pwm); // TODO: instead of fan 2, set to chamber fan
1216
+        #endif
1217
+
1218
+        #if ENABLED(CHAMBER_VENT)
1219
+          #ifndef MIN_COOLING_SLOPE_TIME_CHAMBER_VENT
1220
+            #define MIN_COOLING_SLOPE_TIME_CHAMBER_VENT 20
1221
+          #endif
1222
+          #ifndef MIN_COOLING_SLOPE_DEG_CHAMBER_VENT
1223
+            #define MIN_COOLING_SLOPE_DEG_CHAMBER_VENT 1.5
1224
+          #endif
1225
+          if( (temp_chamber.celsius - temp_chamber.target >= HIGH_EXCESS_HEAT_LIMIT) && !flag_chamber_excess_heat) {
1226
+          // open vent after MIN_COOLING_SLOPE_TIME_CHAMBER_VENT seconds
1227
+          // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG_CHAMBER_VENT
1228
+            if (next_cool_check_ms_2 == 0 || ELAPSED(ms, next_cool_check_ms_2)) {
1229
+              if (old_temp - temp_chamber.celsius < float(MIN_COOLING_SLOPE_DEG_CHAMBER_VENT)) flag_chamber_excess_heat = true; //the bed is heating the chamber too much
1230
+              next_cool_check_ms_2 = ms + 1000UL * MIN_COOLING_SLOPE_TIME_CHAMBER_VENT;
1231
+              old_temp = temp_chamber.celsius;
1232
+            }
1233
+          }
1234
+          else {
1235
+            next_cool_check_ms_2 = 0;
1236
+            old_temp = 9999;
1237
+          }
1238
+          if (flag_chamber_excess_heat && (temp_chamber.celsius - temp_chamber.target <= -LOW_EXCESS_HEAT_LIMIT) ) {
1239
+            flag_chamber_excess_heat = false;
1240
+          }
1241
+        #endif
1242
+      }
1243
+      else if (!flag_chamber_off) {
1244
+        #if ENABLED(CHAMBER_FAN)
1245
+          flag_chamber_off = true;
1246
+          thermalManager.set_fan_speed(2, 0);
1247
+        #endif
1248
+        #if ENABLED(CHAMBER_VENT)
1249
+          flag_chamber_excess_heat = false;
1250
+          MOVE_SERVO(CHAMBER_VENT_SERVO_NR, 90);
1251
+        #endif
1252
+      }
1253
+    #endif
1254
+
1192 1255
     if (ELAPSED(ms, next_chamber_check_ms)) {
1193 1256
       next_chamber_check_ms = ms + CHAMBER_CHECK_INTERVAL;
1194 1257
 
1195 1258
       if (WITHIN(temp_chamber.celsius, CHAMBER_MINTEMP, CHAMBER_MAXTEMP)) {
1196
-        #if ENABLED(CHAMBER_LIMIT_SWITCHING)
1197
-          if (temp_chamber.celsius >= temp_chamber.target + TEMP_CHAMBER_HYSTERESIS)
1198
-            temp_chamber.soft_pwm_amount = 0;
1199
-          else if (temp_chamber.celsius <= temp_chamber.target - (TEMP_CHAMBER_HYSTERESIS))
1200
-            temp_chamber.soft_pwm_amount = MAX_CHAMBER_POWER >> 1;
1201
-        #else
1202
-          temp_chamber.soft_pwm_amount = temp_chamber.celsius < temp_chamber.target ? MAX_CHAMBER_POWER >> 1 : 0;
1203
-        #endif
1259
+        if (!flag_chamber_excess_heat){
1260
+          #if ENABLED(CHAMBER_LIMIT_SWITCHING)
1261
+            if (temp_chamber.celsius >= temp_chamber.target + TEMP_CHAMBER_HYSTERESIS)
1262
+              temp_chamber.soft_pwm_amount = 0;
1263
+            else if (temp_chamber.celsius <= temp_chamber.target - (TEMP_CHAMBER_HYSTERESIS))
1264
+              temp_chamber.soft_pwm_amount = (MAX_CHAMBER_POWER) >> 1;
1265
+          #else
1266
+            temp_chamber.soft_pwm_amount = temp_chamber.celsius < temp_chamber.target ? (MAX_CHAMBER_POWER) >> 1 : 0;
1267
+          #endif
1268
+          #if ENABLED(CHAMBER_VENT)
1269
+            if (!flag_chamber_off) MOVE_SERVO(CHAMBER_VENT_SERVO_NR, 0);
1270
+          #endif
1271
+        }
1272
+        else {
1273
+          temp_chamber.soft_pwm_amount = 0;
1274
+          #if ENABLED(CHAMBER_VENT)
1275
+            if (!flag_chamber_off) MOVE_SERVO(CHAMBER_VENT_SERVO_NR, temp_chamber.celsius <= temp_chamber.target ? 0 : 90);
1276
+          #endif
1277
+        }
1204 1278
       }
1205 1279
       else {
1206 1280
         temp_chamber.soft_pwm_amount = 0;
@@ -3365,7 +3439,7 @@ void Temperature::tick() {
3365 3439
       #define MIN_COOLING_SLOPE_DEG_CHAMBER 1.50
3366 3440
     #endif
3367 3441
     #ifndef MIN_COOLING_SLOPE_TIME_CHAMBER
3368
-      #define MIN_COOLING_SLOPE_TIME_CHAMBER 60
3442
+      #define MIN_COOLING_SLOPE_TIME_CHAMBER 120
3369 3443
     #endif
3370 3444
 
3371 3445
     bool Temperature::wait_for_chamber(const bool no_wait_for_cooling/*=true*/) {

+ 1
- 0
Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h View File

@@ -41,6 +41,7 @@
41 41
 // Servos
42 42
 //
43 43
 #define SERVO0_PIN                          PA1
44
+#define SERVO1_PIN                          PC9
44 45
 
45 46
 //
46 47
 // Trinamic Stallguard pins

Loading…
Cancel
Save