Dasar · 5 mnt baca

Apa Itu PWM? Panduan analogWrite, Duty Cycle, dan Frekuensi di Arduino

Apa itu PWM (pulse width modulation) dan bagaimana cara kerjanya? Duty cycle dan frekuensi, pin PWM Arduino, kecerahan LED dan kecepatan motor dengan analogWrite, perbedaannya dengan servo, LEDC ESP32, dan PWM Raspberry Pi Pico.

Pin digital Arduino hanya mengenal dua hal: 0 V atau 5 V. Lalu bagaimana caranya meredupkan LED sampai setengah terang atau membuat motor berputar pelan? Jawabannya adalah PWM (Pulse Width Modulation). Pin dinyalakan dan dimatikan dengan sangat cepat, dan dengan mengubah perbandingan waktu nyalanya, kamu mengatur daya rata-rata yang diterima beban. Peredupan LED, pengaturan kecepatan motor, penggerak servo, pembuat suara, bahkan charger ponsel semuanya memakai teknik ini.

LED yang dikendalikan dengan PWM oleh Arduino
Dengan PWM kamu menyalakan dan mematikan LED ratusan kali per detik untuk mengatur kecerahannya ke tingkat mana pun yang kamu mau.

Bagaimana cara kerja PWM?

Sinyal PWM adalah gelombang kotak: sinyalnya HIGH selama beberapa waktu, lalu LOW, dan siklus itu terus berulang. Panjang satu siklus nyala-mati disebut periode, dan perbandingan waktu sinyal tetap HIGH dalam satu periode disebut duty cycle. Pada duty cycle 25%, sinyal menyala seperempat waktu, jadi pin 5 V berperilaku seperti 1,25 V secara rata-rata. LED berkedip sekitar 490 kali per detik; matamu tidak bisa mengikutinya dan hanya melihat kecerahan rata-ratanya. Motor, berkat kelembamannya, meratakan pulsa-pulsa itu dan berputar dengan kecepatan rata-rata.

Duty cycleNilai analogWriteTegangan rata-rata (5 V)LED
0%00 VMati
25%641,25 VRedup
50%1272,5 VSetengah terang
75%1913,75 VTerang
100%2555 VTerang penuh

Mata kita tidak merespons cahaya secara linear: perubahan di tingkat rendah sangat terasa, sedangkan perubahan di tingkat tinggi jauh kurang terasa. Itulah sebabnya LED dengan duty cycle 50% terlihat jauh lebih terang dari setengahnya. Untuk peredupan yang terlihat alami, dipakai koreksi gamma seperti di bawah ini.

Frekuensi: seberapa cepat PWM?

Frekuensi adalah berapa kali per detik sinyal menyala dan mati. Di Arduino Uno, pin 5 dan 6 bekerja di sekitar 980 Hz dan pin 3, 9, 10, dan 11 di sekitar 490 Hz. Untuk LED, frekuensi ini sudah lebih dari cukup. Namun untuk motor, 490 Hz berada di rentang yang bisa kamu dengar dan motor bisa sedikit berdengung; di ESP32 dan Pico kamu bisa menaikkan frekuensinya ke 20 kHz supaya senyap. Meski begitu, menaikkan frekuensi jauh melebihi kebutuhan membuat transistor dan MOSFET memanas.

BoardPin PWMFrekuensi bawaanResolusi
Arduino Uno / Nano3, 5, 6, 9, 10, 11490 Hz (5 dan 6: 980 Hz)8-bit (0–255)
Arduino Mega2–13, 44–46490 Hz (4 dan 13: 980 Hz)8-bit (0–255)
ESP32Hampir semua pin outputBisa diatur (analogWrite: 1 kHz)1–16-bit
Raspberry Pi PicoSemua pin GPIOBisa diatur16-bit (0–65535)

Kecerahan LED dengan analogWrite

