TODOPIC
Mecatrónica => Robótica => Mensaje iniciado por: Ercuito 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 todos
![Llorica Llorica]()
.
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
y otra la realidad
, 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.
-
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
-
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!!
-
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

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
-
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!!
-
hola ercuito contame como vas con tu programa, lograste que camine recto?
me gustaria saber mas de tu proyecto.
saludos
Osvaldo