Autor Tema: Control trayectoria de motores dc pwm  (Leído 3789 veces)

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

Desconectado Ercuito

  • PIC10
  • *
  • Mensajes: 5
Control trayectoria de motores dc pwm
« en: 08 de Abril de 2005, 15:49:00 »
Buenas a todos, lo primero decir q este foro esta de p mare ya que gracias a el he podido solucionar muchos problemas, pero no todosLloricaLlorica.
Os explico, estoy realizando un robot diferencial (creo q se dice asi jeje) a cada motor dc le entra una señal de pwm; como sabeis todos una cosa es simular Giño y otra la realidad Llorando, asi q mi problema es q debido a factores externos el robot no me va recto, por lo tento estoy intentando realizar un control pi para la trayectoria.
Aqui os pongo el control con ecuaciones diferenciales:
          error(k)=w2(k)-w1(k)
          y(k)=y(k-1)+K*T*error(k)
          d1(k)=dutty(k)+y(k)
          d2(k)=dutty(k) (o en el caso de hacerlo simetrico:d2(k)=dutty(k)-y(k))
w2 y w1 son las entradas de los encoders conectados a las ruedas y dutty es el valor del dutty cargado en los pwm.
Para hacer esto he pensao utilizar los contadores del timer 0 y del timer 1 para poder saber cuantos pulsos tendre durante cierto tiempo.
Aqui os pongo el programa del control:

#include <16f876.h>
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)
#byte port_a = 5   // Identificador asociado al registro de dirección 5
#byte port_b = 6   // Identificador asociado al registro de dirección 6
#byte port_c = 7   // Identificador asociado al registro de dirección 6



void main(void){

   int e1,e2,x;
   long duty_PWM1,duty_PWM2,b;
   signed long y,e;
   set_tris_a(0x3F);
   setup_timer_1(T1_external);
   setup_timer_2(T2_DIV_BY_16, 249, 1);//pwm f=250Hz
   setup_ccp1 (CCP_PWM);
   setup_ccp2 (CCP_PWM);
   set_timer0(0);
   set_timer1(0);
   port_b=0x00;
   y=e=0;
   while(1)
   {
   x = port_a&0b00001111; //el dutty va de 0%a100% de 10% en 10%
   b = x;    
   if(x>10)
   {
       b=0;
   }
   duty_PWM1 = 100 * b;//para un dutty del 10% necesito cargar 100
   duty_PWM2 = 100 * b;
   while((x)==(port_a&0b00001111))//mientras no haya cambios del puertoA
   {
   set_pwm1_duty(duty_PWM1);
   set_pwm2_duty(duty_PWM2);
   if(input(PIN_A5)){
   //set_timer0(0);
   //set_timer1(0);
   delay_ms(2000);      //tiempo de adquisicion de datos de los encoders
   e1=get_timer0();
   e2=get_timer1();
   e=e2-e1;
   y=y+(0.1*e);//aqui tengo dudas si debo de poner T=1/4000000
   duty_PWM1=duty_PWM1+y;
   }
   }
   }
}
Este programa simplemente quiero ver si funciona el control pero no se pq al simlularlo el contador del timer1 tiene valores si yo no he metido pulsos, es como si actuaso como temporizador o algo. Podemos observar como en el caso en que la rueda2(e2) gire mas rapido q la rueda1(e1) tendre un error positivo por lo tanto el dutty del motor 1(pwm1) aumentara.
Otra duda es si los tipos de variables estan bien declaradas, y tambien en la formula de y=y+K*T*e debo poner T ya q si la pongo necesito q el error sea bastante grande para que la y me cambie modificando el dutty.
Haber si me podeis echar una mano y asi pongo el programa completo del control tanto de velocidad como de sentido con su control de trayectoria.
Muchas gracias.

Desconectado Ercuito

  • PIC10
  • *
  • Mensajes: 5
RE: Control trayectoria de motores dc pwm
« Respuesta #1 en: 10 de Abril de 2005, 10:59:00 »
Bueno, haciendo prubas me he dado cuenta q si no utilizo los dos pwm no tengo problemas a la hora de contar pulsos con el timer 1 , esto quiere decir q no puedo utilizar los dos pwm y tb dos contadores????????? si es asi alguien tiene alguna idea para poder hacer lo antes comentado.
Muchas gracias

Desconectado cucaracha

  • PIC24H
  • ******
  • Mensajes: 1409
    • CUCAWEB
