
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.

(7 votes, average: 4.29 out of 5)
ayhan Eyl 8, 2008
iyi günler
bu siteyi bullup gördügüme cok sevindim
emegi gecen herkeze tesekkurler
Esra Y. Eyl 10, 2008
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
Hüseyin Eyl 14, 2008
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 ?
admin Eyl 21, 2008
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)
ekicioglu Nis 27, 2009
merhabalar, 16f877 ile dc motor sürmeye çalışıyorum. ancak 100 hertz lik çıkış almam lasım. 1Mhz lik kristal kullanmama rağmen, bir türlü proteusda istediğim frekansı elde edemiyorum. yardımcı olabilirseniz sevinirim.. teşekkürler
admin Nis 27, 2009
yazdığınız kodu, devreyi gönderin inceleyelim
mustafa May 8, 2009
Merhabalar.Ben dc fan motorunu pwm ile çalıştırmak istiyorum.Motor sıfır devirden başlayarak yavaş yavaş hızlanacak ve cc2 çıkışı motor max devre ulaştığında pwm den çıkıp high konumuna geçsin istiyorum. Programı yazdım motor yavaş yavaş hızlanıp max devre çıkıyor.Ama pwm mi birtürlü sonlandırıp high konumuna geçiremedim.Bu konuda yardımcı olabilirmisiniz. Pwm i hangi komutla sonlandırabilirim. Bir de programın akışına göre pwm i kesme ile devreye sokup.Tekrar durdurabilirmiyim.
Kolay gelsin
pwm’in max deÄŸeri high komuta eÅŸittir
görkem May 17, 2009
yukarıdakı preteus ıle cızılmıs devrenın bana c dilinde yazılmıs acıkca programını gonderebılırmısınız.
http://rapidshare.com/files/135256285/pwm.zip.html ÅŸifre: ccspic.com
ilkay Tem 26, 2009
İyi günler,
Çalışma gayet başarılı ccp kullanacaklar için çok yardımcı olacaktır.
Benim tamamen software pwm hazırlamam gerekiyor, bununla ilgili örnek kod bulabilir miyim?
Şimdiden teşekkürler
admin Tem 26, 2009
software pwm ile ilgili olarak aşağıdaki linkleri inceleyebilirsiniz.
http://ccspic.com/driver/software-pwm-ile-rgb-led.html
http://ccspic.com/projeler/rgb-ledler-ile-gece-lambasi.html
hasan Kas 2, 2009
Hocam yukarıdaki örnekler ccp modülleri ile pwm yapılmış mesela ben 16f877a nın a5 pininden pwm sinyali yollamak istersem kodda ne tür bir geliştirme yapmam lazım.İlginiz için şimdiden teşekkürler
admin Kas 2, 2009
a5 pininde pwm ile ilgili donanım olmadığı için anca zaman kesmeleriyle pwm yapabilirsiniz ama çok verimli olmayabilir.
motor oyunları Kas 30, 2009
paylaşım için teşekkürler. pwm örnekleri faydalı oldu
Ergün Keskin Ara 8, 2009
Teşekkürler,
Ancak ben CCS PIC kullanarak Proteus ta CCP1 ve CCP2 bacaklarından PWM sinyali almayıdenedim. Ancak sadece bir bacaktan çıkış görülüyor.
Nedeni ne olabilir.
Eser Onur ErdoÄŸan Ara 12, 2009
PIC16F877 YADA PIC18F42 ile 3 ayrı kanal pwm üretebilirmiyim. Yada üç ayrı kanalda pwm üretebileceğim başka bir PIC varmı. Yardımcı olan olursa çok makbule geçer. Şimdiden teşekkürler.
eda çakır Ara 15, 2009
merhaba
ben sadece picin pwm üreten ucundan dc çıkış almak isiyorum burada anlattılan 0-255 arası değer değiştirmesi nasıl yapılıyor yardımcı olursanız sevinirim.
ÅŸimdiden teÅŸekkürler….
mustafa Ara 19, 2009
merhabalar pwm sinyali alacağım fakat bunu keypad ile kontrol etmem için bana yardımcı olabilirmisiniz teşekkürler
ozkan Mar 14, 2010
ben 200-300 watt gücünde dc motor ve buna baglı tako generatör var benm bunu kontrol etmem lazım yani dc motoru kontrol edicem.
Bunuda 16f877 ile yapcam ve bi pwm yazmam gerekiyor yukarıdaki dosyayı indirdim bu konuda yeni oldugum için herşeyi tam olarak anlayamadım.
İndirdiğim klasörün içindeki dc motor pwm örnegi işimi görür mü?yardımalrınz için şimdiden teş.ler
admin Mar 14, 2010
tako generatörden motorun devir hızını ölçüp, ölçtüğün değere göre de pwm ile motorun hızını kontrol edeceksin sanırım.
Örnekteki uygulama ufak güçlü motor için araya güçlü bir sürücü ile motorunu kontrol edebilirsin ama gerçek uygulamada başka problemler çıkar mı açıkçası emin bilmiyorum
Fatih May 4, 2010
hocam benim sorum analog rc servo motorlar piyasada mevcut 50hz le calısıyor ve uygulama hasaslık ısterse sorun cıkarabılıyo. ben analog servo motordan 6 kat daha hasas olan digital servo motorlar ve bunların pwm ile kontrolu hakkında bılgınız varsa paylaşmanızı bekliyorum
gökhan Ağu 8, 2010
hocam çift pwm kullanamıyorum yukarıda bir arkadaş daha aynı sorunu yaşamış sizce neden olabilir? Sizdede aynı sorun oluyor mu?
admin AÄŸu 8, 2010
sorun nedir?
gökhan Ağu 12, 2010
Verdiğiniz kodlarda 2 ledli programı derliyorum ama sadece 1 led yanıyor diğerine hiç birşey gelmiyor. Mesela 1. pwm tek bşaına kullansam sorun yok, 2. yi tek başına kullansam sorun yok ama 2 si aynı anda olmuyor.
sinan AÄŸu 28, 2010
slm hocam pıc16f84 ile potansiyometreli devre yapmak istiyorum nasıl yapabilirim