Atmega328p PWM sobrecalentamiento y parpadeo

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

Configuración

Diagrama fritzing de mi circuito.

Código

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]);
  }
}

Problemas

  1. Parpadeo aleatorio en salidas (diferentes) al girar potenciómetros
  2. 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.
  3. 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.

lo que he hecho hasta ahora

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!

EDITAR:

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.

Diagrama de circuito

¡Hola! Lamentablemente, es muy difícil adivinar la conexión real de los transistores a partir de su diagrama de cableado. ¿Le importaría exportarlo como un esquema adecuado, para que podamos leerlo sin ambigüedades? Es aún más importante con el Atmega, porque, imagínese, por lo general no conocemos de memoria todas las asignaciones de función de pin a número de pin, por lo que su diagrama de cableado realmente hace que sea difícil entender lo que está sucediendo aquí. ¡Un esquema hace que las cosas sean más fáciles de entender para los expertos en electrónica!
(y, lo que es más importante, todos los tipos reales de componentes son importantes aquí, porque determinan el comportamiento real bajo carga, por lo que sin un esquema adecuado con componentes anotados, esto simplemente no se puede responder de ninguna manera significativa)
Está bien, lo siento, estoy trabajando en ello :)
Ha conectado esos BJT NPN como si fueran MOSFET. Ellos no están. Agregue resistencias base en serie !!!!! ¡Es por eso que tu pobre micro se está sobrecalentando!
@brhans ¿Quieres saber por qué? ¡Porque estaba usando MOSFET inicialmente! Gracias por señalarlo, todo está funcionando bien ahora :)

Respuestas (3)

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?

¡Mierda, eran los transistores! Agregar resistencias en serie a los pines de salida soluciona todo. Buscaré implementar un mejor control de PWM, pero por ahora, las resistencias fueron el verdadero problema. ¡Muchas gracias!
  1. Si está utilizando un pero como interruptor, asegúrese de que haya una resistencia base.

  2. Asegúrese de que el interruptor sea adecuado para la carga.

  3. 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.

  4. Aprende a dibujar un esquema.

He añadido el diagrama del circuito. Intenté agregar retrasos de varias longitudes (hasta 100 ms) antes y no pareció hacer una diferencia. Lo intentaré de nuevo.

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 ......

¿Cómo sabes que está muerto? ¿Qué pasa si simplemente extrae demasiada corriente de los pines? Como ha usado el transistor BJT de manera incorrecta.
No es difícil de adivinar. Para calentar -> más del doble de la corriente tiene que fluir a través del uC max para el atmega es de 200 mA. Así que vamos a preguntar 500mA. Esto aumentará la temperatura unos 10 grados. 5mA para atmega en sí. 495mA para 4 salidas - 124mA/pin - tres veces por encima del máximo permitido. Esto es una matanza para la uC. Puede funcionar pero está 100% dañado