28.01.2012

Arduino Project 3 - PWM

Herkese merhaba

Bu çalışmada Arduino ile üreticeğim farklı pwm siyallerini bir lede göndereceğim ve ledin parlak seviyesini yazacağım yazılım ile kontrol etmeye çalışacağım.

Bu çalışamaya göz atmadan önce neler yapıldığını tam olarak anlayabilemek için PWM isimli yazımı okumanız yararlı olur.

İlk olarak gerekli olan parçalar neler bir bakalım;

- 1 Adet 220 Ohm Direnç
- 1 Adet LED
- 1 Adet Arduino Mega 2560 ya da diğer Arduino boardlarından biri
- 1 Adet Breadboard
- Arduino Yazılımı

Arduino'nun PWM çıkışına bir led bağladım. Daha önceki çalışmarda sürekli olarak dijital çıkışları kullanarak led yakıp söndürmüştük. Bu sefer pwm sinyalleri üretiyoruz ve bu sinyalleri ledin ışığını takip ederek gözlemleyeceğiz.

Aşağıdaki grafiğe bakılarak hangi analog çıkışı verdiğimizde nasıl bir PWM üretileceğini inceleyebiliriz. Eğer 8 bitlik bir analog çıkış uyguluyorsak ve %25 sinyal oranına sahip bir pwm üretmek istiyorsak. Burada en yüksek genlik değeri +5V en düşük genlik değeri ise 0V dur.

28 = 256  yani (0-255) aralığında oluyor
(25*256)/100 = 64
yani analog çıkışından 64 değerini göndermemiz gerekir. Burada ortalama gerilim 1.25 V oluyor.


kanımca bu kadar önbilgi yeterli artık kodu incelemeye başlıyalım. Bu kod bir ledi kademe kademe artırarak en yüksek parlaklık seviyesine çıkarıp, ardından kademe kadame düşerek ışık vermeyecek şekilde çalıştırmaya yarıyor. Bu olay bir döngü halinde sürekli olarak tekrarlanıyor. Yani burada kademe kademe  parlayan ve sönen bir led ışığı üretmeye çalışıyoruz.

KOD :

/*
******************
H.Melih ERDOĞAN
******************
Project 3
Name : "PWM Output"
*/

int ledPin = 2;    
// Çıkış olarak kullanacağımız yani led bağlayacağımız pwm bacağını beliriliyoruz.
int ledLevel = 0; //
göndereceğimiz pwm nin siyal oranını atacağımız değişken.

void setup(){
pinMode(ledPin, OUTPUT);
// led bağladığım bacağı çıkış olarak yaralıyorum
}

void loop(){ 
 analogWrite(ledPin, ledLevel);
// daha önceden belirlediğim bacağa (pin 2) analog değerler gönderiyorum
 delay(1000);
// 1 sn beleme yapıyorum.
 ledLevel = ledLevel +51;
// analog olarak göndereceğim değeri arttırıyorum. (led en parlaklığı artıyor)
 // eğer değer 255 i geçmiş ise bu sefer azalarak 0 değerine kadar gidiyorum.
 if(ledLevel >=255){
 ledLevel = 255; 
// değişkeni en yüksek değere çek  (led en parlak surumda)
 for(;;){
 analogWrite(ledPin, ledLevel);
// daha önceden belirlediğim bacağa (pin 2) analog değerler gönderiyorum
 ledLevel = ledLevel -51; // analog olarak göndereceğim değeri azaltıyorum. (led parlaklığı azalıyor)
 delay(1000); // 1 sn bekle
 if(ledLevel <=0){
 ledLevel=0;
 break;
// değer 0 dan küçük ise sonuz döngüden çık ve değişkeni 0 a eşitle.
 }
 }
 }
}


kod anlaşıldı ise artık devre şemasına bakarak gerekli devreyi kurabilirsiniz. Ben bu çalışnmada Arduino üzerinde PWM sinyali üretebileceğim 2 numaralı bacağını kullandım.

Devre şeması


Devrenin kurulmuş ve çalıştırılmış halinin fotoğafları aşağıdadır.

Aşağıdaki fotoğrafta ledin ışığının parlaklığı artıyor.


