From eb3940fab4e6469c8ede41f03037427dda4d41c5 Mon Sep 17 00:00:00 2001 From: kliment Date: Sun, 1 May 2011 16:31:46 +0200 Subject: Added watchdog aand minimal temp for greater safety in the case of a disconnected thermistor --- Tonokip_Firmware/Tonokip_Firmware.pde | 40 +++++++++++++++++++++++++++++++++-- Tonokip_Firmware/configuration.h | 7 ++++++ 2 files changed, 45 insertions(+), 2 deletions(-) (limited to 'Tonokip_Firmware') diff --git a/Tonokip_Firmware/Tonokip_Firmware.pde b/Tonokip_Firmware/Tonokip_Firmware.pde index 607dc76..a352777 100644 --- a/Tonokip_Firmware/Tonokip_Firmware.pde +++ b/Tonokip_Firmware/Tonokip_Firmware.pde @@ -111,8 +111,13 @@ int temp_iState_max = 100*PID_INTEGRAL_DRIVE_MAX/PID_IGAIN; #ifdef SMOOTHING uint32_t nma=SMOOTHFACTOR*analogRead(TEMP_0_PIN); #endif - - +#ifdef WATCHPERIOD +int watch_raw=-1000; +unsigned long watchmillis=0; +#endif +#ifdef MINTEMP +int minttemp=temp2analog(MINTEMP); +#endif //Inactivity shutdown variables unsigned long previous_millis_cmd=0; @@ -623,6 +628,14 @@ inline void process_commands() #endif case 104: // M104 if (code_seen('S')) target_raw = temp2analog(code_value()); + #ifdef WATCHPERIOD + if(target_raw>current_raw){ + watchmillis=max(1,millis()); + watch_raw=current_raw; + }else{ + watchmillis=0; + } + #endif break; case 140: // M140 set bed temp if (code_seen('S')) target_bed_raw = temp2analogBed(code_value()); @@ -651,6 +664,14 @@ inline void process_commands() //break; case 109: // M109 - Wait for heater to reach target. if (code_seen('S')) target_raw = temp2analog(code_value()); + #ifdef WATCHPERIOD + if(target_raw>current_raw){ + watchmillis=max(1,millis()); + watch_raw=current_raw; + }else{ + watchmillis=0; + } + #endif previous_millis_heater = millis(); while(current_raw < target_raw) { if( (millis()-previous_millis_heater) > 1000 ) //Print Temp Reading every 1 second while heating up. @@ -1109,6 +1130,21 @@ inline void manage_heater() nma=(nma+current_raw)-(nma/SMOOTHFACTOR); current_raw=nma/SMOOTHFACTOR; #endif + #ifdef WATCHPERIOD + if(watchmillis && millis()-watchmillis>WATCHPERIOD){ + if(watch_raw+1>=current_raw){ + target_raw=0; + digitalWrite(HEATER_0_PIN,LOW); + digitalWrite(LED_PIN,LOW); + }else{ + watchmillis=0; + } + } + #endif + #ifdef MINTEMP + if(current_raw<=minttemp) + target_raw=0; + #endif #if (TEMP_0_PIN > -1) || defined (HEATER_USES_MAX66675) #ifdef PIDTEMP error = target_raw - current_raw; diff --git a/Tonokip_Firmware/configuration.h b/Tonokip_Firmware/configuration.h index 019a9fd..f97ad6b 100644 --- a/Tonokip_Firmware/configuration.h +++ b/Tonokip_Firmware/configuration.h @@ -37,6 +37,13 @@ float min_constant_speed_units = 2; // the minimum units of an accelerated move //#define SMOOTHING 1 //#define SMOOTHFACTOR 16 //best to use a power of two here - determines how many values are averaged together by the smoothing algorithm +//Experimental watchdog and minimal temp +//The watchdog waits for the watchperiod in milliseconds whenever an M104 or M109 increases the target temperature +//If the temperature has not increased at the end of that period, the target temperature is set to zero. It can be reset with another M104/M109 +//#define WATCHPERIOD 5000 //5 seconds +//The minimal temperature defines the temperature below which the heater will not be enabled +//#define MINTEMP + // Select one of these only to define how the nozzle temp is read. #define HEATER_USES_THERMISTOR //#define HEATER_USES_AD595 -- cgit v1.2.1