1 Star2 Stars3 Stars4 Stars5 Stars (7 votes, average: 4.29 out of 5)
Loading ... Loading ...
AÄŸu
10th

CCS C Dersleri PWM Uygulamaları

pwmpicjap.gif

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.

pwm1.JPG

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.

pwm12.JPG

İ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.

pwm2.JPG

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

pwm3.JPG

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.
pwm4.JPG

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.

Benzer Yazılar


19 Yorum “CCS C Dersleri PWM Uygulamaları”

  1. ayhan Eyl 8, 2008

    iyi günler
    bu siteyi bullup gördügüme cok sevindim
    emegi gecen herkeze tesekkurler

  2. 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

  3. 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 ?

  4. 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)

  5. 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

  6. admin Nis 27, 2009

    yazdığınız kodu, devreyi gönderin inceleyelim

  7. 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

  8. 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

  9. 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

  10. 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

  11. 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

  12. admin Kas 2, 2009

    a5 pininde pwm ile ilgili donanım olmadığı için anca zaman kesmeleriyle pwm yapabilirsiniz ama çok verimli olmayabilir.

  13. motor oyunları Kas 30, 2009

    paylaşım için teşekkürler. pwm örnekleri faydalı oldu

  14. 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.

  15. 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.

  16. 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….

  17. mustafa Ara 19, 2009

    merhabalar pwm sinyali alacağım fakat bunu keypad ile kontrol etmem için bana yardımcı olabilirmisiniz teşekkürler

  18. 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

  19. 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

Yorum yapın