jueves, 12 de abril de 2012

It's all about timing: correcciones en la matriz RGB

Matriz.
Con la matriz, ya habíamos comentado el problema de interferencia entre filas aqui.

Tras examinar exhaustivamente los cronogramas producidos por el micro, el problema consistía en proceso de cambio de fila. Este, al principio, seguía el siguiente esquema:
  • Cambio de fila
  • Envío de datos de la nueva fila
  • Activado de señal BLANK para resetear salidas y de señal XLAT para escribir los nuevos datos.
  • Desactivado de XLAT y BLANK.
El problema residía en que, durante el tiempo que tarda en enviarse los datos de la fila i+1, los colores de la fila i se estaban pintando en la fila i+1 ya que se había cambiado la fila al principio.

La primera opción es modificar la rutina de interrupción para que sigua el siguiente esquema:
  • Activado señal BLANK
  • Envío de datos de la nueva fila
  • Activado de señal XLAT
  • Cambio de fila
  • Desactivado de señal XLAT y BLANK
Esto elimina los problemas de filas, pero nos ha llevado a ver un problema de temporización.
Cronograma, con errores de temporiz.
Para explicarlo claramente, es mejor examinar el cronograma de la imagen (pinchar para ampliar).
  • En él, tenemos la señal GSCLK, generada por el Timer2, de forma continua, a 8 Mhz y que se encarga de incrementar los contadores.
  • El timer 1 interrumpe cada 4096 ciclos de GSCLK y se encarga de activar las señales BLANK, XLAT y transmitir por SPI, además de cambiar de fila.
  • Las salidas del TLC5940 funcionan cuando la señal BLANK está a nivel bajo, y mientras no se hayan recibido más de 4096 ciclos de GSCLK tras la última bajada de BLANK.
El problema viene dado por el tiempo que BLANK está a nivel alto, ya que, si se cambia de fila cada 4096 ciclos de GSCLK, y BLANK está a nivel alto cierto tiempo, resulta en ciclos de GSCLK que no se realizan ya que no da tiempo entre los pulsos de BLANK, reduciendo la gama cromática, y no representando los colores adecuadamente.

La solución más básica es aumentar el número de ciclos de GSCLK que pasan entre cada interrupción para el cambio de fila, de forma que quepan 4096 ciclos (512 microsegundos) entre cada pulso de BLANK. Para realizarlo de forma aproximada, hemos medido dicho tiempo con el osciloscopio, y ajustado el valor del registro de captura del Timer (ICR1) para que coincida.
Esto, evidentemente, conlleva una perdida en la velocidad de refresco, quedandose en 200 Hz (en vez de los 244 Hz originales), ya que se necesitan 1120 ciclos más de GSCLK para que todo cuadre.


Tras esta corrección, la parte de control de la matriz podría haber quedado así, pero encontramos una solución mejor para optimizar el refresco.
El chip TLC5940 admite recibir datos durante un ciclo de PWM, y solo escribe los valores cuando llega la señal XLAT, luego, podemos transmitir los valores de la nueva fila mientras se está iluminando la anterior.
Resulta el siguiente esquema:
  • Activar señal BLANK 
  • Activar señal XLAT
  • Cambio de fila
  • Desactivado de BLANK y XLAT, la matriz empieza a iluminarse
  • Envio de los datos de la siguiente fila.
Con esta técnica, la duración del pulos de BLANK es mucho menor. Ajustando la temporización de la forma comentada anteriormente, sólo necesitamos 170 ciclos extra de GSCLK, y el refresco se queda en 235 Hz.

Con esto, creemos finalizado el diseño de la parte de la matriz RGB, aunque posteriormente se podría implementar la lectura de la flag de error XERR, dot correction o lectura del registro de estado, pero no son imprescindibles para el proyecto.
Cuando acabemos la temporización del micro, intentaremos comproblar con un analizador lógico que toda la temporización funciona de forma adecuada.

No hay comentarios:

Publicar un comentario