
PWM (Pulse width modulation) darbe genişlik modülasyonunda üretilen darbelerin zamana göre genişlikleri belirlenerek çıkışa verilen toplam güç ayarlanmış olur. Yani aslında yapılan iş çıkışa doğrudan lojik1 yada lojik 0 vermek yerine genişliğini bizim belirlediğimiz periyotta sinyalin ne kadar sürede 1 ve ne kadar sürede 0 olarak kalacağını belirlemektir. Bu genişliği maksimum tutarsak çıkışa doğrudan 1 minimum tutarsakda 0 vermiş oluruz. Diğer değerlerde ise yoğunluk ayarı yapmış oluruz.
Pic mikrodenetleyicilerinin pwm fonksiyonu timer2 ile kontrol edilmektedir. Üreteceğimiz pwm frekansını timer2 içerisine atadağımız prescaler ile birlikte kullandığımız kristalin hızıda belirleyecektir.
Frekans belirleme formülü;
Kristal Frekansı(Tosc)
PWM Freq = —————————————–
(PR2 + 1) * (Timer2 Prescaler) * 4
ya da pwm periyodu;
PWM period = (PR2+1) x 4 x Tosc x TMR2 prescaler
şeklinde olacaktır.
Burada PR2 sayıcı deÄŸeri 0-255 arasında olmalıdır. Timer2 prescaler (TMR2 önbölücü) ise 1,4 veya 16 deÄŸerlerini alabilir. Elde etmek istediÄŸimiz frekansı bulmak için PR2 yani timer2′nin saymaya baÅŸlıyacağı deÄŸer ile birlikte prescaler deÄŸerini de uygun ÅŸekilde seçmemiz gerekir.
Örneğin; 4MHz kristal hızı, presaceler 16 ve PR2 124 için
400000
PWM Freq = ————————– = 500 Hz
(124 + 1) * (16) * 4
bulunur.
Bu durumda kullanmamız gereken satır setup_timer_2(T2_DIV_BY_16, 124, 1); olur.
Burada kullandığımız değerlere göre frkans hızı ortaya çıkacaktır. dolayısıyla kristal hızımıza bağlı olarak her frekansı elde edemeyeceğimiz açıktır. Örneğin 4 Mhz kristal için en düşük frekans yaklaşık 244 hertz en yüksek ise 62.5 KHz olacak, kristal hızını artırdıkçada bu değerler artacaktır.
İnceleyeceÄŸimiz ilk en basit pwm uygulaması aÅŸağıda. Burada gerekli ayarlamaları ve tanımlamaları yaptıktan sonra ccp1 ve ccp2(capture,compare,pwm) pinlerini pwm olarak ayarlıyoruz. Daha sonra setup_timer_2(T2_DIV_BY_16, 124, 1); satırı ile pwm frekansını belirliyoruz ve set_pwm1_duty ve set_pwm2_duty satırları ile de pwm kanallarında oluÅŸturulan darbenin geniÅŸliÄŸini belirliyoruz. Rakamlara bakacak olursak 124′ün yarısı olan 62′de sinaylin yarısı aktir halde, 31′de ise çeyreÄŸi. Yani çıkışlarda lamba olsaydı biri öbürünün yarısı kadar yanmış olacaktı. Buradaki satırlara atadığımız deÄŸerler ile çıkış gücünü belirleyeceÄŸiz.
Yukarıdaki örneğin aşağıda yer alan biraz geliştirilmiş versiyonunda darbe genişliği sıfırdan maksimum değerine sürekli artırılır. Programı led dimmer olarakta kullanabilirsiniz.
İkinci basit örneğimizde ise bir adım ilerliyoruz ve artık darbe genişliğini dışarıdan değiştirebiliyoruz. Bu örnekte sadece 1. pwm kanalı kullanıldı. A0 pinine bağlanacak bir potansiyometre ile 1. kanal yani C2 pinine bağlanacak ledin yanıp sönme hızını ayarlayabiliriz.
Pwm frekansı belirlendikten sonra frekansı değiştirmek oldukça kolay. Bunu pot, buton yada seri porttan bilgisayar ile de yapabiliriz.
Aşağıda verilen örnekte yine darbe genişliğini pot ile ayarlayabiliyoruz ek özellik olarak eklediğimiz ise pwm sinyalinin frekansı seri port yardımı ile değiştirmek. Terminal ekranından gönderdiğimiz seçenek numarasına göre switch koşulları içerisinde yer alan seçeneklerden birisi pwm frekansı olarak ayarlanmış olur.
Ayarlanabilecek frekanslar:
(1/10000000)*4*1*128 = 51.2 us or 19.5 khz
(1/10000000)*4*4*128 = 204.8 us or 4.9 khz
(1/10000000)*4*16*128= 819.2 us or 1.2 khz
Aşağıda verilen proteus simülasyonunda pwm ile dc motor ve servo motor uygulamaları yer almakta. Örneklerde pwm ile motorun hızını ayarlama ve servo motorun kaç derece dönceğini ayarlayan programları bulabilirsiniz.
Burada anlatılan program örneklerini aşağıdaki adresten indirebilirsiniz.
http://rapidshare.com/files/135256285/pwm.zip.html ÅŸifre: ccspic.com
Sorularınızı, merak ettiklerinizi yorum kısmına yazabilirsiniz.







By ayhan on Eyl 8, 2008 | Reply
iyi günler
bu siteyi bullup gördügüme cok sevindim
emegi gecen herkeze tesekkurler
By Esra Y. on Eyl 10, 2008 | Reply
Hocam gercekten super bi site..Ellerinize saglık keşke boyle bi site hitech için de olsa
Kolay gelsin calısmalarınızda basarılar
By Hüseyin on Eyl 14, 2008 | Reply
merhaba dökümanınız gerçekten çok açıklayıcı teşekkürler;
Ben de pwm ile servo motor kontrol etmeye çalışıyorum 4 mhz kristalle minimum 244 hz frekansına inebiliyorum
setup_timer_2(T2_DIV_BY_16,255,1)
pwm ile pulsları deneme yanılma yöntemiyle yollayıp servo motorumun
set_pwm2_duty(100); 180 derece
set_pwm2_duty(700); 0 derece olarak
dönüş açılarını buldum
normalde kullanmış olduğum servo 50 hz de çalışmakta ve 20 milisaniyelik periyotta 1500 mikrosaniye(180 derece) ve 2500mikrosaniye(0 derece) lojik 1 verilerek kontrol edilmekte.
50 hz i yazılımsal pwm ile yakalayıp pulsları yolladığımda istediğim verimi alamadım. Geriye donanımsa pwm ile pulsları yollama seceneğim kaldı.
donanımsal pwm ile
setup_timer_2(T2_DIV_BY_16,255,1) 244 hz frekansta
set_pwm2_duty(100 ile 700 arası) değer yolladığımda servo motorum felaket ısındı, bu yolladığım değerlerde sürekli değiştiği için motorda ısınma had safaya ulaşıyor.
Burada benim yazdığım set_pwm2_duty(xxx) xxx = 100 ile 700 arası değerler doğrumudur.
Kitaplardan okuğuduma göre 0 ile 256 arasında değer girmem gerekiyor.
sizce ne yapmalıyım ?
By admin on Eyl 21, 2008 | Reply
PR2 sayıcı değeri en fazla 255 olabilir
daha fazla bilgi için aşağıdaki sayfaya bakabilirsin http://hobby_elec.piclist.com/e_pic7_4.htm (ingilizce)