Fix the WATCHPERIOD implementation. It did not work correctly in a multi extruder setup, it did not work after 32 seconds after startup (int16 used as millies timestamp). And it did not work if you gave an M104 or M109 when the target was already around the target setpoint. So on average, it did not work at all. The new implementation should be robust in detecting a failure to heat up.
This commit is contained in:
parent
1f27870d41
commit
587154c01b
3 changed files with 24 additions and 35 deletions
|
@ -13,8 +13,10 @@
|
||||||
//// Heating sanity check:
|
//// Heating sanity check:
|
||||||
// This waits for the watchperiod in milliseconds whenever an M104 or M109 increases the target temperature
|
// This 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.
|
// 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
|
// It can be reset with another M104/M109. This check is also only triggered if the target temperature and the current temperature
|
||||||
//#define WATCHPERIOD 20000 //20 seconds
|
// differ by at least 2x WATCH_TEMP_INCREASE
|
||||||
|
//#define WATCH_TEMP_PERIOD 20000 //20 seconds
|
||||||
|
//#define WATCH_TEMP_INCREASE 10 //Heat up at least 10 degree in 20 seconds
|
||||||
|
|
||||||
// Wait for Cooldown
|
// Wait for Cooldown
|
||||||
// This defines if the M109 call should not block if it is cooling down.
|
// This defines if the M109 call should not block if it is cooling down.
|
||||||
|
@ -199,7 +201,7 @@
|
||||||
//#define USE_WATCHDOG
|
//#define USE_WATCHDOG
|
||||||
|
|
||||||
#ifdef USE_WATCHDOG
|
#ifdef USE_WATCHDOG
|
||||||
// If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on.
|
// If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on.
|
||||||
// The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset.
|
// The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset.
|
||||||
// However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled.
|
// However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled.
|
||||||
//#define WATCHDOG_RESET_MANUAL
|
//#define WATCHDOG_RESET_MANUAL
|
||||||
|
|
|
@ -105,12 +105,6 @@ static volatile bool temp_meas_ready = false;
|
||||||
static unsigned char soft_pwm[EXTRUDERS];
|
static unsigned char soft_pwm[EXTRUDERS];
|
||||||
static unsigned char soft_pwm_bed;
|
static unsigned char soft_pwm_bed;
|
||||||
|
|
||||||
#ifdef WATCHPERIOD
|
|
||||||
int watch_raw[EXTRUDERS] = { -1000 }; // the first value used for all
|
|
||||||
int watch_oldtemp[3] = {0,0,0};
|
|
||||||
unsigned long watchmillis = 0;
|
|
||||||
#endif //WATCHPERIOD
|
|
||||||
|
|
||||||
#if EXTRUDERS > 3
|
#if EXTRUDERS > 3
|
||||||
# error Unsupported number of extruders
|
# error Unsupported number of extruders
|
||||||
#elif EXTRUDERS > 2
|
#elif EXTRUDERS > 2
|
||||||
|
@ -129,6 +123,10 @@ static int bed_maxttemp = 16383;
|
||||||
static void *heater_ttbl_map[EXTRUDERS] = ARRAY_BY_EXTRUDERS((void *)heater_0_temptable, (void *)heater_1_temptable, (void *)heater_2_temptable);
|
static void *heater_ttbl_map[EXTRUDERS] = ARRAY_BY_EXTRUDERS((void *)heater_0_temptable, (void *)heater_1_temptable, (void *)heater_2_temptable);
|
||||||
static int heater_ttbllen_map[EXTRUDERS] = ARRAY_BY_EXTRUDERS(heater_0_temptable_len, heater_1_temptable_len, heater_2_temptable_len);
|
static int heater_ttbllen_map[EXTRUDERS] = ARRAY_BY_EXTRUDERS(heater_0_temptable_len, heater_1_temptable_len, heater_2_temptable_len);
|
||||||
|
|
||||||
|
#ifdef WATCH_TEMP_PERIOD
|
||||||
|
int watch_start_temp[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0,0,0);
|
||||||
|
unsigned long watchmillis[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0,0,0);
|
||||||
|
#endif //WATCH_TEMP_PERIOD
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//============================= functions ============================
|
//============================= functions ============================
|
||||||
|
@ -376,20 +374,23 @@ void manage_heater()
|
||||||
else {
|
else {
|
||||||
soft_pwm[e] = 0;
|
soft_pwm[e] = 0;
|
||||||
}
|
}
|
||||||
} // End extruder for loop
|
|
||||||
|
#ifdef WATCH_TEMP_PERIOD
|
||||||
#ifdef WATCHPERIOD
|
if(watchmillis[e] && millis() - watchmillis[e] > WATCH_TEMP_PERIOD)
|
||||||
if(watchmillis && millis() - watchmillis > WATCHPERIOD){
|
{
|
||||||
if(watch_oldtemp[0] >= degHotend(active_extruder)){
|
if(degHotend(e) < watch_start_temp[e] + WATCH_TEMP_INCREASE)
|
||||||
setTargetHotend(0,active_extruder);
|
{
|
||||||
|
setTargetHotend(0, e);
|
||||||
LCD_MESSAGEPGM("Heating failed");
|
LCD_MESSAGEPGM("Heating failed");
|
||||||
SERIAL_ECHO_START;
|
SERIAL_ECHO_START;
|
||||||
SERIAL_ECHOLN("Heating failed");
|
SERIAL_ECHOLN("Heating failed");
|
||||||
}else{
|
}else{
|
||||||
watchmillis = 0;
|
watchmillis[e] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
} // End extruder for loop
|
||||||
|
|
||||||
|
|
||||||
#ifndef PIDTEMPBED
|
#ifndef PIDTEMPBED
|
||||||
|
@ -625,9 +626,6 @@ void tp_init()
|
||||||
// Finish init of mult extruder arrays
|
// Finish init of mult extruder arrays
|
||||||
for(int e = 0; e < EXTRUDERS; e++) {
|
for(int e = 0; e < EXTRUDERS; e++) {
|
||||||
// populate with the first value
|
// populate with the first value
|
||||||
#ifdef WATCHPERIOD
|
|
||||||
watch_raw[e] = watch_raw[0];
|
|
||||||
#endif
|
|
||||||
maxttemp[e] = maxttemp[0];
|
maxttemp[e] = maxttemp[0];
|
||||||
#ifdef PIDTEMP
|
#ifdef PIDTEMP
|
||||||
temp_iState_min[e] = 0.0;
|
temp_iState_min[e] = 0.0;
|
||||||
|
@ -746,22 +744,17 @@ void tp_init()
|
||||||
#endif //BED_MAXTEMP
|
#endif //BED_MAXTEMP
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void setWatch()
|
void setWatch()
|
||||||
{
|
{
|
||||||
#ifdef WATCHPERIOD
|
#ifdef WATCH_TEMP_PERIOD
|
||||||
int t = 0;
|
|
||||||
for (int e = 0; e < EXTRUDERS; e++)
|
for (int e = 0; e < EXTRUDERS; e++)
|
||||||
{
|
{
|
||||||
if(isHeatingHotend(e))
|
if(degHotend(e) < degTargetHotend(e) - (WATCH_TEMP_INCREASE * 2))
|
||||||
watch_oldtemp[0] = degHotend(0);
|
|
||||||
{
|
{
|
||||||
t = max(t,millis());
|
watch_start_temp[e] = degHotend(e);
|
||||||
watch_raw[e] = current_raw[e];
|
watchmillis[e] = millis();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
watchmillis = t;
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -56,12 +56,6 @@ extern int current_raw_bed;
|
||||||
extern float pid_setpoint_bed;
|
extern float pid_setpoint_bed;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// #ifdef WATCHPERIOD
|
|
||||||
extern int watch_raw[EXTRUDERS] ;
|
|
||||||
// extern unsigned long watchmillis;
|
|
||||||
// #endif
|
|
||||||
|
|
||||||
|
|
||||||
//high level conversion routines, for use outside of temperature.cpp
|
//high level conversion routines, for use outside of temperature.cpp
|
||||||
//inline so that there is no performance decrease.
|
//inline so that there is no performance decrease.
|
||||||
//deg=degreeCelsius
|
//deg=degreeCelsius
|
||||||
|
|
Reference in a new issue