fixed typo, added even more PID improvements (these settings work out of box for my old hotend, but overshoot badly on MG hotend)

This commit is contained in:
Keegi 2011-08-10 16:09:23 +03:00
parent c6a228d62e
commit 116eefa1d7
2 changed files with 17 additions and 7 deletions

View file

@ -118,7 +118,7 @@ char uuid[] = "00000000-0000-0000-0000-000000000000";
//// PID settings:
// Uncomment the following line to enable PID support. This is untested and could be disastrous. Be careful.
//#define PIDTEMP
//#define PIDTEMP 1
#ifdef PIDTEMP
#define PID_INTEGRAL_DRIVE_MAX 80 // too big, and heater will lag after changing temperature, too small and it might not compensate enough for long-term errors
#define PID_PGAIN 1280 //256 is 1.0 // value of 5.0 means that error of 20C is changing it almost halfway of the PWM range
@ -127,7 +127,7 @@ char uuid[] = "00000000-0000-0000-0000-000000000000";
// magic formula 1, to get approximate "zero error" PWM duty. It is most likely linear formula
#define HEATER_DUTY_FOR_SETPOINT(setpoint) (22+1*setpoint)
// magic formula 2, to make led brightness approximately linear
#define LED_PWM_FOR_BRIGTHNESS(brightness) ((64*brightness-1384)/(300-brightness))
#define LED_PWM_FOR_BRIGHTNESS(brightness) ((64*brightness-1384)/(300-brightness))
#endif
// Change this value (range 1-255) to limit the current to the nozzle

View file

@ -1499,12 +1499,22 @@ void manage_heater()
int delta_temp = current_temp - prev_temp;
prev_temp = current_temp;
pTerm = ((long)PID_PGAIN * error) / 256;
temp_iState += error;
temp_iState = constrain(temp_iState, temp_iState_min, temp_iState_max);
iTerm = ((long)PID_IGAIN * temp_iState) / 256;
dTerm = ((long)PID_DGAIN * delta_temp) / 256;
const int H0 = min(HEATER_DUTY_FOR_SETPOINT(target_temp),HEATER_CURRENT);
heater_duty = H0 + constrain(pTerm + iTerm - dTerm, -H0, HEATER_CURRENT-H0);
heater_duty = H0 + pTerm;
if(error < 20){
temp_iState += error;
temp_iState = constrain(temp_iState, temp_iState_min, temp_iState_max);
iTerm = ((long)PID_IGAIN * temp_iState) / 256;
heater_duty += iTerm;
}
int prev_error = abs(target_temp - prev_temp);
int log3 = 1; // discrete logarithm base 3, plus 1
if(prev_error > 81){ prev_error /= 81; log3 += 4; }
if(prev_error > 9){ prev_error /= 9; log3 += 2; }
if(prev_error > 3){ prev_error /= 3; log3 ++; }
dTerm = ((long)PID_DGAIN * delta_temp) / (256*log3);
heater_duty += dTerm;
heater_duty = constrain(heater_duty, 0, HEATER_CURRENT);
analogWrite(HEATER_0_PIN, heater_duty);
#if LED_PIN>-1
analogWrite(LED_PIN, constrain(LED_PWM_FOR_BRIGHTNESS(heater_duty),0,255));