TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Pchuqui_1 en 26 de Marzo de 2011, 17:36:36
-
Hola a todos. Les cuento que estoy desarrollando un control para estabilizar a un robot móvil con un compas magnético. La idea es ingresar un ángulo (set_point) y que el robot gire y se estabilice en el ángulo deseado. Bueno el desarrollo de la teoría de control ya lo he realizado y he obtenido buenos resultados. El problema se me presentó cuando desarrolle la ecuación del PID (uk = b0ek + b1ek−1 + b2ek−2 + uk−1, obtenida con el método de las derivadas). La cuestión es que no comprendo cómo procesar esos valores para que el motor reaccione en cuestión. Si le aplico la salida directamente al pwm, el valor de uk rebasará muy rápidamente el valor maximo del DUTY para el pwm. Bueno abajo le muestro la parte del código que resuelve el PID, y lo poco que pude hacer hasta ahora. El robot busca el ángulo, pero nunca se estaciona. :lol:
Muchas gracias.
PID:
uk=0;
uk_1=0;
ek=0;
ek_1=0;
ek_1_1=0;
ek_2=0;
ek_1_2=0;
set_point = 90; //Leemos el valor del teclado SET POINT
// c = 0; borramos c para comenzar PID desde 0.
do{
nuevo_pid:
Interpolacion(); // obtengo señal de salidan u_k
//printf ("Angulo= %3.0g\n\r", angulo); //Calculo error e_k
ek = set_point - angulo; //obtengo error actual
if(c == 0){
uk = b_0 * ek;
ek_1 = ek;
uk_1 = uk;
}
if(c == 1){
uk = b_0 * ek + b_1 * ek_1 + uk_1;
ek_2 = ek_1;
uk_1 = uk;
ek_1 = ek;
}
if(c == 2){
uk = b_0 * ek + b_1 * ek_1 + b_2 * ek_2 + uk_1;
ek_2 = ek_1;
ek_1 = ek;
uk_1 = uk;
c=2;
}
if(c <=1){
c= c + 1; //Variable de incremento del set point
}
//printf ("Uk= %3.0g\n\r", uk);
if(uk < 0x00){
izquierda_pid_MC33931();
set_pwm2_duty(uk);
}
else{
derecha_pid_MC33931();
set_pwm1_duty(uk);
}
delay_ms(100);
}while (1);
-
Hola.
El problema es con la ganancia del actuador, es muy limitada en tu caso. Lo mejor es disminuir la pendiente del mismo para aumentar el rango de acción del actuador.
Saludos
-
Hola. Con la ganacia del actuador te referis al compas? Yo creo, por las pruebas que realize, que el valor de uk empieza a oscilar. voy a ver como realizo una rutina para el overshoot.