PWM Nedir? Arduino'da analogWrite, Duty Cycle ve Frekans Rehberi
PWM (darbe genişlik modülasyonu) nedir, nasıl çalışır? Duty cycle ve frekans, Arduino PWM pinleri, analogWrite ile LED parlaklığı ve motor hızı, servo farkı, ESP32 LEDC ve Raspberry Pi Pico PWM.
Arduino'nun dijital pinleri yalnızca iki şey bilir: 0 V ya da 5 V. Peki bir LED'in parlaklığını yarıya nasıl indirirsin ya da bir motoru nasıl yavaş döndürürsün? Cevap PWM'dir (Pulse Width Modulation, darbe genişlik modülasyonu). Pin çok hızlı bir şekilde açılıp kapatılır ve açık kalma süresinin oranı değiştirilerek yüke giden ortalama güç ayarlanır. LED kısma, motor hız kontrolü, servo sürme, ses üretme ve hatta telefon şarj cihazları bu tekniği kullanır.

PWM nasıl çalışır?
PWM sinyali bir kare dalgadır: belirli bir süre HIGH, sonra LOW olur ve bu döngü sürekli tekrarlanır. Bir açık-kapalı döngüsünün süresine periyot, sinyalin HIGH kaldığı sürenin periyoda oranına ise duty cycle (görev döngüsü) denir. Duty cycle %25 ise sinyal zamanın dörtte birinde açıktır ve 5 V'luk bir pin ortalamada 1,25 V gibi davranır. LED saniyede yaklaşık 490 kez yanıp söner; göz bu hızı takip edemez ve yalnızca ortalama parlaklığı görür. Motor ise ataleti sayesinde bu darbeleri yumuşatır ve ortalama hıza göre döner.
| Duty cycle | analogWrite değeri | Ortalama gerilim (5 V) | LED |
|---|---|---|---|
| %0 | 0 | 0 V | Sönük |
| %25 | 64 | 1,25 V | Loş |
| %50 | 127 | 2,5 V | Yarı parlak |
| %75 | 191 | 3,75 V | Parlak |
| %100 | 255 | 5 V | Tam parlak |
Gözümüz ışığa doğrusal tepki vermez: düşük seviyelerdeki değişimleri çok iyi fark eder, yüksek seviyelerdekileri daha az. Bu yüzden %50 duty cycle'daki bir LED yarıdan çok daha parlak görünür. Doğal görünen bir kısma için aşağıda göreceğin gama düzeltmesi kullanılır.
Frekans: PWM ne kadar hızlı?
Frekans, sinyalin saniyede kaç kez açılıp kapandığıdır. Arduino Uno'da 5 ve 6. pinler yaklaşık 980 Hz, 3, 9, 10 ve 11. pinler yaklaşık 490 Hz ile çalışır. LED için bu frekanslar fazlasıyla yeterlidir. Motorlarda ise 490 Hz kulağın duyduğu aralıktadır ve motordan hafif bir vınlama gelebilir; ESP32 ve Pico'da frekansı 20 kHz'e çıkararak motoru sessizleştirebilirsin. Frekansı gereğinden çok yükseltmek ise transistör ve MOSFET'lerde ısınmaya yol açar.
| Kart | PWM pinleri | Varsayılan frekans | Çözünürlük |
|---|---|---|---|
| Arduino Uno / Nano | 3, 5, 6, 9, 10, 11 | 490 Hz (5 ve 6: 980 Hz) | 8 bit (0–255) |
| Arduino Mega | 2–13, 44–46 | 490 Hz (4 ve 13: 980 Hz) | 8 bit (0–255) |
| ESP32 | Neredeyse tüm çıkış pinleri | Ayarlanabilir (analogWrite: 1 kHz) | 1–16 bit |
| Raspberry Pi Pico | Tüm GPIO pinleri | Ayarlanabilir | 16 bit (0–65535) |
analogWrite ile LED parlaklığı
Arduino'da PWM üretmenin yolu analogWrite(pin, değer) komutudur; değer 0 ile 255 arasındadır. Adı yanıltıcı olsa da bu komut gerçek bir analog gerilim üretmez, PWM üretir. Yalnızca üzerinde ~ işareti olan pinlerde çalışır. Aşağıdaki kod bir LED'i yavaşça yakıp söndürerek "nefes alan" bir efekt oluşturur:
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}Potansiyometreyle parlaklık kontrolü
Bir potansiyometreyi A0'a bağlarsan LED'in parlaklığını elle ayarlayabilirsin. analogRead() 0–1023 arası değer döndürür; 4'e bölmek analogWrite'ın beklediği 0–255 aralığını verir. Potansiyometrenin bağlantısı Potansiyometre Nedir? yazısında.
1void loop() {
2 int pot = analogRead(A0); // 0–1023
3 analogWrite(9, pot / 4); // 0–255
4}PWM ile DC motor hızı
Küçük bir DC motor bile yüzlerce miliamper çeker; bir Arduino pini ise en fazla 20 mA civarında güvenle akım verebilir. Bu yüzden motor bir transistör, MOSFET ya da L298N gibi bir motor sürücü üzerinden sürülür ve PWM sinyali sürücünün hız girişine verilir. L298N'de bu giriş ENA (ve ikinci motor için ENB) pinidir; PWM kullanmak için üzerindeki jumper'ı çıkarman gerekir. IN1 ve IN2 pinleri ise dönüş yönünü belirler.

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}Servo motor ve PWM aynı şey mi?
Servo motorlar da darbelerle kontrol edilir ama mantık farklıdır: konum, duty cycle'la değil darbenin genişliğiyle belirlenir. Servo saniyede 50 darbe (50 Hz) bekler; 1 milisaniyelik darbe yaklaşık 0°, 1,5 ms 90°, 2 ms ise 180° anlamına gelir. analogWrite bu zamanlamayı üretemez, bu yüzden servolar için Servo kütüphanesi kullanılır. Ayrıntılar Servo Motor Nedir? yazısında.
PWM'den gerçek analog gerilim: RC filtre
Bazen gerçekten sabit bir gerilime ihtiyaç duyarsın; örneğin bir op-amp'e referans vermek ya da ses çıkışı almak için. Bu durumda PWM'i bir direnç ve kondansatörden oluşan alçak geçiren bir filtreden geçirirsin. 10 kΩ ve 10 µF ile zaman sabiti 0,1 saniye olur; çıkış oldukça düzgün ama değişimlere yavaş tepki verir. Farklı değerleri RC zaman sabiti hesaplayıcısıyla deneyebilirsin. Klasik ESP32'de ise GPIO 25 ve 26 pinlerinde gerçek analog çıkış veren iki DAC bulunur.
ESP32 ile PWM: LEDC
ESP32'de PWM'i LEDC adlı donanım üretir ve frekansı ile çözünürlüğü sen belirlersin. Arduino çekirdeği 3.x sürümünde ledcAttach(pin, frekans, çözünürlük) ve ledcWrite(pin, değer) kullanılır; eski 2.x sürümlerinde kanal tabanlı ledcSetup ve ledcAttachPin komutları vardı. Aşağıdaki örnek 5 kHz ve 8 bit ile LED'i yakıp söndürür:
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}Raspberry Pi Pico ile PWM (MicroPython)
Pico'da her GPIO pini PWM verebilir. MicroPython'da PWM sınıfıyla frekansı freq(), duty cycle'ı ise 0–65535 arası değer alan duty_u16() ile ayarlarsın:
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)PWM ile proje fikirleri
- Nefes alan LED: Bekleme modundaki cihazlar gibi yavaşça yanıp sönen bir durum ışığı.
- Ayarlı masa lambası: Potansiyometreyle parlaklığı ayarlanan bir LED lamba.
- Sıcaklığa göre fan: DHT11 ile ölçülen sıcaklık arttıkça fanı hızlandır.
- Renk karıştırma: Üç PWM kanalıyla RGB LED'de milyonlarca renk üret.
- Robot araba: İki motorun hızını ayrı ayrı ayarlayarak dönüşleri yumuşat.
- Gün doğumu lambası: Sabah alarmından önce ışığı 15 dakikada yavaşça aç.
Sık yapılan hatalar ve çözümleri
- PWM olmayan pine analogWrite: Uno'da ~ işareti olmayan pinler yalnızca açık ya da kapalı olur; 128 ve üzeri açık, altı kapalı sayılır.
- Servo kütüphanesiyle 9 ve 10. pinler: Uno'da Servo kütüphanesi Timer1'i kullanır ve bu iki pindeki PWM'i devre dışı bırakır; LED ya da motoru başka bir PWM pinine taşı.
- tone() ile 3 ve 11. pinler: tone() Timer2'yi kullanır ve bu pinlerdeki PWM'i bozar.
- Motoru doğrudan pine bağlamak: Mutlaka transistör, MOSFET ya da motor sürücü kullan.
- Gama hesabında taşma: v * v hesabı int sınırını aşar; (long) dönüşümü ekle.
- PWM'i gerçek analog sanmak: Multimetre ortalamayı gösterir ama sinyal hâlâ 0 ile 5 V arasında gidip gelir; hassas devreler için RC filtre ya da DAC kullan.
PWM, Arduino'da öğreneceğin en kullanışlı kavramlardan biridir: LED'ler, motorlar, fanlar ve hoparlörler hep bu basit fikirle kontrol edilir. Temeller için LED Nedir? yazısına göz at; BlueGrays uygulamasında PWM ile LED soldurma, potansiyometreyle parlaklık ve RGB renk geçişi projelerini kodlarıyla adım adım bulabilirsin.
Sıkça sorulan sorular
PWM kısaca nedir?
PWM, bir pini çok hızlı açıp kapatarak ve açık kalma süresinin oranını (duty cycle) değiştirerek yüke giden ortalama gücü ayarlama yöntemidir. Böylece yalnızca 0 ve 5 V verebilen dijital bir pinle LED kısılabilir ya da motor yavaşlatılabilir.
Arduino Uno'da hangi pinler PWM destekler?
Uno ve Nano'da 3, 5, 6, 9, 10 ve 11. pinler PWM destekler; kart üzerinde ~ işaretiyle gösterilir. Mega'da 2–13 ve 44–46 numaralı pinler PWM verebilir.
analogWrite gerçek analog çıkış mı verir?
Hayır. analogWrite PWM üretir; pin 0 ile 5 V arasında hızla gidip gelir. Ortalama gerilim değeri ayarlar ama gerçek sabit bir gerilim için PWM'i RC filtreden geçirmek ya da ESP32'deki gibi bir DAC kullanmak gerekir.
Duty cycle nasıl hesaplanır?
Duty cycle, sinyalin HIGH kaldığı sürenin toplam periyoda oranıdır: (HIGH süresi / periyot) × 100. Arduino'da analogWrite değerini 255'e bölüp 100 ile çarparak bulursun; örneğin 64 yaklaşık %25'tir.
Arduino'da PWM frekansı nasıl değiştirilir?
analogWrite frekansı değiştirmez. Uno'da zamanlayıcı yazmaçları (örneğin 9 ve 10. pinler için TCCR1B) değiştirilerek frekans ayarlanabilir ama bu millis ve kütüphaneleri etkileyebilir. ESP32'de ledcAttach ile, Pico'da freq() ile frekansı doğrudan belirlersin.
PWM LED'e zarar verir mi?
Hayır. LED her darbede tam akımla yanar ama bu akım seri direnç tarafından zaten sınırlanır; ortalama akım duty cycle oranında düşer. Doğru direnç kullandığın sürece PWM LED'in ömrünü kısaltmaz.
Bu yazıdan sonra yapabileceğin projeler
Tüm projeleri gör
ESP32 PWM ile LED Soldurma (Fade)
LED'in parlaklığını yumuşak şekilde 0'dan max'a, max'tan 0'a değiştirme. Arduino'daki gibi analogWrite() ile PWM kontrolü yapıyoruz — ESP32 Arduino Core 3.0+ ile aynı syntax sorunsuz çalışır. Pin tanımı + pinMode + analogWrite yeterli.

