Lo bueno de los Atmega en este tipo de problema es que tienen memoria lineal y sus punteros son muy efectivos. Son más rápidos que los PIC en esta tarea.
Creo que la mejor forma de separar la parte del programa difícil y crítica en el tiempo, del resto de gestiones es por interrupciones y utilizando una
"memoria de vídeo".
Por ejemplo se me ocurre este para montar yo:
Especificaciones del POV:Motor de 1500 rpm (25 rps)
192 puntos por vuelta
Frecuencia de muestreo 192 * 25 = 4800 Hz
40 puntos por fila
40 * 196 = 7680 bits por imagen (960 bytes)
Separación entre leds de 3mm. Radio total del POV = 3mm * 40 led = 120mm
Control con Atmega328P (2kbytes ram)
Rutina de interrupciones:1.- Se configura un timer para que llame a las interrupciones 28800 veces por segundo (34.7us) (28800 = 6 * 25 * 192)
2.- En cada interrupción se envía un dato por SPI y se apunta al siguiente byte de la "memoria de video"
Como pasa suficiente tiempo entre una llamada y otra, no hace falta comprobar que el dato ha sido enviado por el SPI (ahorra tiempo)
3.- Después de enviar 5 bytes (40 leds) se envía una señal para actualizar los latch en la sexta interrupción.
4.- Los datos se toman de la memoria ram de forma consecutiva. Una vez llegado al final de la memoria de video, se vuelve a comenzar otra vez.
Frecuencia SPI = 500khz
Tiempo de ciclo SPI = 2us
Tiempo para enviar un byte = 16us, que es menor de 34.7us de la interrupción
Tiempo estimado de tratamiento de la interrupción < 4us (12% del tiempo total)
Rutina de usuario:Para el usuario, el proceso de enviar la imagen a los leds es completamente transparente. Son las interrupciones las que se encargan de realizarlo.
El tiempo restante que queda para el usuario, puede utilizarlo para modificar las imágenes sobre la memoria.
Como esto es difícil, se utiliza una librería de dibujo que permita dibujar líneas rectas, puntos, círculos o bitmaps pequeños.
Los alumnos/usuarios sólo se preocupan de llamar a la librería de dibujo para trazar sus dibujos en coordenadas rectangulares.
Librería de dibujo:Como el 88% del tiempo está disponible para el usuario, el microcontrolador puede fabricar sus propias imágenes con alguna librería de dibujo, adaptando alguna de las existentes para Arduino.
El mayor problema consiste en traducir las posiciones cartesianas (x, y) en coordenadas polares (módulo y ángulo)
La librería se maneja todo el tiempo en coordenadas rectangulares, hasta el momento de escribir en memoria.
El mayor problema, traducir coordenadas rectangulares a polares, se soluciona con las fórmulas:
x = posición horizontal del punto a visualizar (en unidades de 3 milímetros)
y = posición vertical del punto a visualizar (en unidades de 3 milímetros)
Led (bit) = sqrt(x*x + y*y)
Angulo = atan(y/x)
Se puede acelerar mucho, pero con coma flotante de 24 bits puede ser suficientemente rápido para representar letras, líneas, puntos, círculos, etc. en tiempo real
Como hay suficiente memoria, también se puede construir una imagen en la memoria libre y luego volcar rápidamente esa imagen a la zona de "memoria de video".
Librería gráfica de Adafruit (hay que adaptarla):
https://learn.adafruit.com/adafruit-gfx-graphics-library/overviewSaludos.