Temperature cleanup

This commit is contained in:
Scott Lahteine 2021-05-02 21:32:21 -05:00
parent e69e56ea52
commit d174d610bd
3 changed files with 61 additions and 106 deletions

View File

@ -184,6 +184,7 @@ void Touch::touch(touch_control_t *control) {
int8_t heater; int8_t heater;
heater = control->data; heater = control->data;
ui.clear_lcd(); ui.clear_lcd();
#if HAS_HOTEND
if (heater >= 0) { // HotEnd if (heater >= 0) { // HotEnd
#if HOTENDS == 1 #if HOTENDS == 1
MenuItem_int3::action((const char *)GET_TEXT_F(MSG_NOZZLE), &thermalManager.temp_hotend[0].target, 0, thermalManager.hotend_max_target(0), []{ thermalManager.start_watching_hotend(0); }); MenuItem_int3::action((const char *)GET_TEXT_F(MSG_NOZZLE), &thermalManager.temp_hotend[0].target, 0, thermalManager.hotend_max_target(0), []{ thermalManager.start_watching_hotend(0); });
@ -192,6 +193,7 @@ void Touch::touch(touch_control_t *control) {
MenuItem_int3::action((const char *)GET_TEXT_F(MSG_NOZZLE_N), &thermalManager.temp_hotend[heater].target, 0, thermalManager.hotend_max_target(heater), []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); }); MenuItem_int3::action((const char *)GET_TEXT_F(MSG_NOZZLE_N), &thermalManager.temp_hotend[heater].target, 0, thermalManager.hotend_max_target(heater), []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); });
#endif #endif
} }
#endif
#if HAS_HEATED_BED #if HAS_HEATED_BED
else if (heater == H_BED) { else if (heater == H_BED) {
MenuItem_int3::action((const char *)GET_TEXT_F(MSG_BED), &thermalManager.temp_bed.target, 0, BED_MAX_TARGET, thermalManager.start_watching_bed); MenuItem_int3::action((const char *)GET_TEXT_F(MSG_BED), &thermalManager.temp_bed.target, 0, BED_MAX_TARGET, thermalManager.start_watching_bed);

View File

@ -443,11 +443,11 @@ volatile bool Temperature::raw_temps_ready = false;
temp_range_t Temperature::temp_range[HOTENDS] = ARRAY_BY_HOTENDS(sensor_heater_0, sensor_heater_1, sensor_heater_2, sensor_heater_3, sensor_heater_4, sensor_heater_5, sensor_heater_6, sensor_heater_7); temp_range_t Temperature::temp_range[HOTENDS] = ARRAY_BY_HOTENDS(sensor_heater_0, sensor_heater_1, sensor_heater_2, sensor_heater_3, sensor_heater_4, sensor_heater_5, sensor_heater_6, sensor_heater_7);
#endif #endif
#ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED #if MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED > 1
uint8_t Temperature::consecutive_low_temperature_error[HOTENDS] = { 0 }; uint8_t Temperature::consecutive_low_temperature_error[HOTENDS] = { 0 };
#endif #endif
#ifdef MILLISECONDS_PREHEAT_TIME #if MILLISECONDS_PREHEAT_TIME > 0
millis_t Temperature::preheat_end_time[HOTENDS] = { 0 }; millis_t Temperature::preheat_end_time[HOTENDS] = { 0 };
#endif #endif
@ -468,7 +468,7 @@ volatile bool Temperature::raw_temps_ready = false;
#endif #endif
#if ENABLED(PROBING_HEATERS_OFF) #if ENABLED(PROBING_HEATERS_OFF)
bool Temperature::paused; bool Temperature::paused_for_probing;
#endif #endif
// public: // public:
@ -1312,10 +1312,10 @@ void Temperature::manage_heater() {
#if DISABLED(PIDTEMPBED) #if DISABLED(PIDTEMPBED)
if (PENDING(ms, next_bed_check_ms) if (PENDING(ms, next_bed_check_ms)
&& TERN1(PAUSE_CHANGE_REQD, paused == last_pause_state) && TERN1(PAUSE_CHANGE_REQD, paused_for_probing == last_pause_state)
) break; ) break;
next_bed_check_ms = ms + BED_CHECK_INTERVAL; next_bed_check_ms = ms + BED_CHECK_INTERVAL;
TERN_(PAUSE_CHANGE_REQD, last_pause_state = paused); TERN_(PAUSE_CHANGE_REQD, last_pause_state = paused_for_probing);
#endif #endif
TERN_(HEATER_IDLE_HANDLER, heater_idle[IDLE_INDEX_BED].update(ms)); TERN_(HEATER_IDLE_HANDLER, heater_idle[IDLE_INDEX_BED].update(ms));
@ -1950,9 +1950,30 @@ void Temperature::updateTemperaturesFromRawValues() {
/** /**
* Initialize the temperature manager * Initialize the temperature manager
*
* The manager is implemented by periodic calls to manage_heater() * The manager is implemented by periodic calls to manage_heater()
*
* - Init (and disable) SPI thermocouples like MAX6675 and MAX31865
* - Disable RUMBA JTAG to accommodate a thermocouple extension
* - Read-enable thermistors with a read-enable pin
* - Init HEATER and COOLER pins for OUTPUT in OFF state
* - Init the FAN pins as PWM or OUTPUT
* - Init the SPI interface for SPI thermocouples
* - Init ADC according to the HAL
* - Set thermistor pins to analog inputs according to the HAL
* - Start the Temperature ISR timer
* - Init the AUTO FAN pins as PWM or OUTPUT
* - Wait 250ms for temperatures to settle
* - Init temp_range[], used for catching min/maxtemp
*/ */
void Temperature::init() { void Temperature::init() {
TERN_(PROBING_HEATERS_OFF, paused_for_probing = false);
#if BOTH(PIDTEMP, PID_EXTRUSION_SCALING)
last_e_position = 0;
#endif
// Init (and disable) SPI thermocouples // Init (and disable) SPI thermocouples
#if TEMP_SENSOR_0_IS_MAX6675 && PIN_EXISTS(MAX6675_CS) #if TEMP_SENSOR_0_IS_MAX6675 && PIN_EXISTS(MAX6675_CS)
OUT_WRITE(MAX6675_CS_PIN, HIGH); OUT_WRITE(MAX6675_CS_PIN, HIGH);
@ -2003,10 +2024,6 @@ void Temperature::init() {
OUT_WRITE(TEMP_1_TR_ENABLE_PIN, ENABLED(TEMP_SENSOR_1_IS_MAX_TC)); OUT_WRITE(TEMP_1_TR_ENABLE_PIN, ENABLED(TEMP_SENSOR_1_IS_MAX_TC));
#endif #endif
#if BOTH(PIDTEMP, PID_EXTRUSION_SCALING)
last_e_position = 0;
#endif
#if HAS_HEATER_0 #if HAS_HEATER_0
#ifdef BOARD_OPENDRAIN_MOSFETS #ifdef BOARD_OPENDRAIN_MOSFETS
OUT_WRITE_OD(HEATER_0_PIN, HEATER_0_INVERTING); OUT_WRITE_OD(HEATER_0_PIN, HEATER_0_INVERTING);
@ -2262,55 +2279,8 @@ void Temperature::init() {
while (analog_to_celsius_cooler(mintemp_raw_COOLER) > COOLER_MINTEMP) mintemp_raw_COOLER += TEMPDIR(COOLER) * (OVERSAMPLENR); while (analog_to_celsius_cooler(mintemp_raw_COOLER) > COOLER_MINTEMP) mintemp_raw_COOLER += TEMPDIR(COOLER) * (OVERSAMPLENR);
while (analog_to_celsius_cooler(maxtemp_raw_COOLER) < COOLER_MAXTEMP) maxtemp_raw_COOLER -= TEMPDIR(COOLER) * (OVERSAMPLENR); while (analog_to_celsius_cooler(maxtemp_raw_COOLER) < COOLER_MAXTEMP) maxtemp_raw_COOLER -= TEMPDIR(COOLER) * (OVERSAMPLENR);
#endif #endif
TERN_(PROBING_HEATERS_OFF, paused = false);
} }
#if WATCH_HOTENDS
/**
* Start Heating Sanity Check for hotends that are below
* their target temperature by a configurable margin.
* This is called when the temperature is set. (M104, M109)
*/
void Temperature::start_watching_hotend(const uint8_t E_NAME) {
const uint8_t ee = HOTEND_INDEX;
watch_hotend[ee].restart(degHotend(ee), degTargetHotend(ee));
}
#endif
#if WATCH_BED
/**
* Start Heating Sanity Check for hotends that are below
* their target temperature by a configurable margin.
* This is called when the temperature is set. (M140, M190)
*/
void Temperature::start_watching_bed() {
watch_bed.restart(degBed(), degTargetBed());
}
#endif
#if WATCH_CHAMBER
/**
* Start Heating Sanity Check for chamber that is below
* its target temperature by a configurable margin.
* This is called when the temperature is set. (M141, M191)
*/
void Temperature::start_watching_chamber() {
watch_chamber.restart(degChamber(), degTargetChamber());
}
#endif
#if WATCH_COOLER
/**
* Start Cooling Sanity Check for cooler that is above
* its target temperature by a configurable margin.
* This is called when the temperature is set. (M143, M193)
*/
void Temperature::start_watching_cooler() {
watch_cooler.restart(degCooler(), degTargetCooler());
}
#endif
#if HAS_THERMAL_PROTECTION #if HAS_THERMAL_PROTECTION
Temperature::tr_state_machine_t Temperature::tr_state_machine[NR_HEATER_RUNAWAY]; // = { { TRInactive, 0 } }; Temperature::tr_state_machine_t Temperature::tr_state_machine[NR_HEATER_RUNAWAY]; // = { { TRInactive, 0 } };
@ -2473,8 +2443,8 @@ void Temperature::disable_all_heaters() {
#if ENABLED(PROBING_HEATERS_OFF) #if ENABLED(PROBING_HEATERS_OFF)
void Temperature::pause(const bool p) { void Temperature::pause(const bool p) {
if (p != paused) { if (p != paused_for_probing) {
paused = p; paused_for_probing = p;
if (p) { if (p) {
HOTEND_LOOP() heater_idle[e].expire(); // Timeout immediately HOTEND_LOOP() heater_idle[e].expire(); // Timeout immediately
TERN_(HAS_HEATED_BED, heater_idle[IDLE_INDEX_BED].expire()); // Timeout immediately TERN_(HAS_HEATED_BED, heater_idle[IDLE_INDEX_BED].expire()); // Timeout immediately
@ -2759,17 +2729,16 @@ void Temperature::readings_ready() {
const int8_t tdir = temp_dir[e]; const int8_t tdir = temp_dir[e];
if (tdir) { if (tdir) {
const int16_t rawtemp = temp_hotend[e].raw * tdir; // normal direction, +rawtemp, else -rawtemp const int16_t rawtemp = temp_hotend[e].raw * tdir; // normal direction, +rawtemp, else -rawtemp
const bool heater_on = (temp_hotend[e].target > 0
|| TERN0(PIDTEMP, temp_hotend[e].soft_pwm_amount) > 0
);
if (rawtemp > temp_range[e].raw_max * tdir) max_temp_error((heater_id_t)e); if (rawtemp > temp_range[e].raw_max * tdir) max_temp_error((heater_id_t)e);
const bool heater_on = (temp_hotend[e].target > 0 || TERN0(PIDTEMP, temp_hotend[e].soft_pwm_amount > 0));
if (heater_on && rawtemp < temp_range[e].raw_min * tdir && !is_preheating(e)) { if (heater_on && rawtemp < temp_range[e].raw_min * tdir && !is_preheating(e)) {
#ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED #if MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED > 1
if (++consecutive_low_temperature_error[e] >= MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED) if (++consecutive_low_temperature_error[e] >= MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED)
#endif #endif
min_temp_error((heater_id_t)e); min_temp_error((heater_id_t)e);
} }
#ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED #if MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED > 1
else else
consecutive_low_temperature_error[e] = 0; consecutive_low_temperature_error[e] = 0;
#endif #endif

View File

@ -458,11 +458,11 @@ class Temperature {
static int16_t mintemp_raw_COOLER, maxtemp_raw_COOLER; static int16_t mintemp_raw_COOLER, maxtemp_raw_COOLER;
#endif #endif
#ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED #if MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED > 1
static uint8_t consecutive_low_temperature_error[HOTENDS]; static uint8_t consecutive_low_temperature_error[HOTENDS];
#endif #endif
#ifdef MILLISECONDS_PREHEAT_TIME #if MILLISECONDS_PREHEAT_TIME > 0
static millis_t preheat_end_time[HOTENDS]; static millis_t preheat_end_time[HOTENDS];
#endif #endif
@ -471,7 +471,7 @@ class Temperature {
#endif #endif
#if ENABLED(PROBING_HEATERS_OFF) #if ENABLED(PROBING_HEATERS_OFF)
static bool paused; static bool paused_for_probing;
#endif #endif
public: public:
@ -606,7 +606,7 @@ class Temperature {
/** /**
* Preheating hotends * Preheating hotends
*/ */
#ifdef MILLISECONDS_PREHEAT_TIME #if MILLISECONDS_PREHEAT_TIME > 0
static inline bool is_preheating(const uint8_t E_NAME) { static inline bool is_preheating(const uint8_t E_NAME) {
return preheat_end_time[HOTEND_INDEX] && PENDING(millis(), preheat_end_time[HOTEND_INDEX]); return preheat_end_time[HOTEND_INDEX] && PENDING(millis(), preheat_end_time[HOTEND_INDEX]);
} }
@ -649,17 +649,11 @@ class Temperature {
return TERN0(HAS_HOTEND, temp_hotend[HOTEND_INDEX].target); return TERN0(HAS_HOTEND, temp_hotend[HOTEND_INDEX].target);
} }
#if WATCH_HOTENDS
static void start_watching_hotend(const uint8_t e=0);
#else
static inline void start_watching_hotend(const uint8_t=0) {}
#endif
#if HAS_HOTEND #if HAS_HOTEND
static void setTargetHotend(const celsius_t celsius, const uint8_t E_NAME) { static void setTargetHotend(const celsius_t celsius, const uint8_t E_NAME) {
const uint8_t ee = HOTEND_INDEX; const uint8_t ee = HOTEND_INDEX;
#ifdef MILLISECONDS_PREHEAT_TIME #if MILLISECONDS_PREHEAT_TIME > 0
if (celsius == 0) if (celsius == 0)
reset_preheat_time(ee); reset_preheat_time(ee);
else if (temp_hotend[ee].target == 0) else if (temp_hotend[ee].target == 0)
@ -698,6 +692,14 @@ class Temperature {
return ABS(wholeDegHotend(e) - temp) < (TEMP_HYSTERESIS); return ABS(wholeDegHotend(e) - temp) < (TEMP_HYSTERESIS);
} }
// Start watching a Hotend to make sure it's really heating up
static inline void start_watching_hotend(const uint8_t E_NAME) {
UNUSED(HOTEND_INDEX);
#if WATCH_HOTENDS
watch_hotend[HOTEND_INDEX].restart(degHotend(HOTEND_INDEX), degTargetHotend(HOTEND_INDEX));
#endif
}
#endif // HAS_HOTEND #endif // HAS_HOTEND
#if HAS_HEATED_BED #if HAS_HEATED_BED
@ -711,11 +713,8 @@ class Temperature {
static inline bool isHeatingBed() { return temp_bed.target > temp_bed.celsius; } static inline bool isHeatingBed() { return temp_bed.target > temp_bed.celsius; }
static inline bool isCoolingBed() { return temp_bed.target < temp_bed.celsius; } static inline bool isCoolingBed() { return temp_bed.target < temp_bed.celsius; }
#if WATCH_BED // Start watching the Bed to make sure it's really heating up
static void start_watching_bed(); static inline void start_watching_bed() { TERN_(WATCH_BED, watch_bed.restart(degBed(), degTargetBed())); }
#else
static inline void start_watching_bed() {}
#endif
static void setTargetBed(const celsius_t celsius) { static void setTargetBed(const celsius_t celsius) {
TERN_(AUTO_POWER_CONTROL, if (celsius) powerManager.power_on()); TERN_(AUTO_POWER_CONTROL, if (celsius) powerManager.power_on());
@ -748,12 +747,6 @@ class Temperature {
static bool wait_for_probe(const celsius_t target_temp, bool no_wait_for_cooling=true); static bool wait_for_probe(const celsius_t target_temp, bool no_wait_for_cooling=true);
#endif #endif
#if WATCH_PROBE
static void start_watching_probe();
#else
static inline void start_watching_probe() {}
#endif
#if HAS_TEMP_CHAMBER #if HAS_TEMP_CHAMBER
#if ENABLED(SHOW_TEMP_ADC_VALUES) #if ENABLED(SHOW_TEMP_ADC_VALUES)
static inline int16_t rawChamberTemp() { return temp_chamber.raw; } static inline int16_t rawChamberTemp() { return temp_chamber.raw; }
@ -768,17 +761,13 @@ class Temperature {
#endif #endif
#endif #endif
#if WATCH_CHAMBER
static void start_watching_chamber();
#else
static inline void start_watching_chamber() {}
#endif
#if HAS_HEATED_CHAMBER #if HAS_HEATED_CHAMBER
static void setTargetChamber(const celsius_t celsius) { static void setTargetChamber(const celsius_t celsius) {
temp_chamber.target = _MIN(celsius, CHAMBER_MAX_TARGET); temp_chamber.target = _MIN(celsius, CHAMBER_MAX_TARGET);
start_watching_chamber(); start_watching_chamber();
} }
// Start watching the Chamber to make sure it's really heating up
static inline void start_watching_chamber() { TERN_(WATCH_CHAMBER, watch_chamber.restart(degChamber(), degTargetChamber())); }
#endif #endif
#if HAS_TEMP_COOLER #if HAS_TEMP_COOLER
@ -795,17 +784,13 @@ class Temperature {
#endif #endif
#endif #endif
#if WATCH_COOLER
static void start_watching_cooler();
#else
static inline void start_watching_cooler() {}
#endif
#if HAS_COOLER #if HAS_COOLER
static inline void setTargetCooler(const celsius_t celsius) { static inline void setTargetCooler(const celsius_t celsius) {
temp_cooler.target = constrain(celsius, COOLER_MIN_TARGET, COOLER_MAX_TARGET); temp_cooler.target = constrain(celsius, COOLER_MIN_TARGET, COOLER_MAX_TARGET);
start_watching_cooler(); start_watching_cooler();
} }
// Start watching the Cooler to make sure it's really cooling down
static inline void start_watching_cooler() { TERN_(WATCH_COOLER, watch_cooler.restart(degCooler(), degTargetCooler())); }
#endif #endif
/** /**
@ -856,7 +841,6 @@ class Temperature {
#if ENABLED(PROBING_HEATERS_OFF) #if ENABLED(PROBING_HEATERS_OFF)
static void pause(const bool p); static void pause(const bool p);
static inline bool is_paused() { return paused; }
#endif #endif
#if HEATER_IDLE_HANDLER #if HEATER_IDLE_HANDLER