From c9b8435749d9582334a70d97d6f997dc2a29eec0 Mon Sep 17 00:00:00 2001 From: David Forrest Date: Mon, 31 Mar 2014 03:16:00 -0400 Subject: [PATCH 1/3] heater.c: Limit PID I term with conditional integration. --- Marlin/temperature.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp index a3fedbf986..f0b6f20ee8 100644 --- a/Marlin/temperature.cpp +++ b/Marlin/temperature.cpp @@ -455,7 +455,14 @@ void manage_heater() //K1 defined in Configuration.h in the PID settings #define K2 (1.0-K1) dTerm[e] = (Kd * (pid_input - temp_dState[e]))*K2 + (K1 * dTerm[e]); - pid_output = constrain(pTerm[e] + iTerm[e] - dTerm[e], 0, PID_MAX); + pid_output = pTerm[e] + iTerm[e] - dTerm[e]; + if (pid_output > PID_MAX) { + if (pid_error[e] > 0 ) temp_iState[e] -= pid_error[e]; // conditional un-integration + pid_output=PID_MAX; + } else if (pid_output < 0){ + if (pid_error[e] < 0 ) temp_iState[e] -= pid_error[e]; // conditional un-integration + pid_output=0; + } } temp_dState[e] = pid_input; #else From 984177c40cd3d6dc897d8f11407d6c424037843e Mon Sep 17 00:00:00 2001 From: David Forrest Date: Sun, 8 Jun 2014 01:05:11 -0400 Subject: [PATCH 2/3] temperature.cpp:Add PID Conditional integration on heated bed. --- Marlin/temperature.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp index f0b6f20ee8..e7f640953c 100644 --- a/Marlin/temperature.cpp +++ b/Marlin/temperature.cpp @@ -565,7 +565,14 @@ 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, MAX_BED_POWER); + pid_output = pTerm_bed + iTerm_bed - dTerm_bed; + if (pid_output > MAX_BED_PID) { + if (pid_error_bed > 0 ) temp_iState_bed -= pid_error_bed; // conditional un-integration + pid_output=PID_MAX; + } else if (pid_output < 0){ + if (pid_error_bed < 0 ) temp_iState_bed -= pid_error_bed; // conditional un-integration + pid_output=0; + } #else pid_output = constrain(target_temperature_bed, 0, MAX_BED_POWER); From cf52c48d19a2efbbd88ba79c3761270e926b64c5 Mon Sep 17 00:00:00 2001 From: David Forrest Date: Tue, 24 Jun 2014 17:03:55 -0400 Subject: [PATCH 3/3] Configuration.m: Set PID_INTEGRAL_DRIVE_MAX from PID_MAX from BANG_MAX. Current defaults are all 255. If it makes sense to reduce them, they should come down together, and be in a PID_INTEGRAL_DRIVE_MAX <= PID_MAX <- BANG_MAX relationship. --- Marlin/Configuration.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index b99ec6a29e..07478e372b 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -144,13 +144,13 @@ // Comment the following line to disable PID and enable bang-bang. #define PIDTEMP #define BANG_MAX 255 // limits current to nozzle while in bang-bang mode; 255=full current -#define PID_MAX 255 // limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_MAX BANG_MAX // limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current #ifdef PIDTEMP //#define PID_DEBUG // Sends debug data to the serial port. //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature // is more then PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. - #define PID_INTEGRAL_DRIVE_MAX 255 //limit for the integral term + #define PID_INTEGRAL_DRIVE_MAX PID_MAX //limit for the integral term #define K1 0.95 //smoothing factor within the PID #define PID_dT ((OVERSAMPLENR * 10.0)/(F_CPU / 64.0 / 256.0)) //sampling period of the temperature routine