Raspberry Pi Pico PWM ile LED Fade (Nefes Efekti, GP14)
LED artık sadece yanıp sönmüyor — nefes alıyor! 🌬️ Raspberry Pi Pico'nun **PWM** (Pulse Width Modulation — darbe genişlik modülasyonu) özelliğiyle LED'in parlaklığı yavaş yavaş artar, sonra yavaş yavaş azalır. Uyku modundaki MacBook ışığı gibi sakin bir "nefes" efekti. Öğrenme: **machine.PWM sınıfı** (pini PWM çıkışına çevirme), **duty_u16()** (0–65535 arası 16-bit parlaklık değeri), **PWM frekansı** (`freq(1000)` — saniyede 1000 kez aç-kapa, göz titremeyi görmez), **range() ile adım adım döngü*

ESP32 Potansiyometre ile LED Parlaklık (Analog → PWM)
Bu projede bir potansiyometre ile LED parlaklığını analog olarak kontrol ediyoruz. ESP32'nin ADC pini potansiyometreden gelen 0-3.3V gerilimi okur, ardından bu değer PWM (Pulse Width Modulation) sinyaline çevrilerek LED'e gönderilir. Böylece potansiyometreyi çevirdikçe LED kademeli olarak parlar ve söner. Arduino Core 3.0+ ile `analogWrite()` doğrudan kullanılabilir; ESP32-S2/S3'te ADC çözünürlüğü 12-bit'e sabitlenir.

