Die LED dimmt, wenn der MOSFET mit höherer Geschwindigkeit schaltet

Ich möchte LEDs mit einem Arduino Due und einem MOSFET ansteuern. Unten ist die Schaltung, die ich verwende, entnommen aus einem anderen Beitrag: LED-Streifen vom Mikrocontroller antreiben

Schaltplan

Ich habe den Transistor im Bild durch einen IRLB8721PbF ersetzt. Datenblatt: https://cdn-shop.adafruit.com/datasheets/irlb8721pbf.pdf

Der LED_STRIP wird durch zwei in Reihe geschaltete weiße LEDs LH351B ersetzt. Datenblatt: http://www.samsung.com/global/business/business-images/led/file/product/lighting/201504/Data_Sheet_LH351B_Rev.4.3d.pdf

Die Durchlassspannung des LH351B beträgt ungefähr 3 V, daher verwende ich 6 V als Stromversorgung. Grundsätzlich möchte ich die LEDs ein- und ausschalten. Mir ist aufgefallen, dass die LEDs beim Erhöhen der Schaltfrequenz, beispielsweise 100 kHz, dunkler waren als beim Schalten mit einer langsameren Frequenz wie 1 kHz. Woran könnte der Helligkeitsabfall liegen?

Ich glaube, LED sollte im Nanosekundenbereich schalten können? Und der von mir verwendete MOSFET hat ebenfalls eine Anstiegs- / Abfallzeit von Nanosekunden. Liegt es am Mikrocontroller? Unten ist der Code, den ich verwende, nur ein einfaches DigitalWrite mit Port-Manipulation:

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

--BEARBEITET--

vollständiger Code:

    #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();
    } 
Was ist der maximale Antrieb eines Arduino-Pins?
@Trevor Ich habe hier einige Informationen gefunden arduino.cc/en/Hacking/PinMappingSAM3X . Ich denke, es sind 15 mA und 3,3 V für den Pin, den ich verwende
Das ist ziemlich klein, um eine Mosfet-Gate-Kapazität zu treiben
Ihr IRLML2502 FET hat laut Datenblatt eine Gate-Source-Kapazität von 740 pF (typisch). Ich habe zu dieser Nachtzeit nicht die Energie, den I / O-Pin-Strom nachzuschlagen und herauszufinden, wie schnell er diese Kapazität über einen 27R-Widerstand laden / entladen kann und wie langsam Ihre Kanten daher sind. (Persönliche Vermutung: nicht sehr langsam, bezweifle, dass sie die Ursache sind, aber Sie können es herausfinden, indem Sie den Strom nachschlagen und Q = CV = transponieren.) Außerdem, wie ist Ihre Verkabelung für die Übertragung von 100 kHz, ist sie drei Fuß lang? dünner Draht? Und kann Ihre LED einen Strom mitteln? Kleben Sie 10 uF über die LED, sehen Sie, ob es sich ändert.
Auf keinen Fall kann eine LED in Nanosekunden schalten ... aus dem gleichen Grund kann eine Standarddiode dies nicht tun ... die meisten LEDs beginnen bei einigen kHz oder 10 kHz zu übersteigen. Geräte mit höheren Geschwindigkeiten haben Spezifikationen zur Sperrschichtkapazität usw., die Ihnen helfen können, die Spitzenschaltfrequenzen abzuschätzen.
@ TonyM Ich verstehe, ich werde mir die Berechnung ansehen. Die Drähte sind alle weniger als 5 cm lang. Ich habe 10 uF über die LED gelegt, aber es ist keine Helligkeitsänderung zu beobachten.
Wie wäre es, wenn Sie Scope-Spuren des Transistor-Drains nehmen, anstatt über Code oder Treiberstärke / -kapazität zu spekulieren? Welches Modell eines Oszilloskops verwenden Sie während des Code-Debuggens?
Offensichtliche Idee, @AliChen, aber Sie spekulieren, dass das OP Zugriff auf einen Bereich hat. Klingt für mich wie ein Heimprojekt, wie ich spekuliere ...
@TonyM, meine umfangreiche Erfahrung im Umgang mit Entwicklern von Firmware zeigt, dass jeder, der eine Schnittstelle mit Hardware entwickelt und kein Oszilloskop verwendet, die Zeit aller verschwendet. Ein zweikanaliges PC-Oszilloskop (+ Logikanalysator) ist heutzutage keine große Ausgabe, aber es spart viel Zeit und Nerven.
@AliChen, oh, ich weiß, dass ein Oszilloskop nützlich ist, nicht das Muss-sonst-tun-"Jedermanns-Zeit-verschwenden"-Bit - hört sich so an, als ob sich meine umfangreiche Erfahrung von Ihrer unterscheidet :-) Aber es ist der falsche Ausgangspunkt, wenn das OP nicht hat keinen Zugriff auf diese Ausrüstung. Einige sind im Schulalter, in einem Schlafzimmer mit ein paar Brettern, versuchen zu erkunden und zu lernen. Keine Zielfernrohre da, fürchte ich. Was da ist, ist Enthusiasmus und Interesse, das gefördert und unterstützt werden soll. Was natürlich das einzige Ziel dieser Seite ist. Und ein Ort, an dem wir auch lernen können, unabhängig von unserer "umfangreichen Erfahrung" :-) In diesem Sinne ein frohes Weihnachtsfest für Sie
@TonyM, Frohe Weihnachten auch für dich. Obwohl in diesem Land die gesamte Öffentlichkeit von der Regierung inspiriert wurde, "Frohe Feiertage" zu sagen, könnten Sie sonst einige Clusterfck beleidigen. Oh mein.

