Combine thermal runaway and watch-period
- Make thermal protection for all hotends and/or bed into simple switches - Now enable `WATCH_TEMP_PERIOD` when `THERMAL_PROTECTION_HOTENDS` is enabled - Move detailed thermal parameters to `Configuration_adv.h` - Add sanity checks to warn about old configurations - Change `WATCH_TEMP_PERIOD` to seconds instead of milliseconds
This commit is contained in:
		@@ -73,16 +73,14 @@ unsigned char soft_pwm_bed;
 | 
			
		||||
  int current_raw_filwidth = 0;  //Holds measured filament diameter - one extruder only
 | 
			
		||||
#endif  
 | 
			
		||||
 | 
			
		||||
#define HAS_HEATER_THERMAL_PROTECTION (defined(THERMAL_RUNAWAY_PROTECTION_PERIOD) && THERMAL_RUNAWAY_PROTECTION_PERIOD > 0)
 | 
			
		||||
#define HAS_BED_THERMAL_PROTECTION (defined(THERMAL_RUNAWAY_PROTECTION_BED_PERIOD) && THERMAL_RUNAWAY_PROTECTION_BED_PERIOD > 0 && TEMP_SENSOR_BED != 0)
 | 
			
		||||
#if HAS_HEATER_THERMAL_PROTECTION || HAS_BED_THERMAL_PROTECTION
 | 
			
		||||
#if THERMAL_PROTECTION_HOTENDS || THERMAL_PROTECTION_BED
 | 
			
		||||
  enum TRState { TRReset, TRInactive, TRFirstHeating, TRStable, TRRunaway };
 | 
			
		||||
  void thermal_runaway_protection(TRState *state, millis_t *timer, float temperature, float target_temperature, int heater_id, int period_seconds, int hysteresis_degc);
 | 
			
		||||
  #if HAS_HEATER_THERMAL_PROTECTION
 | 
			
		||||
  #if THERMAL_PROTECTION_HOTENDS
 | 
			
		||||
    static TRState thermal_runaway_state_machine[4] = { TRReset, TRReset, TRReset, TRReset };
 | 
			
		||||
    static millis_t thermal_runaway_timer[4]; // = {0,0,0,0};
 | 
			
		||||
  #endif
 | 
			
		||||
  #if HAS_BED_THERMAL_PROTECTION
 | 
			
		||||
  #if THERMAL_PROTECTION_BED
 | 
			
		||||
    static TRState thermal_runaway_bed_state_machine = TRReset;
 | 
			
		||||
    static millis_t thermal_runaway_bed_timer;
 | 
			
		||||
  #endif
 | 
			
		||||
@@ -170,7 +168,7 @@ static float analog2temp(int raw, uint8_t e);
 | 
			
		||||
static float analog2tempBed(int raw);
 | 
			
		||||
static void updateTemperaturesFromRawValues();
 | 
			
		||||
 | 
			
		||||
#ifdef WATCH_TEMP_PERIOD
 | 
			
		||||
#ifdef THERMAL_PROTECTION_HOTENDS
 | 
			
		||||
  int watch_target_temp[EXTRUDERS] = { 0 };
 | 
			
		||||
  millis_t watch_heater_next_ms[EXTRUDERS] = { 0 };
 | 
			
		||||
#endif
 | 
			
		||||