Di Arduino, PWM dibuat dengan analogWrite(pin, value), dengan nilai antara 0 dan 255. Meski namanya menyesatkan, perintah ini tidak menghasilkan tegangan analog sungguhan; yang dihasilkan adalah PWM. Perintah ini hanya berfungsi di pin yang bertanda ~. Kode di bawah menyalakan dan meredupkan LED pelan-pelan untuk efek “bernapas”:

C++ (Arduino IDE)
1const int LED_PIN = 9;   // ~ işaretli PWM pini / PWM pin marked with ~
2
3void setup() {
4  pinMode(LED_PIN, OUTPUT);
5}
6
7void loop() {
8  for (int v = 0; v <= 255; v++) {   // yavaşça yan / fade in
9    analogWrite(LED_PIN, v);
10    delay(8);
11  }
12  for (int v = 255; v >= 0; v--) {   // yavaşça sön / fade out
13    analogWrite(LED_PIN, v);
14    delay(8);
15  }
16}
Untuk peredupan yang lebih alami, skalakan nilainya dengan mengkuadratkannya: analogWrite(LED_PIN, (long)v * v / 255);. Bagian (long) penting di sini: di Uno, int tidak bisa menampung angka di atas 32.767, jadi 255 × 255 akan overflow.

Mengatur kecerahan dengan potensiometer

Kalau kamu menghubungkan potensiometer ke A0, kamu bisa mengatur kecerahan LED secara manual. analogRead() mengembalikan nilai dari 0 sampai 1023; membaginya dengan 4 menghasilkan rentang 0–255 yang dibutuhkan analogWrite. Pengkabelan potensiometer dibahas di Apa Itu Potensiometer?

C++ (Arduino IDE)
1void loop() {
2  int pot = analogRead(A0);   // 0–1023
3  analogWrite(9, pot / 4);    // 0–255
4}

Kecepatan motor DC dengan PWM

Motor DC kecil pun menarik ratusan miliampere, sedangkan pin Arduino hanya aman memberi sekitar 20 mA. Karena itu motor dikendalikan melalui transistor, MOSFET, atau driver motor seperti L298N, dan sinyal PWM masuk ke input kecepatan driver. Di L298N, input ini adalah pin ENA (dan ENB untuk motor kedua); untuk memakai PWM, kamu perlu melepas jumper di pin itu. Pin IN1 dan IN2 mengatur arah putaran.

Modul driver motor L298N
Driver motor L298N: PWM di pin ENA dan ENB mengatur kecepatan dua motor DC secara terpisah.
C++ (Arduino IDE)
1const int ENA = 9;   // hız (PWM) / speed (PWM)
2const int IN1 = 8;   // yön / direction
3const int IN2 = 7;
4
5void setup() {
6  pinMode(ENA, OUTPUT);
7  pinMode(IN1, OUTPUT);
8  pinMode(IN2, OUTPUT);
9  digitalWrite(IN1, HIGH);   // ileri / forward
10  digitalWrite(IN2, LOW);
11}
12
13void loop() {
14  analogWrite(ENA, 255);  delay(2000);   // tam hız / full speed
15  analogWrite(ENA, 150);  delay(2000);   // orta hız / medium speed
16  analogWrite(ENA, 0);    delay(2000);   // dur / stop
17}
Jangan pernah menghubungkan motor langsung ke pin Arduino; arus yang ditariknya dan tegangan balik yang dihasilkannya akan merusak pin. Selain itu, pada nilai duty yang sangat rendah motor hanya berdengung tanpa berputar; sebagian besar motor butuh nilai minimal sekitar 80–120 untuk mulai bergerak.

Apakah motor servo dan PWM itu sama?

Motor servo juga dikendalikan dengan pulsa, tetapi logikanya berbeda: posisinya ditentukan oleh lebar pulsa, bukan oleh duty cycle. Servo mengharapkan 50 pulsa per detik (50 Hz); pulsa 1 milidetik berarti sekitar 0°, 1,5 ms berarti 90°, dan 2 ms berarti 180°. analogWrite tidak bisa menghasilkan pewaktuan ini, itulah sebabnya servo memakai library Servo. Detailnya ada di Apa Itu Motor Servo?

