Cómo aumentar el rango de atenuación del LED controlado por mosfet

0

Me estoy metiendo lentamente en los circuitos y armé un atenuador LED PWM. El led es impulsado por este circuito:

EstoymanejandoelPWMatravésdeundispositivoBLEseparadoquemapeaunaentradadeusuariode[0,100]aunvalorde8bitsparalosPWMdearduinos[0,255].Aquíestáelcódigo:

intled=9;//thePWMpintheLEDisattachedtointintR;intt;voidsetup(){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);
  }
}

Cada vez que establezco el valor de atenuación en 100 (ciclo de trabajo del 100%), el led brilla con mucha intensidad, pero cuando configuro el valor en 0, el LED brilla con un brillo de probablemente el 60%.

¿Qué tendría que hacer para hacer una transición suave del LED desde un estado completamente apagado a un estado completamente encendido?

EDITAR:

Después de una discusión en los comentarios, he actualizado mi código y circuito y algo parece estar mal. El siguiente código y par de esquemas me dan el mejor rango de intensidad (visualmente, quizás un 10-100% de producción total) y funciona en múltiples mosfets desde mi paquete.

Nuevo código & Esquema del circuito:

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

MisMOSFETestánetiquetadoscomoP30N06LEquecorrespondenaeste RFP30N06LE hoja de datos . Y a menos que mis apuestas se hicieran incorrectamente, mi drenaje realmente va directamente a GND, y mi LED negativo entra en la fuente. El problema que tengo ahora es doble: 1) entender por qué mi circuito funciona de esta manera y 2) apagar completamente mi led al configurar el pin en LOW.

Con la configuración anterior, cuando el pin 9 se establece en LOW, el LED tiene un brillo de ~ 10%, y cuando quito físicamente el cable del pin 9 de arduino, el LED se apaga completamente. Si luego conecto el cable a varios pines sin alimentación, el LED brilla con un brillo bajo, lo que indica que hay suficiente voltaje para alimentar al fet. ¿Cómo puedo hacer que el led se apague por completo?

    
pregunta GregoryNeal

2 respuestas

2

¿Cómo estás convirtiendo 0-100 a 0-255? Parece que estás usando la función externa map . Todo se explicaría si la función map estuviera "funcionando mal" y volviera a 155-255 para una entrada de 0-100. Dado que 155 es el 60% de 255. Tal vez esa función no funcione de la forma en que crees que funciona.

¿Por qué no simplemente ir t = intR * 255 / 100?

Para el caso, ¿por qué incluso ingresar una escala 0-100, pensar en binario e ingresar una escala 0-255?

    
respondido por el Harper
0

Para la resolución de problemas, eliminaría el valor serial recibido de la ecuación. Solo establece t = 0;

Esto es lo que sospecho que puede estar pasando.

Esta respuesta requiere demasiadas suposiciones porque los valores recibidos no se explicaron. Pero es una posibilidad si el MOSFET está funcionando correctamente.

  

Tengo un módulo HM10 BLE conectado al arduino. Estoy usando el   Aplicación de Android BLE scanner (para pruebas). Una vez que me conecto estoy enviando un   Solicitud de escritura a la característica personalizada del HM10. El arduino es   leyendo los bits y analizando el entero y luego enviando los datos   directamente al pin PWM.

Si entiendo correctamente, está utilizando un solo carácter ASCII en serie para sus valores PWM.

Lo que no explica es los posibles valores que se reciben en el puerto serie.

Un cero, en ASCII, sería un carácter NULO. Donde un "0" sería 32, y 100 sería "d". Suponiendo que está usando valores ASCII de 7 caracteres y esa es la razón por la que está usando valores de nivel de atenuación de 0 a 100.

Eso tendría sentido si en realidad está enviando un "0" (valor de 32) en lugar de NULL (valor cero). Su ojo podría malinterpretar fácilmente la diferencia entre el 32% y el 60% de intensidad luminosa.


No entiendo por qué analogWrite(led, t); está dentro de
if (Serial.available() > 0){} .
Solo podría enviar un único carácter para cambiar el nivel de atenuación si el
analogWrite(led, t);
no estaba dentro de los corchetes if .
Creo que estás enviando innecesariamente un flujo continuo de caracteres.


    
respondido por el Misunderstood

Lea otras preguntas en las etiquetas