fbpx

Expresate

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

Controlar servo de ...
 
Avisos
Vaciar todo

Controlar servo de un angulo a otro

6 Respuestas
3 Usuarios
0 Reactions
2,735 Visitas
plapu
Respuestas: 80
Topic starter
(@plapu)
Trusted Member
Registrado: hace 16 años

Hola estoy haciendo un pequeño proyecto y necesito controlar unos servos...he aconseguido poner el servo en una posicion determinada pero no puedo mover de un angulo a otro (es decir pasar de 30º a 180º por ejemplo).

El codigo que uso para ir a una posicion determinada es este:

#include <16f690.h>
#fuses XT,NOWDT
#use delay (clock=4000000)
#use standard_io(B)

//*************************************************Función para mover a una posicion fija*************************************************************************
void posicio_fixa(int16 x)
{
int16 alto,bajo;

alto=x*100;
bajo=20000-alto; // 20000us=20ms

output_high(PIN_A0);
delay_us(alto);
output_low(PIN_A0);
delay_us(bajo);

}

void main()
{
setup_oscillator(OSC_4MHZ);

while(true)
{
posicio_fixa(10); //Aprox 30º
delay_ms(50);
posicio_fixa(24); //Aprox 180º
delay_ms(50);
}
}

Responder
5 respuestas
victorblue
Respuestas: 64
(@victorblue)
Trusted Member
Registrado: hace 15 años

while(true)
{
posicio_fixa(10); //Aprox 30º
delay_ms(50);
posicio_fixa(24); //Aprox 180º
delay_ms(50);
}

En mi humilde experiencia, creo que te estan pasando una o mas de estas cosas:

-Tengo entendido que la funcion de control ha de ser periódica (20ms). En tu caso la función se ejecuta por 20ms pero despues se queda 50ms en estado low, es decir, que tu "periodo" es de 70ms.

- Lo mismo necesitas varios "ciclos" de posicio_fixa(10) para dar tiempo al servo a posicionarse, pues no es instantáneo.

Prueba lo siguiente:
while(1)
{
posicio_fixa(10);
posicio_fixa(10);
posicio_fixa(10);
posicio_fixa(10);
posicio_fixa(10);

posicio_fixa(24);
posicio_fixa(24);
posicio_fixa(24);
posicio_fixa(24);
posicio_fixa(24);
posicio_fixa(24);
}

Cuando veas que funciona sin problemas, y que se mantiene en posición 30º demasiado tiempo, quita items de poxicio_fixa(..).

Responder
boops
Respuestas: 1813
(@boops)
Ardero
Registrado: hace 19 años

siempre puedes usar un for para repetir tantas veces como creas oportuno 😀

Responder
victorblue
Respuestas: 64
(@victorblue)
Trusted Member
Registrado: hace 15 años

Sí, la verdad es que lo suyo es que se pongan bucles dentro del while, pues controlas de forma más fácil las iteraciones; de hecho en el ejemplo que te he puesto creo que tendrías repetir unas 50 veces la llamada a la función para que esté durante 1 segundo;

No lo puse para no liarlo, por si no tiene mucha destreza con los bucles anidados.

No creo que sea necesario, pero en teoría habría que considerar los ciclos que consume el pic en comprobar la condicion e incrementar los contadores, pero bueno, eso ya es ser un poquillo tikismikis; dudo que el circuito del servo sea tan "exquisito" . 😛 😛

Responder
plapu
Respuestas: 80
Topic starter
(@plapu)
Trusted Member
Registrado: hace 16 años

Gracias! He hecho los bucles que me habeis dicho de 100 iteraciones y funciona perfectamente. Dejo el codigo para si alguien esta como yo:

void main()
{
int i=0;
setup_oscillator(OSC_4MHZ);

while(true)
{
while(i<100)
{
posicio_fixa(10);
i=i+1;
}
i=0;

while(i<100)
{
posicio_fixa(22);
i=i+1;
}

i=0;

}
}

Responder
Página 1 / 2
Compartir: