El LED se atenúa cuando el MOSFET cambia a una velocidad más alta

Quiero manejar LED usando un Arduino Due y un MOSFET. A continuación se muestra el circuito que estoy usando, tomado de otra publicación: tira de LED de conducción del microcontrolador

esquema del circuito

Reemplacé el transistor en la imagen con un IRLB8721PbF. Hoja de datos: https://cdn-shop.adafruit.com/datasheets/irlb8721pbf.pdf

El LED_STRIP se reemplaza con dos LED blancos LH351B conectados en serie. Hoja de datos: http://www.samsung.com/global/business/business-images/led/file/product/lighting/201504/Data_Sheet_LH351B_Rev.4.3d.pdf

El voltaje directo del LH351B es de aproximadamente 3 V, por lo que estoy usando 6 V como fuente de alimentación. Básicamente, quiero seguir encendiendo y apagando los LED. Noté que cuando aumenté la frecuencia de conmutación, por ejemplo, 100 kHz, los LED eran más tenues que cuando cambiaba a una frecuencia más lenta, como 1 kHz. ¿Qué podría estar causando la disminución del brillo?

¿Creo que el LED debería poder cambiar en el rango de nanosegundos? Y el MOSFET que estoy usando también tiene un tiempo de subida/bajada de nanosegundos. ¿Tiene que ver con el microcontrolador? A continuación se muestra el código que estoy usando, solo un simple digitalWrite usando la manipulación del puerto:

    PIOD->PIO_SODR = 1<<8; //HIGH on pin 12
    //digitalWrite(12, HIGH);
    delayMicroseconds(10);


    PIOD->PIO_CODR = 1<<8; //LOW on pin 12
    //digitalWrite(12,LOW);
    delayMicroseconds(10);
    }

--EDITADO--

código completo:

    #include <SPI.h>
    #include <SD.h>
    File dataFile;

    void setup() {
      pinMode(12, OUTPUT);
      Serial.begin(210000);

      if (!SD.begin(10)) {
        Serial.println("Card failed, or not present");
        return;
      }
      Serial.println("card initialized.");
    }

    void loop() {
      int myData_read;
      dataFile = SD.open("DATALOG.dat");
      myData_read = dataFile.read();
      //Serial.println(myData_read);
      for(int i=0; i < 8; i++){
         if((myData_read & (1<<i)) >> i){

            PIOD->PIO_SODR = 1<<8; //HIGH on pin 12
            //digitalWrite(12, HIGH);

            delayMicroseconds(5);
          } else {

            PIOD->PIO_CODR = 1<<8; //LOW on pin 12
            //digitalWrite(12,LOW);
            delayMicroseconds(5);
            }
      }
    dataFile.close();
    } 
¿Cuál es la unidad máxima de un pin Arduino?
@Trevor Encontré información aquí arduino.cc/en/Hacking/PinMappingSAM3X . Creo que es 15mA y 3.3V para el pin que estoy usando
Eso es bastante pequeño para conducir una capacitancia de puerta mosfet
Su IRLML2502 FET tiene una capacitancia de puerta a fuente de 740 pF (típica), según su hoja de datos. No tengo la energía a esta hora de la noche para buscar la corriente del pin de E/S y calcular qué tan rápido puede cargar/descargar esta capacitancia a través de una resistencia 27R y, por lo tanto, qué tan lentos son sus bordes. (Suposición personal: no es muy lento, dudo que sean la causa, pero puede resolverlo buscando la corriente y transponiendo Q = CV = eso). Además, ¿cómo es su cableado para transportar 100 kHz? ¿Tiene tres pies de largo? alambre delgado? ¿Y puede su LED promediar una corriente? Pegue 10 uF en el LED, vea si cambia.
No hay forma de que un LED pueda cambiar en nanosegundos... por la misma razón que un diodo estándar no puede hacerlo... la mayoría de los LED comienzan a alcanzar su máximo alrededor de unos pocos kHz o decenas de kHz. Los que tienen capacidad para velocidades más altas tendrán especificaciones sobre la capacitancia de la unión, etc., que pueden ayudarlo a estimar las frecuencias de conmutación máximas.
@TonyM Ya veo, echaré un vistazo al cálculo. Los cables son todos menos de 5 cm. Pongo 10uF en el LED pero no se observa ningún cambio en el brillo.
¿Qué hay de tomar rastros de alcance del drenaje del transistor, en lugar de especular sobre el código o la fuerza/capacitancia de la unidad? ¿Qué modelo de osciloscopio está utilizando durante la depuración del código?
Idea obvia, @AliChen, pero estás especulando que el OP tiene acceso a un 'alcance. Suena como un proyecto de casa para mí, como especulo...
@TonyM, mi amplia experiencia en el trato con desarrolladores de firmware indica que cualquiera que desarrolle una interfaz con hardware y no use un alcance está perdiendo el tiempo de todos. Un osciloscopio de PC de dos canales (+analizador lógico) no es un gran gasto hoy en día, pero ahorrará mucho tiempo y nervios.
@AliChen, oh, sé que un osciloscopio es útil, no el "desperdicio del tiempo de todos". Parece que mi amplia experiencia es diferente a la tuya :-) Pero es el punto de partida incorrecto si el OP no lo ha hecho t acceso a ese equipo. Algunos están en edad escolar, en un dormitorio con algunas tablas, tratando de explorar y aprender. No hay alcances allí, me temo. Lo que hay es entusiasmo e interés por ser alentado y ayudado. Que, por supuesto, es el único objetivo de este sitio. Y un lugar para que aprendamos también, independientemente de nuestra "amplia experiencia" :-) En ese sentido, muy feliz Navidad para ti.
@TonyM, Feliz Navidad para ti también. Aunque en este país todo el público fue instruido por políticas inspiradas por el gobierno para decir "felices fiestas", de lo contrario podrías ofender a algunos. Oh mi.