Tegangan analog sungguhan dari PWM: filter RC

Kadang kamu benar-benar butuh tegangan yang stabil, misalnya untuk memberi referensi ke op-amp atau untuk mendapatkan output audio. Dalam kasus itu, PWM dilewatkan melalui filter lolos rendah yang terdiri dari resistor dan kapasitor. Dengan 10 kΩ dan 10 µF, konstanta waktunya 0,1 detik; output-nya cukup halus tetapi lambat merespons perubahan. Kamu bisa mencoba nilai yang berbeda dengan kalkulator konstanta waktu RC. ESP32 klasik juga punya dua DAC di GPIO 25 dan 26 yang memberi output analog sungguhan.

PWM di ESP32: LEDC

Di ESP32, PWM dibuat oleh perangkat keras bernama LEDC, dan kamu yang memilih frekuensi dan resolusinya. Di Arduino core 3.x kamu memakai ledcAttach(pin, frequency, resolution) dan ledcWrite(pin, value); versi 2.x yang lebih lama memakai perintah berbasis channel ledcSetup dan ledcAttachPin. Contoh di bawah meredupkan LED di 5 kHz dengan resolusi 8-bit:

C++ (Arduino IDE)
1const int LED_PIN = 2;
2
3void setup() {
4  ledcAttach(LED_PIN, 5000, 8);   // 5 kHz, 8 bit (0–255) — ESP32 Arduino core 3.x
5}
6
7void loop() {
8  for (int d = 0; d <= 255; d++) { ledcWrite(LED_PIN, d); delay(5); }
9  for (int d = 255; d >= 0; d--) { ledcWrite(LED_PIN, d); delay(5); }
10}

PWM di Raspberry Pi Pico (MicroPython)

Setiap pin GPIO di Pico bisa mengeluarkan PWM. Di MicroPython kamu memakai kelas PWM, mengatur frekuensi dengan freq() dan duty cycle dengan duty_u16(), yang menerima nilai dari 0 sampai 65535:

MicroPython
1from machine import Pin, PWM
2import time
3
4led = PWM(Pin(15))
5led.freq(1000)                        # 1 kHz
6
7while True:
8    for d in range(0, 65536, 512):    # yavaşça yan / fade in
9        led.duty_u16(d)
10        time.sleep_ms(5)
11    for d in range(65535, -1, -512):  # yavaşça sön / fade out
12        led.duty_u16(d)
13        time.sleep_ms(5)

Ide proyek dengan PWM

  • LED bernapas: lampu status yang menyala dan meredup pelan seperti perangkat dalam mode siaga.
  • Lampu meja yang bisa diredupkan: lampu LED yang kecerahannya kamu atur dengan potensiometer.
  • Kipas yang dikendalikan suhu: percepat kipas seiring naiknya suhu yang diukur DHT11.
  • Mencampur warna: buat jutaan warna di LED RGB dengan tiga channel PWM.
  • Mobil robot: buat belokan lebih mulus dengan mengatur kecepatan dua motor secara terpisah.
  • Lampu matahari terbit: terangkan lampu pelan-pelan selama 15 menit sebelum alarm pagimu berbunyi.

Kesalahan umum dan cara mengatasinya

  • analogWrite di pin non-PWM: di Uno, pin tanpa tanda ~ hanya bisa menyala atau mati; 128 ke atas dianggap nyala, nilai di bawahnya mati.
  • Pin 9 dan 10 bersama library Servo: di Uno, library Servo memakai Timer1 dan mematikan PWM di kedua pin ini; pindahkan LED atau motormu ke pin PWM lain.
  • Pin 3 dan 11 bersama tone(): tone() memakai Timer2 dan merusak PWM di pin-pin ini.
  • Menghubungkan motor langsung ke pin: selalu pakai transistor, MOSFET, atau driver motor.
  • Overflow di perhitungan gamma: v * v melewati batas int; tambahkan cast (long).
  • Menganggap PWM sebagai analog sungguhan: multimeter menunjukkan rata-ratanya, tetapi sinyalnya tetap berayun antara 0 dan 5 V; untuk rangkaian yang sensitif, pakai filter RC atau DAC.

