Estoy utilizando un Atmel ATtiny13 que tiene un 6-pin I/O. me gustaría control sobre 15 LEDs, pero estoy seguro de cómo conectar todo. Sin multiplexación de cualquier tipo, parece que sería capaz de controlar 6 LEDs a la vez. Estoy limitado a sólo 6 LEDs debido al tamaño de la microcontrolador?
Respuestas
¿Demasiados anuncios?Hay varios métodos que puede utilizar para un gran número de LEDs de un par de pines.
La más sencilla es la norma de fila/columna de la pantalla de multiplexación. Con esta técnica, usted puede conducir \$( n / 2 )^2\$ LEDs con \$n\$ IO pines. Matemáticamente, el ciclo de trabajo es:
$$\frac{1}{minimum(\text{unique row patterns, unique column patterns})}$$
Esto significa que esta técnica tiene un ciclo de trabajo del 100% cuando todos los LEDs están encendidos (o todas las filas o todas las columnas son idénticas) y un ciclo de trabajo de \$1 / n\$ cuando una línea diagonal necesita ser iluminado (o todas las filas son diferentes). Sólo está garantizada 100% ciclo de trabajo cuando la iluminación LED o un LED (o cero LEDs, pero que en realidad no cuenta para mucho).
Un poco más complejo es Charlieplexing. Con esta técnica, usted puede conducir \$n^2 - n\$ LEDs con \$n\$ IO pines. Sólo \$n - 1\$ LEDs pueden ser encendidos simultáneamente con esta técnica. Matemáticamente, el ciclo de trabajo es:
$$\frac{1}{\text{minimum simultaneous sets}}$$
donde simultánea de un conjunto es un grupo único de LEDs que tiene un ánodo común o cátodo común. (Esto no ha sido demostrado, es justo lo que he llegado después de reflexionar sobre el problema durante un minuto. Si el ciclo de trabajo es importante para usted, usted querrá buscar en esto más adelante.) Esta es mucho más compleja de cálculo, tanto en el plano intelectual y computacionalmente que el equivalente de cálculo estándar para la multiplexación. Efectivamente, se obtiene un ciclo de trabajo de \$1 / n\$ cuando todos los Led se encienden, pero algunos (sólo algunos) de los modelos de n-1 o menos LEDs pueden tener un ciclo de trabajo del 100%. Sólo está garantizada 100% ciclo de trabajo cuando la iluminación de 1 LED.
El último método que voy a mencionar es el uso de un registro de desplazamiento o IO expansor. Con dos pines (el raw de datos/interfaz del reloj, I2C, o unidireccional SPI), puede controlar un número arbitrariamente grande de LEDs. El ciclo de trabajo para cualquier patrón es del 100%, pero la tasa de actualización es inversamente proporcional a la cantidad de LEDs. Esta es la más costosa. Para el 15 de LEDs, seguramente será más barato para actualizar a un micro con que muchos de los pines.
El uso de Charlieplexing puede conducir directamente a la \$n \times (n-1)\$ LEDs de \$n\$ pins.
Ejemplo:
Seis LED de 3 Pines:
PINS LEDS
0 1 2 1 2 3 4 5 6
0 0 0 0 0 0 0 0 0
0 1 Z 1 0 0 0 0 0
1 0 Z 0 1 0 0 0 0
Z 0 1 0 0 1 0 0 0
Z 1 0 0 0 0 1 0 0
0 Z 1 0 0 0 0 1 0
1 Z 0 0 0 0 0 0 1
0 0 1 0 0 1 0 1 0
0 1 0 1 0 0 1 0 0
0 1 1 1 0 0 0 1 0
1 0 0 0 1 0 0 0 1
1 0 1 0 1 1 0 0 0
1 1 0 0 0 0 1 0 1
1 1 1 0 0 0 0 0 0
Como @mjh2007 sugirió con I2C expansor. Pero no son específicamente para la conducción de LEDs que va a evitar la necesidad de corriente externa resistencias limitadoras.
He aquí un ejemplo de charlieplexing que he construido.
Es un faro de haz de simulador y utiliza una serie de 12 LEDs charlieplexed a 4 GPIOs para el barrido de un haz de luz alrededor de un disco. Hay un video de ella aquí.
El proyecto está basado en PIC, yo uso un PIC12f683 que es también una de 8 pines y podría considerarse comparable a la de 8 pines AVRs.
El LED de intensidad es impulsado por un interupt que proporciona un paso 32 PWM en alrededor de 60 hz. Sólo dos LEDs están permitidos para ser encendido en cualquier momento dando un trabajo del 50% para cada uno de los LED, ya que era todo lo que necesitaba. También le da un buen trato de PWM frecuencia de actualización en contra de la resolución.
La codificación para el uso de charlieplexing como en realidad bastante simple, si nos atenemos a la "clásica" método de iluminación sólo un único LED en cualquier punto en el tiempo en un muy rápida velocidad de actualización. Yo trabajo en el PUERTO y TRIS (pic registros específicos) en primer lugar sobre el papel, a continuación, guardar los resultados en una matriz estática. A la luz LED x la PIC sólo tiene que buscar el valor en la matriz de índice[x] y escribir directamente en el PUERTO (con un poco de enmascaramiento para preservar el estado de los otros pines no utilizados en el charliplex)
Mi proyecto sólo tiene 12 LED no 15 o el máximo de 20 el 5 GPIO permitirá como yo quería mantener una GPIO de repuesto para el desarrollo futuro.
De todos modos... yo sólo pensé que podría ser útil para tener un ejemplo de trabajo similares a los de su solicitud.
Código fuente completo y esquemas están disponibles en mi blog.