PIC|ULAK PIC|ULAK ile PWM Uygulaması By Sinan Sözügüzel Posted on 21 Şubat 2016 6 min read 0 0 5,976 Paylaş ! Facebook Paylaş ! Twitter Paylaş ! Google+ Paylaş ! Reddit Paylaş ! Pinterest Paylaş ! Linkedin Paylaş ! Tumblr Merhaba arkadaşlar, Bu yazımızda, MekatronikLAB firmasının üretmiş olduğu PIC mikrodenetleyiciler ile proje geliştirme kiti PIC|ULAK ile pwm(Pulse width modulation) darbe genişlik modülasyonu uygulamasını gerçekleştirdik. 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 lojik 1 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 tutarsak da 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şlayacağı 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 frekans 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ça da 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. Malzemeler piculak lcd 330Ω direnç led Bağlantı şeması CCS C Kodları [php] #include <main.h> #use delay(clock=4000000) // osilatör frekansı belirleniyor. #fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // sigorta ayarları #include <lcd420.c> // lcd tanımlanıyor. int data = 0; // Tamsayı tipinde değişken tanımlanıyor /********* ANA PROGRAM FONKSİYONU********/ void main ( ) { lcd_init(); // lcd hazırlanııyor. printf(lcd_putc,"\fMEKATRONIKLAB"); printf(lcd_putc,"\nROBOTURKA"); printf(lcd_putc,"\nSINAN SOZUGUZEL"); printf(lcd_putc,"\nGAZIOSMANPASA UNI"); delay_ms(1500); setup_timer_2(t2_div_by_16,254,1); // pwm ayarları yapılıyor. setup_ccp1(ccp_pwm); // ccp1 aktifleştiriliyor. while(1) { data = data+3; // data değişken değeri işleme tutuluyor. if(data==255) // data değişken koşulu { for(data=255; data>0; data = data-3 ) { set_pwm1_duty(data); delay_ms(20); } } set_pwm1_duty(data); delay_ms(20); } } [/php] Devrenin Çalışma Videosu