multiplexar numerosas tiras de WS2812

0

Por lo que entiendo, una tira de LED WS2812 usa PWM para ajustar el brillo (y por lo tanto el consumo de corriente) para un LED determinado. Si adjunto varias tiras en paralelo, cada una con su propio pin de datos de mi uC, ¿sería posible multiplexar las tiras de modo que cada tira esté encendida solo en un momento dado? Espero que al hacer esto, se reduzca el sorteo actual de toda la configuración.

Desde el siguiente hilo parece que la respuesta es no:

  

Debe comprender que la multiplexación y la PWM tienen el mismo efecto, desde el punto de vista de un solo led. Ambos reducen el% de tiempo que fluye la corriente. Por lo tanto la corriente media cae y el led es menos brillante. No hay magia que pueda mantener un led tan brillante mientras que la corriente promedio sea menor.

y

  

¿Te refieres a tener tiras separadas y mostrar el patrón en una tira a la vez, pero cambias la tira que se muestra rápidamente para que parezca que todas las tiras están encendidas?   Hay dos cosas mal con esto:

     

1) La velocidad de PWM en las tiras es lenta, por lo que no puede apagarlas tan rápidamente. Así que verás flicker en las tiras.

     

2) Las tiras siguen siendo más tenue y usan la misma cantidad de corriente en promedio como si solo hubieras reducido el brillo.

¿Podría alguien explicar esto con más detalle?

Como experimento mental, si tuviera varias tiras de un solo LED, si un LED solo está en realidad una fracción del tiempo (PWM), y si sincroniza las cosas correctamente para que cada tira esté "a tiempo" está desplazado solo un poco para que no se activen dos tiras al mismo tiempo, luego se debe reducir la corriente. ¿Qué me estoy perdiendo?

Editar

Quizás una de mis suposiciones es incorrecta. Cuando un LED está siendo PWM-ed, supongo que el dibujo actual a lo largo del tiempo parece idéntico a la onda PWM. Por lo tanto, me pregunto por qué no se pudo programar el sorteo actual de las otras tiras cuando las demás están bajas.

    
pregunta Constantino

2 respuestas

3

Te estás perdiendo el hecho de que WS2812 hace su propio PWM'ing. Una vez que haya cargado los datos en las tiras, cada controlador de LED WS2812 individual dirige su LED con PWM, de forma asíncrona a los otros LED de esa tira y a las otras tiras.

Tal vez podría escribir datos 'on' en una tira, luego escribir datos 'off' y escribir 'on' en la siguiente tira. Pero eso parece ser una forma difícil de obtener una versión parpadeante simplemente programando los LED a un brillo más bajo, lo que también reducirá el consumo actual de toda la configuración.

    
respondido por el Neil_UK
0

PWM no tiene nada que ver con esto. Solo déjalo a un lado por ahora. Cómo se atenúan los LED no importa. El brillo de cada LED se programa 30 veces por segundo cuando el método de atenuación del LED no es relevante para la programación.

Para esta discusión, digamos que tenemos un conjunto de 3 tiras de 10 LED y 1 tira de 30.

Lo que estás proponiendo es programar las 3 tiras individuales de 10 con tres clavijas en lugar de una tira de 30 con una clavija.

Puede hacer exactamente lo mismo con la tira de 30 LED conectada a un pin, como puede hacerlo con 3 tiras conectadas a tres.

Los LED se programan un cuadro a la vez.

Puede programar una tira de 30 LED 30 veces por segundo.

Y puedes programar las 3 tiras de 10 en paralelo 30 veces por segundo

Sea cual sea el modo en que lo corte, solo puede programar tiras 30 veces por envío, sin importar la cantidad de LED por tira O la cantidad de tiras.

Entonces, o bien tendrá un marco de 30 LED o tendrá 3 marcos de 10 LED. Todavía 30 cuadros por segundo.

Entonces, si almacenara sus valores de LED para la tira 1 de 30 en una matriz, tendría:

strip = {v0,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,v17,v18,v19,v20,v21,v22,v23,v24,v25,v26,v27,v28,v29};

Si almacenara sus valores de LED para las 3 tiras de 10 en una matriz tridimensional, tendría:

strip[0] = {v10,v11,v12,v13,v14,v15,v16,v17,v18,v19};
strip[1] = {v20,v21,v22,v23,v24,v25,v26,v27,v28,v29};
strip[2] = {v30,v31,v32,v33,v34,v35,v36,v37,v38,v39};

Se puede acceder a las matrices anteriores de la misma manera que a la matriz unidimensional a continuación.
{v10-v19, v20-v29, v30-v39}

strip = {v10,v11,v12,v13,v14,v15,v16,v17,v18,v19, v20,v21,v22,v23,v24,v25,v26,v27,v28,v29, v30,v31,v32,v33,v34,v35,v36,v37,v38,v39};

Agreguemos otra dimensión para la multiplexación.

strip[0,0] = {0,0,0,0,0,0,0,0,0,0};
strip[0,1] = {0,0,0,0,0,0,0,0,0,0};
strip[0,2] = {0,0,0,0,0,0,0,0,0,0};

strip[1,0] = {v10,v11,v12,v13,v14,v15,v16,v17,v18,v19};
strip[1,1] = {v20,v21,v22,v23,v24,v25,v26,v27,v28,v29};
strip[1,2] = {v30,v31,v32,v33,v34,v35,v36,v37,v38,v39};

mux[0] = {0,1,1};
mux[1] = {1,0,1};
mux[2] = {1,1,0};

while(true){
  for(multiplex=0;multiplex<3;multiplex++){
    for(frame=0;frame<3;frame++){
      xmit(strip[mux[multiplex],frame]);
    }
  }  
}

El código anterior está repitiendo los 3 cuadros debajo donde los primeros 10 LED están apagados en el cuadro 1, V20 a través de v29 están fuera del cuadro 2, y v30 a través de v30 están fuera del cuadro 3

{0,0,0,0,0,0,0,0,0,0,v20,v21,v22,v23,v24,v25,v26,v27,v28,v29,v30,v31,v32,v33,v34,v35,v36,v37,v38,v39}
{v10,v11,v12,v13,v14,v15,v16,v17,v18,v19,0,0,0,0,0,0,0,0,0,0,v30,v31,v32,v33,v34,v35,v36,v37,v38,v39}
{v10,v11,v12,v13,v14,v15,v16,v17,v18,v19,v20,v21,v22,v23,v24,v25,v26,v27,v28,v29,0,0,0,0,0,0,0,0,0,0}
    
respondido por el Misunderstood

Lea otras preguntas en las etiquetas