No obtener el voltaje esperado en el LED

1

Hace poco recogí un arduino nano kit y jugué un poco con todos los proyectos simples. No tengo mucha experiencia en EE además de esas, así que tengo una pregunta que podría ser bastante básica.

Estoy intentando hacer una linterna de viaje simple con una batería recargable de ion de litio. Está funcionando, pero el voltaje en el LED está por debajo de lo que calculé, y por lo tanto el LED es más tenue de lo esperado.

Estoy usando una batería 18650 3.7v Li-ion para la alimentación que está conectada a una placa de protección / carga TP4056. La salida TP4056 está conectada a un convertidor elevador de aumento MT3608 para aumentar 3.7v hasta 7v, lo que alimenta al Nano a través del pin 30. Sé que no es una forma eficiente de hacerlo, pero lo cambiaré en el futuro.

Quiero usar PWM para controlar el brillo mediante un codificador rotatorio y el botón para encenderlo / apagarlo. El LED se salvó de una linterna que tenía alrededor y después de algunas investigaciones parece que es un cree xp-c que muestra un voltaje directo de 3.6v @ 350mA. Para reducir la salida máxima de 5 V de los pines de arduino, hice un divisor de voltaje con R1 como resistencia de 100 ohmios y R2 con 330 ohmios. Esto debería hacer que la salida entre las resistencias sea ~ 3.8v, pero como el arduino emite un poco menos de 5v, esperaba una salida de ~ 3.6v.

El problema es que estoy obteniendo 2.6v al LED en lugar de 3.6v como debería ser. Medí 4.5v desde el pin D6 a GND pero solo 2.6v después del divisor. ¿Qué podría hacer que el voltaje sea 1v más bajo de lo esperado?

Aquí está el código que tengo en el nano:

int tempPin = 0;

volatile boolean TurnDetected;  // need volatile for Interrupts
volatile boolean rotationdirection;  // CW or CCW rotation
volatile boolean isOn;
volatile boolean buttonPress;

const int PinCLK=2;   // White
const int PinDT=4;    // Orange
const int PinSW=3;    // Brown
const int PinLED=5;

int counter = 100;

// Interrupt routine runs if CLK goes from HIGH to LOW
void isr ()  {
  delay(4);  // delay for Debouncing
  if (digitalRead(PinCLK))
    rotationdirection= digitalRead(PinDT);
  else
    rotationdirection= !digitalRead(PinDT);
  TurnDetected = true;
}
void isr1 ()  {
  delay(4);  // delay for Debouncing
  if(!digitalRead(PinSW)){
    isOn = !isOn;
  }
  buttonPress = true;
}

void setup() {
  isOn=false;
  Serial.begin(9600);
  pinMode(PinCLK,INPUT);
  pinMode(PinDT,INPUT);  
  pinMode(PinSW,INPUT);
  pinMode(PinLED,OUTPUT);
  digitalWrite(PinSW, HIGH); // Pull-Up resistor for switch

  attachInterrupt (0,isr,FALLING);
  attachInterrupt (digitalPinToInterrupt(PinSW),isr1,FALLING);

}

void loop() {

  if(buttonPress){
    if(isOn){
      int val = map(counter, 0, 100, 0, 255);
      analogWrite(PinLED, val);
    } else {
      digitalWrite(PinLED, LOW);
    }
    buttonPress=false;
  }

  if (TurnDetected)  {
    if (rotationdirection) {
      counter+=2;
    }
    else {
      counter-=2;
    } 
    if(counter > 100){
      counter=100;
    }else if (counter < 30){
      counter = 30;
    }
    int val = map(counter, 0, 100, 0, 255);
    analogWrite(PinLED, val); 
    TurnDetected = false;  // do NOT repeat IF loop until new rotation 
detected
    Serial.println(counter);
  }
}
    
pregunta Loxez

1 respuesta

1

Las salidas de Arduino están generalmente limitadas a 20 mA con una caída de voltaje de 0.3 a 0.8V, dependiendo del microcontrolador utilizado.

Para leds de 350 mA, necesita como mínimo un mosfet o transistor, y preferiblemente un controlador de corriente constante.

Los divisores de tensión de la resistencia serán muy muy pobres en este tipo de situación. Sería mejor usar una sola resistencia.

    
respondido por el Passerby

Lea otras preguntas en las etiquetas