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
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();
}
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 >> i
declaración if
es completamente superflua.
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.
Trevor_G
wey t
Trevor_G
TonyM
sombrereroloco
wey t
mitu raj
Ale..chenski
TonyM
Ale..chenski
TonyM
Ale..chenski