diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 2bcfc72833..0a1c119446 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -95,7 +95,6 @@ // PID settings: // Comment the following line to disable PID and enable bang-bang. #define PIDTEMP -#define PIDTEMPBED #define PID_MAX 255 // limits current to nozzle; 255=full current #ifdef PIDTEMP //#define PID_DEBUG // Sends debug data to the serial port. @@ -115,22 +114,50 @@ // #define DEFAULT_Ki 0.1 // #define DEFAULT_Kd 12 -//from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, argressive factor of .15 (vs .1, 1, 10) - #define DEFAULT_bedKp 10.00 - #define DEFAULT_bedKi .023 - #define DEFAULT_bedKd 305.4 - -//mark from pidautotune -// #define DEFAULT_bedKp 97.1 -// #define DEFAULT_bedKi 1.41 -// #define DEFAULT_bedKd 1675.16 - // Mendel Parts V9 on 12V // #define DEFAULT_Kp 63.0 // #define DEFAULT_Ki 2.25 // #define DEFAULT_Kd 440 #endif // PIDTEMP +// Bed Temperature Control +// Select PID or bang-bang with PIDTEMPBED. If bang-bang, BED_LIMIT_SWITCHING will enable hysteresis +// +// uncomment this to enable PID on the bed. It uses the same ferquency PWM as the extruder. +// If your PID_dT above is the default, and correct for your hardware/configuration, that means 7.689Hz, +// which is fine for driving a square wave into a resistive load and does not significantly impact you FET heating. +// This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W heater. +// If your configuration is significantly different than this and you don't understand the issues involved, you proabaly +// shouldn't use bed PID until someone else verifies your hardware works. +// If this is enabled, find your own PID constants below. +//#define PIDTEMPBED +// +//#define BED_LIMIT_SWITCHING + +// This sets the max power delived to the bed, and replaces the HEATER_BED_DUTY_CYCLE_DIVIDER option. +// all forms of bed control obey this (PID, bang-bang, bang-bang with hysteresis) +// setting this to anything other than 255 enables a form of PWM to the bed just like HEATER_BED_DUTY_CYCLE_DIVIDER did, +// so you shouldn't use it unless you are OK with PWM on your bed. (see the comment on enabling PIDTEMPBED) +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#ifdef PIDTEMPBED +//120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) +//from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, argressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + +//120v 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) +//from pidautotune +// #define DEFAULT_bedKp 97.1 +// #define DEFAULT_bedKi 1.41 +// #define DEFAULT_bedKd 1675.16 + +// FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + + + //this prevents dangerous Extruder moves, i.e. if the temperature is under the limit //can be software-disabled for whatever purposes by #define PREVENT_DANGEROUS_EXTRUDE diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 0182c9375a..281da70bc0 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -5,13 +5,10 @@ //=============================Thermal Settings ============================ //=========================================================================== -// Select one of these only to define how the bed temp is read. -// -//#define BED_LIMIT_SWITCHING #ifdef BED_LIMIT_SWITCHING #define BED_HYSTERESIS 2 //only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS #endif -#define BED_CHECK_INTERVAL 5000 //ms +#define BED_CHECK_INTERVAL 5000 //ms between checks in bang-bang control //// Heating sanity check: // This waits for the watchperiod in milliseconds whenever an M104 or M109 increases the target temperature diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp index f31f84b260..f25b462ab6 100644 --- a/Marlin/temperature.cpp +++ b/Marlin/temperature.cpp @@ -153,8 +153,7 @@ void PID_autotune(float temp, int extruder, int ncycles) long t_high; long t_low; - long bias=PID_MAX/2; - long d = PID_MAX/2; + long bias, d; float Ku, Tu; float Kp, Ki, Kd; float max, min; @@ -173,9 +172,15 @@ void PID_autotune(float temp, int extruder, int ncycles) disable_heater(); // switch off all heaters. if (extruder<0) - soft_pwm_bed = PID_MAX/2; + { + soft_pwm_bed = (PID_MAX_BED)/2; + bias = d = (PID_MAX_BED)/2; + } else - soft_pwm[extruder] = PID_MAX/2; + { + soft_pwm[extruder] = (PID_MAX)/2; + bias = d = (PID_MAX)/2; + } @@ -209,8 +214,8 @@ void PID_autotune(float temp, int extruder, int ncycles) t_low=t2 - t1; if(cycles > 0) { bias += (d*(t_high - t_low))/(t_low + t_high); - bias = constrain(bias, 20 ,PID_MAX-20); - if(bias > PID_MAX/2) d = PID_MAX - 1 - bias; + bias = constrain(bias, 20 ,(extruder<0?(PID_MAX_BED):(PID_MAX))-20); + if(bias > (extruder<0?(PID_MAX_BED):(PID_MAX))/2) d = (extruder<0?(PID_MAX_BED):(PID_MAX)) - 1 - bias; else d = bias; SERIAL_PROTOCOLPGM(" bias: "); SERIAL_PROTOCOL(bias); @@ -414,10 +419,10 @@ void manage_heater() dTerm_bed= (bedKd * (pid_input - temp_dState_bed))*K2 + (K1 * dTerm_bed); temp_dState_bed = pid_input; - pid_output = constrain(pTerm_bed + iTerm_bed - dTerm_bed, 0, PID_MAX); + pid_output = constrain(pTerm_bed + iTerm_bed - dTerm_bed, 0, PID_MAX_BED); #else - pid_output = constrain(pid_setpoint_bed, 0, PID_MAX); + pid_output = constrain(pid_setpoint_bed, 0, PID_MAX_BED); #endif //PID_OPENLOOP if((current_raw_bed > bed_minttemp) && (current_raw_bed < bed_maxttemp)) @@ -437,7 +442,7 @@ void manage_heater() } else { - soft_pwm_bed = 100; + soft_pwm_bed = PID_MAX_BED>>1; } } else { @@ -454,7 +459,7 @@ void manage_heater() else if(current_raw_bed <= target_bed_low_temp) { - soft_pwm_bed = 100; + soft_pwm_bed = PID_MAX_BED>>1; } } else {