Estoy utilizando un codificador de eje conectado a un motor de CC para medir RPM, un L293D IC para impulsar el motor y una placa Arduino. Mi objetivo es controlar la velocidad del motor de CC a aproximadamente 200 RPM, y estoy tratando de usar la biblioteca PID del arduino para lograr esto. Mi problema, ahora mismo, es con la afinación. El sistema oscila mucho, y he intentado varios métodos, pero nada parece funcionar. He intentado poner Kd y Ki en cero y ajustar Kp hasta que obtenga una oscilación constante, sin éxito. Además, ajustar Kd no está haciendo amortiguamiento. He intentado usar un programa Python simple para trazar el RPM en función del tiempo y esto es lo que estoy obteniendo:
AcontinuaciónsemuestraelcódigoArduinoqueestoyusando:
#include<PID_v1.h>#defineSpeedSetPoint200doubleInput,Output,Setpoint;//PIDVariablesintpotKp=2;intpotKd=3;intpotKi=4;floatKp=0,Kd=0,Ki=0;PIDmyPid(&Input,&Output,&Setpoint,0,0,0,DIRECT);//RPMCounterunsignedlongstart;constbyteencoderPinA=2;//Apin->interruptpin0constbyteencoderPinB=4;//Bpin->digitalpin4volatilelongpulse;volatileboolpinB,pinA,dir;constbyteppr=25,upDatesPerSec=2;constintfin=1000/upDatesPerSec;constfloatkonstant=60.0*upDatesPerSec/(ppr*2);intrpm=0;intoutputValue=0;//DCMotorPinsintpwm=5;intmotorA1=10;intmotorA2=9;voidsetup(){Serial.begin(19200);Input=25;Setpoint=SpeedSetPoint;myPid.SetMode(AUTOMATIC);attachInterrupt(0,readEncoder,CHANGE);pinMode(encoderPinA,INPUT_PULLUP);pinMode(encoderPinB,INPUT_PULLUP);pinMode(pwm,OUTPUT);pinMode(motorA1,OUTPUT);pinMode(motorA2,OUTPUT);//StartDCMotordigitalWrite(pwm,HIGH);digitalWrite(motorA1,HIGH);digitalWrite(motorA2,LOW);}voidloop(){Kp=analogRead(potKp)/100.0;Ki=analogRead(potKi)/1000.0;Kd=analogRead(potKd)/1000.0;myPid.SetTunings(Kp,Ki,Kd);if(millis()-start>fin){start=millis();rpm=pulse*konstant;rpm=abs(rpm);Serial.println(rpm);pulse=0;}//EndRPMreadingInput=rpm;myPid.Compute();outputValue=Output;//outputValue=map(outputValue,0,400,180,255);analogWrite(pwm,outputValue);Serial.print("RPM = ");
Serial.print(rpm);
Serial.print("\t");
Serial.print("Kp = ");
Serial.print(Kp);
Serial.print("\t");
Serial.print("Ki = ");
Serial.print(Ki);
Serial.print("\t");
Serial.print("Kd = ");
Serial.println(Kd);
}
void readEncoder()
{
pinA = bitRead(PIND,encoderPinA);
pinB = bitRead(PIND,encoderPinB);
dir = pinA ^ pinB; // if pinA & pinB are the same
dir ? --pulse : ++pulse; // dir is CW, else CCW
}
¿Algún consejo?