Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Estoy trabajano en la controladora de servos de mi Bípedo. He decidido modificar el codigo que he estado utilizando para optimizarlo un poco, y he pensado que en vez de usar Delays iba a utilizar el Timer1 (que es de 16 bits) para crear la rutina de PWM de los servos. Pero es que por algun fallo que no encuentro, no funciona como deberia. El codigo de la funcion de Timer1 es este:
//Variables globales previamente declaradas
int timming = 1;
int Pos = 21;
int state = 0;
//funcion del timer1
#int_timer1
void tim1_func(void)
{
if(!timming)
{
on(Srv02);
on(Srv03);
//on(Srv04);
set_timer1(62536);//1.5 milisegundos hasta que salte de nuevo.
timming ++;
state = 0;
}
else
{
if(timming < 41) //41 es el numero de posiciones en que puedo
//fijar el servo, la resolucion.
{
set_timer1(65486);//2^16-(1/40ms)
timming ++;
state ++;
if(state == Pos)
{
//off(Srv02);
off(Srv03);
//off(Srv04);
}
}
else
{
set_timer1(30536);//hasta reiniciar el bucle, 17.5 ms
timming = 0;
off(Srv02);
}
}
}
El problema es que los servos siempre se van al final del recorrido....no se, seguramente sera un fallo tonto, pero no lo encuentro (es la primera vez que uso timers). En teoria el servo 3 deberia quedarse a mitad de recorrido y servo 2 llegar hasta el final, pero en cambio ambos llegan hasta el final. he probado ya bastantes cosas pero no encuentro el motivo.
technik, has probado a medir con el osciloscopio?
No tengo osciloscopio...teng entendido que hay alguna forma de usar el ordenador para eso, pero nunca lo he mirado.
De todas formas sospecho que el fallo puede no ser del codigo, quizas estos servos no funcionen en el rango que yo creia (1,5 - 2,5ms), y por eso falla. Lo comprobare dentro de un rato.
mis servos funcionan de 0,5 a 2,5 y tengo otros que van de 0,7 a 2,2... míratelo bien, otra cosa que puedes hacer es crear trazas, osea, como no estás seguro de si el protocolo te entra cuando debe entrar y cosas así, haz que cada vez que entre en el primer if, se encienda un led, y si entra en el segundo, se encienda otro... así vas descartando cosas. Ya si quieres mejorarlo, envía por puerto serie en cada if el estado en el que está el PIC (són sólo 2 byte, timming y state) para ver que está haciendo lo que debe... luego te quedaría por saber si la frecuencia que está generando el PIC es la acertada... eso es un pelín más difícil sin osciloscopio, pero puedes hacer lo siguiente. Crear una rutina que active el puerto serie 1 sólo segundo, y lo apague el resto del tiempo, así al redondeando deberá de llegar exactamente 50-60 "estados" no?nosé, juega con éste tipo de cosas... yo así lo suelo hacer y te saca de MUCHOS errores.
Espero q te ayude en algo.
PS: Si no tienes puerto serie configurado... ¿a qué esperas 😡 ? 😉 no ahora en serio, siempre lo puedes hacer con leds... pero a 50 Hz como que no te vas a enterar de mucho y sólo de una traza general...
En realidad de la frecuencia no tengo dudas, ya la he comprobado mas de una vez y por diferentes métodos. Y para el debug lo que yo hacia era encender varios servos al principio del bucle y luego ir apagando cada uno en un momento distinto: El primero al saltar el timer por primera vez a los 1,5 ms, otro en la posicion 3, otro en la 21 y otro en la 38, y por ultimo uno justo despues de esto, a los 2,5ms. Asi se todo lo que pasa en el bucle. Esto me dio la idea de probar en otro rango de trabajo al ver que los resultados eran que los servos no hacian el recorrido completo (de hecho se parecia mas a la segunda mitad del recorrido). Pero aun no he podido probarlo, ahora me pondre a ello. Luego os cuento