Pwm1

 PWM in açılımı, Pulse Weight Modilation dır. Yani Darbe Genişlik Modülasyonu anlamına geliyor.  isminden de anlaşıldığı gibi PWM bir sinyal olarak üretilir. Ve bu sinyalin bir görev çevrimi oranı(Duty Cycle) vardır.  Bu oran +5 Volt logic bilginin verilme süresidir.   Aşağıdaki grafikten de daha iyi anlaşılır sanırım; 

PWM sinyali

 Görüldüğü gibi duty cycle şeklinde adlandırılan bu çevrim süresi ne kadar fazla olursa bir periyot boyunca verilen +5Volt logic bilgi süresi artar.   Bu bize bazı avantajlar sağlıyor. Şöyle ki, bir motoru kontrol ettiğimizi düşünürsek verdiğimiz voltaj sinyalinin duty cycle ‘ı ile oynayarak motorun hızını yani devir sayısını kontrol edebiliriz.  Genel olarak PWM sinyali bu amaç için kullanılır zaten.   

 Bu modilasyonun mantığını iyi anlamak için küçük bir uygulama vermek istiyorum. Mesela bir motor sürücü ile kontrol ettiğimiz bir DC motorun hızını da kontrol etmek istiyoruz diyelim.  Bu durumda PWM sinyalini kullanmamız gerekecektir.   Bu uygulama için 16F877 yi kullanalım. 16F877 , iki adet PWM pini içerir. Bunlar CCP1(RC2) ve CCP2(RC1) pinleridir.   PWM sinyali denetleyici osilatör frekansı Timer2 zamanlayıcı PR2 değeri ve bölme oranı değeri ile belirlenir. Yani şöyle;

  Tpwm=Torder x (PR2+1)x(TMR2 Bölme Oranı) ,  fpwm=1/Tpwm 

 fkomut=(denetleyici Frekansı)/4

 Bu formüller programı doğru yazabilmek için gereklidir. Programı doğru yazabilmemiz içim PWM siyali ve komut frekansının doğru hesaplanması lazım.  🙂  Mesela Görev çevrimi süresi PWM periodundan büyük olamaz.  

 PWM modülünde oluşturulan PWM sinyalinin çözünürlük değeri vardır. PWM çözünürlüğü,PWM sinyalinin kaç eşit parçada değiştirilebileceğini belirtir. Bu çözünürlük bit olarak şu formülle hesaplanır;

PWM Çözünürlüğü=(log(fosc/fpwm))/log(2)

 Bu formüle göre PWM sinyalinin maksimum çözünürlüğü en az 2 en fazla 10 olabilir. Şimdi isterseniz ISIS üzerinden devrenin krokisine bir göz atalım;

PWM uygulaması

 Görüldüğü gibi motor kontrolü için L293N motor sürücüsü kullanıldı. Bu motor sürücüsünün Enable A ve B bacaklarına denetleyicinin CCP1 birimi yani PWm sinyali üreten pini bağlanarak motorun hızı kontrol ediliyor. Motor Sürücünün Enable bacakları PWM sinyalleri için düşünülmüş moro sürücü pinleridir.  Bu pinlere sürekli +5 volt verdiğinizde motor doyum noktasında çalışır.  

 Her neyse motor sürücüse bağlı motoru denetleyicinin RA0,1,2 bacaklarına bağladığım butonlarla motorun hareketini kontrol etmek istiyorum. RA0 pinine bağlı buton motorun hareket edip etmemesini kontrol ederken, RA1,2 pinlerine bağlı butonları ise PWM sinyalini arttırıp azaltmaya yarayan butonlar olarak kullanıyorum.   Program şöyle olacak o halde;

<!--wp_fromhtmlpreview_devfmt-->

"]/******************************************************       &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;PWM Uygulaması<!--DVFMTSC-->*******************************************************/#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.// Denetleyici konfigürasyon ayarları#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.#use fast_io(a) //Port yönlendirme komutları A portu için geçerli#use fast_io(b) //Port yönlendirme komutları B portu için geçerliint i=0; // Tamsayı tipinde değişken tanımlanıyor/********* ANA PROGRAM FONKSİYONU********/void main ( ){   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok   setup_adc(ADC_OFF);             // ADC birimi devre dışı   set_tris_a(0b00000111);   // RA0, RA1 ve RA2 pinleri giriş   set_tris_b(0x00);   // b portu komple çıkış   setup_ccp1(CCP_PWM);  // CCP1 birimi PWM çıkışı için ayarlandı   setup_timer_2(T2_DIV_BY_16,170,1); // Timer2 ayarları yapılıyor    set_pwm1_duty(i);// PWM1 çıkışı görev saykılı belirleniyor   while(1) // Sonsuz döngü   {      if (input(pin_a0))// Eğer RA0 girişine bağlı butona basılırsa      {          output_high(pin_b0); // B0 ı yak          output_low(pin_b1);  // B1 i söndür... Böylelikle motor hareket etsin                 if(input(pin_a1))//Eğer RA1 girişine bağlı butona da basılırsa      {          delay_ms(20);         // Buton arkı önleme gecikmesi         i+=5; // i=i+5 anlamındadır.         set_pwm1_duty(i);// PWM1 çıkışı görev saykılı belirleniyor         if (i>170){ // i değeri 170'den büyükse i değeri 170 olsun            i=170;         set_pwm1_duty(i);}// PWM1 çıkışı görev saykılı belirleniyor              }      if (input(pin_a2)) // Eğer RA2 girişine bağlı butona basılırsa      {         delay_ms(20);         // Buton arkı önleme gecikmesi                 i-=5;  // i=i-5 anlamındadır.         set_pwm1_duty(i);// PWM1 çıkışı görev saykılı belirleniyor                  if (i<5) {// i değeri 5'dEn küçük ise i değeri 5 olsun            i=5;         set_pwm1_duty(i);// PWM1 çıkışı görev saykılı belirleniyor         delay_ms(50);}      }      }      else      {        output_low(pin_b0);       output_low(pin_b1);      }   }}

&nbsp;

Programda PWM sinyalinin period süresi ve maximum duty cycle süresi sırasıyla 2.736msn ve 2.72msn olarak hesaplanmıştır.

Tüm dosyalar için; PWM