@@ -604,15 +602,15 @@ void manage_heater() {
 | 
			
		||||
    if (ct < max(HEATER_0_MINTEMP, 0.01)) min_temp_error(0);
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if defined(WATCH_TEMP_PERIOD) || !defined(PIDTEMPBED) || HAS_AUTO_FAN
 | 
			
		||||
  #if defined(THERMAL_PROTECTION_HOTENDS) || !defined(PIDTEMPBED) || HAS_AUTO_FAN
 | 
			
		||||
    millis_t ms = millis();
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  // Loop through all extruders
 | 
			
		||||
  for (int e = 0; e < EXTRUDERS; e++) {
 | 
			
		||||
 | 
			
		||||
    #if HAS_HEATER_THERMAL_PROTECTION
 | 
			
		||||
      thermal_runaway_protection(&thermal_runaway_state_machine[e], &thermal_runaway_timer[e], current_temperature[e], target_temperature[e], e, THERMAL_RUNAWAY_PROTECTION_PERIOD, THERMAL_RUNAWAY_PROTECTION_HYSTERESIS);
 | 
			
		||||
    #if THERMAL_PROTECTION_HOTENDS
 | 
			
		||||
      thermal_runaway_protection(&thermal_runaway_state_machine[e], &thermal_runaway_timer[e], current_temperature[e], target_temperature[e], e, THERMAL_PROTECTION_PERIOD, THERMAL_PROTECTION_HYSTERESIS);
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    float pid_output = get_pid_output(e);
 | 
			
		||||
@@ -621,7 +619,7 @@ void manage_heater() {
 | 
			
		||||
    soft_pwm[e] = current_temperature[e] > minttemp[e] && current_temperature[e] < maxttemp[e] ? (int)pid_output >> 1 : 0;
 | 
			
		||||
 | 
			
		||||
    // Check if the temperature is failing to increase
 | 
			
		||||
    #ifdef WATCH_TEMP_PERIOD
 | 
			
		||||
    #ifdef THERMAL_PROTECTION_HOTENDS
 | 
			
		||||
      // Is it time to check this extruder's heater?
 | 
			
		||||
      if (watch_heater_next_ms[e] && ms > watch_heater_next_ms[e]) {
 | 
			
		||||
        // Has it failed to increase enough?
 | 
			
		||||
@@ -635,7 +633,7 @@ void manage_heater() {
 | 
			
		||||
          watch_heater_next_ms[e] = 0;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    #endif // WATCH_TEMP_PERIOD
 | 
			
		||||
    #endif // THERMAL_PROTECTION_HOTENDS
 | 
			
		||||
 | 
			
		||||
    #ifdef TEMP_SENSOR_1_AS_REDUNDANT
 | 
			
		||||
      if (fabs(current_temperature[0] - redundant_temperature) > MAX_REDUNDANT_TEMP_SENSOR_DIFF) {
 | 
			
		||||
@@ -675,8 +673,8 @@ void manage_heater() {
 | 
			
		||||
 | 
			
		||||
  #if TEMP_SENSOR_BED != 0
 | 
			
		||||
  
 | 
			
		||||
    #if HAS_BED_THERMAL_PROTECTION
 | 
			
		||||
      thermal_runaway_protection(&thermal_runaway_bed_state_machine, &thermal_runaway_bed_timer, current_temperature_bed, target_temperature_bed, -1, THERMAL_RUNAWAY_PROTECTION_BED_PERIOD, THERMAL_RUNAWAY_PROTECTION_BED_HYSTERESIS);
 | 
			
		||||
    #if THERMAL_PROTECTION_BED
 | 
			
		||||
      thermal_runaway_protection(&thermal_runaway_bed_state_machine, &thermal_runaway_bed_timer, current_temperature_bed, target_temperature_bed, -1, THERMAL_PROTECTION_BED_PERIOD, THERMAL_PROTECTION_BED_HYSTERESIS);
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    #ifdef PIDTEMPBED
 | 
			
		||||
@@ -999,14 +997,14 @@ void tp_init() {
 | 
			
		||||
  #endif //BED_MAXTEMP
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef WATCH_TEMP_PERIOD
 | 
			
		||||
#ifdef THERMAL_PROTECTION_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 start_watching_heater(int e) {
 | 
			
		||||
    millis_t ms = millis() + WATCH_TEMP_PERIOD;
 | 
			
		||||
    millis_t ms = millis() + WATCH_TEMP_PERIOD * 1000;
 | 
			
		||||
    if (degHotend(e) < degTargetHotend(e) - (WATCH_TEMP_INCREASE * 2)) {
 | 
			
		||||
      watch_target_temp[e] = degHotend(e) + WATCH_TEMP_INCREASE;
 | 
			
		||||
      watch_heater_next_ms[e] = ms;
 | 
			
		||||
@@ -1016,7 +1014,7 @@ void tp_init() {
 | 
			
		||||
  }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if HAS_HEATER_THERMAL_PROTECTION || HAS_BED_THERMAL_PROTECTION
 | 
			
		||||
#if THERMAL_PROTECTION_HOTENDS || THERMAL_PROTECTION_BED
 | 
			
		||||
 | 
			
		||||
  void thermal_runaway_protection(TRState *state, millis_t *timer, float temperature, float target_temperature, int heater_id, int period_seconds, int hysteresis_degc) {
 | 
			
		||||
 | 
			
		||||
@@ -1082,7 +1080,7 @@ void tp_init() {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
#endif // HAS_HEATER_THERMAL_PROTECTION || HAS_BED_THERMAL_PROTECTION
 | 
			
		||||
#endif // THERMAL_PROTECTION_HOTENDS || THERMAL_PROTECTION_BED
 | 
			
		||||
 | 
			
		||||
void disable_all_heaters() {
 | 
			
		||||
  for (int i=0; i<EXTRUDERS; i++) setTargetHotend(0, i);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user