Estoy construyendo un controlador para tira de LED RGB (tira de 12V 5m 5050 LED RGB con ánodo común). Mi solución actual utiliza Arduino Uno con 3 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 a baja intensidad de luz seguirán siendo "brillantes".
Por lo que he leído, es posible usar Timer1 para producir PWM de 10 bits en dos pines. Desafortunadamente, me falta la solución para el tercer pin.
He leído algunos artículos sobre TLC5940 pero no encontré una buena solución para la corriente tan alta que necesito.
¿Hay alguna solución relativamente simple para que Arduino (o AVR) controle PWM de 10 bits (o mejor 12 bits) que pueda usar como entrada al transistor MOSFET para usar con 12V y corriente> 1A?
Si es flexible, use 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 bits EDITAR: parece que analogWrite() no lo admite
Puede imitar temporizadores de 10/12 bits con un temporizador de 8 bits, omitiendo ciclos. No sabría cómo hacer esto con la biblioteca Arduino PWM (analogWrite()), pero si está dispuesto a manejar las interrupciones del temporizador, se vuelve factible.
Si todo lo que está haciendo son comunicaciones PWM + multicanal, probablemente pueda usar interrupciones mientras el bucle principal hace las comunicaciones.
Configure una interrupción del temporizador para que suceda en [PWM Freq. * Resolución], y dentro de eso, incremente una variable de rampa y compárela con cada uno de los canales deseados. Si es menos, enciéndalo; de lo contrario, apáguelo. No olvide restablecer la rampa a su valor máximo, si no usa el rango completo permitido por el tipo de datos.
O bien, otra forma de hacerlo, que podría acelerarlo un poco 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. Entonces, la interrupción simplemente recorre la matriz utilizando la variable de rampa como índice.
Por ejemplo, qué tan rápida debe ser la interrupción, 50 Hz PWM * resolución de 10 bits = 50 Hz * 1024 = 51200 Hz. En ese caso, la interrupción del temporizador debe dispararse a 51,2 kHz, y el código debe terminar a tiempo para el siguiente, menos una pequeña cantidad para que se introduzca el bucle principal.
Mi solución usa Arduino Pro Micro y el código vinculado . Arduino API solo admite 8 bits analogWrite
para Pro Micro. Por lo tanto estoy manipulando los registros directamente. El código controla 3 salidas PWM de 16 bits. Las funciones relevantes del código referido son setup
y applyRgb
. El código también contiene una transformación simple a la percepción de la luz del ojo humano no lineal.
PD: Agregaré README.md
allí pronto.
uint128_t
Aarón Schultz