PWM (Pulse Width Modulation- Sinyal Genişlik Modülasyonu) PWM bir sinyal modülasyon tekniği olarak tanımlanabilir. Sinyal bilgisinin aktarım için uygun hale çevirilmesi amacının yanı sıra güç kontrolü sağlamak ve elektrik makineleri, güneş pili şarj üniteleri gibi özel devrelere destek olmak amacı da taşır.
PWM Digital sinyaller Evet(1) ya da Hayır(0) gibi sadece kesin sonuç verir. Analog sinyaller sinyal değerinin şiddetini ifade eder. (Işık parlaklığı, motor hızı gibi.) Arduino ile Analog sinyaller gönderemeyiz ama Analog sinyalleri taklit eden Dijital sinyaller gönderebiliriz. Bu yönteme PWM (Pulse-Width Modulation) yöntemi denir.
PWM Çalışma Prensibi PWM sinyaller kare dalga sinyallerdir. Arduinonun çalışma gerilimi olan 5 Voltu belirli aralıklarla gönderip – keserek 5 Volttan daha küçük gerilimlerin elde edilmesi sağlanır. Bu yöntemle dijital sinyaller kullanılarak analog sinyaller taklit edilmiş olur.
Arduino ile yanıp sönen bir LED devresi kurmak veya Arduino ile DC motor kontrolü gerçekleştirmek için PWM tekniğini kullanmamız gerekiyor. Bu teknik de Arduino'ya gömülen yazılımda yatıyor. "analogWrite(...)" fonksiyonu ile görev döngüsünün miktarı belirleniyor ve kare dalga elde ediliyor.
PWM dalgasını elde etmenin yöntemleri ♦ Delta: Delta modülasyonlu PWM sinyali, integral alıcı ve limitleyici devre yapıları ile elde edilir. İntegral sonucunun limitlere değmesi "off", diğer durumlarda "on" durumu oluştuğu için kare dalga oluşur. ♦ Sigma - Delta: Bu modülasyonda ise çıkış sinyali, referans alınan sinyalden çıkartılır. Böylece hata sinyali elde edilmiş olur. Hata sinyalinin integralinin sonucuna göre eğer limite değiyorsa "off", değmiyorsa "on" durumu oluşturularak kare dalga elde edilir. ♦ Boşluk - Vektör: 3 fazlı AC uygulamalar için algoritma kullanılarak kare dalga elde edilir. ♦ Direkt Tork Kontrol (DTC): AC motorlarda kullanılmak üzere geliştirilen bir PWM tekniğidir. Delta modülasyon tekniğinden üretilmiştir. Motora gönderilen sinyal belirli bir filtreden geçirilir ve motorun torku ile manyetik akı kontrol altında tutulur. ♦ Zaman Bölücü: Özellikle mikroişlemcilerin PWM çıkışları tarafından kullanılırlar. Değişken görev döngüsüne sahip devrelerde de kullanılabilirler.
PWM Uygulama Alanları Haberleşme Sistemleri Güç Aktarımı ve Elektrik Makineleri Voltaj Regülatör Devreleri Ses Efektleri ve Yükselticiler Güneş enerji sistemlerinde ve rüzgar enerjisi sistemleri Robotik devrelerde ve servo motor devreleri
DC Motor – H bridge L293D ile Kontrolü /* Adafruit Arduino - Lesson 15. Bi-directional Motor */ int enablePin = 11; int in1Pin = 10; int in2Pin = 9; int switchPin = 7; int potPin = 0; void setup() { pinMode(in1Pin, OUTPUT); pinMode(in2Pin, OUTPUT); pinMode(enablePin, OUTPUT); pinMode(switchPin, INPUT_PULLUP); } void loop() int speed = analogRead(potPin) / 4; boolean reverse = digitalRead(switchPin); setMotor(speed, reverse); void setMotor(int speed, boolean reverse) analogWrite(enablePin, speed); digitalWrite(in1Pin, ! reverse); digitalWrite(in2Pin, reverse);
Servo Motor /* Adafruit Arduino - Lesson 14. Sweep */ #include <Servo.h> int servoPin = 9; Servo servo; int angle = 0; // servo position in degrees void setup() { servo.attach(servoPin); } void loop() // scan from 0 to 180 degrees for(angle = 0; angle < 180; angle++) servo.write(angle); delay(15); // now scan back from 180 to 0 degrees for(angle = 180; angle > 0; angle--)
Servo Potansiyometre ile Kontrolü /* Adafruit Arduino - Lesson 14. Knob */ #include <Servo.h> int potPin = 0; int servoPin = 9; Servo servo; void setup() { servo.attach(servoPin); } void loop() int reading = analogRead(potPin); // 0 to 1023 int angle = reading / 6; // 0 to 180-ish servo.write(angle);
Servo Motor Ultrasonic Sensor Kontrolü #include <Servo.h> Servo myservo; #define trigPin 3 #define echoPin 2 void setup(){ myservo.attach(9); myservo.write(0); Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop(){ int duration, distance; digitalWrite(trigPin, HIGH); delayMicroseconds(100); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29.1; Serial.print(distance); Serial.println(" cm"); int thisPitch = map(distance, 0, 200, 2093, 22); tone(4, thisPitch); delay(50); noTone(4); if (distance < 50) { //Distance in cm myservo.write(40); // angle of the servo arm delay (700); delay (2000);