PIC16F877A min. PWM frekansı

Başlatan oongit, 05 Kasım 2010, 22:26:24

justice_for_all

Harici kesme girislerine buton koyarak yapabilirsin..

harici kesme fonksiyonundada duty cycle ni attirip azaltabilirsin ..
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

oongit

Valla ne yalan söyleyeyim... Şu kesme olayını halâ tam olarak çözebilmiş değilim... Demek ki biraz daha üzerinde çalışmalıyım... Ama kısa zamanda çözerim sanırım...

justice_for_all

simdi baktin da 877A da harici kesme bitane var ozaman B4-B7 pinlerinde olusan kesmelere koyabilirsin..

veya butonlari herhangi iki pine baglarsin bu pinlerden den 1 tane iki girisli AND kapisina baglarsin butonlar yukari cekme direnciyle 5volta bagli olacak AND kapisininda cikisini INT0 pinine baglarsin butonlarda herhangi bi degisiklik olmayinca AND kapisinin cikisi 1 olacagi icin kesme meydana gelmez butonlarin herhangi bitine basilinca AND kapisi 0 olur ve kesme meydana gelir kesmede butonlara bagli pinleri okuyarak if in icinde arttirip azaltabilirsin...

birinci yol daha kolay ama birinci yolda butona basinca kesme oluyor nutondan elimizi cekincede kesme oluyor..hata meydana gelebilir ama birinci durumdada if kosulu yaparak hangi butona basildigini bulabilirsiniz...


Kolay gelsin...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

oongit

Yapmak istediğim devrenin başlangıcı böyle:
http://www.upload.gen.tr/resim.php/s16/3k5l02ry/Ads__z.jpg.html

PWM başladığı zaman, Duty Cycle %50 olarak başlayacak.
Arttır butonuna tıkladığımda Duty Cycle %5 artacak,
Azalt butonuna tıkladığımda Duty Cycle %5 azalacak...
Duty Cycle oranı min. %10, max ise %90 olacak
Ve CCP1 veya CCP2 pininden sabit 100 Hz. alacağım...

4 Mhz kristal kullanıldığında min. PWM frekansı donanımsal olarak 249 Hz. olabiliyormuş... Frekans bölücü kullanımı PWM'i bozabiliyormuş... Peki o halde yazılımsal olarak nasıl 100 Hz. PWM alabilirim.

NOT: PWM frekansı üretilirken ve Duty Cycle değiştirilirken, programda kesinlikle bir kesme ya da sapma olmamalı... Bu mümkün müdür? Mümkünse nasıl?  :-\

oongit

Yine de problem çıkabilir diyorsanız; mebcuren 250 Hz. kullanacağım... Peki 250 Hz. için aşağıdaki kod nasıl değişmeli?

setup_timer_2(T2_DIV_BY_16,170,1);

justice_for_all

100 hz pwm alamazsin 4 mhz ile alabilecegin dedigin gibi 250 hz... benim yazdigim programi denemedin mi 100 hz uretmiyomu...

Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

oongit

Alıntı yapılan: justice_for_all - 11 Kasım 2010, 21:51:55
benim yazdigim programi denemedin mi 100 hz uretmiyomu...
Yanlış hatırlamıyorsam kesmelerden falan bahsetmiştiniz... Açıkçası programda kesme olabileceği fikri beni endişelendirdi. Üstelik C dilinde henüz acemi olduğum için programı tam olarak nasıl yazmam gerektiğini bilemedim... Bu yüzden de denemedim.

neural

Programda kesme oluşuyor ancak o kesmeler pwm üretmek için ayrıca kesme içerisindeki kodlar basit olduğu için çok fazla bir bekleme olmuyor.
Buton okuma işini main program içerisinde de yapabilirsiniz. Bu şekilde butona basıldığında program kesintiye uğramaz. Arkadaşların bahsettiği kesme ana program çalışırken araya daha önemli bir programın girip çalışması oluyor. Yani kesme programı sizin pwm üreten programınız, ana program altında da buton okuma, ledlerin kontrolu, lcd kontrolü gibi uygulamaları yapabilirsiniz.

justice_for_all

PWM Period = [(PR2) + 1] • 4 • TOSC • (TMR2 Prescale Value)

buformulden yerine koyarsak  PR2=255 presscale icin ise 1 koyarak hesaplarmisin...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

justice_for_all

arkadasim PR2 ye 0 ver prescale e de 1 ver ve hesapla...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

oongit

O formülde nasıl hesaplayacağım, anlayamadım...

justice_for_all

arkadasim sana lazim olan PR2 degeri

PWM Period = [(PR2) + 1] • 4 • TOSC • (TMR2 Prescale Value) 

(pwm periyot * FOSC/ 4/timer2 prescale )-1=PR2

simdi FOSC= 4Mhz
timer prescale=16 verin
pwm periyot=1/250=0.004

PR2yede =249 verip formulde yerina koyarmisiniz...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

oongit

setup_timer_2(T2_DIV_BY_16,170,1);

Yukarıda verdiğim kodu, aşağıdakine çevirdim..
setup_timer_2(T2_DIV_BY_16,249,1);

ISIS simülasyonunda 250 Hz. verdi  :)
Çok teşekkür ederim...

Peki az önce sorduğum Duty Cycle işini nasıl yapacağım?

oongit

Programı şu şekilde yaptım:
#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use fast_io(c)
#use fast_io(d)

int i=5; //Tamsayı tipinde değişken tanımlanıyor

void main()
{
   setup_PSP(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   
   set_tris_d(0b11000000);    //RD6 ve RD7 giriş
   set_tris_c(0b11111001);    //RC1 ve RC2 çıkış
   
   setup_ccp1(CCP_PWM);       //CCP1 birimi PWM çıkışı için ayarlandı
   setup_ccp2(CCP_PWM);       //CCP2 birimi PWM çıkışı için ayarlandı
   setup_timer_2(T2_DIV_BY_16,249,1);
   
   set_pwm1_duty(i);
   set_pwm2_duty(i);
   
   while(1)
   {
      if (input(pin_d7))
      {
         delay_ms(20);
         while(input(pin_d7));
         i+=3;
         
         if (i>=170)
         i=170;
         
         set_pwm1_duty(i);
         set_pwm2_duty(i);
      }
      
      if (input(pin_d6))
      {
         delay_ms(20);
         while(input(pin_d6));
         i-=3;
         
         if (i<5)
         i=5;
         
         set_pwm1_duty(i);
         set_pwm2_duty(i);
      }
   }
}

Peki Duty Cycle oranının min. ve max. seviyesini ve %5'lik değişimlerini nasıl yapacağım?

justice_for_all

yani eger programinizin aksamasi problem yaratmazsa sonsuz dongude butonlari kontrol ettirirsiniz ama yok benim programim baska islerlede ugrascak zaman benim icin onemli diyosan o zaman kesme ile yapmak zorundasiniz...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay