5 farklı frekansta Kare Dalga PWM

Başlatan oongit, 20 Kasım 2010, 22:14:43

oongit

Eğer yanlış hesaplamadıysam;
çözünürlük= [log(1000000/100)]/log(2)
                 =log(10000)/log(2)
                 =4/0,301
                 =13,29 çıkıyor...

Ama en fazla 10 bit çözünürlük alabiliyoruz sanırım... 13 bit 10 bitten büyük olduğu için, 10 bit olarak mı kabul edeceğiz çözünürlüğü?

justice_for_all

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

oongit

O halde;
Çözünürlük = log(Fosc/Fpwm) / log(2) formülünden yola çıkarak;

Fosc= Osilatör frekansımız (yani 1.000.000 Hz),
Fpwm=İstediğimiz pwm çıkış frekansımız, (yani 100 hz), olacak... Tamam bu kısmı çok iyi anladım...

Peki;
PWM period = [(PR2) + 1] x 4 x Tosc x TMR2 Prescaler Değeri formülünde ise;
PR2 ve TMR2 Prescaler Değeri nasıl ve neye göre hesaplanıyor?

justice_for_all

zaten prescale degerleri belli (1,4,16) bu ilk once prescaler degeri 1 verilerek baslanir eger PR2 degeri 255 ten kucuk bi degerse bunu kullanabilirsin ama degilse o zaman prescaler degerine 4 verirsin yine hesaplayip yukaridaki sarta bakarsin oda olmadi bu kez prescaler degerine 16 verirsin bu sekilde hesaplanir arkadasim...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

oongit

Sayenizde benim için oldukça değerli bilgiler edindim, sonsuz kere sonsuz teşekkürler  ;D

Öğrenmenin yaşı yokmuş gerçekten de... Bu yaşta kafa basmaz dedim ama anlamaya başladım yavaş yavaş... Ama öğrenmek istediklerim henüz bitmedi  :)

Biz bu satırda ne demek istedik?
int16 i=0,sayac=70,maxduty;


Burada "i" neden "0",
"sayac" neden 70,
maxduty, bizim istediğimiz max. duty anlamına mı geliyor?
sayac=70 de yoksa min. duty anlamına mı geliyor?

justice_for_all

simdi hocam i degiskeni artik isimize yaramiyor o ilk programdaydi i=0 denilmesinin sebebi ilk deger atamasi eger biz o degeri vermezsek program random bi deger atar buda bizim isimize gelmez...

sayac degiskeni dutynin degerini tutuyo aslinda butonlarla sayac degiskenini azaltip cogaltiyoruz bu degiskenide dutyde gosteriyoruz..

max dutyde dediginiz gibi frekansin maz duty degeri programda gorduyseniz her frekansin icinde ayri max duty degeri yazdik sizin istediginiz gibi..

yasiniz kacti acaba??
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 - 29 Kasım 2010, 00:29:01
simdi hocam i degiskeni artik isimize yaramiyor o ilk programdaydi
Yani onu programımızdan çıkaracak mıyız artık?

Alıntı yapılan: justice_for_all - 29 Kasım 2010, 00:29:01
yasiniz kacti acaba??
4 ay sonra 33...

justice_for_all

evet cikarabilirsiniz hocam..

benden buyukmussunuz abi demem gerekir..ne isle mesguldunuz abi..
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

oongit

#98
Estağfurullah... Hitap şeklinizden rahatsızlık duymadım... Bursa'da Gazcılar'da Gündüz Elektronikte çalışıyorum. Elektrik, elektronik malzeme, komponent vs. satışı, ayrıca trafo sarımı falan da yapıyoruz... Normalde mobilya mezunuyum ve otomotivciyimdir, ama elektroniğe karşı yıllardır bir sempatim ve merağım var. Bugüne kadar tüm öğrendiklerimi araştıra araştıra, sora sora öğrenmiştim. Bugünden sonra da yine araştırmaya ve bunaltana kadar sormaya devam edeceğim. Çünkü elektroniği çok seviyorum...

PIC'lere de en başta MCS ve PBP ikilisiyle başlamıştım. Ama C dilinin çok daha az kayıpla hex'e dönüştürülebildiğini ve daha profesyonel bir dil olduğunu öğrendiğim andan itibaren, C dilini öğrenmeye çalışıyorum ben de...

Bu arada sizin yaşınız kaçtı?

OG

Alıntı Yapbunaltana kadar sormaya devam edeceğim.
Bu güzel. Ancak, Hızlı gitmek istiyorsan bir kitap, bir kurs vs gerekir. Parça parça gitmek zordur.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

oongit

Yarın sabah Altaş Yayıncılığın çıkardığı, Serdar ÇİÇEK imzalı CCS C ile PIC Programlama kitabını satın alacağım inşaallah...

justice_for_all

C dili en kolay ogrenebilen ve yapi bakimindan saglam bir dildir (tabi buna C++ ve  C# i dahil etmiyorum onlar daha profesyonel cunku) ben asm filan ogrenmeden direct olarak C ile basladim cokda memnunum..

basic filan bilmem oyuzden asm yide biraz bilirim onuda universiteden ders olarak gosteriliyodu ordan ogrendim ama kodlari anlarim..

C iyi bir dildir memnun kalacaksiniz yani:)

kitap alacaksaniz serdar cicek CCS C kitabi var gercekten cok guzel anlatmis tavsiye ederim cunku ben C dilini o kitaptan ogrendim...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

