Added redundant temp sensor
This commit is contained in:
		
							parent
							
								
									7231a20dba
								
							
						
					
					
						commit
						9be61cdc02
					
				| @ -88,10 +88,14 @@ | |||||||
| // 55 is 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan) (1k pullup)
 | // 55 is 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan) (1k pullup)
 | ||||||
| 
 | 
 | ||||||
| #define TEMP_SENSOR_0 -1 | #define TEMP_SENSOR_0 -1 | ||||||
| #define TEMP_SENSOR_1 0 | #define TEMP_SENSOR_1 -1 | ||||||
| #define TEMP_SENSOR_2 0 | #define TEMP_SENSOR_2 0 | ||||||
| #define TEMP_SENSOR_BED 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
 | // Actual temperature must be close to target for this long before M109 returns success
 | ||||||
| #define TEMP_RESIDENCY_TIME 10  // (seconds)
 | #define TEMP_RESIDENCY_TIME 10  // (seconds)
 | ||||||
| #define TEMP_HYSTERESIS 3       // (degC) range of +/- temperatures considered "close" to the target one
 | #define TEMP_HYSTERESIS 3       // (degC) range of +/- temperatures considered "close" to the target one
 | ||||||
|  | |||||||
| @ -367,5 +367,8 @@ const unsigned int dropsegments=5; //everything with less than this number of st | |||||||
|   #undef BED_MAXTEMP |   #undef BED_MAXTEMP | ||||||
| #endif | #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
 | #endif //__CONFIGURATION_ADV_H
 | ||||||
|  | |||||||
| @ -40,10 +40,13 @@ | |||||||
| int target_temperature[EXTRUDERS] = { 0 }; | int target_temperature[EXTRUDERS] = { 0 }; | ||||||
| int target_temperature_bed = 0; | int target_temperature_bed = 0; | ||||||
| int current_temperature_raw[EXTRUDERS] = { 0 }; | int current_temperature_raw[EXTRUDERS] = { 0 }; | ||||||
| float current_temperature[EXTRUDERS] = { 0 }; | float current_temperature[EXTRUDERS] = { 0.0 }; | ||||||
| int current_temperature_bed_raw = 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 | #ifdef PIDTEMP | ||||||
|   float Kp=DEFAULT_Kp; |   float Kp=DEFAULT_Kp; | ||||||
|   float Ki=(DEFAULT_Ki*PID_dT); |   float Ki=(DEFAULT_Ki*PID_dT); | ||||||
| @ -157,28 +160,28 @@ void PID_autotune(float temp, int extruder, int ncycles) | |||||||
|   float Kp, Ki, Kd; |   float Kp, Ki, Kd; | ||||||
|   float max = 0, min = 10000; |   float max = 0, min = 10000; | ||||||
| 
 | 
 | ||||||
| 	if ((extruder > EXTRUDERS) |   if ((extruder > EXTRUDERS) | ||||||
|   #if (TEMP_BED_PIN <= -1) |   #if (TEMP_BED_PIN <= -1) | ||||||
| 		||(extruder < 0) |        ||(extruder < 0) | ||||||
| 	#endif |   #endif | ||||||
| 	){ |        ){ | ||||||
|   	SERIAL_ECHOLN("PID Autotune failed. Bad extruder number."); |           SERIAL_ECHOLN("PID Autotune failed. Bad extruder number."); | ||||||
|   	return; |           return; | ||||||
| 	} |         } | ||||||
| 	 | 	 | ||||||
|   SERIAL_ECHOLN("PID Autotune start"); |   SERIAL_ECHOLN("PID Autotune start"); | ||||||
|    |    | ||||||
|   disable_heater(); // switch off all heaters.
 |   disable_heater(); // switch off all heaters.
 | ||||||
| 
 | 
 | ||||||
