|
@@ -455,7 +455,14 @@ void manage_heater()
|
455
|
455
|
//K1 defined in Configuration.h in the PID settings
|
456
|
456
|
#define K2 (1.0-K1)
|
457
|
457
|
dTerm[e] = (Kd * (pid_input - temp_dState[e]))*K2 + (K1 * dTerm[e]);
|
458
|
|
- pid_output = constrain(pTerm[e] + iTerm[e] - dTerm[e], 0, PID_MAX);
|
|
458
|
+ pid_output = pTerm[e] + iTerm[e] - dTerm[e];
|
|
459
|
+ if (pid_output > PID_MAX) {
|
|
460
|
+ if (pid_error[e] > 0 ) temp_iState[e] -= pid_error[e]; // conditional un-integration
|
|
461
|
+ pid_output=PID_MAX;
|
|
462
|
+ } else if (pid_output < 0){
|
|
463
|
+ if (pid_error[e] < 0 ) temp_iState[e] -= pid_error[e]; // conditional un-integration
|
|
464
|
+ pid_output=0;
|
|
465
|
+ }
|
459
|
466
|
}
|
460
|
467
|
temp_dState[e] = pid_input;
|
461
|
468
|
#else
|
|
@@ -558,7 +565,14 @@ void manage_heater()
|
558
|
565
|
dTerm_bed= (bedKd * (pid_input - temp_dState_bed))*K2 + (K1 * dTerm_bed);
|
559
|
566
|
temp_dState_bed = pid_input;
|
560
|
567
|
|
561
|
|
- pid_output = constrain(pTerm_bed + iTerm_bed - dTerm_bed, 0, MAX_BED_POWER);
|
|
568
|
+ pid_output = pTerm_bed + iTerm_bed - dTerm_bed;
|
|
569
|
+ if (pid_output > MAX_BED_PID) {
|
|
570
|
+ if (pid_error_bed > 0 ) temp_iState_bed -= pid_error_bed; // conditional un-integration
|
|
571
|
+ pid_output=PID_MAX;
|
|
572
|
+ } else if (pid_output < 0){
|
|
573
|
+ if (pid_error_bed < 0 ) temp_iState_bed -= pid_error_bed; // conditional un-integration
|
|
574
|
+ pid_output=0;
|
|
575
|
+ }
|
562
|
576
|
|
563
|
577
|
#else
|
564
|
578
|
pid_output = constrain(target_temperature_bed, 0, MAX_BED_POWER);
|