CCS C ile Pwm Uygulamaları

pwmpicjap

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.

pwm1

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 olarak da kullanabilirsiniz.

pwm12

İ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

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

10 bit duty cycle için

setup_pwm2_duty(—) alacağı değerler 0-1024 arası olacaktır.

Oran hesabı= (16 bit duty cycle değeri) / ((middle value+1)*prescaler)=102L/((63+1)*4   = 39,8% olur (set_pwm2_duty(102L) için örnek)

pwm

10 bit kullanımında dikkat edilmesi gereken husus PWM periyodu/(max 1024) sonucu işlem zamanından yani 1/(fosc/4) (burada 0,05 us)’ dan küçük olamaz. Bu nedenle pwm periyodu her zaman 1024’e bölünemeyebilir.
Tablodan görüleceği üzere PR2=0x1f yada 31 değerini aldığında pwm periyodu 6,4 us olur. 6,4/0,05 = 128 sonucuna göre ölçek 7 bit yani 128 kademe olacaktır

Özetle

* PR2 0-255 arası olmalı

* TMR2 prescaler 1,4 veya 16 olmalı

* Timer2’de kullanılan postscalerin pwm hesabına etkisi yok

* PWM duty cycle pwm peryodunun 1/1024 oranında hassasiyetle kullanılabilir

* 10 bit kullanımında;
1) Sabitle kullanım
set_pwm2_duty(50L)
2) Değişkenle kullanım
int16 pwm_duty;
pwm_duty=50;
set_pwm2_duty(pwm_duty)
3) Sabit veya değişkenle kullanım
set_pwm2_duty(int(16)50); 8 bitlik sabit yada
değişkeni fonkssiyona vermeden önce 16 bitliğe
çevirmiş olur.

Bu yazı Pic Donanım kategorisine gönderilmiş ve , , , ile etiketlenmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.