|
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*/) {
|
|
0 commit comments