Algoritmo para simular PWM hasta 595's

3

Estoy tratando de obtener una especie de efecto pwm en una matriz led controlada por registros de desplazamiento. No necesito un control súper fino, por lo que solo tomo unos 16 niveles de brillo.

Para una matriz de 24 filas, yendo a una actualización de 100Hz, necesito manejar filas a 2400Hz. Para obtener 16 niveles de brillo distintos, necesito 16 veces ese número, ¿verdad? Eso significa 38.4kHz, que no debería estar fuera del alcance ni siquiera para un arduino o similar.

Todo esto tiene mucho sentido para mí, pero de lo que no estoy seguro es de la mejor manera de controlar los distintos niveles de brillo. Necesitaré un número de 4 bits distinto para cada bit de la matriz y un contador que realice un seguimiento de 16 ciclos.

Si estoy en el brillo 7/16, podría encenderlo durante los primeros 7 ciclos así:

11111110000000000

O podría intentar espaciarlo de alguna manera así:

10101010101010000

¿Habrá una diferencia visible entre estos dos enfoques? Me inclino ahora hacia el primero para facilitar la implementación, pero si el segundo (o alguna variación en él) tiene un buen algoritmo para diferentes valores, entonces valdría la pena analizarlo. ¿Incluso importa? ¿Hay una mejor manera de lograr este tipo de cosas? He analizado las matrices de led ic, pero son caras y difíciles de integrar con mi matriz de 2 colores. Los 595 son baratos y simples.

    
pregunta captncraig

2 respuestas

1
  

Me inclino ahora hacia el primero para facilitar la implementación, pero si el segundo (o alguna variación en él) tiene un buen algoritmo para diferentes valores, entonces vale la pena analizarlo.

Hay, y es bastante simple.

Dado un ciclo de trabajo como una fracción racional p / q entre 0 y 1, haga lo siguiente (pseudo-código en Javascript)

var state = 0;
// q should be a positive constant, but vary p between 0 and q
function pseudopwm(p,q)
{
   state += p;
   if (state < q)
      return 0;
   state -= q;
   return 1;
}

Más información en una entrada de blog que escribí .

  

Para obtener 16 niveles de brillo distintos, necesito 16 veces ese número, ¿no?

Tipo de. La percepción humana del brillo es casi logarítmica, por lo que la diferencia percibida entre el ciclo de trabajo de 0 y 1/16 es enorme, mientras que la diferencia percibida entre el ciclo de trabajo de 15/16 y 16/16 es muy pequeña.

    
respondido por el Jason S
0

Si desea obtener dieciséis niveles de brillo lineal, y si su frecuencia de PWM es lo suficientemente alta o no necesita cambiar los niveles de brillo de las luces con demasiada frecuencia, solo puede enviar cuatro actualizaciones por fotograma. El truco es enviar un cuadro de datos que se enviará a 8/15 de un "intervalo PWM", un cuadro que se emitirá a 4/15, un cuadro que se emitirá a 2/15 y otro que se emitirá salida para 1/15.

Si sería difícil enviar dos cuadros de datos separados por solo 1/15 de un intervalo PWM, se podría usar la señal de control de habilitación de salida para acortar el tiempo que se envía el cuadro 'corto'. En una versión algo extrema de tal escenario, uno podría enviar una trama para 8/32 de un intervalo PWM con la salida habilitada todo el tiempo, una trama forma 8/32 de un intervalo PWM con la salida habilitada para la mitad de eso (es decir, 4/32 de todo el intervalo), una trama para 8/32 con la salida habilitada durante un trimestre (2/32) y una para 8/32 con la salida habilitada para un octavo (1/32). Esto significaría que incluso con el brillo máximo, la salida solo estaría en aproximadamente la mitad del tiempo, pero la tasa de desplazamiento de la salida sería uniforme. Probablemente, uno no querría llevar las cosas tan lejos en la dirección de una tasa de cuadros uniforme, pero podría formular fácilmente otros patrones que cambiarían la tasa de desplazamiento máxima para el ciclo de trabajo máximo.

Otra alternativa sería usar cuatro conjuntos de 74HC595, y hacer arreglos para que alguna lógica haga salir uno de ellos la mitad del tiempo, uno de ellos una cuarta parte del tiempo (mientras que el primero estaba inactivo), uno de salida un octavo de la época (mientras que las dos primeras estaban inactivas), y una decimosexta (mientras que las tres anteriores estaban inactivas).

En cualquiera de estos métodos, es importante tener en cuenta que actualizar la configuración de brillo de un LED puede ocasionar que sea momentáneamente un poco más brillante o más tenue de lo que debería, especialmente entre configuraciones consecutivas en las que muchos bits cambian (por ejemplo, de 7 a 7). -0111 a 8--1000). Este efecto se puede minimizar dividiendo el intervalo de tiempo asociado con los bits más significativos en múltiples partes más pequeñas, pero dicha división se puede realizar más fácilmente en hardware que en software. Sin embargo, si uno no puede permitirse una solución de "hardware puro", puede utilizar una solución híbrida (por ejemplo, dos 595 por bit; uno se carga una vez por 'marco' con el MSB del brillo, mientras que el otro obtiene Cargado varias veces por cuadro, con los otros bits). El uso de dos 595 reduciría a la mitad la velocidad de actualización de datos requerida; el uso de tres 595 reduciría la tasa de actualización en un factor de cuatro. El uso de cuatro 595 para 16 niveles de brillo reduciría la tasa de actualización requerida a cero (ya que el hardware podría mantener el "pwm" automáticamente).

    
respondido por el supercat

Lea otras preguntas en las etiquetas