diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 923d0ef04d..9b2979eab6 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -88,10 +88,14 @@ // 55 is 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan) (1k pullup) #define TEMP_SENSOR_0 -1 -#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_1 -1 #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_BED 0 +// This makes temp sensor 1 a redundant sensor for sensor 0. If the temperatures difference between these sensors is to high the print will be aborted. +#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 5 + // Actual temperature must be close to target for this long before M109 returns success #define TEMP_RESIDENCY_TIME 10 // (seconds) #define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index afdd684415..dbfa69989e 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -367,5 +367,8 @@ const unsigned int dropsegments=5; //everything with less than this number of st #undef BED_MAXTEMP #endif +#if EXTRUDERS > 1 && defined TEMP_SENSOR_1_AS_REDUNDANT + #error "You cannot use TEMP_SENSOR_1_AS_REDUNDANT if EXTRUDERS > 1" +#endif #endif //__CONFIGURATION_ADV_H diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp index 7b23780791..f827708405 100644 --- a/Marlin/temperature.cpp +++ b/Marlin/temperature.cpp @@ -40,10 +40,13 @@ int target_temperature[EXTRUDERS] = { 0 }; int target_temperature_bed = 0; int current_temperature_raw[EXTRUDERS] = { 0 }; -float current_temperature[EXTRUDERS] = { 0 }; +float current_temperature[EXTRUDERS] = { 0.0 }; int current_temperature_bed_raw = 0; -float current_temperature_bed = 0; - +float current_temperature_bed = 0.0; +#ifdef TEMP_SENSOR_1_AS_REDUNDANT + int redundant_temperature_raw = 0; + float redundant_temperature = 0.0; +#endif #ifdef PIDTEMP float Kp=DEFAULT_Kp; float Ki=(DEFAULT_Ki*PID_dT); @@ -157,28 +160,28 @@ void PID_autotune(float temp, int extruder, int ncycles) float Kp, Ki, Kd; float max = 0, min = 10000; - if ((extruder > EXTRUDERS) + if ((extruder > EXTRUDERS) #if (TEMP_BED_PIN <= -1) - ||(extruder < 0) - #endif - ){ - SERIAL_ECHOLN("PID Autotune failed. Bad extruder number."); - return; - } + ||(extruder < 0) + #endif + ){ + SERIAL_ECHOLN("PID Autotune failed. Bad extruder number."); + return; + } SERIAL_ECHOLN("PID Autotune start"); disable_heater(); // switch off all heaters. - if (extruder<0) - { - soft_pwm_bed = (MAX_BED_POWER)/2; - bias = d = (MAX_BED_POWER)/2; - } - else - { - soft_pwm[extruder] = (PID_MAX)/2; - bias = d = (PID_MAX)/2; + if (extruder<0) + { + soft_pwm_bed = (MAX_BED_POWER)/2; + bias = d = (MAX_BED_POWER)/2; + } + else + { + soft_pwm[extruder] = (PID_MAX)/2; + bias = d = (PID_MAX)/2; } @@ -196,10 +199,10 @@ void PID_autotune(float temp, int extruder, int ncycles) if(heating == true && input > temp) { if(millis() - t2 > 5000) { heating=false; - if (extruder<0) - soft_pwm_bed = (bias - d) >> 1; - else - soft_pwm[extruder] = (bias - d) >> 1; + if (extruder<0) + soft_pwm_bed = (bias - d) >> 1; + else + soft_pwm[extruder] = (bias - d) >> 1; t1=millis(); t_high=t1 - t2; max=temp; @@ -250,10 +253,10 @@ void PID_autotune(float temp, int extruder, int ncycles) */ } } - if (extruder<0) - soft_pwm_bed = (bias + d) >> 1; - else - soft_pwm[extruder] = (bias + d) >> 1; + if (extruder<0) + soft_pwm_bed = (bias + d) >> 1; + else + soft_pwm[extruder] = (bias + d) >> 1; cycles++; min=temp; } @@ -264,14 +267,14 @@ void PID_autotune(float temp, int extruder, int ncycles) return; } if(millis() - temp_millis > 2000) { - int p; - if (extruder<0){ - p=soft_pwm_bed; - SERIAL_PROTOCOLPGM("ok B:"); - }else{ - p=soft_pwm[extruder]; - SERIAL_PROTOCOLPGM("ok T:"); - } + int p; + if (extruder<0){ + p=soft_pwm_bed; + SERIAL_PROTOCOLPGM("ok B:"); + }else{ + p=soft_pwm[extruder]; + SERIAL_PROTOCOLPGM("ok T:"); + } SERIAL_PROTOCOL(input); SERIAL_PROTOCOLPGM(" @:"); @@ -471,7 +474,19 @@ void manage_heater() } } #endif - + #ifdef TEMP_SENSOR_1_AS_REDUNDANT + if(fabs(current_temperature[1] - redundant_temperature) > MAX_REDUNDANT_TEMP_SENSOR_DIFF) { + disable_heater(); + if(IsStopped() == false) { + SERIAL_ERROR_START; + SERIAL_ERRORLNPGM("Extruder switched off. Temperature difference between temp sensors is to high !"); + LCD_ALERTMESSAGEPGM("Err: REDUNDANT TEMP ERROR"); + } + #ifndef BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE + Stop(); + #endif + } + #endif } // End extruder for loop #if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) || \ @@ -644,7 +659,9 @@ static void updateTemperaturesFromRawValues() current_temperature[e] = analog2temp(current_temperature_raw[e], e); } current_temperature_bed = analog2tempBed(current_temperature_bed_raw); - + #ifdef TEMP_SENSOR_1_AS_REDUNDANT + redundant_temperature =analog2temp(redundant_temperature_raw, 1); + #endif //Reset the watchdog after we know we have a temperature measurement. watchdog_reset(); @@ -1145,6 +1162,9 @@ ISR(TIMER0_COMPB_vect) #if EXTRUDERS > 1 current_temperature_raw[1] = raw_temp_1_value; #endif +#ifdef TEMP_SENSOR_1_AS_REDUNDANT + redundant_temperature_raw = raw_temp_1_value; +#endif #if EXTRUDERS > 2 current_temperature_raw[2] = raw_temp_2_value; #endif diff --git a/Marlin/temperature.h b/Marlin/temperature.h index 7cc62aa529..75ffcd06bf 100644 --- a/Marlin/temperature.h +++ b/Marlin/temperature.h @@ -37,6 +37,9 @@ extern int target_temperature[EXTRUDERS]; extern float current_temperature[EXTRUDERS]; extern int target_temperature_bed; extern float current_temperature_bed; +#ifdef TEMP_SENSOR_1_AS_REDUNDANT + extern float redundant_temperature; +#endif #ifdef PIDTEMP extern float Kp,Ki,Kd,Kc;