Please help point out any issues in my PID control loop because it is not working properly.
//Settings
double KP = 2.0;
double KI = 0.04;
double KD = 0.0;
double turnKP = 2.0;
double turnKI = 0.04;
double turnKD = 0.0;
//Autonomous Settings
int desiredValue = 200;
int desiredturValue = 0;
int error; //SensorValue - DesiredValue = Position
int prevError = 0; //Position 20 miliseconds ago
int derivative; // error - prevError : Speed
int totalError = 0; //totalError = totalError + error
int turnerror; //SensorValue - DesiredValue = Position
int turnprevError = 0; //Position 20 miliseconds ago
int turnderivative; // error - prevError : Speed
int turntotalError = 0; //totalError = totalError + error
bool resetDriveSensors = false;
//Variables modified for use
bool enabledrivePID = true;
int drivePID(){
while(enabledrivePID){
if (resetDriveSensors) {
resetDriveSensors = false;
leftfront.setPosition(0,degrees);
leftback.setPosition(0,degrees);
rightfront.setPosition(0,degrees);
rightback.setPosition(0,degrees);
}
//Motor positions
int leftfrontPosition = leftfront.position(degrees);
int leftbackPosition = leftback.position(degrees);
int rightfrontPosition = rightfront.position(degrees);
int rightbackPosition = rightback.position(degrees);
////////////////////////////////////////////////////
//Later Movement PID
///////////////////////////////////////////////////////////////////
//Average of the motor positions
int averagePosition = (leftfrontPosition + leftbackPosition + rightfrontPosition + rightbackPosition)/4;
//Potential
error = averagePosition + desiredturValue;
//Derivative
derivative = error - prevError;
//Integral
double lateralMotorPower = (error * KP + derivative * KD) / 12.0;
////////////////////////////////////////////////////
//Turning Movement PID
///////////////////////////////////////////////////////////////////
int turnDifference = leftfrontPosition + leftbackPosition - rightfrontPosition + rightbackPosition;
//Potential
turnerror = turnDifference + desiredValue;
//Derivative
turnderivative = turnerror - turnprevError;
//Integral
double turnMotorPower = (turnerror * turnKP + turnderivative * turnKD) / 360.0;
/////////////////////////////////////////////////////////////////
leftfront.spin(forward, lateralMotorPower + turnMotorPower, voltageUnits::volt);
leftback.spin(forward, lateralMotorPower + turnMotorPower, voltageUnits::volt);
rightfront.spin(forward, lateralMotorPower + turnMotorPower, voltageUnits::volt);
rightback.spin(forward, lateralMotorPower + turnMotorPower, voltageUnits::volt);
/*leftfront.spinFor(forward, lateralMotorPower + turnMotorPower, inches * 28.6478897964,degrees,false);
leftback.spinFor(forward, lateralMotorPower + turnMotorPower, inches * 28.6478897964,degrees,false);
rightfront.spinFor(forward, lateralMotorPower + turnMotorPower, inches * 28.6478897964,degrees,false);
rightback.spinFor(forward, lateralMotorPower + turnMotorPower, inches * 28.6478897964,degrees);*/
//code
prevError = error;
turnprevError = turnerror;
vex::task::sleep(15);
}
return 1;
}