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.

    0 0 votes
    Article Rating
    17 Comments
    Newest
    Oldest Most Voted
    Inline Feedbacks
    Alle Kommentare anzeigen
    Arne
    7 Jahre zuvor

    Ich möchte mit meinem Arduino UNO eine RGB-LED und einen Servomotor ansteuern. Einzeln (nur RGB-LED bzw. nur Servo funktioniert es, wenn ich aber beide zeitgleich nutzen will funktioniert die RGB nicht richtig.
    Was muss ich machen?

    Maik
    9 Jahre zuvor

    Die Frequenz beträgt also 500Hz und ist somit für das Auge nicht wahrnehmbar.
    Für eine Oszilloskop aber schon. ;-)

    Maik
    9 Jahre zuvor

    Zu beachten ist dass der Wert 255 einer Pulsdauer von 2ms entspricht.
    Somit ist der Ausgang bei dem Wert 127 für eine 1ms auf +5V und dann wieder für 1ms auf 0V. Und beim Wert 63 für eine 0,5ms auf +5V und dann wieder für 1,5ms auf 0V.

    9 Jahre zuvor

    我研究出來囉~~其實也沒啥研究拉…就是照Cooper的方式實作XD分享在這下面是Arduino端的程式其實也就是接收電腦端從com port傳來的數字訊號,然後在判讀訊號發射相對應的紅外線:))至於C#那邊的程式太多拉…貼這會報掉XDD#include // 引用 IRRemote 函式庫IRsend irsend; // 定義 IRsend 物件來發射紅外線訊號int iinnmcogByte = 0; // 用來儲存收進來的 data bytevoid setup() { // 開啟 Serial port, 通訊速率為 9600 bps Serial.begin(9600);}void loop() { // 檢查是否有資料可供讀取 if (Serial.available() > 0) { // 讀取一個 byte iinnmcogByte = Serial.read(); // 決定打開或關掉 LED if (incomingByte == ‚1‘) irsend.sendNEC(0xFB30CF, 32); //前進 else if(incomingByte == ‚2‘) irsend.sendNEC(0xFBF20D, 32); //後退 else if(incomingByte == ‚3‘) irsend.sendNEC(0xFB9867, 32);//左轉 else if(incomingByte == ‚4‘) irsend.sendNEC(0xFB32CD, 32); //右轉 else irsend.sendNEC(0xFBA05F, 32); //停止 }}

    Chris
    10 Jahre zuvor

    Eine grundsätzliche Frage eines Einsteigers an der Stelle: Die Pins, die (so wie ich das verstanden habe) grundsätzlich PWM könnten, sind demnach universell? Wenn ich also die Einsteiger-Beispiele (z. B. das einfache BLINK) abwandle, brauche ich dann keine Rücksicht auf diese Beschriftung zu nehmen? Sprich – eine LED kann ich mit den gleichen Befehlen genausogut über Pin 5 wie über Pin 8 ansteuern?

    Doce
    12 Jahre zuvor

    Der Vollständigkeit halber: LED sind eigentlich keine „trägen“ Bauteile im ursprünglichen Sinne des Wortes – träge ist vielmehr das Auge, das das PWM-Flackern ab einer bestimmten Frequenz einfach nicht mehr wahrnimmt

    Nick
    12 Jahre zuvor

    digitalWrite(FET_LS_R, LOW);
    delay (1);
    digitalWrite(FET_HS_R, HIGH);
    delay (5);
    digitalWrite(FET_HS_R, LOW);
    delay (1);
    digitalWrite(FET_LS_R, HIGH);
    delay (5);
    break;

    ein Lösungsansatz für alle die dasselbe Problem besitzen, jedoch kleine Frequenz..

    Nochmals besten Dank!

    Nick
    12 Jahre zuvor

    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

    12 Jahre zuvor

    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“

    Nick
    12 Jahre zuvor

    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?