Antworten (2)

Sie haben uns nicht genug von Ihrem Code gezeigt, aber vermutlich ist dieses Fragment in eine Art Schleife eingebettet, vielleicht sogar eine Arduino-spezifische loop()Funktion.

Das bedeutet, dass Ihre "Aus"-Zeit nicht gleich Ihrer "Ein"-Zeit ist. Die „Ein“-Zeit ist einfach die 10-µs-Verzögerung, aber die „Aus“-Zeit ist die 10-µs-Verzögerung zuzüglich des Schleifen-Overheads – der den Overhead für das Verlassen der loop()Funktion und den erneuten Eintritt beinhalten kann.

Wenn Sie den nominalen Verzögerungswert verringern, wird dieser Loop-Overhead zu einem größeren Bruchteil der Gesamtperiode, wodurch das Tastverhältnis und damit die LED-Helligkeit verzerrt wird.

Dies wird offensichtlich, wenn Sie den Ausgangspin einfach mit einem Oszilloskop betrachten.


Wenn Sie sich den "vollständigen Code" in Ihrer Bearbeitung ansehen, gibt es viele Möglichkeiten, ihn zu optimieren. Ich würde so etwas versuchen:

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

Es gibt keinen Grund, die Datei immer wieder in der Schleife zu lesen, und das >> iin der ifAnweisung ist völlig überflüssig.

Oder versuchen Sie andernfalls, das Code-Snippet aus der Frage in einen for(;;){}-Block einzufügen und zu sehen, ob das Verhalten anders ist?
@Dave Tweed♦ Ich glaube, Sie haben auf einen schwerwiegenden Fehler in meinem Design hingewiesen. Der vollständige Code (oben bearbeitet) beinhaltet das Lesen gespeicherter Binärdaten auf einer SD-Karte und das Umschalten der LED, um 1 (ein) und 0 (aus) zu senden. Die Ausführung jeder Codezeile dauert einige Zeit, was zu größeren Unterschieden in der "Ein"- und "Aus"-Zeit führt. Irgendwelche Vorschläge zur Verbesserung des Codes? (Vielleicht sollte ich das in einem separaten Beitrag fragen)
@vicatcu Ja, das Verhalten ist anders! Die LEDs leuchten wieder. Vermeiden Sie es, in die Funktion loop() zu gehen, um die ungleiche LED-Ein-/Ausschaltzeit zu lösen.
Wenn Sie wirklich präzises Timing benötigen, sollten Sie die LED direkt von einem der Hardware-Timer ansteuern. Dies beinhaltet auch die Verwendung von Interrupts, um sicherzustellen, dass die Software die Timer-Einstellungen so schnell wie möglich aktualisiert, wenn dies erforderlich ist.

LED kann nicht mit einer so hohen Frequenz umgeschaltet werden. Es wird in diesem Zeitintervall nicht genug Spannung erhalten, um sich vollständig einzuschalten, und daher bleibt es dunkel oder sogar ausgeschaltet.

Gibt es eine Möglichkeit, die maximale Frequenz zu berechnen, die eine LED umschalten kann? Haben Sie auch einen Vorschlag, wie Sie Daten mit blinkenden LEDs effektiv übertragen können?
Das ist einfach falsch. LEDs sind keine langsamen Geräte.
Reale Welt - Wie sieht es mit der Schaltzeit aufgrund des Vorwiderstands in Kombination mit den Sperrschichtkapazitäten der Diode aus? Überprüfen Sie -> google.co.in/url?sa=t&source=web&rct=j&url=http://…
Geben Sie einem Widerstands-LED-Schaltkreis einen Rechteckwelleneingang und erhöhen Sie allmählich die Eingangsfrequenz und beobachten Sie die Änderungen.
Hier bereits diskutiert und akzeptiert ---> electronic.stackexchange.com/questions/79373/…
@MITURAJ Danke, es hat mir eine Idee gegeben, wie ich das aktuelle Design verbessern kann