PWM adalah salah satu konsep paling berguna yang akan kamu pelajari di Arduino: LED, motor, kipas, dan speaker semuanya dikendalikan dengan trik sederhana ini. Untuk dasarnya, lihat Apa Itu LED?; di aplikasi BlueGrays kamu akan menemukan proyek peredupan LED dengan PWM, kecerahan dengan potensiometer, dan transisi warna RGB langkah demi langkah lengkap dengan kode.

Pertanyaan umum

Apa itu PWM secara singkat?

PWM adalah cara mengatur daya rata-rata yang diterima beban dengan menyalakan dan mematikan pin dengan sangat cepat dan mengubah perbandingan waktu nyalanya (duty cycle). Dengan PWM, pin digital yang hanya bisa mengeluarkan 0 atau 5 V dapat meredupkan LED atau memperlambat motor.

Pin mana saja yang mendukung PWM di Arduino Uno?

Di Uno dan Nano, pin 3, 5, 6, 9, 10, dan 11 mendukung PWM; pin-pin ini bertanda ~ di board. Di Mega, pin 2–13 dan 44–46 bisa mengeluarkan PWM.

Apakah analogWrite memberi output analog sungguhan?

Tidak. analogWrite menghasilkan PWM; pinnya berpindah cepat antara 0 dan 5 V. Perintah ini mengatur tegangan rata-rata, tetapi untuk tegangan yang benar-benar stabil, kamu perlu melewatkan PWM melalui filter RC atau memakai DAC seperti yang ada di ESP32.

Bagaimana cara menghitung duty cycle?

Duty cycle adalah waktu sinyal tetap HIGH dibagi seluruh periode: (waktu HIGH / periode) × 100. Di Arduino, kamu mendapatkannya dengan membagi nilai analogWrite dengan 255 lalu mengalikan 100; misalnya, 64 kira-kira 25%.

Bagaimana cara mengubah frekuensi PWM di Arduino?

analogWrite tidak mengubah frekuensi. Di Uno kamu bisa mengaturnya dengan mengubah register timer (misalnya TCCR1B untuk pin 9 dan 10), tetapi ini bisa memengaruhi millis dan library. Di ESP32 frekuensinya diatur langsung dengan ledcAttach, dan di Pico dengan freq().

Bisakah PWM merusak LED?

Tidak. LED menyala dengan arus penuh selama setiap pulsa, tetapi arus itu sudah dibatasi oleh resistor seri, dan arus rata-ratanya turun sebanding dengan duty cycle. Selama kamu memakai resistor yang tepat, PWM tidak memperpendek umur LED.

Lihat semua proyek
LED Fade dengan PWM ESP32
#110Pemula

LED Fade dengan PWM ESP32

Mengubah kecerahan LED secara halus dari 0 ke maksimum, dan dari maksimum ke 0. Kita mengendalikan PWM dengan analogWrite() seperti di Arduino; sintaks yang sama bekerja tanpa masalah di ESP32 Arduino Core 3.0+. Definisi pin + pinMode + analogWrite sudah cukup.

4.8(36)
54
LED Fade PWM Raspberry Pi Pico (Efek Bernapas)
#160Pemula

LED Fade PWM Raspberry Pi Pico (Efek Bernapas)

LED tidak lagi sekadar berkedip, ia bernapas! Dengan PWM (Pulse Width Modulation) Pico, kecerahan LED naik lalu turun perlahan, seperti lampu MacBook yang tidur. Pelajari kelas machine.PWM, duty_u16() (kecerahan 16-bit 0–65535), frekuensi PWM (freq(1000): 1000 siklus per detik, tanpa kedipan terlihat), loop range() bertahap, dan output mirip analog dari pin digital. PWM juga dipakai untuk warna RGB, motor, servo, dan buzzer.

