Ana sayfa | Hakkımda | İletişim | Sosyal platform
YAZILARIM
PWM modülü kullanımı
 
   Bu yazımda belirli kaynaklardan yararlanarak hep birlikte PWM modülü kullanımı hakkındaki soru işaretlerimizi kaldırmaya çalışacağım.
  Öncelikle bilmemiz gereken ilk bilgi "PWM birimi TIMER 2  zamanlayıcısını kullanır." bilgisi olacaktır.

 

 

   

   

 

  

  

  

 


İlk önce TIMER 2 fonksiyonu hakkında bilgiler verelim.

setup_timer_2(a, b, c); 

Yukarıdaki timer2 fonksiyonu 3 parametreden oluşur:

a : Bu parametre modülü açıp kapatma ve bölme oranlarını ayarlamak için kullanılır.
--> Modülü kapatmak için kullanılan tanımlama: T2_DISABLED
--> Bölme oranları için kullanılan tanımlamalar ise: T2_DIV_BY_1, T2_DIV_BY_4, T2_DIV_BY_16  (Tanımlamaların sonundaki sayılar bölme oranlarını belirtir.)
 
b : Bu parametre zamanlayıcı sayıcısı için 0 ile 255 arasında bir tam sayı girilir.
 
c : Bu parametre ise "Postscale" değeri yani 2. parametredeki zamanlayıcı değeri kaç defa eşitlendikten sonra kesmeye gidilsin sorusunun sayısal değerini içerir.
 
Peki timer2 kesmesi nasıl kullanılır?

Yazdığımız programda yer alan ana programın üstündeki herhangi bir satıra aşağıdaki komut tanımlamalarını eklemeniz gerekir.

#int_timer2   // CCS C derleyicisinde timer2 kesmesi bloğu için bu tanımlama şarttır.
Void timer2_kesmesi(){   // Kesme fonksiyonumuzun adını "timer2_kesmesi" şeklinde tanımladık. İsterseniz bu adı
                                    //değişken tanımlama kurallarına göre değiştirebilirsiniz. Örneğin; "kesmem" vs.
/* Kesme oluştuğunda çalıştırmak istediğiniz komutlar bu alanda olacak*/
}
 
PWM modülü nasıl aktif edilir?
Modülü açmak için;
setup_ccp1(CCP_PWM);  // PWM modülü sayısına göre setup_ccp2, 3 vs.
Yukarıdaki fonksiyonu ana program başlangıcına yani void main bloğunun başına yazınız. Örnek tanımlama ve kullanma için makelenin en sonunda paylaşılacaktır.
Şimdiki fonksiyonumuz ise hesapladığımız pwm periyoduna göre görev çevrimini belirleyeceğimiz fonksiyona;
set_pwm1_duty(/* değer */);  // PWM modülü çıkış sayısına göre set_pwm(2, 3 vs.)_duty();  olabilir.
 
Herşey tamam da bu PWM periyot süresi nasıl hesaplanıyor?
Sıra geldi hesaplamalara;
Örneğin 4MHz 'lik bir kristal kullandık.
 
Osilatör(frekansı) = 4MHz / 4 = 1MHz  // veya 20MHz olsaydı; 20MHz / 4 = 5MHz
                                                     // denetleyici kullanılan harici osilatörün 1/4 'ünü kullanır.
Komut(periyot) = 1 / Osilatör(frekansı)
 
PWM(periyot) = ( Komut(periyot) ) x ( PR2(1)+1 ) x ( Timer2 Bölme oranı )
 
PWM çıkışımızın ne kadar süre lojik-1 'de kalacağını PWM(periyot) değeri belirleyecek.
Ne kadar süreden sonra lojik-0 'da kalacağını ise set_pwm1_duty(/*değer*/); fonksiyonu ile belirleyeceğiz. Yalnız buradaki değer kısmımızı PR2 değerinden büyük yazmamaya dikkat etmeliyiz.
 
Eğer istersek pwm duty oranını sabit tutup timer 2 fonksiyonuylada görev çevrimi ayarı yapabiliriz. Fakat en kullanışlı olanı yukarıdaki anlattıklarımın üzerinden, pwm oranın hesaplanmasıdır.
Dip not:
(1) = Yukarıda bahsettiğimiz timer2 fonksiyonunun 2. yani b. parametresi
 
 

Bütün bu bilgileri buraya tıklayarak uygulama üzerinden pekiştirebilirsiniz.

ELEKTRO ÇAVUŞ
Ana sayfa | Hakkımda | İletişim | Sosyal platform
ELEKTRO ÇAVUŞ2012 | elektrocavus.com