| 	if (extruder<0) |   if (extruder<0) | ||||||
| 	{ |   { | ||||||
| 	 	soft_pwm_bed = (MAX_BED_POWER)/2; |      soft_pwm_bed = (MAX_BED_POWER)/2; | ||||||
| 		bias = d = (MAX_BED_POWER)/2; |      bias = d = (MAX_BED_POWER)/2; | ||||||
|   } |    } | ||||||
| 	else |    else | ||||||
| 	{ |    { | ||||||
| 	  soft_pwm[extruder] = (PID_MAX)/2; |      soft_pwm[extruder] = (PID_MAX)/2; | ||||||
| 		bias = d = (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(heating == true && input > temp) { | ||||||
|         if(millis() - t2 > 5000) {  |         if(millis() - t2 > 5000) {  | ||||||
|           heating=false; |           heating=false; | ||||||
| 					if (extruder<0) |           if (extruder<0) | ||||||
| 						soft_pwm_bed = (bias - d) >> 1; |             soft_pwm_bed = (bias - d) >> 1; | ||||||
| 					else |           else | ||||||
| 						soft_pwm[extruder] = (bias - d) >> 1; |             soft_pwm[extruder] = (bias - d) >> 1; | ||||||
|           t1=millis(); |           t1=millis(); | ||||||
|           t_high=t1 - t2; |           t_high=t1 - t2; | ||||||
|           max=temp; |           max=temp; | ||||||
| @ -250,10 +253,10 @@ void PID_autotune(float temp, int extruder, int ncycles) | |||||||
|               */ |               */ | ||||||
|             } |             } | ||||||
|           } |           } | ||||||
| 					if (extruder<0) |           if (extruder<0) | ||||||
| 						soft_pwm_bed = (bias + d) >> 1; |             soft_pwm_bed = (bias + d) >> 1; | ||||||
| 					else |           else | ||||||
| 						soft_pwm[extruder] = (bias + d) >> 1; |             soft_pwm[extruder] = (bias + d) >> 1; | ||||||
|           cycles++; |           cycles++; | ||||||
|           min=temp; |           min=temp; | ||||||
|         } |         } | ||||||
| @ -264,14 +267,14 @@ void PID_autotune(float temp, int extruder, int ncycles) | |||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
|     if(millis() - temp_millis > 2000) { |     if(millis() - temp_millis > 2000) { | ||||||
| 			int p; |       int p; | ||||||
| 			if (extruder<0){ |       if (extruder<0){ | ||||||
| 	      p=soft_pwm_bed;        |         p=soft_pwm_bed;        | ||||||
| 	      SERIAL_PROTOCOLPGM("ok B:"); |         SERIAL_PROTOCOLPGM("ok B:"); | ||||||
| 			}else{ |       }else{ | ||||||
| 	      p=soft_pwm[extruder];        |         p=soft_pwm[extruder];        | ||||||
| 	      SERIAL_PROTOCOLPGM("ok T:"); |         SERIAL_PROTOCOLPGM("ok T:"); | ||||||
| 			} |       } | ||||||
| 			 | 			 | ||||||
|       SERIAL_PROTOCOL(input);    |       SERIAL_PROTOCOL(input);    | ||||||
|       SERIAL_PROTOCOLPGM(" @:"); |       SERIAL_PROTOCOLPGM(" @:"); | ||||||
| @ -471,7 +474,19 @@ void manage_heater() | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     #endif |     #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
 |   } // End extruder for loop
 | ||||||
| 
 | 
 | ||||||
|   #if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) || \ |   #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[e] = analog2temp(current_temperature_raw[e], e); | ||||||
|     } |     } | ||||||
|     current_temperature_bed = analog2tempBed(current_temperature_bed_raw); |     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.
 |     //Reset the watchdog after we know we have a temperature measurement.
 | ||||||
|     watchdog_reset(); |     watchdog_reset(); | ||||||
| 
 | 
 | ||||||
| @ -1145,6 +1162,9 @@ ISR(TIMER0_COMPB_vect) | |||||||
| #if EXTRUDERS > 1 | #if EXTRUDERS > 1 | ||||||
|       current_temperature_raw[1] = raw_temp_1_value; |       current_temperature_raw[1] = raw_temp_1_value; | ||||||
| #endif | #endif | ||||||
|  | #ifdef TEMP_SENSOR_1_AS_REDUNDANT | ||||||
|  |       redundant_temperature_raw = raw_temp_1_value; | ||||||
|  | #endif | ||||||
| #if EXTRUDERS > 2 | #if EXTRUDERS > 2 | ||||||
|       current_temperature_raw[2] = raw_temp_2_value; |       current_temperature_raw[2] = raw_temp_2_value; | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -37,6 +37,9 @@ extern int target_temperature[EXTRUDERS]; | |||||||
| extern float current_temperature[EXTRUDERS]; | extern float current_temperature[EXTRUDERS]; | ||||||
| extern int target_temperature_bed; | extern int target_temperature_bed; | ||||||
| extern float current_temperature_bed; | extern float current_temperature_bed; | ||||||
|  | #ifdef TEMP_SENSOR_1_AS_REDUNDANT | ||||||
|  |   extern float redundant_temperature; | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
| #ifdef PIDTEMP | #ifdef PIDTEMP | ||||||
|   extern float Kp,Ki,Kd,Kc; |   extern float Kp,Ki,Kd,Kc; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user