Add Chamber servo vent, auto fan (#19519)

This commit is contained in:
ladismrkolj
2020-10-07 01:36:01 +02:00
committed by GitHub
parent f95a2f6d91
commit 2c99c1e06f
6 changed files with 193 additions and 39 deletions

View File

@ -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
@ -1189,18 +1197,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;
@ -3365,7 +3439,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*/) {