Autor Tema: Pid para robot movil  (Leído 1715 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Pid para robot movil
« 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);
« Última modificación: 26 de Marzo de 2011, 17:50:41 por Pchuqui_1 »

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Pid para robot movil
« Respuesta #1 en: 26 de Marzo de 2011, 22:07:23 »
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
El papel lo aguanta todo

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re: Pid para robot movil
« Respuesta #2 en: 27 de Marzo de 2011, 22:41:38 »
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.


 

anything