Seguimos:
La idea en el programa es utilizar 48 MHz para Fosc, ya que la comunicación será vía USB. A 48 MHz de Fosc, el tiempo por instrucción es de 83,33 nanosegundos. La cosa es, como he visto en algún programa de gestión de servos, generar una interrupción por timer cada 5 milisegundos. Así, tendremos los 20ms de período de señal de control divididos en 4 partes. Esto nos permitirá gestionar los cuatro servos en paralelo, ya que los tiempos en alto estarán desfasados 5ms entre sí, con lo que las señales serán siempre independientes. No es que sea necesario, pero me gusta la solución.
Las señales quedarían:
_____ _____
____| |_______________| |______________________ Linea A
_____ _____
____________| |_______________| |______________ Linea B
_____ _____
___________________| |_______________| |_______ Linea C
_____ _____
__________________________| |_______________| | Linea D
t
on nunca será 5ms (el máximo será 2,5 ms) con lo que me quedarán, tras terminar t
on, 2,5 ms mínimo para realizar las tareas que tenga pendientes. Tengo que revisar el tema USB dado que si no recuerdo mal, las especificaciones mencionaban que ha de atenderse a la tarea USB cada ms, al menos al inicializar. Imagino que despues podrá atenderse cada 5ms, si no, pues la interrupción USB será de baja prioridad, los timers de alta, y todo lo que no sea fundamental se hará en un estado del programa principal al final de los 4 ciclos (Antes de actualizar los valores del t
on...
Para los timers, funcionando a la citada frecuencia de 48MHz:
--> 5 milisegundos = 60000 ciclos ==> 60k * 0,000083333 ms = 4,99998 ms
--> 0'5 milisegundos = 6000 ciclos ==> 6k * 0,000083333 ms = 0,499998 ms
--> 0,45 milisegundos = 5400 ciclos ==> 5400 * 0,083333 us = 0,4499982 ms
Ergo en principio T --> timer fijo a 60k ciclos, por 4 pasos
t
on --> timer variable de 5400 a 29400 pasos [0,45 ms a 2,45 ms], esto es, 5400 + pos, con pos [0 ... 24000]. Nos quedaría: 24000 / 180 = 133'33 --> 133 pasos por grado, aprox... Lo que en tiempo queda: 2 ms / 180 = 11,1 us.
Con esto, ambos timers necesitarán ser de 16 bits. Esto no supone un problema en el pic 18F2550, con lo cual tengo bastante claro el tema, ahora solo faltan el tiempo y las ganas de escribir el programa
. A ver si una noche de estas me pongo... que escaquearse del trabajo está muy mal...
Una cuestión para los más experimentados: ¿vale la pena "pensar en grados" a la hora de situar los motores en determinada posición, o es más sencillo limitarse a un valor determinado de pasos (en función de la precisión que deseemos) y utilizarlo pensando en él como en un motor PAP?
Es que, dado que el timer que controla el tiempo a alto me variará del mínimo al máximo en 24000 cuentas, lo primero que me vino a la mente fue limitarme a "fabricar" 200 "pasos" de 120 cuentas, esto es de 10 us aproximadamente. Más sencillo, más preciso (200 en lugar de 180 posiciones) y supongo que después, visualmente, será dificil apreciar si el brazo está exactamente a 75º o a 75.6º (84 pasos de 10us
) además de que, probablemente, el servo carece de esa precisión...
Vaya, resumiendo, que si esto es como el ADC: que por mucho que te ofrezcan 10 bits en la conversión, en un caso "normal" el ruido te dejará únicamente con 7 u 8 bits significativos... ¿Opiniones al respecto?