CCS pic ile 16f877 pwm'de sorunYARDIM!!!!

Başlatan ozkancelebi, 12 Mayıs 2010, 01:43:40

ozkancelebi

arkadaşlar ccs ile 16f877 için pwm kodu yazdım pwm üretiyor ama frekansı sabit tutup duty cycle'ı değiştirmem gerekiyor.İşte bu noktada sorun oluyor.duty cycle ı değişmiyor.devrede a0 pinine artır butonu a1 pinine azalt butonu koydum.ama hangisine basarsam basayım duty cycle hep aynı kalıyor.
KODLAR BURDA;



/******************************************************
      PIC16F877 ile PWM Modu Uygulaması-1
*******************************************************/
#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(c) //Port yönlendirme komutları C portu için geçerli

int 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(0x03);   // RA0 ve RA1 pinleri giriş
   set_tris_c(0x00);   // RC0, RC1 ve RC2 pini giriş

   setup_ccp2(CCP_PWM);  // CCP2 birimi PWM çıkışı için ayarlandı


   setup_timer_2(T2_DIV_BY_4,49,1); // Timer2 ayarları yapılıyor

   while(1) // Sonsuz döngü
   {
      if (input(pin_a0)) // Eğer RA0 girişine bağlı butona basılırsa
      {
         delay_ms(20);   // Buton arkı önleme gecikmesi
         while(input(pin_a0)); // Basılı butondan el çekile kadar bekle
         i+=3; // i=i+3 anlamındadır.
     
         if (i>170) // i değeri 170'dan büyükse i değeri 170 olsun
            i=170;

         set_pwm2_duty(i); // PWM2 çıkışı görev saykılı belirleniyor
      }

      if (input(pin_a1)) // Eğer RA1 girişine bağlı butona basılırsa
      {
         delay_ms(20);  // Buton arkı önleme gecikmesi
         while(input(pin_a1)); // Basılı butondan el çekile kadar bekle
         i-=3;  // i=i-3 anlamındadır.

         if (i<5) // i değeri 5'den küçük ise i değeri 10 olsun
            i=5;
         set_pwm2_duty(i); // PWM2 çıkışı görev saykılı belirleniyor
      }
   }
}

lütfen yardım edin proje konum bu benim ve teslimine az kaldı:(
şimdiden teşekkürler...

ferdem

timer2 nin kurulumunda ikinci bölüm periyot bilgisi(CCS C nin helpinde var).
setup_timer_2(T2_DIV_BY_4,period,postscale);

Siz duty cycle i 170 e kadar çıkarıyorsunuz ancak periyodunuz 49. Bu durumda PWM düzgün çalışmaz, ya period u 170 yapın ya da duty değiştirme aralığınızı 0-49 yapın. Kolay gelsin.

ozkancelebi

setup_timer_2(T2_DIV_BY_4,49,1); setup_timer_2(T2_DIV_BY_1,199,1) olarak değiştirdim ama aynı sorun devam ediyor artır veya azalt butonuyla duty cycle değişmiyor mesela isis de simuling yaptıktan sonra bir kere artır butonuna bastıgımda duty cycle sürekli ON modunda oluyor yani tepe değerde düz bir çizgi oluyor.Simuling yaptıktan sonra azalta basarsam ise duty cycle sürekli OFF oluyor.
Bu değerleri yazmamın nedeni ise 5Khz lik bir pwm elde etmem gerektiğinden.
60V da dc motor hız ayarını denicem ve bu motor bir tako generatöre bağlı herhangi bir önerinizde olursa çok sevinirim sevinirim.


JKramer

Yaptığınız düzeltmeden sonra istediğiniz gibi çalışıyor. Isis dosyasını koyar mısınız?

ozkancelebi

#4
dosya ekleyemiorum
resim ekledende olmadı??
nasıl eklicem dosyayı?



JKramer

Isis'ten kaynaklanıyor. Bendeki sürüm 7.6 SP4 (portable), sizin gönderdiğinizde osiloskop da farklı.

Bir de denerken mosfeti çıkartın.

besiktask

aynı sorunu  bende yasıyorm butonlar hala normal olarak calıstırmıyor  devreyi. calıstırabıldıysenız  duzletılmıs kodları gonderebılırmısnız???

ozkancelebi

bende bu kez portable proteus 7.6 ile denedim bu seferde artır butonuna basınca duty cycle darbe şeklini alıyor dediğiniz gibi isis de bir sorun olabilir...
benm bir sorum daha olcak peki ben kodlarda duty cycle'ın butona 1. basışta 10,2. basışta 20,3. basışta 30  vs. gibi yapmak istersem kod sistemini nasıl değiştirmem lazım?bunda while yapısından başka bi yapı mı kullanmalıyım?
bu konuda çok yeniyim ve bu koduda örneklerden yola çıkarak yazdım. Yani while ve if yapılarını kısmen biliyorum.

ozkancelebi

arkadaşlar sayın JKramer inde dediği gibi mosfeti çıkarıp yerine NPN transistör koydum ve duty cycle ımı istediğim şekilde değiştirebiliyorum.Sanırım sorun mosfetle ilgili bir sorun.
JKramer e teşekkür etmeyi bir borç bilirim:D

JKramer

Siz üçer üçer arttırmak için i+=3 yazmışsınız. Onar onar arttırmak için de benzer şekilde i+=10 yazmanız yeterli. Bir de pwm duty için başlangıç değeri (butonlara hiç basılmadan, sonsuz döngünün dışına) verin; set_pwm2_duty(0) gibi.