3 canales 10+bit PWM

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?

Otra posibilidad podría ser el PCA9685 , o algo similar. Le ofrece 16 canales de PWM de 12 bits, frecuencia de hasta 1,5 kHz, a través de I2C.
Estos hilos también pueden ser útiles. Puede usar MOFSET junto con algo como TLC5940 o TLC59711 para la conmutación PWM de alta corriente. Publicación en el foro y documento del proyecto de islou

Respuestas (3)

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.

Arduino Leonardo es mucho más caro en comparación con Arduino Nano (en eBay) y también es de mayor tamaño. Hay alternativas más pequeñas para una placa de conexión para ATmega32u4, pero todas las que encontré son más caras. Con respecto a la imitación, ¿podría enviarme un enlace a algún artículo que lo explique? Gracias.
Encontré Leonardo Pro Micro y no es tan caro :-)

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.

Probaré esta solución en un par de días e informaré aquí cómo funciona (+ calificación). Gracias.
Probé la solución, funciona, pero para 10 bits solo puedo tener una frecuencia PWM máxima de 150 Hz, que es demasiado baja para la iluminación ergonómica de la habitación oscura que deseo.
150 muy bajo? Fisiológicamente, no debería poder ver nada más de 30, excepto un efecto estroboscópico en las cosas que se mueven. ¿Qué estás haciendo en realidad?
Aparte de un chip diferente, creo que la mejor solución para reducir el efecto estroboscópico es mantener la interrupción del temporizador bit-banged, funcionando tan rápido como sea posible, y agregar un paso bajo en el hardware. Mire el filtro de salida de un amplificador de audio de clase D para inspirarse.
Por supuesto que no veo 150 Hz, pero hace que los ojos se cansen de forma similar a la iluminación de neón. El filtro de paso bajo destruiría la linealidad y la coincidencia del componente RGB de color sería más difícil de hacer para calcular un color. O todavía no tengo tanta experiencia.
Lowpass no debería tener nada que ver con eso. Configure la tasa de respuesta para que sea más rápida de lo que la luz necesita cambiar y más lenta que el PWM. Todo lo que hace entonces es eliminar la frecuencia PWM y sus armónicos y dejar el promedio que sus ojos captan de todos modos.
Funciona mejor cuando la frecuencia de corte de LC está lejos de ambas restricciones, al menos por un factor de 2 (octava), pero preferiblemente por un factor de 10 (década) o más. Solo como referencia, 2 décadas por debajo de 150 Hz PWM daría una tasa de respuesta sin obstáculos de 1,5 Hz, lo que probablemente esté bien para la iluminación. (Puede ordenarlo más rápido, por supuesto, pero podría retrasarse).
En cualquier caso, puede apuntar a la media geométrica y ajustar desde allí. En lugar de una media aritmética, donde sumas los dos números y los divides por 2, una media geométrica te hace multiplicar los dos números y sacar la raíz cuadrada. Luego aproxime eso usando los valores de los componentes obtenibles: Corte LC (Hz) = 1 / (2 * pi * sqrt (L*C)), donde L y C están en Henrys y Farads. (mantenga sus prefijos SI correctos)

Mi solución usa Arduino Pro Micro y el código vinculado . Arduino API solo admite 8 bits analogWritepara 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 setupy 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.mdallí pronto.