Aşağıdaki fotoğrafta ledin ışığının parlaklığı azalıyor.


Aşağıdaki fotoğrafta ledin ışığının parlaklığı en yüksek seviyede. Yani lede şuan 5V luk gerilim uyguluyoruz.


Projenin çalıştırılmış halinin videosu aşağıdadır. İyi seyirler, bir sonraki çalışmamda görüşmek dileği ile ....





Diğer Arduino projelerine de bakmak isterseniz technologylaboratory.blogspot.com/search/label/Arduino

PWM

Darbe Genişlik Modülasyonu - PWM

PWM yani darbe genişlik modülasyonu üretilecek olan darbelerin, genişliklerini kontrol ederek, çıkışta üretilmek istenen analog elektriksel değerin veya sinyalin elde edilmesi tekniğidir. Örneğin şağıdaki grafik bir PWM sinyalidir. PWM sinyallerini kare dalgalar ile oynayarak üretiyoruz.


Peki bu kare dalgaların nereleriyle oynuyoruz ? Burada ürettiğimiz kare dalgaların bir periyodu içersinde sinyalin ne kadar süre yüksekte ve alçakta kalacağını belirliyoruz. Bunun oranı bizim ortalam değerimizi belirliyor. Örneğin aşağıdaki grafikte bir kare dalgada periyot süresi, yüksekte kalma süresi ve düşükte kalma süresinin neler olduğu görülebilir. Bu süreler ile oynanırsa en yüksek genlik değeri ile en düşük genlik değeri arasıda çıkış değerleri üretilebilir.

Daha iyi anlaşılması açısından örnek vermek gerekirse
En yüksek genlik değeri 5V en düşük genlik değeri 0V olsun.

%25 için ortalama gerilim 1.25V olur.
Yani yüksekte kalma süresi %25'de tutulursa. (5*25)/100 = 1.25V
%50 için 2.5V olur
%75 için 3.75 olur.

Eğer %100 lük bir pwm değeri üretirsek ortalama gerilim, en yüksek genlik değerine eşit olur yani 5V. %0 lık bir pwn sinyali üretilmesi durumunda da ortalama gerilim, en düşük genlik değeri yani 0V ta eşit olur.

Bu örnek ile ilgili soru işaretlerinin yok olması için aşağıdaki farklı oranlara sahip PWM sinyallerinin grafiksel gösterimlerine bakılabilir.




Artık pwm nin ne olduğu biraz olsun anlaşılmıştır. Açıkcası bende bu yazıyı yazmadan önce pek birşey bilmiyordum o yüzden sıfır seviyesiden yani benimde bulunduğum yerden başlayarak beraberce anlatmaya ve öğrenmeye çalışıyorum :) Şimdi sıra geldi bu değerlerin nerelerden geldiğine.

olay yukarıdaki formülden geliyor. Burada Ymin = en düşük genlik değeri, Ymax = en yüksek genlik değeri, D = sinyal oranı ve T periyot oluyor. Eğer burada da yukarıdaki grafikteki gibi Ymin değerini 0V kabul edersek formül

durumunu alıyor. Şimdi daha önceden yaptığımız örneği bu formülde deneyelim. Ymax= 5V, Ymin = 0V ve D( Duty Cycle) yani sinyal oranı %75 olsun.

ortalama değer = (75/100)*5
ortalam değer = 3.75 V

yani az önce yaptığımız işle aynı kapıya çıktık. Peki neden bunları anlattım, sizin kullanacağınız Ymin ve Ymax değerleri değişiklik gösterse bile çözüme gidebilmemiz için bunlardan bahsettim. Artık PWM konusu en azında benim için daha net bir şekilde anlaşılmıştır. Bununla ilgili bir çalışma yaparak bu konuyu pekiştirmek gerekiyor. Acaba analog çıkış imkanı sunan bir mikrodenetleyici yardımı ile PWM sinyalleri üretip bir lede gönderirsek verdiği ışıkta neler gözlemleriz ?

Not : PWM anlatımında kullandığım formülleri yazmaya üşendiğimden :P antrak.org.tr adresinden aldım. Hazırlayana teşekkürlerimi iletiyorum :)