Estoy tratando de construir un control de atenuación para una tira de LED RGBW de 24 V usando potenciómetros como entradas analógicas. Es bastante similar al ejemplo de analogWrite() en el sitio web de arduino (arduino.cc/en/Reference/AnalogWrite), pero con cuatro entradas y salidas en lugar de una.
Estoy usando Arduino IDE con el cargador de arranque optiboot (optiboot_atmega328_pro_8MHz.hex) para compilar y actualizo los chips usando avrdude desde los pines GPIO de Raspberry Pi. Los fusibles están configurados para:
efuse: 0x05
hfuse: 0xd6
lfuse: 0xe2
int RGBW_LED[4] = {10, 9, 5, 6};
int RGBW_POT[4] = {A5, A4, A3, A2};
int RGBW_VAL[4] = {0, 0, 0, 0};
void setup()
{
for (int i = 0; i < 4; ++i)
{
pinMode(RGBW_LED[i], OUTPUT);
pinMode(RGBW_POT[i], INPUT);
}
}
void loop()
{
for (int i = 0; i < 4; ++i)
{
RGBW_VAL[i] = 0;
analogRead(RGBW_POT[i]); // read once and discard
for (int j = 0; j < 5; ++j) // then calculate mean to avoid flickering
{
RGBW_VAL[i] += analogRead(RGBW_POT[i]);
}
RGBW_VAL[i] /= 20; // divide by 5 for mean, then by 4 to scale to output range [0, 255]
analogWrite(RGBW_LED[i], RGBW_VAL[i]);
}
}
La configuración parece funcionar bien siempre que solo esté girando un potenciómetro. También he "resuelto" más o menos el problema 1 al calcular la media en el código y escribir eso en los pines de salida. Me parece más una solución alternativa, pero al menos es funcional. Si hay una solución adecuada, soy todo oídos.
El problema 2 parece estar relacionado con los mismos relojes PWM que se ejecutan en los pines 5/6 y 9/10, ya que parece funcionar la atenuación simultánea en diferentes combinaciones de pines. Como necesito cuatro controles PWM para RGBW y el Atmega328p solo tiene tres relojes PWM independientes, no puedo "engañar" a este.
No tengo ni idea de lo que está pasando con el problema 3 . Intenté usar una fuente de alimentación separada (VCC de Raspberry Pi) para el controlador (dejando caer el regulador de voltaje y separando los circuitos), eso no cambió nada. He intentado eliminar la fuente de 24 V y la tira de LED, el mismo resultado. Lo único que evitó que los pines se calentaran fue quitar los transistores, pero estoy bastante seguro de que están cableados correctamente y dado que también sucede sin la fuente de 24 V, no puedo imaginar que la corriente esté fuera de especificación.
Intenté modificar el código agregando retrasos, regulando el valor máximo de analogWrite () y cambiando la alimentación a los potenciómetros antes y después de la lectura conectándolos a una salida digital en lugar de VCC, todo fue en vano.
También intenté usar un chip Atmega328p diferente (tengo algunos por ahí) por si acaso, y definitivamente no es por un chip defectuoso.
¡Cualquier ayuda sería apreciada! ¡Muchas gracias!
He incluido el diagrama del circuito a continuación. Tenga en cuenta que omití el regulador de voltaje y usé fuentes de alimentación separadas de 5V y 24V. He probado el circuito con ambas configuraciones y no hay diferencia. Como se indicó anteriormente, incluso puedo desconectar la fuente de 24 V y la tira de LED (cortar la línea dibujada a mano en el diagrama) y aún se produce el calentamiento.
Parpadeo aleatorio en salidas (diferentes) al girar potenciómetros
Está escribiendo continuamente los registros de salida PWM. No hagas esto. En su lugar, agregue un filtro
de paso bajo y lea los análogos regularmente. Cada 10 milisegundos por ejemplo. Ponga esto en el filtro y use la salida del filtro para su PWM.
El mejor momento para actualizar los valores de PWM es cuando el temporizador se desborda (recarga). Vea si puede obtener esta interrupción.
El controlador se "bloquea" aleatoriamente y debe reiniciarse cuando se giran simultáneamente los potenciómetros para rojo/verde y azul/blanco. Esto no parece suceder en otras combinaciones.
El controlador se calienta (creo que está en el lado de los pines de salida) cuantos más potenciómetros enciendo. Esto también hace que el microcontrolador se bloquee y sea necesario reiniciarlo.
Esos están relacionados.
Olvidó las resistencias base en los transistores, por lo que probablemente esté sobrecargando los pines de salida.
Además, no veo condensadores en absoluto. Esto puede generar un ruido de conmutación significativo del PWM de los LED para que el chip se comporte de manera errática. Ha omitido esta parte, pero ¿está seguro de que todo es correcto?
Si está utilizando un pero como interruptor, asegúrese de que haya una resistencia base.
Asegúrese de que el interruptor sea adecuado para la carga.
En su código, asegúrese de tener suficiente tiempo para que el pwm se ejecute por completo. Por ejemplo, inserte un retraso allí. O para usar pwm alineado al centro. O te encuentras con fallas.
Aprende a dibujar un esquema.
Me temo que has matado a tu micro. Atmega no tiene que calentarse en absoluto. Si es así, significa que atmega está dañado. Incluso tengo uno (lo he matado por un flujo de corriente demasiado grande y creo que también es el caso aquí) que se calienta alrededor de 90-100C y luego se detiene, se enfría un poco y comienza de nuevo (continuando con el programa original) , se detiene de nuevo ......
marcus muller
marcus muller
mrbaozi
brahans
mrbaozi