• Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.

problemas PID

problemas PID Publicado por MANUEL

Posted 5 años 9 meses antes #1749
Muy buenas , necesito ayuda en un sistema PID la librería es PID_v1.h y ya he calibrado las variables Kp=0.3, Ki=0.3, Kd=0.01 pero cuando corto la corriente del motor el encoder deja de enviar las RPM y cuando doy de nuevo corriente se acelera al maximo, eso no ocurre cuando receteo o inicio el arduino que controla el motor, en esa circunstancia va elevando la velocidad de forma gradual hasta alcanzar el Setpoint.
os dejo el codigo
Code:
/******************************************************** * PID Basic Example * Reading analog input 0 to control analog PWM output 3 ********************************************************/ #include <PID_v1.h> #include <Wire.h> int dato =0; const int SM_1= 10; const int SM_2= 11; //#define PIN_ENTRADA 0 //#define PIN_SALIDA 3 //Define Variables we'll be connecting to double Setpoint, Input, Output; //Specify the links and initial tuning parameters double Kp=0.3, Ki=0.3, Kd=0.01; //double Kp=1.1, Ki=0.8, Kd=0.09; Kp=1, Ki=0.95, Kd=0.07 PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT); void setup() { Serial.begin(9600); Wire.begin(); //initialize the variables we're linked to Input = dato;//analogRead(PIN_ENTRADA); Setpoint = 180; //turn the PID on myPID.SetMode(AUTOMATIC); } void loop() { Wire.requestFrom(1, 1); // LE PIDE DATOS AL ESCLAVO_1 POR EL CABLE while(Wire.available()) // ESPERA QUE HAYA DATOS ENVIADOS DESDE ESCLAVO_1 POR EL CABLE { dato = Wire.read(); // LEE LOS DATOS ENVIADOS DESDE ESCLAVO_1 POR EL CABLE, Y ALMACENA EN RDS_1 delay (5); } Input = dato;//analogRead(PIN_ENTRADA); Serial.println(dato); myPID.Compute(); analogWrite(SM_1, Output); analogWrite (SM_2,0); //Serial.println(Input); //delay (100); }
Post by MANUEL

Por favor, Conectar o Crear cuenta para unirse a la conversación.

Respuesta de MANUEL sobre el tema problemas PID

Posted 5 años 9 meses antes #1750
El sistema consta de un motor, engranajes y encoder, se gestiona mediante dos arduinos, uno de ellos se implementa en el encoder y el otro controla el motor con el PID la comunicación entre ambos es mediante PID .
os dejo la foto
Post by MANUEL
Adjuntos:

Por favor, Conectar o Crear cuenta para unirse a la conversación.

Respuesta de Raúl Diosdado sobre el tema problemas PID

Posted 5 años 9 meses antes #1753
Buenos días Manuel! tu siempre trabajando con proyectos súper chulos!
En mi caso nunca he aplicado un regulador PID para controlar las revoluciones de un motor, pero por lo que comentas creo que el problema lo debes tener a la hora de sincronicar los dos Arduinos, dices que si lo reseteas va perfecto, que solo da problemas al cortar alimentación del motor. Cuando cortas la alimentación al motor ¿cortas también la alimentación a uno de los Arduinos?, si es así puede que el problema venga por ahi.
Otra cosa... ¿con que driver estas controlando el motor?
Si el proyecto lo has sacado de algún sitio pásamelo y lo estudio
Post by Raúl Diosdado
El siguiente usuario dijo gracias: MANUEL

Por favor, Conectar o Crear cuenta para unirse a la conversación.

Respuesta de MANUEL sobre el tema problemas PID

Posted 5 años 9 meses antes #1758
no, la alimentación del motor va independiente de los arduinos, todo va bien sólo cuando el arduino que controla el motor se inicia o recetea es cuando la aceleración del motor va suave hasta alcanzar el punto programado, cuando se para el motor el arduino del PID recibe 0 RPM ya que el encoder está parado, y cuando vuelvo a darle corriente al motor es cuando se acelera de forma exagerada y al rato vuelve al punto programado.
La comunicación I2C va bien no es el problema.
el proyecto es de mi cosecha propia jejejejejejejjeje y el driver que controla el motor es el Puente H Driver Bts7960 43a el cual es un pepino me encanta
Post by MANUEL

Por favor, Conectar o Crear cuenta para unirse a la conversación.

Respuesta de Raúl Diosdado sobre el tema problemas PID

Posted 5 años 8 meses antes #1763
Por lo que comentas entonces creo que lo que están mal regulado son los parámetros del PID, al apagar el motor va a 0rpm, y el PID intenta que funcione a la velocidad marcada, por lo que intenta acelerarlo todo lo que pueda, cuando le das corriente al motor, el PID está ya tratando de moverlo a tope, por eso se embala y se pasa de revoluciones estabilizándose al cabo de un ratito.
Creo que deberías probar diferentes valores de Kp, Ki, Kd a ver si consigues mejoras, si no también puedes intentar programar un arranque suave con alguna función, tipo:
Code:
if (revoluciones == 0) { Ejecuta arranque suave durante 3 segundos }

Es lo único que se me ocurre sin conocer como funciona ese sistema
Post by Raúl Diosdado
El siguiente usuario dijo gracias: MANUEL

Por favor, Conectar o Crear cuenta para unirse a la conversación.

Respuesta de MANUEL sobre el tema problemas PID

Posted 5 años 8 meses antes #1766
Raul tambien probé con eso, pero las operaciones internas en computer() pone la salida a tope de pwm y tal como comentas, al parar el motor y el sistema ve que le entra 0 rpm se va a tope.
Ya lo solucioné jejejjej aun tengo que perfilar el programa pero va a asi
Code:
#include <PID_v1.h> #include <Wire.h> const int BOTON = 7; int dato =0; const int SM_1= 10; const int SM_2= 11; double Setpoint = 0.0, Input = 0.0, Output = 0.0; double Kp=0.6, Ki=0.64, Kd=0.012; double outMax = 0.0, outMin = 0.0; unsigned int tmp = 0; PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT); void setup() { pinMode(BOTON,INPUT); Serial.begin(9600); Wire.begin(); analogWrite(SM_1, 0); analogWrite(SM_2,0); outMax = 255; // Límite máximo del controlador PID. outMin = 0; Setpoint = 150; tmp = 8; myPID.SetSampleTime(tmp); myPID.SetOutputLimits(outMin, outMax); myPID.SetMode(AUTOMATIC);//MANUAL (AUTOMATIC } void loop() { myPID.SetMode(AUTOMATIC); Wire.requestFrom(1, 1); // LE PIDE DATOS AL ESCLAVO_1 POR EL CABLE while(Wire.available()) // ESPERA QUE HAYA DATOS ENVIADOS DESDE ESCLAVO_1 POR EL CABLE { dato = Wire.read(); // LEE LOS DATOS ENVIADOS DESDE ESCLAVO_1 POR EL CABLE, Y ALMACENA EN RDS_1 delay (5); } Input = dato; // Serial.println( Output); //Serial.println(dato); if (digitalRead(BOTON)== LOW) { myPID.Compute(); Serial.println(Output); analogWrite(SM_1,Output); analogWrite (SM_2,0); } else { analogWrite(SM_1,0); analogWrite (SM_2,0); myPID.SetMode(MANUAL); Output=0; Input = 0; double Kp=0.6, Ki=0.64, Kd=0.012; Serial.println(Output); } }
Post by MANUEL

Por favor, Conectar o Crear cuenta para unirse a la conversación.

Tiempo de carga de la página: 0.993 segundos