So erhöhen Sie den Dimmbereich einer Mosfet-gesteuerten LED

Ich komme langsam in Schaltungen und habe einen PWM-LED-Dimmer zusammengestellt. Die LED wird von dieser Schaltung angesteuert:

Geben Sie hier die Bildbeschreibung ein

Ich treibe die PWM über ein separates BLE-Gerät, das eine Benutzereingabe von [0, 100] auf einen 8-Bit-Wert für die Arduinos PWM [0, 255] abbildet. Hier ist der Code:

int led = 9;           // the PWM pin the LED is attached to
int intR;
int t;

void setup() {
  Serial.begin(9600);
  Serial.println("serial connected...");

  // declare pin 9 to be an output:
  pinMode(led, OUTPUT);

  analogWrite(led, 0);
}

void loop() {
  if (Serial.available() > 0) {
    intR = Serial.parseInt();
    t = map(intR, 0, 100, 0, 255); //remaps intR from [0, 100] -> [0, 255] to scale to PWM
    Serial.print(intR);
    Serial.print(" -> ");
    Serial.print(t);
    Serial.println("");  

    analogWrite(led, t);
  }
}

Immer wenn ich den Dimmwert auf 100 (100% Einschaltdauer) stelle, leuchtet die LED ziemlich hell, aber wenn ich den Wert auf 0 setze, leuchtet die LED mit wahrscheinlich 60% Helligkeit.

Was müsste ich tun, um die LED reibungslos von einem vollständig ausgeschalteten Zustand in einen vollständig eingeschalteten Zustand zu überführen?

BEARBEITEN:

Nach einer Diskussion in den Kommentaren habe ich meinen Code und meine Schaltung aktualisiert und etwas scheint nicht zu stimmen. Das folgende Code- und Schemapaar gibt mir den besten Dimmbereich (visuell vielleicht 10-100% Gesamtleistung) und funktioniert mit mehreren Mosfets aus meinem Paket.

Neuer Code & Schaltplan:

int led = 9; // the PWM pin the LED is attached to
int intR;

void setup() {
  Serial.begin(9600);
  Serial.println("serial connected...");

  // declare pin 9 to be an output:
  pinMode(led, OUTPUT);

  digitalWrite(led, LOW);
}

void loop() {
  if (Serial.available() > 0) {
    intR = Serial.parseInt(); //reads the next valid integer
    Serial.print(intR);
    Serial.println("");

    if (intR <= 255 && intR >= 0) {    
      if (intR == 0) {
        digitalWrite(led, LOW);
      } else {
        analogWrite(led, intR);
      }
    }
  }
}

Das funktioniert

Meine MOSFETs sind mit P30N06LE gekennzeichnet, die diesem RFP30N06LE-Datenblatt entsprechen . Und wenn meine Fets nicht falsch gemacht wurden, geht mein Drain wirklich direkt auf GND und mein LED-Negativ wird in die Quelle eingespeist. Das Problem, das ich jetzt habe, ist zweifach: 1) zu verstehen, warum meine Schaltung auf diese Weise funktioniert, und 2) meine LED zum vollständigen Ausschalten zu bringen, wenn der Pin auf LOW gesetzt wird.

Wenn bei der obigen Konfiguration Pin 9 auf LOW gesetzt ist, hat die LED eine Helligkeit von ~ 10%, und wenn ich den Draht physisch von Arduino Pin 9 entferne, schaltet sich die LED vollständig aus. Wenn ich dann das Kabel in verschiedene stromlose Pins stecke, leuchtet die LED mit geringer Helligkeit und zeigt an, dass genügend Spannung vorhanden ist, um den Fet mit Strom zu versorgen. Wie bekomme ich die LED komplett aus?

