|
@@ -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*/) {
|