RE: Control trayectoria de motores dc pwm
« Respuesta #2 en: 10 de Abril de 2005, 17:33:00 »
Una cosilla... No te falta la configuración del timer0??
En esa porción de código no lo veo. Sólo veo para el T1 y T2.
No se si sólo copiastes parte del código y olvidastes pegar eso o si lo olvidastes incluir en el codigo... Ojalá sea lo segundo, no??jeje Tendría fácil solución tu problema.


Saludos y suerte!!
Saludos desde Huelva (ESPAÑA)

Desconectado Ercuito

  • PIC10
  • *
  • Mensajes: 5
RE: Control trayectoria de motores dc pwm
« Respuesta #3 en: 10 de Abril de 2005, 19:50:00 »
Cucaracha gracias por contestar, he corregido lo que me has comentado (aunq sin poner el setup_counter el contador0 si q me cuenta) pero el problema lo tengo en el contador 1, q el mu chalao al simularlo en el proteus cuando abro las variables me ponen unos valores q me gustaria saber de donde salen Fumador
Lo que he echo ahora es hacer una cuenta con el timer 0 y otra con la interrupcion externa de rb0, y si q me cuenta bien; lo que pasa es q no se si es una buena idea por si el contador exo con la interrupcion me va a contar exactamente el mismo tiempo q el de el timer0. Aqui os pongo el programita:

#include <16f876.h>
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)
#byte port_a = 5   // Identificador asociado al registro de dirección 5
#byte port_b = 6   // Identificador asociado al registro de dirección 6
#byte port_c = 7   // Identificador asociado al registro de dirección 6

signed long e2;

#int_ext
void interrupt(void)

{
e2++;
}

void main(void){

   int x;
    signed long y,e,e1,duty_PWM1,duty_PWM2,b;


   set_tris_a(0x3F);
   set_tris_b(0x01);
   setup_timer_2(T2_DIV_BY_16, 249, 1);
   setup_ccp1 (CCP_PWM);
   setup_ccp2 (CCP_PWM);
   setup_counters(rtcc_ext_h_to_l,rtcc_div_1);
   //setup_timer_1(T1_EXTERNAL);
   set_timer0(0);
   //set_timer1(0);
   port_b=0x01;
   y=e=0;
   while(1)
   {
   x = port_a&0b00001111;
   b = x;

   if(x>10)
   {
       b=0;
   }

   duty_PWM1 = 100 * b;
   duty_PWM2 = 100 * b;
   while((x)==(port_a&0b00001111))
   {
   set_pwm1_duty(duty_PWM1);
   set_pwm2_duty(duty_PWM2);
   if(input(PIN_A5)){ //Para poder seleccionar si quiero o no control
   
   
   e2=0;
   enable_interrupts(int_ext);
   set_timer0(0);
   enable_interrupts(global);
   delay_ms(1000);      //adquiere valores durante 1 segundo
   e1=get_timer0();
   disable_interrupts(int_ext);//aqui dejo de contar los impulsos
   
   e=e2-e1;
   //y=y+(0.1*e);
   duty_PWM1=duty_PWM1+e;
   }
   }
   }
}

Bueno esto es lo que he exo, aunq para la simulacion he quitao las lineas del set_timer0(0) y e2=0 para poder ver si los pulsos q introduzco con un pulsador los cuentan ambos contadores antes de q me los vuelva a resetear para una nueva cuenta.
au

Desconectado cucaracha

  • PIC24H
  • ******
  • Mensajes: 1409
    • CUCAWEB
RE: Control trayectoria de motores dc pwm
« Respuesta #4 en: 10 de Abril de 2005, 21:22:00 »
Aaaaa, bueno... Que donde dices no te funciona es en Proteus.
Nada.. ya lo irás conociendo, jejeje.
Monta el circuito en protoboard y pueba físicamente.
El Proteus aun deja mucho que desear...
Si tienes un ICD te ayudará mucho... Debug real, y en tiempo real!! no como el proteus. El ICD1, puedes usarlo en el CCS. Por internet hay varios clones del aparatito este...

Saludos!!
Saludos desde Huelva (ESPAÑA)

Desconectado valdorre

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 348
RE: Control trayectoria de motores dc pwm
« Respuesta #5 en: 05 de Mayo de 2005, 22:37:00 »
hola ercuito contame como vas con tu programa, lograste que camine recto?
me gustaria saber mas de tu proyecto.
saludos

Osvaldo
Osvaldo


 

anything