Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Control de Servos c...
 
Avisos
Vaciar todo

Control de Servos con timer1

7 Respuestas
3 Usuarios
0 Reactions
31.7 K Visitas
technik
Respuestas: 287
Topic starter
(@technik)
Reputable Member
Registrado: hace 18 años

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.

Responder
6 respuestas
boops
Respuestas: 1813
(@boops)
Ardero
Registrado: hace 20 años

technik, En primer lugar probaria a realizar esa secuencia a base de delays:

low
20ms
high los dos
1500us
low el que se queda enmedio
1m
low el que va al tope.

Responder
technik
Respuestas: 287
Topic starter
(@technik)
Reputable Member
Registrado: hace 18 años

He probado hace un momento lo siguiente:
servo1->0,5ms
servo2->1,0ms
servo3->1,5ms
servo4->2,0ms
servo5->2,5ms
y parece hacer lo siguiente, 4 y 5 no funcionan, como si no los activale. 1 y dos se van casi al final del recorrido, sin diferencia aparente entre ambos, y 3 parece irse al mismo angulo que 1 y 2, ofrece resistencia a moverse hacia atras, pero puedo moverlo libremente entre su angulo y el final del recorrido. Esto me desconcierta un poco, la verdad.
Lo curioso es que cuando trabajaba antes, lo hacia entre 1,5 y 2,5 ms que es curiosamente lo que ahora no hace nada... 😕

Responder
Página 2 / 2
Compartir: