Expresate

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

Avisos
Vaciar todo

Controlar velocidad servos

8 Respuestas
5 Usuarios
0 Reactions
3,351 Visitas
ionthas
Respuestas: 153
Topic starter
(@ionthas)
Estimable Member
Registrado: hace 18 años

Buenas a todos.

Después de controlar los grados de los servos me toca controlar su velocidad.

BoOpS me dio la idea para hacerlo.

1 - Se tiene que calcular el incremento en ticks cada 20ms.
2 - Se tiene que incrementar o disminuir en funcion del angulo final.

El problema es que me dejo algo ya que aplicado a mi código no funciona.
¿Tengo que hacer algo mas aparte de lo descrito anteriormente?

(No puedo adjuntar el código en ese momento, después lo pondré)

Saludos y gracias.


Responder
7 respuestas
ionthas
Respuestas: 153
Topic starter
(@ionthas)
Estimable Member
Registrado: hace 18 años

Me lo he estado mirando y exactamente si le paso el valor 99 no responde, en cambio si le paso el valor 100 si lo hace.


Responder
dragonet80
Respuestas: 1328
(@dragonet80)
Ardero
Registrado: hace 18 años

Wolfskin, yo cambiaría el modo de controlar el servo y también revisaría los tiempos. Lo primero que necesitamos saber es que tiempos usan tus servos. No todos van igual, tienes que mirar las especificaciones del fabricante. Supongamos que tenemos un servo, que según fabricante, tiene de fondo de escala inferior (-90º) 0,5 ms y de fondo superior (+90º) 2,5 ms. Eso quiere decir que estará centrado (0º) con 1,5 ms.
* Para un cristal de 20MHz, tienes una velocidad de ejecución de instrucción de 20/4 = 5 MHz (0,2 us).
* Eliges el divisor. Dependiendo de los valores máximos, del periodo y de la resolución que quieras, podrás elegir uno u otro. Para la resolución el mejor siempre el 1. Para los valores mínimo y máximo en ON en este caso, el 1, 2, 4 y quizá el 8. Para contar los 20 ms de periodo, el 1 no te llega.
* Por tanto, o eliges el divisor 2 o haces lo de ir acumulando interrupciones. Si no es necesario prefiero hacerlo en una sola interrupción, cogería el divisor 2. Entonces tienes un tiempo de tick de 0,4 us.
* Calculas los valores de precarga mínimo:
--> [-90º] 500 / 0,4 = 1250 ciclos ; precarga = 65535 - 1250 = 64285
--> [0º] 1500 / 0,4 = 3750 ciclos ; precarga = 65535 - 3750 = 61785
--> [+90º] 2500 / 0,4 = 6250 ciclos ; precarga = 65535 - 6250 = 59285
--> [periodo] 20000 / 0,4 = 50000 ciclos ; precarga = ... = 15535
* Con esto tienes una resolución de:
--> 180º de movimiento con (6250-1250)=5000 de incremento
--> 180 / 5000 = 0,036 grados por unidad (seguramente mucho más de lo que dará físicamente el servo).

Ahora puedes plantearlo de diversas formas, una de ellas esta:
* Usamos una variable para el valor del tiempo del servo en ON. Será de tipo Integer sin signo (0 a 65535). Sus valor mínimo será 59285 y su valor máximo 64285. Usamos una variable para el flag de servo en on.
* Activas interrupciones, pones el flag en ON y empezamos por el primer desbordamiento. Esto se repite siempre:
--> Si el flag está en ON, Pones a ON el servo. Le metes la precarga correspondiente al Timer1. Pones a OFF el flag.
--> Si el flag está en OFF, pones a OFF el servo. Calculas la siguiente precarga: (20 ms - TONServo) = 15535 + (65535 - VariableServoON). Pones a ON el flag.
* Para modificar el ángulo del servos lo haces desde el programa principal (fuera de la interrupción). Incrementas o decrementas VariableServoON teniendo en cuenta los límites mínimo y máximo.

... quizá me esté enrollando demasiado 😳 Coge una tabla de cálculo y hazte todos los cálculos allí... Mira, mejor te mando la mía y la modificas... no está muy bonita ni explicada pero con un par de vueltas que le des creo que lo entenderás.


Responder
sphinx
Respuestas: 651
(@sphinx)
Ardero
Registrado: hace 18 años

[...]Si alguien ve algo raro que lo comente.
Wolfskin, he estado echando un vistazo a tu código, y aunque no me he metido 100% a analizarlo, si que veo alguna cosilla rara:

En la función void DisparoPulso(), tienes 3 if seguidos que pueden darte problemas.

Resulta que si la condición del primer if es verdadera y a la variable ticksActuals le sumas la variable incremento, a continuación la evaluación de cualquiera de los 2 siguientes if también podría resultar verdadera !! Y de ese modo volvieses a modificar el valor de ticksActuals dándole un valor que precisamente no es el que querías.

Creo que sería conveniente que desde ese if, dieses un salto para evitar los otros 2. O quizá que revisases la estructura de todos ellos, para salir de las evaluaciones tan pronto como hallas dado el valor correcto a la variable ticksActuals .

Puede que esta sea una de las causas de lo que comentabas aquí:Me lo he estado mirando y exactamente si le paso el valor 99 no responde, en cambio si le paso el valor 100 si lo hace.

Dime si te ha ayudado esta nota.

Un saludo.


Responder
Página 2 / 2
Compartir: