I’m having an issue with my PID loop. I’m using this to keep the launcher constant.
The issue is that the launcher “stutters”. It will quickly go forward or backward and I can hear gears skipping when this happens.
Here’s the code:
#pragma config(UART_Usage, UART1, uartVEXLCD, baudRate19200, IOPins, None, None)
#pragma config(UART_Usage, UART2, uartNotUsed, baudRate4800, IOPins, None, None)
#pragma config(I2C_Usage, I2C1, i2cSensors)
#pragma config(Sensor, in1, gyro, sensorGyro)
#pragma config(Sensor, dgtl1, leftEncoder, sensorQuadEncoder)
#pragma config(Sensor, dgtl3, rightEncoder, sensorQuadEncoder)
#pragma config(Sensor, dgtl5, limitSwitch, sensorTouch)
#pragma config(Sensor, I2C_1, leftIME, sensorQuadEncoderOnI2CPort, , AutoAssign)
#pragma config(Sensor, I2C_2, rightIME, sensorQuadEncoderOnI2CPort, , AutoAssign)
#pragma config(Motor, port1, intake, tmotorVex393TurboSpeed_HBridge, openLoop)
#pragma config(Motor, port2, left1, tmotorVex393_MC29, openLoop, reversed, driveLeft)
#pragma config(Motor, port3, right1, tmotorVex393_MC29, openLoop, reversed, driveRight)
#pragma config(Motor, port4, topRightLaunch, tmotorVex393_MC29, openLoop, encoderPort, I2C_1)
#pragma config(Motor, port5, bottomRightLaunch, tmotorVex393_MC29, openLoop, reversed, encoderPort, I2C_1)
#pragma config(Motor, port6, topLeftLaunch, tmotorVex393_MC29, openLoop, encoderPort, I2C_2)
#pragma config(Motor, port7, bottomLeftLaunch, tmotorVex393_MC29, openLoop, reversed, encoderPort, I2C_2)
#pragma config(Motor, port8, right2, tmotorVex393_MC29, openLoop, reversed, driveRight)
#pragma config(Motor, port9, left2, tmotorVex393_MC29, openLoop, driveLeft)
#pragma config(Motor, port10, intake2, tmotorVex393TurboSpeed_HBridge, openLoop)
//*!!Code automatically generated by 'ROBOTC' configuration wizard !!*//
//encoder: 627.2 ticks per revolution
int time = 25;
int Hz = 1000 / time;
int ticks = 627.2;
float Kp = 2.0;
float Ki = 0.04;
float Kd = 0;
int pidRunning = 1;
float PIDLastError;
float PIDDerivative;
float PIDTarget = 100;
float PIDIntegral = 0;
float PIDIntegralLimit = 50;
float PIDError;
float RPM;
void RPMCalc()
{
SensorValue[leftIME] = 0;
wait1Msec(time);
RPM = SensorValue[leftIME] * Hz * 60 / ticks;
}
void Error()
{
PIDError = PIDTarget - RPM;
}
void PID()
{
if(pidRunning == 1)
{
if(Ki != 0)
{
if(abs(PIDError) < PIDIntegralLimit) PIDIntegral = PIDIntegral + PIDError;
else PIDIntegral = 0;
}
PIDLastError = PIDError;
PIDDerivative = PIDError - PIDLastError;
float PIDDrive = (Kp * PIDError) + (Ki * PIDIntegral) + (Kd * PIDDerivative);
if(PIDDrive > 127) PIDDrive = 127;
else if(PIDDrive < 127) PIDDrive = -127;
motor[topLeftLaunch] = (PIDDrive);
motor[bottomLeftLaunch] = (PIDDrive);
}
else
{
PIDError = 0;
PIDLastError = 0;
PIDIntegral = 0;
PIDDerivative = 0;
}
}
task main()
{
while(1)
{
RPMCalc();
Error();
PID();
}
}
What am I doing wrong?