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
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();
}
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 >> i
in der if
Anweisung ist völlig überflüssig.
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.
Trevor_G
Wei T
Trevor_G
Toni M
Verrückter Hutmacher
Wei T
Mitu Raj
Ale..chenski
Toni M
Ale..chenski
Toni M
Ale..chenski