Welchen MOSFET verwendest du?
Ich verwende ein P30N06LE
Wie schnell senden Sie serielle Daten in Ihre MCU? Senden Sie diese Daten auch als Rampe (wie bei einem Sägezahn?) Oder senden Sie den Wert 0 ein und halten ihn dort (ändern den Wert nie) und sehen die LED immer noch bei etwa 60%?
Kann die LED die vollen 12 Volt aushalten?
Bist du sicher, dass du den MOSFET richtig angeschlossen hast? Die LED sollte mit dem Mittelstift verbunden werden.
@τεκ Richtig, meine LED ist mit dem Mittelstift (Drain) des Mosfets verbunden. Der PWM ist mit dem Gate verbunden und der Source-Pin ist geerdet.
@jonk Ich habe meinen Code bearbeitet, um den Wert bei der Initialisierung auf 0% Arbeitszyklus zu setzen, es ist immer noch fast die volle Helligkeit.
@GregoryNeal Entfernen Sie die E / A-Pin-Verbindung, lassen Sie den 1k-Widerstand jedoch auf Masse. Wenn das 9-LED-System dadurch nicht ausgeschaltet wird, hängt das Problem NICHT mit Ihrer I/O-Pin-Anordnung zusammen. Es ist etwas anderes. Wenn das die LED ausschaltet, dann haben Sie ein Problem mit Ihrem I/O (analog out?) Pin. (Ich gehe davon aus, dass Ihre Lichtkuppel mit 12 V betrieben werden soll.)
@jonk Wenn ich den E / A-Pin herausnehme, bleibt das Licht an, also ist meine Schaltungskonfiguration falsch? Gibt es eine Möglichkeit, mit Sicherheit festzustellen, ob meine LED 12 V benötigt? Im Internet habe ich keine Datenblätter gefunden
@GregoryNeal Ich denke schon. Es hat 9 LEDs und ist angeblich für 12-V-Automobilanwendungen ausgelegt. Sie könnten es einfach direkt an die 12-V-Batterie anschließen. Aber ich denke, es wird gut leuchten, wenn Sie es tun. Sie haben also wahrscheinlich die Dinge falsch verdrahtet oder einen schlechten NFET. Wahrscheinlich falsch verdrahtet (überprüfen Sie die Pinbelegung SORGFÄLTIG.) Stellen Sie sicher, dass Sie wissen, welche Pins welche auf dem NFET sind! Und überprüfen Sie auch Ihre Spannungspolaritäten.
@jonk Gemäß diesem Datenblatt: sparkfun.com/datasheets/Components/General/RFP30N06LE.pdf Bei meiner ursprünglichen Konfiguration ging das LED-Negativ in den Mittelstift, der als Abfluss aufgeführt ist. Und der Rest als: - LED -> Drain GND -> Source PWM -> Gate Einmal habe ich die Drain- und Source-Eingänge so vertauscht, dass: GND -> Drain -LED -> Source PWM -> Gate Der Dimmbereich stieg dramatisch (fast auf ein brauchbarer Bereich). Wenn ich jedoch den PWM-Pin ausstecke, springt er jetzt in den vollständig eingeschalteten Zustand, anstatt den Stromfluss zu unterbrechen, wie ich es erwarten würde.
@GregoryNeal Nun, es hört sich fast so an, als hätten Sie einen PFET, keinen NFET. Aber auch das passt nicht in allen Einzelheiten zu Ihrer Beschreibung. Also sehr seltsam. Ich denke, Sie müssen zu einigen sehr grundlegenden Tests des FET zurückkehren. Verwenden Sie anstelle des LED-Lichts einen Widerstand am Drain-Pin. Messen Sie den Spannungsabfall über dem Widerstand für zwei Fälle: geerdetes Gate und ein Spannungsteiler-Widerstandspaar zum Gate, das etwa 3 V zum Gate liefern sollte. Es stimmt etwas nicht.
@jonk Wenn ich diese Konfiguration mit geerdetem Gate verwende und die Spannung an R1 messe, bekomme ich -11,6 V. Und wenn ich das geerdete Gate wie in dieser Konfiguration durch eine Quelle von ~ 3,3 V ersetze, beträgt die Spannung an R1 -12,1 V.
Sie haben den 12-V-Anschluss (schwarz) mit dem GND des Arduino verbunden, richtig? Und die 12V + (rot) Klemme mit der LED verbunden.
@τεκ Ja, so ist es eingerichtet. Bisher habe ich festgestellt, dass der Aufbau der Schaltung auf diese Weise die besten Ergebnisse liefert. Das Einstellen des PWM auf 0 führt zu etwa 10-20% Helligkeit in der LED, und das Einstellen des PWM auf 255 führt zu ungefähr voller Helligkeit. Ich denke, mein Mosfet ist schlecht, aber ich weiß nicht, welche Tests ich darauf ausführen soll.

Antworten (2)

Wie konvertiert man 0-100 in 0-255? Anscheinend verwenden Sie die externe Kartenfunktion . Alles würde erklärt, wenn die mapFunktion "fehlfunktioniert" wäre und 155-255 für eine 0-100-Eingabe zurückgeben würde. Da 155 60 % von 255 beträgt. Vielleicht funktioniert diese Funktion nicht so, wie Sie denken, dass sie funktioniert.

Warum nicht einfach hingehent = intR * 255 / 100?

Warum überhaupt eine Skala von 0 bis 100 eingeben, binär denken und eine Skala von 0 bis 255 eingeben.

