|
|
|
@ -111,6 +111,9 @@
|
|
|
|
|
#include "../libs/buzzer.h"
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if HAS_SERVOS
|
|
|
|
|
#include "./servo.h"
|
|
|
|
|
#endif
|
|
|
|
|
#if HOTEND_USES_THERMISTOR
|
|
|
|
|
#if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)
|
|
|
|
|
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,
|
|
|
|
|
#if HAS_TEMP_CHAMBER
|
|
|
|
|
chamber_info_t Temperature::temp_chamber; // = { 0 }
|
|
|
|
|
#if HAS_HEATED_CHAMBER
|
|
|
|
|
int16_t fan_chamber_pwm;
|
|
|
|
|
bool flag_chamber_off;
|
|
|
|
|
bool flag_chamber_excess_heat = false;
|
|
|
|
|
millis_t next_cool_check_ms_2 = 0;
|
|
|
|
|
float old_temp = 9999;
|
|
|
|
|
#ifdef CHAMBER_MINTEMP
|
|
|
|
|
int16_t Temperature::mintemp_raw_CHAMBER = HEATER_CHAMBER_RAW_LO_TEMP;
|
|
|
|
|
#endif
|
|
|
|
@ -1194,18 +1202,84 @@ void Temperature::manage_heater() {
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if EITHER(CHAMBER_FAN, CHAMBER_VENT)
|
|
|
|
|
if (temp_chamber.target > CHAMBER_MINTEMP) {
|
|
|
|
|
flag_chamber_off = false;
|
|
|
|
|
|
|
|
|
|
#if ENABLED(CHAMBER_FAN)
|
|
|
|
|
#if CHAMBER_FAN_MODE == 0
|
|
|
|
|
fan_chamber_pwm = CHAMBER_FAN_BASE
|
|
|
|
|
#elif CHAMBER_FAN_MODE == 1
|
|
|
|
|
fan_chamber_pwm = temp_chamber.celsius > temp_chamber.target ? CHAMBER_FAN_BASE + ((temp_chamber.celsius - temp_chamber.target) * CHAMBER_FAN_FACTOR ) : 0;
|
|
|
|
|
#elif CHAMBER_FAN_MODE == 2
|
|
|
|
|
fan_chamber_pwm = (CHAMBER_FAN_BASE) + (CHAMBER_FAN_FACTOR) * ABS(temp_chamber.celsius - temp_chamber.target);
|
|
|
|
|
if (temp_chamber.soft_pwm_amount)
|
|
|
|
|
fan_chamber_pwm += (CHAMBER_FAN_FACTOR) * 2;
|
|
|
|
|
#endif
|
|
|
|
|
fan_chamber_pwm = _MIN(225, fan_chamber_pwm);
|
|
|
|
|
thermalManager.set_fan_speed(2, fan_chamber_pwm); // TODO: instead of fan 2, set to chamber fan
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if ENABLED(CHAMBER_VENT)
|
|
|
|
|
#ifndef MIN_COOLING_SLOPE_TIME_CHAMBER_VENT
|
|
|
|
|
#define MIN_COOLING_SLOPE_TIME_CHAMBER_VENT 20
|
|
|
|
|
#endif
|
|
|
|
|
#ifndef MIN_COOLING_SLOPE_DEG_CHAMBER_VENT
|
|
|
|
|
#define MIN_COOLING_SLOPE_DEG_CHAMBER_VENT 1.5
|
|
|
|
|
#endif
|
|
|
|
|
if( (temp_chamber.celsius - temp_chamber.target >= HIGH_EXCESS_HEAT_LIMIT) && !flag_chamber_excess_heat) {
|
|
|
|
|
// open vent after MIN_COOLING_SLOPE_TIME_CHAMBER_VENT seconds
|
|
|
|
|
// if the temperature did not drop at least MIN_COOLING_SLOPE_DEG_CHAMBER_VENT
|
|
|
|
|
if (next_cool_check_ms_2 == 0 || ELAPSED(ms, next_cool_check_ms_2)) {
|
|
|
|
|
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
|
|
|
|
|
next_cool_check_ms_2 = ms + 1000UL * MIN_COOLING_SLOPE_TIME_CHAMBER_VENT;
|
|
|
|
|
old_temp = temp_chamber.celsius;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
next_cool_check_ms_2 = 0;
|
|
|
|
|
old_temp = 9999;
|
|
|
|
|
}
|
|
|
|
|
if (flag_chamber_excess_heat && (temp_chamber.celsius - temp_chamber.target <= -LOW_EXCESS_HEAT_LIMIT) ) {
|
|
|
|
|
flag_chamber_excess_heat = false;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
else if (!flag_chamber_off) {
|
|
|
|
|
#if ENABLED(CHAMBER_FAN)
|
|
|
|
|
flag_chamber_off = true;
|
|
|
|
|
thermalManager.set_fan_speed(2, 0);
|
|
|
|
|
#endif
|
|
|
|
|
#if ENABLED(CHAMBER_VENT)
|
|
|
|
|
flag_chamber_excess_heat = false;
|
|
|
|
|
MOVE_SERVO(CHAMBER_VENT_SERVO_NR, 90);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if (ELAPSED(ms, next_chamber_check_ms)) {
|
|
|
|
|
next_chamber_check_ms = ms + CHAMBER_CHECK_INTERVAL;
|
|
|
|
|
|
|
|
|
|
if (WITHIN(temp_chamber.celsius, CHAMBER_MINTEMP, CHAMBER_MAXTEMP)) {
|
|
|
|
|
#if ENABLED(CHAMBER_LIMIT_SWITCHING)
|
|
|
|
|
if (temp_chamber.celsius >= temp_chamber.target + TEMP_CHAMBER_HYSTERESIS)
|
|
|
|
|
temp_chamber.soft_pwm_amount = 0;
|
|
|
|
|
else if (temp_chamber.celsius <= temp_chamber.target - (TEMP_CHAMBER_HYSTERESIS))
|
|
|
|
|
temp_chamber.soft_pwm_amount = MAX_CHAMBER_POWER >> 1;
|
|
|
|
|
#else
|
|
|
|
|
temp_chamber.soft_pwm_amount = temp_chamber.celsius < temp_chamber.target ? MAX_CHAMBER_POWER >> 1 : 0;
|
|
|
|
|
#endif
|
|
|
|
|
if (!flag_chamber_excess_heat){
|
|
|
|
|
#if ENABLED(CHAMBER_LIMIT_SWITCHING)
|
|
|
|
|
if (temp_chamber.celsius >= temp_chamber.target + TEMP_CHAMBER_HYSTERESIS)
|
|
|
|
|
temp_chamber.soft_pwm_amount = 0;
|
|
|
|
|
else if (temp_chamber.celsius <= temp_chamber.target - (TEMP_CHAMBER_HYSTERESIS))
|
|
|
|
|
temp_chamber.soft_pwm_amount = (MAX_CHAMBER_POWER) >> 1;
|
|
|
|
|
#else
|
|
|
|
|
temp_chamber.soft_pwm_amount = temp_chamber.celsius < temp_chamber.target ? (MAX_CHAMBER_POWER) >> 1 : 0;
|
|
|
|
|
#endif
|
|
|
|
|
#if ENABLED(CHAMBER_VENT)
|
|
|
|
|
if (!flag_chamber_off) MOVE_SERVO(CHAMBER_VENT_SERVO_NR, 0);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
temp_chamber.soft_pwm_amount = 0;
|
|
|
|
|
#if ENABLED(CHAMBER_VENT)
|
|
|
|
|
if (!flag_chamber_off) MOVE_SERVO(CHAMBER_VENT_SERVO_NR, temp_chamber.celsius <= temp_chamber.target ? 0 : 90);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
temp_chamber.soft_pwm_amount = 0;
|
|
|
|
@ -3370,7 +3444,7 @@ void Temperature::tick() {
|
|
|
|
|
#define MIN_COOLING_SLOPE_DEG_CHAMBER 1.50
|
|
|
|
|
#endif
|
|
|
|
|
#ifndef MIN_COOLING_SLOPE_TIME_CHAMBER
|
|
|
|
|
#define MIN_COOLING_SLOPE_TIME_CHAMBER 60
|
|
|
|
|
#define MIN_COOLING_SLOPE_TIME_CHAMBER 120
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
bool Temperature::wait_for_chamber(const bool no_wait_for_cooling/*=true*/) {
|
|
|
|
|