Zum Inhalt springen

Analog Out

    Sechs der digitalen Kanäle auf dem Arduino-Board sind nicht nur digital, sondern auch analog ansteuerbar. Sie sind mit dem Aufdruck PWM gekennzeichnet (Kanal 3, 5, 6, 9, 10, 11).

    PWM (Pulse Width Modulation) bedeutet, dass kein konstantes Signal an dem Kanal anliegt, sondern dass dieser Kanal kontinuierlich an- und abgeschaltet wird. In der Arduino-Software übergibt man einen Wert zwischen 0 und 255 an den Kanal. 0 entspricht dem GND (Minus-Pol), 255 entspricht 5V+, Zwischenwerte bedeuten für träge Bauteile (LEDs, Motoren, etc.) also eine Spannung zwischen 0 und 5V. Damit kann man also die Geschwindigkeit von Motoren oder die Helligkeit einer LED regulieren.

    (Motoren sollten nicht direkt an einen Arduino-Kanal angeschlossen werden. Mehr dazu im Abschnitt Motorsteuerung.)


    Sieh dir jetzt meinen neuen Arduino-Videokurs an: Jetzt ansehen!


    Das Arduino-Beispiel Fading (File>Examples>Analog>Fading) zeigt, wie man eine LED dimmt. Hier der Code von David A. Mellis:

    // by David A. Mellis and Tom Igoe
    
    int ledPin = 9;
    
    void setup() {
    
    }
    
    void loop() {
      for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
        analogWrite(ledPin, fadeValue);
        delay(30);
      }
      for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
        analogWrite(ledPin, fadeValue);
        delay(30);
      }
    }

    Im Gegensatz zur digitalen Ausgabe muss ein analog angesprochener Kanal nicht im Setup deklariert werden. Der Befehl analogWrite erhält als Parameter den Pin, an dem die LED angeschlossen ist und den Wert (0 – 255), wie hell die LED leuchten soll.

    18 Gedanken zu „Analog Out“

    1. Hallo Stefan,

      zusätzliche Dioden sind vorerst keine Lösung :-)

      das delay ist eine tolle und elegante Idee, jedoch wird mein Signal doch nur verzögert ausgegeben, die Phasen werden letztendlich dennoch gleich sein. Oder verwechsele ich hier was?

      bsp.

      analogWrite(FET_HS_R, 125);
      delay (—);
      analogWrite(FET_LS_R, 125);

      Gruß,
      Nick

    2. Hi Nick,

      wow. Was hast du vor. Die Diode ist doch genau dafür da. Wenn die zu klein ist, kannst du selbst noch Freilaufdioden verschalten.

      Ansonsten kann man analogWrite nicht phasenverschieben, soviel ich weiß, aber du kannst die Phasen mit digitalWrite selbst pulsen. Es gibt einen delayMicroseconds Befehl. Das sollte exakt genug sein.

      Liebe Grüße

      Stefan”

    3. Danke für die schnelle Rückmeldung.
      Soweit ist das Verständlich, jedoch möchte ich ein Kanal Phasenverschoben steuern damit sich bei der PWM, die ungewünschte Induktivität meines Motors nicht die Freilaufdiode zerstört, dies wollte ich gerne per Software sicherstellen…

      Ist es den prinzipiell mögliche mittels analogWrite-Befehl ein Signal Phasenverschoben zu generieren? Oder wird hier nur die Modulationsbreite bestimmt?

    4. @Nick: Da mach dir keine Sorgen. Das ist einfach: Strom fließt ja von + zu –

      Motor links rum:
      analogWrite(pin1,0) ist GND
      analogWrite(pin2,255) ist 5V+

      Motor rechts rum:
      analogWrite(pin1,255) ist 5V+
      analogWrite(pin2,0) ist GND

      Liebe Grüße

      Stefan”

    5. vorab super Tutorial-Page!

      spiele auch gerade mit einem Arduino 2560, und möchte eine PWM erzeugen welche meine Vollbrücke steuert. Brauch ein inventiertes Signal von analogWrite(FET_HS_L, 125);
      hab mir gedacht das folgend zu erstellen,
      analogWrite(FET_HS_L, 125);
      analogWrite(FET_LS_L, -125);
      jedoch ist das Signal gleich dem anderem.
      jemand eine Idee?

    6. @Atalanttore.

      Für eine for Schleife oder auch Zählschleife gilt
      for (initalisierung; abbruchbedingung; anweisung) {
      inhalt
      }

      * Beim eintritt in die schleife wird die “initialisierung” durchgeführt.
      * Für jeden durchlauf wird die “abbruchbedingung” geprüft und entweder abgebrochen (false) oder der inhalt (true) ausgeführt
      * Nach Durchführung von “inhalt” wird “anweisung” ausgeführt.

      Würde man die for schleife aus dem Beispiel als while schleife implementieren würde diese z.B. so aussehen:

      int fadeValue = 0;
      while (fadeValue <= 255) {
      analogWrite(ledPin, fadeValue);
      delay(30);
      fadeValue +=5
      }

    7. Also alles, was ins Void Setup gehört schreibt man vor..

      “void setup() {

      }”

      Alles was permanent “bearbeitet” werden soll schreibt man nach..

      void loop() {

      ?

    8. Danke für die Erklärung.

      Das int fadeValue = 0 in der Schleifenbedingung wird nur beim ersten Durchgang der Schleife durchlaufen oder irre ich mich da? Ein anderes Verhalten würde aus der Schleife ja eigentlich eine Dauerschleife machen.

    9. Das Bedeutet quasi: Solange fadeValue kleiner oder geich 255 ist (<=), setze fadeValue auf seinen eigenen Wert + 5 (+=5)…

      Er geht also die Schleife in 5er Schritten bis 255 durch.

    10. Was bedeuten <= und += in der Bedingung
      for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5)
      ???

    Die Kommentarfunktion ist deaktiviert.