0.0(0)
4
Kendali Kecerahan LED dengan Potensiometer ESP32 (Analog → PWM)
#115Menengah
Premium

Kendali Kecerahan LED dengan Potensiometer ESP32 (Analog → PWM)

Di proyek ini, kita mengendalikan kecerahan LED secara analog memakai potensiometer. Pin ADC ESP32 membaca tegangan 0-3,3V dari potensiometer, lalu nilai ini diubah menjadi sinyal PWM (Pulse Width Modulation) dan dikirim ke LED. Hasilnya, ketika kamu memutar potensiometer, LED perlahan menerang dan meredup. Dengan Arduino Core 3.0+, analogWrite() bisa langsung dipakai; di ESP32-S2/S3, resolusi ADC tetap 12-bit.

4.5(19)
32
Transisi Warna Halus dengan LED RGB
#40Pemula
Premium

Transisi Warna Halus dengan LED RGB

Satu LED RGB perlahan bergeser dari merah ke hijau, hijau ke biru, lalu kembali ke merah, berputar melewati warna pelangi tanpa pernah berhenti. Setiap peralihan butuh sekitar dua setengah detik, dan

4.8(58)
76
Kendali LED RGB ESP32
#111Pemula

Kendali LED RGB ESP32

Menghasilkan warna tanpa batas dengan satu LED RGB alih-alih 3 LED terpisah. Seperti di Arduino, kita membuat transisi pelangi dengan mengatur nilai R/G/B lewat analogWrite(). Teori warna (seperti merah+hijau=kuning) terlihat secara praktis.

4.6(29)
51
Siklus Warna LED RGB Raspberry Pi Pico (PWM 3 Kanal)
#161Pemula

Siklus Warna LED RGB Raspberry Pi Pico (PWM 3 Kanal)

Satu LED, jutaan warna! LED RGB berisi 3 LED: merah, hijau, dan biru. Masing-masing digerakkan dengan kanal PWM Pico sendiri: merah + hijau = kuning, hijau + biru = cyan, ketiganya = putih. LED berputar melewati 8 warna. Pelajari beberapa kanal PWM, mendefinisikan fungsi (def set_color(...)), pencampuran warna RGB (cara kerja layar), konversi 8-bit → 16-bit (x257 memetakan 0–255 ke 0–65535), dan LED katoda bersama vs anoda bersama.

0.0(0)
6
Motor Servo ESP32 (Kendali Potensiometer)
#118Menengah
Premium

Motor Servo ESP32 (Kendali Potensiometer)

Di proyek ini, kita mengendalikan motor servo SG90 memakai potensiometer. Kita mengatur sudut servo dengan memetakan nilai analog yang dibaca dari potensiometer ke rentang 0–180 derajat. Library ESP32Servo menghasilkan sinyal servo di pin GPIO ESP32 yang sesuai dan bisa menjadi output; proyek ini memakai GPIO 18. Ini metode kendali dasar untuk lengan robot, gimbal kamera, dan mekanisme pintu otomatis.

4.3(29)
42
Lampu Pencampur Warna ESP32 (3 Potensiometer + LED RGB + OLED)
#138Mahir
Premium

Lampu Pencampur Warna ESP32 (3 Potensiometer + LED RGB + OLED)

Lampu pencampur warna pintar: campur warna apa pun dengan memutar tiga potensiometer di ESP32! Ketika potensiometer merah, hijau, dan biru diputar, LED RGB katoda bersama berubah warna secara real-time. OLED SSD1306 menampilkan nilai setiap warna dalam rentang 0–255, bar pengisi, dan kode warna web HEX (seperti #FF8040). Studio warna mini yang mengajarkan teori warna RGB, pembacaan ADC, pengaturan kecerahan dengan PWM, dan desain layar I2C sekaligus.

4.7(6)
10