oongit

Sanırım biraz fazla yoruldum bugün... Kafam iyice karıştı... Bazı şeyleri kavrayamaz hale geldim... Şu programa beraberce bir el atsak nasıl olur? Uykum da geldi, sabah erkenden işe gideceğim...

Benim tam olarak istediğim şey şu:
1- Program ilk başladığında 100 Hz PWM, %10 Duty ile başlayacak...
2- Frekans 100-150-200-250-300 Hz. butonlarından hangisine basarsam basayım %10 Duty ile başlayacak...
3- Duty kesinlikle %10 seviyesinin altına düşmeyecek...
4- Duty kesinlikle %75 seviyesinin üzerine çıkmayacak...
5- Duty değeri azalırken ve artarken daima %5 artıp azalacak...

Kafam çok karıştı, üzgünüm...
Kodun son hali böyle:
#include <16f628a.h>
#fuses xt,nowdt,noput,noprotect,nobrownout,mclr,nolvp,nocpd
#use delay(clock=1000000)
#use fast_io(a)
#use fast_io(b)
#define pwm100       pin_a0
#define pwm150       pin_a1
#define pwm200       pin_a2
#define pwm250       pin_a3
#define pwm300       pin_a4
#define duty_arttir  pin_b6
#define duty_azalt   pin_b7

int16 sayac=60,maxduty;

#int_RB                          //PORTB'de B4..B7 pinlerinde oluşan kesme
void RB_isr(void)                //Kesme fonksiyonu
{
   if(!input(duty_arttir))       //Duty Arttır butonuna basıldı mı?
   {
      while(!input(duty_arttir))
      {
         delay_ms(20);
         if(sayac==maxduty)      //Sayac değerini sınırlamak için
         sayac=maxduty-5;
         sayac+=5;               //Duty değerini arttırmak için
         set_pwm1_duty(sayac);   //Hesaplanan sayaç değerini Duty'e yansıt
      }
   }
   
   if(!input(duty_azalt))        //Duty Azalt butonuna basıldı mı?
   {
      while(!input(duty_azalt))
      {
         delay_ms(20);
         if(sayac==5)            //Yine bu da sayac değerini sınırlama
         sayac=10;
         sayac-=5;               //Duty değerini azalt
         set_pwm1_duty(sayac);   //Hesaplanan sayaç değerini Duty'e yansıt
      }
   }
}

void main()
{
   setup_timer_0(rtcc_internal|rtcc_div_1);
   setup_timer_1(t1_internal|t1_div_by_1);
   setup_timer_2(t2_div_by_16,155,1);
   setup_ccp1(CCP_PWM);
   set_pwm1_duty(sayac);   //Başlangıçta Duty %50'dir demek
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_RB);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   set_tris_b(0xF7);
   set_tris_a(0xFF);
 
   while(1)
   {
      if(!input(pwm100))   //A0 pinindeki butona basildi mi?
      {
         setup_timer_2(T2_DIV_BY_16,155,1);  //100 Hz butona bikez basilinca bu if e girer
         maxduty=300;
         sayac=62;
         set_pwm1_duty(sayac);
      }
      
      else if(!input(pwm150)) //A1 pinindeki butona basildi mi?
      {
         setup_timer_2(T2_DIV_BY_16,103,1); //150 Hz ikinci kez basilinca
         maxduty=375;
         sayac=41;
         set_pwm1_duty(sayac);
      }
         
      else if(!input(pwm200)) ///a2 pinindeki butona basildi mi?
      {
         setup_timer_2(T2_DIV_BY_16,77,1); //200 Hz ikinci kez basilinca
         maxduty=375;
         sayac=31;
         set_pwm1_duty(sayac);
      }
            
      else if(!input(pwm250)) ///a3 pinindeki butona basildi mi?
      {
         setup_timer_2(T2_DIV_BY_16,61,1); //150 Hz ikinci kez basilinca
         maxduty=375;
         sayac=25;
         set_pwm1_duty(sayac);
      }
         
      else if(!input(pwm300)) ///a4 pinindeki butona basildi mi?
      {
         setup_timer_2(T2_DIV_BY_16,51,1); //300 Hz ikinci kez basilinca
         maxduty=375;
         sayac=20;
         set_pwm1_duty(sayac);
      }
   }
}

justice_for_all

size verdigim formulden dutylerin %10 ve %75 hangi desimal degerlere esit oldugunu bulmanizi istemistim buldunuzmu?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

oongit

100 Hz:
setup_timer_2(T2_DIV_BY_16, 155, 1);
set_pwm1_duty(62);          //%10
set_pwm1_duty(468);        //%75

150 Hz:
setup_timer_2(T2_DIV_BY_16, 103, 1);
set_pwm1_duty(41);          //%10
set_pwm1_duty(312);        //%75

200 Hz:
setup_timer_2(T2_DIV_BY_16, 77, 1);
set_pwm1_duty(31);          //%10
set_pwm1_duty(234);        //%75

250 Hz:
setup_timer_2(T2_DIV_BY_16, 61, 1);
set_pwm1_duty(25);          //%10
set_pwm1_duty(187);        //%75

300 Hz:
setup_timer_2(T2_DIV_BY_16, 51, 1);
set_pwm1_duty(20);          //%10
set_pwm1_duty(156);        //%75