Bugfix - removed reset wind-up fix

Removed the reset windup prevention code, as the old code already
took care of that by only incrementing Ierror when output was not being clamped.
This commit is contained in:
Kristof Robot 2013-08-16 16:16:48 +02:00
parent 2c9881552b
commit 7887d639f3

View File

@ -15,7 +15,7 @@ typedef struct {
* Using previous input (PrevInput) instead of PrevError to avoid derivative kick, * Using previous input (PrevInput) instead of PrevError to avoid derivative kick,
* see http://brettbeauregard.com/blog/2011/04/improving-the-beginner%E2%80%99s-pid-derivative-kick/ * see http://brettbeauregard.com/blog/2011/04/improving-the-beginner%E2%80%99s-pid-derivative-kick/
*/ */
long PrevInput; // last input int PrevInput; // last input
//int PrevErr; // last error //int PrevErr; // last error
/* /*
@ -24,9 +24,9 @@ typedef struct {
* see http://brettbeauregard.com/blog/2011/04/improving-the-beginner%E2%80%99s-pid-tuning-changes/ * see http://brettbeauregard.com/blog/2011/04/improving-the-beginner%E2%80%99s-pid-tuning-changes/
*/ */
//int Ierror; //int Ierror;
long ITerm; //integrated term int ITerm; //integrated term
int output; // last motor setting long output; // last motor setting
} }
SetPointInfo; SetPointInfo;
@ -68,19 +68,12 @@ void resetPID(){
void doPID(SetPointInfo * p) { void doPID(SetPointInfo * p) {
long Perror; long Perror;
long output; long output;
long input; int input;
//Perror = p->TargetTicksPerFrame - (p->Encoder - p->PrevEnc); //Perror = p->TargetTicksPerFrame - (p->Encoder - p->PrevEnc);
input = p->Encoder - p->PrevEnc; input = p->Encoder - p->PrevEnc;
Perror = p->TargetTicksPerFrame - input; Perror = p->TargetTicksPerFrame - input;
/*
* Avoid reset windup,
* see http://brettbeauregard.com/blog/2011/04/improving-the-beginner%E2%80%99s-pid-reset-windup/
*/
p->ITerm += (Ki * Perror);
if (p->ITerm > MAX_PWM) p->ITerm = MAX_PWM;
else if (p->ITerm < -MAX_PWM) p->ITerm = MAX_PWM;
/* /*
* Avoid derivative kick and allow tuning changes, * Avoid derivative kick and allow tuning changes,
@ -99,9 +92,11 @@ void doPID(SetPointInfo * p) {
output = MAX_PWM; output = MAX_PWM;
else if (output <= -MAX_PWM) else if (output <= -MAX_PWM)
output = -MAX_PWM; output = -MAX_PWM;
//else else
// p->Ierror += Perror; /*
* allow turning changes, see http://brettbeauregard.com/blog/2011/04/improving-the-beginner%E2%80%99s-pid-tuning-changes/
*/
p->ITerm += Ki * Perror;
p->output = output; p->output = output;
p->PrevInput = input; p->PrevInput = input;