PWM bedeutet Pulse Width Modulation und beschreibt ein Verfahren, bei dem der Strom in schneller Abfolge ein- und abgeschaltet wird. Ein Zeitintervall ist dabei 20 Millisekunden lang. Träge Bauelemente kann man durch ein PWM Signal dimmen. Ist der Strom z.B. 10 Millisekunden ein- und danach 10 Millisekunden abgeschaltet, ist der resultierende Strom nur halb so groß. Eine LED würde also nur halb so kräftig leuchten.
Befehl
analogWrite(pwmPin, value);
value: 0 – 255
pin: Muss ein PWM-Pin sein. Auf dem Arduino-UNO-Board gibt es sechs Kanäle, die PWM-Signale erzeugen können: 3,5,6,9,10,11.
Hintergrund
Pulsweitenmodulation oder PWM ist eine Technik, die digitale Methoden verwendet, um analoge Ergebnisse zu erhalten. Dabei wird der digitale Controller verwendet, um Rechteckwellen zu erzeugen, d. h. Signale zum Öffnen und Schließen. Dieser Ein-Aus-Modus kann die Spannung zwischen dem vollständig eingeschalteten Zustand (5 Volt) und dem ausgeschalteten Zustand (0 Volt) basierend auf dem Verhältnis der Einschaltzeit zum Ausschaltzeit simulieren.
Die Dauer der Einschaltzeit wird als Impulsbreite bezeichnet. Um unterschiedliche Analogwerte zu erhalten, kann man diese Impulsbreite ändern oder modulieren. Verwendet man diese Modulation beispielsweise mit einer LED, entspricht das Ergebnis dem, als ob die durch LED eine konstante Spannung zwischen 0 und 5 V versorgt würde. Sie beeinflusst die Helligkeit der LED.
In der Abbildung stellt der Abstand der blauen Linien eine feste Zeitspanne dar. Die Dauer oder Periode ist der Kehrwert der PWM-Frequenz. Mit anderen Worten, in dem Fall, in dem die Arduino-PWM-Frequenz ungefähr 500 Hz beträgt, entsprechen die grünen Linien 2 ms. Der Wertebereich von AnalogWrite() liegt zwischen 0 und 255. Daher erfordert analogWrite(255) beispielsweise ein Verhältnis zwischen An und Aus von 100% (immer eingeschaltet), während analogWrite (127) ein Verhältnis zwischen An und Aus von 50% (die Hälfte der Zeit) erfordert.
PWM-Pins verschiedener Boards
- Arduino UNO: 3, 5, 6, 9 – 11
- Arduino MEGA: 2 – 13, 44 – 46
- Arduino Leonardo, Micro Yún: 3, 5, 6, 9, 10, 11, 13
- NodeMCU: D1 – D8, D12
- Teensy3: 3 – 6, 9, 10, A6 – A9
Pingback: So baust du einen Kronleuchter mit Arduino – Ein Arduino Tutorial
是不是無法同時發射2組以上的脈波? 底下的程式只有第1組可以正常動作:/* * irObjectDetection.pde: 紅外線物體偵測 */ const int irRec1 = 2; // 紅外線接收器 const int irLed1 = 3; // 紅外線發射器 const int ledPin1 = 12; // 紅外線指示燈 const int irRec2 = 4; // 紅外線接收器 const int irLed2 = 5; // 紅外線發射器 const int ledPin2 = 13; // 紅外線指示燈 const unsigned int frqeneucy = 38000; // 發射頻率(單位: Hz) void setup() { pinMode(irRec1, INPUT); // 把 irReceiver 接腳設置為 INPUT pinMode(irLed1, OUTPUT); // 把 irLed 接腳設置為 INPUT pinMode(ledPin1, OUTPUT); // 把 ledPin 設置為 OUTPUT pinMode(irRec2, INPUT); // 把 irReceiver 接腳設置為 INPUT pinMode(irLed2, OUTPUT); // 把 irLed 接腳設置為 INPUT pinMode(ledPin2, OUTPUT); // 把 ledPin 設置為 OUTPUT tone(irLed1, frqeneucy); // 產生指定頻率的脈波 (Pulses) tone(irLed2, frqeneucy); // 產生指定頻率的脈波 (Pulses) } // 讓指示燈閃爍幾下 void blinkLED(int ledPin) { for (int i=1; i<= 3; i++) { digitalWrite(ledPin, HIGH); // 打開指示燈 delay(100); digitalWrite(ledPin, LOW); // 關掉指示燈 delay(100); } } void loop() { int ir1 = digitalRead(irRec1); // 讀取 irReceiver 的狀態 if (ir1 == 0) blinkLED(ledPin1); // 讓指示燈閃爍幾下 int ir2 = digitalRead(irRec2); // 讀取 irReceiver 的狀態 if (ir2 == 0) blinkLED(ledPin2); // 讓指示燈閃爍幾下 }
Es heißt ausgeschaltet und nicht ausgeschalten!
Du kannst etwas ausschalten, aber wenn du das getan hast, ist es ausgeschaltet und nicht ausgeschalten. grrrrr
Wie mich das auch immer in den Videos nervt.
Entschuldige bitte, dass ich so direkt bin, ist nicht böse gemeint.
Musste ich jetzt mal loswerden ;-)
@Ralf: Ja, da hast du recht. Eigentlich pulst eine LED so schnell, dass sie eben nur dunkler aussieht.
Was das Dimmen von LEDs betrifft stimmt die Erklärung leider nicht. Im Gegensatz zu Glühlampen sind LEDs sehr schnelle Bauelemente. Aus diesem Grund kann man LEDs für Signalübertragungen bis in den zweistelligen MHz-Bereich verwenden. Das träge Element ist in diesem Fall das menschliche Auge.
Für Systeme wie z.B. Glühlampen, die ja mit einem Glühdraht eine thermische Trägheit aufweisen oder für E-Motoren mit ihrer mechanischen Trägheit stimmt die Erklärung.
Das Arduino-Board kann man auch extern takten – ob man damit 25kH PWM erreichen kann weiss ich nicht.
@Jürgen: Hm, das weiß ich leider auch nicht. Vielleicht ist für solche Frequenzen das Arduino nicht geeignet?
Hi,
das original PWM ist ja recht langsam, wie du selber schreibst.
Wie kann man hohe PWM Frequenzen ausgeben, z.B. im Bereich von 25 kHz?
Danke.
Jürgen
yes rainer
Die Kommentarfunktion ist deaktiviert.