This code should take the current error and make it the previous error for the next loop. they are always the exact same number. Any suggestions to fix this??
void PIDcalc() {
// float a = EstimateAngle() - INIT_ANGLE;
float a = RwEst[1] - INIT_ANGLE;
angleBuffer[angleBufferIndex] = a;
angleBufferIndex = (angleBufferIndex + 1) % ANGLE_BUFFER_LENGTH;
float ang = GetAvgAngle();
curErr = ang - INIT_ANGLE; //error
// Proprtional Term
// curErr = RwEst[1] - INIT_ANGLE; //error
// Integral Term
SumErr += curErr;
if (SumErr > SumErrMax) SumErr = SumErrMax;
else if (SumErr < SumErrMin) SumErr = SumErrMin;
// integralTerm = SumErr * Ki / (Kp * elapsedTimeSec * 10.0); // Ki*SumE/(Kp*Fs*X)
integralTerm = SumErr * interval / 1000000 * Ki / Kp * 10.0; // Ki*SumE/(Kp*Ts*X)
// Derivative Term
derivativeTerm = curErr - prevErr;
if(derivativeTerm > 0.1) derivativeTerm = 0.1;
else if (derivativeTerm < -0.1) derivativeTerm = -0.1;
derivativeTerm = derivativeTerm * Kd * interval / 1000000 / Kp; // Kd(curErr-prevErr)*Ts/(Kp*X)
if(elapsedTimeSec > 120) derivativeTerm = 120;
else if (derivativeTerm < -120) derivativeTerm = -120;
// PID Calc
Cn = (curErr + integralTerm + derivativeTerm) * Kp / 10.0;
// Serial.println (Cn);
// Motor drive calc
WheelDirection dir;
if (Cn > 0) dir = DIR_FORWARD;
else if (Cn < -0) dir = DIR_BACKWARD;
else dir = DIR_STOP;
throttle = abs(Cn);
if (abs(ang) > 0.7) MoveWheels(DIR_STOP, 0); //if angle too large to correct, stop motor
else MoveWheels(dir, throttle);
prevErr = curErr;