Ich habe meinen Code bearbeitet, um die Kartenfunktion zu entfernen, das Verhalten ist jedoch immer noch dasselbe. Die Eingabe von 255 scheint volle Helligkeit zu sein, aber die Eingabe von 0 ist immer noch fast volle Helligkeit, nur ein wenig dunkler. der Code:void loop() { if (Serial.available() > 0) { intR = Serial.parseInt(); //reads the next valid integer Serial.print(intR); Serial.println(""); if (intR <= 255 && intR >= 0) { analogWrite(led, intR); } } }
Welche Zahl ist die Arduino-Decodierung? Kann man das irgendwie sagen? Funktioniert es, wenn Sie direkt eine Ziffer 0 an den Arduino senden? Was ist, wenn Sie 1 senden?
Ich habe ein HM10 BLE-Modul an das Arduino angeschlossen. Ich verwende die Android-App BLE-Scanner (zum Testen). Sobald ich eine Verbindung hergestellt habe, sende ich eine Schreibanforderung an die benutzerdefinierte Eigenschaft des HM10. Das Arduino liest die Bits und analysiert die Ganzzahl und sendet dann die Daten direkt an den PWM-Pin. Das Senden eines Werts von 0 setzt es in einen ziemlich hellen Zustand. Wenn Sie es anschließend auf 1 setzen, tut dies scheinbar nichts. Sie können den Unterschied in der Lichtleistung nicht sehen, es sei denn, Sie haben ein Delta von etwa 60 oder 70.

Zur Fehlersuche würde ich den empfangenen Serienwert aus der Gleichung nehmen. Einfach einstellent = 0;

Das ist, was ich vermute, kann passieren.

Diese Antwort erforderte zu viele Annahmen, da die erhaltenen Werte nicht erklärt wurden. Aber es ist eine Möglichkeit, wenn der MOSFET korrekt funktioniert.

Ich habe ein HM10 BLE-Modul an das Arduino angeschlossen. Ich verwende die Android-App BLE-Scanner (zum Testen). Sobald ich eine Verbindung hergestellt habe, sende ich eine Schreibanforderung an die benutzerdefinierte Eigenschaft des HM10. Das Arduino liest die Bits und analysiert die Ganzzahl und sendet dann die Daten direkt an den PWM-Pin.

Wenn ich das richtig verstehe, verwenden Sie ein einzelnes serielles ASCII-Zeichen für Ihre PWM-Werte.

Was Sie nicht erklären, sind die möglichen Werte, die auf der seriellen Schnittstelle empfangen werden.

Eine Null in ASCII wäre ein NULL-Zeichen. Wobei eine "0" 32 wäre und 100 wäre "d". Angenommen, Sie verwenden 7-stellige ASCII-Werte und verwenden daher 0-100 Dimmlevel-Werte.

Das wäre sinnvoll, wenn Sie tatsächlich eine "0" (Wert 32) und nicht NULL (Wert Null) senden. Ihr Auge könnte den Unterschied zwischen 32 % und 60 % Lichtstärke leicht falsch interpretieren.



Ich verstehe nicht, warum die analogWrite(led, t);in der
if (Serial.available() > 0){}.
Sie können nur ein einzelnes Zeichen senden, um die Dimmstufe zu ändern, wenn das
analogWrite(led, t);
nicht in den ifKlammern steht.
Ich denke, Sie senden unnötigerweise einen kontinuierlichen Strom von Zeichen.


Ich habe meinen Code überarbeitet und Sie können ihn in meiner Bearbeitung sehen. In der BLE-Scanner-App habe ich die Möglichkeit, Text- oder Byte-Arrays zu senden. Ich habe Textwerte von 0 bis 255 gesendet, von denen ich annehme, dass sie von der Arduino-Funktion korrekt analysiert wurden Serial.parseInt. Analysieren Arduino-Bibliotheken den von einem ble-Gerät empfangenen Textwert nicht richtig?
Wenn Sie eine ASCII „0“ erhalten, ist der ganzzahlige Wert 32. Wenn Sie eine ganze Zahl mit einem Wert von 32 drucken, erhalten Sie wahrscheinlich eine ASCII „0“. Dies kann Sie zu der Annahme verleiten, dass der Wert von intR Null ist, wenn er tatsächlich 32 beträgt. Ich bin mit Arduino-Bibliotheken nicht vertraut. Normalerweise können Sie mit C zum Senden eines ASCII-Nullzeichens 32 oder "0" "drucken". Sie senden einen ganzzahligen Wert, den der Compiler möglicherweise in sein ASCII-Zeichen umwandelt. Ich habe in den letzten 20 Jahren keinen Atmel-Code geschrieben. Ich habe hauptsächlich Assembler geschrieben und wenn ich in C geschrieben habe, habe ich IAR Systems Embeded Workbwench verwendet
Liest gemäß diesem Arduino-Tutorial und meinem Verweis auf die Dokumentation den ASCII-Wert aus dem Stream-Puffer und analysiert ihn in die logische Ganzzahl und nicht in Serial.parseInt()den Ordnungswert. Wenn der Puffer "5,220,70" enthielt, gibt der erste Aufruf von Serial.parseInt()die Ganzzahl 5 zurück, der zweite Aufruf gibt 220 zurück. In meinem aktualisierten Code sende ich keine durch Kommas getrennten Werte, daher Serial.parseInt()sollte der einzelne Aufruf von korrekt zurückgeben Wert.
Sie sollten versuchen, analogWrite (led, intR) zu nehmen; aus der if-Anweisung. analogWrite sollte bei jeder Iteration der Schleife ausgeführt werden. Sie führen analogWrite nur aus, wenn serielle Daten empfangen werden. Ich empfehle dringend, nur einen Wert von Null für intR zu verwenden und die empfangenen Daten nicht zu verwenden, um den Wert von intR festzulegen oder analogWrite in analogWrite (led, 0) zu ändern.