RGB Led İle Yumuşak Renk Geçişi
analogWrite ile RGB LED'in renklerini kademeli olarak geçiş yaptırarak yumuşak gökkuşağı efekti oluşturan proje. PWM ile renk karışımı ve geçiş animasyonu mantığını öğretir.

ESP32 RGB LED Kontrolü
3 ayrı LED yerine tek RGB LED ile sınırsız renk üretme. Arduino'daki gibi analogWrite() ile R/G/B değerlerini ayarlayarak gökkuşağı geçişi yaparız. Renk teorisi (red+green=yellow gibi) pratik olarak görülür.

Raspberry Pi Pico RGB LED Renk Cevrimi (3 Kanal PWM, GP11-13)
Tek LED, milyonlarca renk! 🌈 RGB LED'in içinde aslında 3 ayrı LED var: **kırmızı, yeşil ve mavi**. Pico'nun 3 ayrı **PWM** kanalıyla her birinin parlaklığını ayrı ayrı ayarlayınca renkler karışır: kırmızı + yeşil = sarı, yeşil + mavi = camgöbeği, üçü birden = beyaz. Bu projede LED 8 renk arasında sırayla dönüyor. Öğrenme: **çoklu PWM kanalı** (aynı anda 3 pin), **fonksiyon tanımlama** (`def set_color(...)` ile tekrar eden kodu tek yerde toplama), **RGB renk karışımı**

