@ -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 ) ;