Respuestas (2)

loop()No nos ha mostrado suficiente de su código, pero presumiblemente este fragmento está incrustado en un bucle de algún tipo, tal vez incluso una función específica de Arduino .

Lo que esto significa es que su tiempo de "apagado" no es igual a su tiempo de "encendido". El tiempo de "encendido" es simplemente el retraso de 10 µs, pero el tiempo de "apagado" es el retraso de 10 µs más la sobrecarga del ciclo, que podría incluir la sobrecarga de salir de la loop()función y luego volver a ingresar.

A medida que disminuye el valor de retardo nominal, esa sobrecarga de bucle se convierte en una fracción mayor del período total, sesgando el ciclo de trabajo y, por lo tanto, el brillo del LED.

Esto será obvio si simplemente observa el pin de salida con un osciloscopio.


Mirando el "código completo" en su edición, hay muchas maneras en que podría optimizarse. Yo intentaría algo como esto:

#include <SPI.h>
#include <SD.h>
File dataFile;
int myData_read;

void setup() {
  pinMode(12, OUTPUT);
  Serial.begin(210000);

  if (!SD.begin(10)) {
    Serial.println("Card failed, or not present");
    return;
  }
  Serial.println("card initialized.");
  dataFile = SD.open("DATALOG.dat");
  myData_read = dataFile.read();
  //Serial.println(myData_read);
  dataFile.close();
}

void loop() {
  for (int i=0; i < 8; i++) {
    if (myData_read & (1<<i)) {
      PIOD->PIO_SODR = 1<<8; //HIGH on pin 12
      //digitalWrite(12, HIGH);
    } else {
      PIOD->PIO_CODR = 1<<8; //LOW on pin 12
      //digitalWrite(12,LOW);
    }
    delayMicroseconds(5);
  }
}

No hay motivo para leer el archivo una y otra vez en el bucle, y la >> ideclaración ifes completamente superflua.

O, de lo contrario, intente colocar el fragmento de código de la pregunta en un bloque for(;;){} y vea si el comportamiento es diferente.
@Dave Tweed♦ Creo que señalaste una falla grave en mi diseño. El código completo (editado arriba) implica leer datos binarios almacenados en una tarjeta SD y alternar el LED para enviar 1 (encendido) y 0 (apagado). Cada línea de código tarda un tiempo en ejecutarse, provoca una mayor diferencia en el tiempo de "encendido" y "apagado". ¿Alguna sugerencia sobre cómo mejorar el código? (Quizás debería preguntar esto en una publicación separada)
@vicatcu ¡Sí, el comportamiento es diferente! Los LED vuelven a brillar. Evite entrar en la función loop() que resuelve el tiempo de encendido/apagado desigual del LED.
Si necesita una sincronización realmente precisa, debe controlar el LED directamente desde uno de los temporizadores de hardware. Esto también implicará el uso de interrupciones para asegurarse de que el software actualice la configuración del temporizador lo antes posible cuando sea necesario.

El LED no se puede alternar a una frecuencia tan alta. No obtendrá suficiente voltaje en ese intervalo de tiempo para encenderse por completo y, por lo tanto, permanece tenue o incluso apagado.

¿Hay alguna forma de calcular la frecuencia máxima que puede alternar un LED? ¿También alguna sugerencia sobre cómo transmitir datos de manera efectiva usando LED parpadeantes?
Esto es simplemente incorrecto. Los LED no son dispositivos lentos.
Mundo real: ¿qué hay del tiempo de conmutación debido a la resistencia en serie, combinado con las capacitancias de unión del diodo? Comprobar -> google.co.in/url?sa=t&source=web&rct=j&url=http://…
Dé una entrada de onda cuadrada a un circuito de resistencia - LED y aumente gradualmente la frecuencia de entrada y observe los cambios.
Ya discutido y aceptado aquí ---> electronics.stackexchange.com/questions/79373/…
@MITURAJ Gracias, me dio una idea de cómo mejorar el diseño actual