ESP32 Servo Motor (Potansiyometre Kontrolü)
Bu projede potansiyometre ile SG90 servo motoru kontrol ediyoruz. Potansiyometreden okunan analog değeri 0-180 derece aralığına map'leyerek servo açısını ayarlıyoruz. ESP32Servo kütüphanesi sayesinde ESP32'nin herhangi bir GPIO'su PWM sinyali üretebiliyor. Bu, robotik kollar, kamera gimbal'ları ve otomatik kapı mekanizmaları için temel bir kontrol yöntemidir.

ESP32 Renk Mikser Lambası (3 Pot + RGB LED + OLED)
ESP32 ile 3 potansiyometre çevirerek istediğin rengi karıştıran akıllı bir renk mikser lambası! Kırmızı, yeşil ve mavi potansiyometreleri çevirdikçe ortak katot RGB LED anlık olarak renk değiştirir. SSD1306 OLED ekranda her renk için 0-255 aralığında değer, görsel dolgu barları ve HEX web renk kodu (#FF8040 gibi) canlı olarak gösterilir. Mini bir profesyonel renk stüdyosu — RGB renk teorisi, ADC analog okuma, PWM ile parlaklık kontrolü ve I2C ekran tasarımını tek projede öğretir. Grafik tasarımc
Diğer yazılar
Dijital bir pinin LED'i nasıl kısıp motoru nasıl yavaşlattığını, duty cycle ve frekansın ne demek olduğunu, analogWrite'ı doğru kullanmayı ve ESP32 ile Pico'da PWM'i öğren.

