|
|
|
@ -33,6 +33,7 @@
|
|
|
|
|
#include "ultralcd.h"
|
|
|
|
|
#include "temperature.h"
|
|
|
|
|
#include "watchdog.h"
|
|
|
|
|
#include "language.h"
|
|
|
|
|
|
|
|
|
|
#include "Sd2PinMap.h"
|
|
|
|
|
|
|
|
|
@ -228,11 +229,11 @@ void PID_autotune(float temp, int extruder, int ncycles)
|
|
|
|
|
|| extruder < 0
|
|
|
|
|
#endif
|
|
|
|
|
) {
|
|
|
|
|
SERIAL_ECHOLN("PID Autotune failed. Bad extruder number.");
|
|
|
|
|
SERIAL_ECHOLN(MSG_PID_BAD_EXTRUDER_NUM);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SERIAL_ECHOLN("PID Autotune start");
|
|
|
|
|
SERIAL_ECHOLN(MSG_PID_AUTOTUNE_START);
|
|
|
|
|
|
|
|
|
|
disable_heater(); // switch off all heaters.
|
|
|
|
|
|
|
|
|
@ -287,22 +288,22 @@ void PID_autotune(float temp, int extruder, int ncycles)
|
|
|
|
|
bias = constrain(bias, 20, max_pow - 20);
|
|
|
|
|
d = (bias > max_pow / 2) ? max_pow - 1 - bias : bias;
|
|
|
|
|
|
|
|
|
|
SERIAL_PROTOCOLPGM(" bias: "); SERIAL_PROTOCOL(bias);
|
|
|
|
|
SERIAL_PROTOCOLPGM(" d: "); SERIAL_PROTOCOL(d);
|
|
|
|
|
SERIAL_PROTOCOLPGM(" min: "); SERIAL_PROTOCOL(min);
|
|
|
|
|
SERIAL_PROTOCOLPGM(" max: "); SERIAL_PROTOCOLLN(max);
|
|
|
|
|
SERIAL_PROTOCOLPGM(MSG_BIAS); SERIAL_PROTOCOL(bias);
|
|
|
|
|
SERIAL_PROTOCOLPGM(MSG_D); SERIAL_PROTOCOL(d);
|
|
|
|
|
SERIAL_PROTOCOLPGM(MSG_MIN); SERIAL_PROTOCOL(min);
|
|
|
|
|
SERIAL_PROTOCOLPGM(MSG_MAX); SERIAL_PROTOCOLLN(max);
|
|
|
|
|
if (cycles > 2) {
|
|
|
|
|
Ku = (4.0 * d) / (3.14159265 * (max - min) / 2.0);
|
|
|
|
|
Tu = ((float)(t_low + t_high) / 1000.0);
|
|
|
|
|
SERIAL_PROTOCOLPGM(" Ku: "); SERIAL_PROTOCOL(Ku);
|
|
|
|
|
SERIAL_PROTOCOLPGM(" Tu: "); SERIAL_PROTOCOLLN(Tu);
|
|
|
|
|
SERIAL_PROTOCOLPGM(MSG_KU); SERIAL_PROTOCOL(Ku);
|
|
|
|
|
SERIAL_PROTOCOLPGM(MSG_TU); SERIAL_PROTOCOLLN(Tu);
|
|
|
|
|
Kp = 0.6 * Ku;
|
|
|
|
|
Ki = 2 * Kp / Tu;
|
|
|
|
|
Kd = Kp * Tu / 8;
|
|
|
|
|
SERIAL_PROTOCOLLNPGM(" Classic PID ");
|
|
|
|
|
SERIAL_PROTOCOLPGM(" Kp: "); SERIAL_PROTOCOLLN(Kp);
|
|
|
|
|
SERIAL_PROTOCOLPGM(" Ki: "); SERIAL_PROTOCOLLN(Ki);
|
|
|
|
|
SERIAL_PROTOCOLPGM(" Kd: "); SERIAL_PROTOCOLLN(Kd);
|
|
|
|
|
SERIAL_PROTOCOLLNPGM(MSG_CLASSIC_PID);
|
|
|
|
|
SERIAL_PROTOCOLPGM(MSG_KP); SERIAL_PROTOCOLLN(Kp);
|
|
|
|
|
SERIAL_PROTOCOLPGM(MSG_KI); SERIAL_PROTOCOLLN(Ki);
|
|
|
|
|
SERIAL_PROTOCOLPGM(MSG_KD); SERIAL_PROTOCOLLN(Kd);
|
|
|
|
|
/*
|
|
|
|
|
Kp = 0.33*Ku;
|
|
|
|
|
Ki = Kp/Tu;
|
|
|
|
@ -331,7 +332,7 @@ void PID_autotune(float temp, int extruder, int ncycles)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (input > temp + 20) {
|
|
|
|
|
SERIAL_PROTOCOLLNPGM("PID Autotune failed! Temperature too high");
|
|
|
|
|
SERIAL_PROTOCOLLNPGM(MSG_PID_TEMP_TOO_HIGH);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// Every 2 seconds...
|
|
|
|
@ -339,26 +340,26 @@ void PID_autotune(float temp, int extruder, int ncycles)
|
|
|
|
|
int p;
|
|
|
|
|
if (extruder < 0) {
|
|
|
|
|
p = soft_pwm_bed;
|
|
|
|
|
SERIAL_PROTOCOLPGM("ok B:");
|
|
|
|
|
SERIAL_PROTOCOLPGM(MSG_OK_B);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
p = soft_pwm[extruder];
|
|
|
|
|
SERIAL_PROTOCOLPGM("ok T:");
|
|
|
|
|
SERIAL_PROTOCOLPGM(MSG_OK_T);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SERIAL_PROTOCOL(input);
|
|
|
|
|
SERIAL_PROTOCOLPGM(" @:");
|
|
|
|
|
SERIAL_PROTOCOLPGM(MSG_AT);
|
|
|
|
|
SERIAL_PROTOCOLLN(p);
|
|
|
|
|
|
|
|
|
|
temp_millis = ms;
|
|
|
|
|
} // every 2 seconds
|
|
|
|
|
// Over 2 minutes?
|
|
|
|
|
if (((ms - t1) + (ms - t2)) > (10L*60L*1000L*2L)) {
|
|
|
|
|
SERIAL_PROTOCOLLNPGM("PID Autotune failed! timeout");
|
|
|
|
|
SERIAL_PROTOCOLLNPGM(MSG_PID_TIMEOUT);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (cycles > ncycles) {
|
|
|
|
|
SERIAL_PROTOCOLLNPGM("PID Autotune finished! Put the last Kp, Ki and Kd constants from above into Configuration.h");
|
|
|
|
|
SERIAL_PROTOCOLLNPGM(MSG_PID_AUTOTUNE_FINISHED);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
lcd_update();
|
|
|
|
@ -571,17 +572,17 @@ void manage_heater() {
|
|
|
|
|
|
|
|
|
|
#ifdef PID_DEBUG
|
|
|
|
|
SERIAL_ECHO_START;
|
|
|
|
|
SERIAL_ECHO(" PID_DEBUG ");
|
|
|
|
|
SERIAL_ECHO(MSG_PID_DEBUG);
|
|
|
|
|
SERIAL_ECHO(e);
|
|
|
|
|
SERIAL_ECHO(": Input ");
|
|
|
|
|
SERIAL_ECHO(MSG_PID_DEBUG_INPUT);
|
|
|
|
|
SERIAL_ECHO(pid_input);
|
|
|
|
|
SERIAL_ECHO(" Output ");
|
|
|
|
|
SERIAL_ECHO(MSG_PID_DEBUG_OUTPUT);
|
|
|
|
|
SERIAL_ECHO(pid_output);
|
|
|
|
|
SERIAL_ECHO(" pTerm ");
|
|
|
|
|
SERIAL_ECHO(MSG_PID_DEBUG_PTERM);
|
|
|
|
|
SERIAL_ECHO(pTerm[e]);
|
|
|
|
|
SERIAL_ECHO(" iTerm ");
|
|
|
|
|
SERIAL_ECHO(MSG_PID_DEBUG_ITERM);
|
|
|
|
|
SERIAL_ECHO(iTerm[e]);
|
|
|
|
|
SERIAL_ECHO(" dTerm ");
|
|
|
|
|
SERIAL_ECHO(MSG_PID_DEBUG_DTERM);
|
|
|
|
|
SERIAL_ECHOLN(dTerm[e]);
|
|
|
|
|
#endif //PID_DEBUG
|
|
|
|
|
|
|
|
|
@ -599,9 +600,9 @@ void manage_heater() {
|
|
|
|
|
if (watchmillis[e] && ms > watchmillis[e] + WATCH_TEMP_PERIOD) {
|
|
|
|
|
if (degHotend(e) < watch_start_temp[e] + WATCH_TEMP_INCREASE) {
|
|
|
|
|
setTargetHotend(0, e);
|
|
|
|
|
LCD_MESSAGEPGM("Heating failed");
|
|
|
|
|
LCD_MESSAGEPGM(MSG_HEATING_FAILED_LCD); // translatable
|
|
|
|
|
SERIAL_ECHO_START;
|
|
|
|
|
SERIAL_ECHOLNPGM("Heating failed");
|
|
|
|
|
SERIAL_ECHOLNPGM(MSG_HEATING_FAILED);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
watchmillis[e] = 0;
|
|
|
|
@ -614,8 +615,8 @@ void manage_heater() {
|
|
|
|
|
disable_heater();
|
|
|
|
|
if (IsStopped() == false) {
|
|
|
|
|
SERIAL_ERROR_START;
|
|
|
|
|
SERIAL_ERRORLNPGM("Extruder switched off. Temperature difference between temp sensors is too high !");
|
|
|
|
|
LCD_ALERTMESSAGEPGM("Err: REDUNDANT TEMP ERROR");
|
|
|
|
|
SERIAL_ERRORLNPGM(MSG_EXTRUDER_SWITCHED_OFF);
|
|
|
|
|
LCD_ALERTMESSAGEPGM(MSG_ERR_REDUNDANT_TEMP); // translatable
|
|
|
|
|
}
|
|
|
|
|
#ifndef BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE
|
|
|
|
|
Stop();
|
|
|
|
@ -728,7 +729,7 @@ static float analog2temp(int raw, uint8_t e) {
|
|
|
|
|
{
|
|
|
|
|
SERIAL_ERROR_START;
|
|
|
|
|
SERIAL_ERROR((int)e);
|
|
|
|
|
SERIAL_ERRORLNPGM(" - Invalid extruder number !");
|
|
|
|
|
SERIAL_ERRORLNPGM(MSG_INVALID_EXTRUDER_NUM);
|
|
|
|
|
kill();
|
|
|
|
|
return 0.0;
|
|
|
|
|
}
|
|
|
|
@ -1074,9 +1075,9 @@ void thermal_runaway_protection(int *state, unsigned long *timer, float temperat
|
|
|
|
|
else if ( (ms - *timer) > ((unsigned long) period_seconds) * 1000)
|
|
|
|
|
{
|
|
|
|
|
SERIAL_ERROR_START;
|
|
|
|
|
SERIAL_ERRORLNPGM("Thermal Runaway, system stopped! Heater_ID: ");
|
|
|
|
|
SERIAL_ERRORLNPGM(MSG_THERMAL_RUNAWAY_STOP);
|
|
|
|
|
SERIAL_ERRORLN((int)heater_id);
|
|
|
|
|
LCD_ALERTMESSAGEPGM("THERMAL RUNAWAY");
|
|
|
|
|
LCD_ALERTMESSAGEPGM(MSG_THERMAL_RUNAWAY); // translatable
|
|
|
|
|
thermal_runaway = true;
|
|
|
|
|
while(1)
|
|
|
|
|
{
|
|
|
|
@ -1140,8 +1141,8 @@ void max_temp_error(uint8_t e) {
|
|
|
|
|
if(IsStopped() == false) {
|
|
|
|
|
SERIAL_ERROR_START;
|
|
|
|
|
SERIAL_ERRORLN((int)e);
|
|
|
|
|
SERIAL_ERRORLNPGM(": Extruder switched off. MAXTEMP triggered !");
|
|
|
|
|
LCD_ALERTMESSAGEPGM("Err: MAXTEMP");
|
|
|
|
|
SERIAL_ERRORLNPGM(MSG_MAXTEMP_EXTRUDER_OFF);
|
|
|
|
|
LCD_ALERTMESSAGEPGM(MSG_ERR_MAXTEMP); // translatable
|
|
|
|
|
}
|
|
|
|
|
#ifndef BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE
|
|
|
|
|
Stop();
|
|
|
|
@ -1153,8 +1154,8 @@ void min_temp_error(uint8_t e) {
|
|
|
|
|
if(IsStopped() == false) {
|
|
|
|
|
SERIAL_ERROR_START;
|
|
|
|
|
SERIAL_ERRORLN((int)e);
|
|
|
|
|
SERIAL_ERRORLNPGM(": Extruder switched off. MINTEMP triggered !");
|
|
|
|
|
LCD_ALERTMESSAGEPGM("Err: MINTEMP");
|
|
|
|
|
SERIAL_ERRORLNPGM(MSG_MINTEMP_EXTRUDER_OFF);
|
|
|
|
|
LCD_ALERTMESSAGEPGM(MSG_ERR_MINTEMP); // translatable
|
|
|
|
|
}
|
|
|
|
|
#ifndef BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE
|
|
|
|
|
Stop();
|
|
|
|
@ -1167,8 +1168,8 @@ void bed_max_temp_error(void) {
|
|
|
|
|
#endif
|
|
|
|
|
if (IsStopped() == false) {
|
|
|
|
|
SERIAL_ERROR_START;
|
|
|
|
|
SERIAL_ERRORLNPGM("Temperature heated bed switched off. MAXTEMP triggered !!");
|
|
|
|
|
LCD_ALERTMESSAGEPGM("Err: MAXTEMP BED");
|
|
|
|
|
SERIAL_ERRORLNPGM(MSG_MAXTEMP_BED_OFF);
|
|
|
|
|
LCD_ALERTMESSAGEPGM(MSG_ERR_MAXTEMP_BED); // translatable
|
|
|
|
|
}
|
|
|
|
|
#ifndef BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE
|
|
|
|
|
Stop();
|
|
|
|
|