-         
Ergebnis 1 bis 5 von 5

Thema: Buck LED Treiber mit Arduino dimmen

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    22.11.2015
    Beiträge
    24

    Buck LED Treiber mit Arduino dimmen

    Anzeige

    Praxistest und DIY Projekte
    Hallo,

    ich möchte mit einem "Arduino Nano" über einen "PWM Pin" mit einem "Constant Current Buck LED Driver " eine LED dimmen.

    Jedoch benötigt der "Buck LED Driver" ein bestimmtes PWM-Signal, dass ich nur mit Veränderungen im Arduino- Code erzeugen kann.

    siehe Datenblatt Buck LED: https://www.mouser.de/datasheet/2/468/RCD-48-958257.pdf

    /************************************************** ************************************************** ******************/
    Laut Datenblatt:

    PWM DIMMING CONTROL & REMOTE ON/OFF CONTROL
    Input Voltage Range: 5V typ. / 10V max.
    Threshold Voltage: Device ON 0.5V max.
    Device OFF 2.0V min.

    PWM Frequency: For Linear Operation 200Hz max.
    Frequency Limit 1000Hz max.
    /************************************************** ************************************************** ******************/

    Weil ich eine lineare Dimmung erreichen möchte, habe ich mir gedacht,dass ich den "Arduino Nano" PIN 3 verwende,
    da dieser 450Hz hat und ich dort dann das PWM Signal auf 150Hz setze(200 Hz max. lineare PWm Operation ).
    Ebenfalls habe ich in meinen Sketch versucht das PWM- Signal zu invertieren, da ja Device On = 0,5V max. und Device OFF = 2,0V min. sind.
    Jedoch bekomme ich nicht das gewünschte Ergebnis. Die LED wird zwar gedimmt, wenn ich mit den Duty Cycle rumspiele , aber die LED geht bei 0 DC nicht aus. Hmmm

    /************************************************** ************************************************** ******************/

    Hier mein Sketch:
    Code:
    //Uno, Nano, Mini 3, 5, 6, 9, 10, 11 490 Hz (Pins 5 und 6: 980 Hz)  
    /********************************************************************/
    int ledPin3 = 3;
    /********************************************************************/
    
    void setup()
    {
      Serial.begin(9600);
      Serial.println("********************************* PWM Test *********************************");  
      changePWmFrequenncy(ledPin3);
    }
    
    void loop()
    {
      if (Serial.available() > 0) 
      {
        char ch = Serial.read();
        int pwmPercent = ch - '0';     
        writePwmInverted(ledPin3,pwmPercent);  
      }
    }
    
    void changePWmFrequenncy(int _ledPin)
    { 
      pinMode(_ledPin, OUTPUT);                          // Set digital pin to an output
      TCCR1A = _BV(COM1A1) | _BV(COM1A0) | _BV(WGM11);  // Enable the PWM output OC1A on digital pins and invert output
      TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS12);     // Set fast PWM and prescaler of 256 on timer 1
      ICR1 = 415.667;                                     // Set the PWM frequency to 150Hz: 16MHz/(256 * 150Hz) - 1 => (16000000/38400)-1 => 416,667 -1 => 415,667
    }
    
    void writePwmInverted(int _ledPin,float _percent)
    { 
      analogWrite(_ledPin, (255 / 100) * _percent);  
      TCCR1A = TCCR1A & ~B00110000; //switch off output B
      TCCR1A |= B00110000;  //switch on the B output with inverted output
    }
    Wie kann ich mein Ziel erreichen und was ist falsch in meinem Code?

    Beste Grüße

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    32
    Beiträge
    4.885
    Es reicht 1 Thread pro Thema, es ist sinnlos 2 mal das gleiche zu posten.

    Jetzt zum eigentlichen Thema.

    1) Du hast bei ICR einen Floatwert, das ICR Register kann aber nur Integerwerte verarbeiten. Hier ist es aber egal, weil es in 415 geändert wird.
    2) Du hast eingestellt das 415,667 dein TOP Wert ist, bedeutet das er bei 0 beginnt und bei 415 einen Überlauf hat. Somit musst du mit 415 und nicht 255 als Maximalwert rechnen.
    3) Was ich auch nicht verstehe ist was du in der Funktion "writePwminverted" vorhast. Du schaltest den Ausgang B ab und in der nächsten Zeile wieder ein, was hat das für einen Sinn?

    Was du auch machen kannst um den Ausgang ganz abzuschalten. Im TCCR1A Register schaltest du den Port wieder auf "Normal Operation" um (also trennen vom Timer) und dann kannst du den Ausgang direkt ein bzw ausschalten. Das kannst du auch in eine eigene Funktion packen.

    Also z.B.
    Led == 0% => Ausgang auf "normal operation" stellen, Ausgang = 1
    Led == 100% => Ausgang auf "normal operation" stellen, Ausgang = 0
    Led > 0% && Led < 100% => Ausgang auf PWM stellen, Vorgabewert in OCR1A schreiben (1...414)

    MfG Hannes

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    22.11.2015
    Beiträge
    24
    Hey Hannes,

    danke für die Hilfe.
    Bei mir wird 0 und 100 % geschaltet, aber beim PWM 1-99% macht er irgendwie nichts.
    Stelle ich den Ausgang so richtig auf PWM um ?

    Code:
    void writePwm(float _percent)
    { 
        if (_percent == 0)
        {       
           pinMode(ledPin, OUTPUT); 
           digitalWrite(ledPin, HIGH); 
        }
        else if (_percent == 100)
        {      
           pinMode(ledPin, OUTPUT); 
           digitalWrite(ledPin, LOW); // Setzt den Digitalpin 13 auf HIGH = "Ein"
        }
        else if (_percent > 0 && _percent < 100)
        {
           //Ausgang auf PWM stellen, Vorgabewert in OCR1A schreiben (1...414)     
           pinMode(ledPin, OUTPUT);                          // Set digital pin to an output
           TCCR1A = _BV(COM1A1) | _BV(COM1A0) | _BV(WGM11);  // Enable the PWM output OC1A on digital pins and invert output
           TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS12);     // Set fast PWM and prescaler of 256 on timer 1
           ICR1 = 415;                                     // Set the PWM frequency to 150Hz: 16MHz/(256 * 150Hz) - 1 => (16000000/38400)-1 => 416,667 -1 => 415,667 => 415
           OCR1A = (415 / 100) * _percent;
        }
    }

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    32
    Beiträge
    4.885
    Ich würde nur mit Integer arbeiten und nicht mit Prozent und Float. Du kannst es aber so machen wie du willst.

    Was ich nicht ganz verstehe ist warum du den Pin immer auf Ausgang setzt. Eigentlich reicht einmal.

    Was du testen kannst ist einfach einmal die PWM erhöhen. Die PWM konfigurieren und mit einem Zähler erhöhst du den PWM Wert (0-Max).

    Kannst du die PWM messen?

    Die Konfiguration des Timers sollte passen.

    MfG Hannes

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    22.11.2015
    Beiträge
    24
    Hi,
    ja klar du hast recht mit dem Float und ja ich brauche den Pin nur einmal auf Ausgang setzen.
    Ich habe die PWM Frequenz erhöht und nun geht alles. Musste ich ein bischen mit den Frequenzen rumspielen. Besitze leider kein Oszi.
    Danke für deine Hilfe

Ähnliche Themen

  1. Buck LED Treiber mit Arduino dimmen
    Von Lord Integer im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 26.02.2020, 19:56
  2. [ERLEDIGT] Treiber für Arduino Uno
    Von trunx im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 2
    Letzter Beitrag: 11.06.2018, 15:22
  3. Finde keinen Treiber für Arduino UNO
    Von Elu im Forum Arduino -Plattform
    Antworten: 5
    Letzter Beitrag: 08.06.2018, 22:30
  4. Verkaufe Arduino + Ramps + Treiber + Kabel
    Von SoulRaiZor im Forum Kaufen, Verkaufen, Tauschen, Suchen
    Antworten: 0
    Letzter Beitrag: 16.05.2015, 13:51
  5. [ERLEDIGT] High-Power LED mit Arduino dimmen
    Von gusi im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 13.04.2015, 06:25

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •