3 canales 10 + bit PWM

1

Estoy construyendo un controlador para tira de LED RGB (tira de RGB LED de 12V 5m 5050 LED con ánodo común). Mi solución actual utiliza Arduino Uno con 3x MOSFET IRFZ44N para alimentar la tira. La solución está parcialmente inspirada en este sitio .

El problema es la resolución PWM donde 256 niveles no son suficientes para tener un "color verdadero" suave, especialmente para un brillo más bajo, porque la percepción de la luz del ojo es exponencial. Hay una manera de ajustar los niveles para que el brillo sea lineal , pero los cambios con poca intensidad de luz todavía estar "nervioso".

Por lo que he leído, es posible usar Timer1 para producir 10bit PWM en dos pines. Lamentablemente me falta la solución para el tercer pin.

He leído algunos artículos sobre TLC5940 pero no he encontrado una buena solución para la corriente tan alta que necesito.

¿Existe alguna solución relativamente simple para que Arduino (o AVR) controle PWM de 10 bits (o mejor 12 bits), por lo que podría usarlo como entrada al transistor MOSFET para usar con 12 V y corriente > 1A?

    
pregunta Martin Ždila

3 respuestas

0

Mi solución utiliza Arduino Pro Micro y vinculado código . La API de Arduino no es compatible con el 8% bit analogWrite para Pro Micro. Por lo tanto estoy manipulando los registros directamente. El código controla 3x 16bit PWM salidas. Las funciones relevantes del código referido son setup y applyRgb . El código también contiene una transformación simple a precepción de luz del ojo humano no lineal.

PS: Agregaré README.md allí pronto.

    
respondido por el Martin Ždila
1

Si eres flexible, usa un Arduino Lenoardo, tiene un temporizador de alta resolución que puede manejar 3 pines. 32U4, página 130, Temporizador / Contador de alta velocidad de 10 bits4 EDITAR: parece que analogWrite () no lo admite

Puedes imitar los temporizadores de 10/12 bits con un temporizador de 8 bits, omitiendo ciclos. No sabría una manera de hacer esto con la biblioteca PWM de Arduino (analogWrite ()), pero si está dispuesto a manejar las interrupciones del temporizador, se vuelve factible.

    
respondido por el Roland Mieslinger
1

Si todo lo que estás haciendo es comunicaciones PWM + multicanal, probablemente puedas utilizarlo como interrupciones mientras el bucle principal hace las comunicaciones.

Configure una interrupción del temporizador para que ocurra en [PWM Freq. * Resolución], y dentro de eso, incrementa una variable de rampa y compárala con cada uno de los canales deseados. Si es menos, enciéndelo; de lo contrario, apágalo. No olvide restablecer la rampa en su valor máximo, si no utiliza el rango completo permitido por el tipo de datos.

O, otra forma de hacerlo, que podría acelerarlo ligeramente para muchos canales, es hacer que el bucle principal mantenga una matriz de valores de puerto de acuerdo con el valor PWM ordenado para cada canal / pin. La interrupción entonces, simplemente recorre la matriz utilizando la variable rampa como índice.

Por ejemplo, qué tan rápida debe ser la interrupción, 50Hz PWM * resolución de 10 bits = 50Hz * 1024 = 51200Hz. En ese caso, la interrupción del temporizador debe dispararse a 51.2kHz, y el código debe finalizar a tiempo para el siguiente, menos una pequeña cantidad para que el bucle principal se introduzca.

    
respondido por el AaronD

Lea otras preguntas en las etiquetas