Pic ile frekans ölçeceğim yardım lütfen

Başlatan mustafa_09, 07 Aralık 2012, 23:43:16

mustafa_09

Merhaba pic ile frekans ölçmem gerekiyor (kare dalga 0-300hz) işin içinden çıkamadım. kesmelerin bir tanesini kullana biliyorum ama frekans ölçebilmem için iki kesme kullanamam gerekiyor galiba. pic ile fazla bilgim yok biraz ccs c biliyorum. Araştırdım birkaç frekansmetre devresi buldum ama işi çözemedim. bir proje yapıyorum bu projenin ilk adımı.

0-75hz de birinci led yakacak
75-150hz de ikinci led yanacak
150-225hz de üçüncü led yanacak
225-300hz de dördüncü led yanacak

frekansı sayma işleminde yardımcı olursanız sevinirim. teşekkürler.

muhittin_kaplan

#1
capture and compare modülünü araştırınız (yükselen kenerda sayıcıyı başlatıp diğer yükselen kenerda okursanız peryod zamanını bulursunuz.)

mesaj birleştirme:: 07 Aralık 2012, 23:54:21

arayınca bu çıktı karşıma
https://www.picproje.org/index.php?topic=32164.0

mustafa_09

linkler için teşekkür ederim ama onlarıda incelemiştim ben tam olarak nasıl çalıştığını mantığını kavrayamadım elimde iki kitap ve birçok frekans metre devresi var. timer kesmeleri ile sıkıntım var bir tanesi gelen palsleri ölçecek diğeri ile nasıl zamanı ölçeceğimi bilmiyorum.

diot

pic basic pro ile yap. frekans sayma komudu var. 3-5 satırda halledersin

necati

#4
http://www.4shared.com/rar/CYjMTA18/frequency.html
Timer0 da elde edilen 1sn boyunca gelen palsler Timer1 de sayiliyor

if((75<=hz) && (hz<=150)){output_bit(pin_b1,1);}else{output_bit(pin_b1,0);}

[email]entegreterbiyecisi@yahoo.com[/email]

mustafa_09

İlginiz için Teşekkür ederim işi çözdüm

Necati bey in gönderdiği link çok yardımcı oldu. kod da değiştirmemi önerdiğiniz kısım varmı?

#include <16f628.H>
#use   delay(clock=4000000)//
#fuses NOPROTECT,NOWDT,PUT,noBROWNOUT,noLVP,NOMCLR,xt
#BYTE     PORT_A=0X05
#BYTE     PORT_B=0X06

#use standard_io ( a )
#use standard_io ( b )

int32 ab=0,hz=0;
float khz=0;
int1 aa=0;
int16 sayi=0,tr=20;

#int_timer1
void tas(){
ab++;
}
#int_timer0
void sn(){sayi=0;
 set_timer0(61);//(255-60)*195*20=1000000us=dahili 1sn icin
 if(tr){ tr--;}
 else{delay_us ( 698 );
      output_low(pin_a0);
      disable_interrupts (global);
      disable_interrupts(int_timer0);
      disable_interrupts(int_timer1);
      sayi=get_timer1();
      aa=1;
      hz=sayi+(65536*ab);
      tr=20;
                              }}
   void   main() {

      setup_timer_1 (t1_external|t1_div_by_1);
      setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_256);
      enable_interrupts(int_timer0); // timer0
      enable_interrupts(int_timer1);
      enable_interrupts(global);
     
      SET_TRIS_A   (0b00100000);
      SET_TRIS_B   (0b11000000);
      set_timer0(61);
      set_timer1(0);
      
      sayi=0;
      hz=0;

   while(true){
   if(aa==1){


 if(75<=hz)
   output_high(pin_b0);

 
 if(75<=hz<=150)   
   output_high(pin_b1);
   
 if(hz<=75)   
   output_low(pin_b1);
   
 if(150<=hz<=225)
   output_high(pin_b2);
   
 if(hz<=150)
   output_low(pin_b2);
   
 if(225<=hz<=300) 
   output_high(pin_b3);
   
 if(hz<=225) 
   output_low(pin_b3);
   
      delay_ms (2);;
      set_timer1(0);
      enable_interrupts(int_timer0);
      enable_interrupts(int_timer1);
      enable_interrupts (global);
      aa=0;
      ab=0;
      sayi=0;
      hz=0;
      khz=0;
      }
          
          
          
          }}

eistain_54

Bir pinden girilen sinyalin frekansı max ne kadar olabilir?Herhangi bir pin için.Birde bu iş için yani frekans okuma için uygun pinler yada donanımlar hangileri olabilir?Birde 8 bit mcunun max okuyabileceği frekans ne kadardır?Bu konuyu kısaca özetleyebilir mi birisi?Ben gerçekten kavrayamadım da olayı.Kafamı karıştıran noktalar var.
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!

fryrmnd

Sanırım en uygunun 2 adet timer kullanıp tekini counter modda kulanmak. Diğer timer ise 1 sn süre tutar. 1sn sonunda sayılan yükselen yada düşen kenar sayısı ile frekansı elde edersiniz. Counter olarak kullandığınız timer 16 bit ise ve 1:265 prescaler kullanıyorsanız  2^16*256 kadar sayabilirsiniz. Değişik eklemeler(extra ön bölücü entegreler) yapılabilir sanırım.

sadogan

Alıntı yapılan: mustafa_09 - 08 Aralık 2012, 12:16:25
İlginiz için Teşekkür ederim işi çözdüm

Necati bey in gönderdiği link çok yardımcı oldu. kod da değiştirmemi önerdiğiniz kısım varmı?

#include <16f628.H>
#use   delay(clock=4000000)//
#fuses NOPROTECT,NOWDT,PUT,noBROWNOUT,noLVP,NOMCLR,xt
#BYTE     PORT_A=0X05
#BYTE     PORT_B=0X06

#use standard_io ( a )
#use standard_io ( b )

int32 ab=0,hz=0;
float khz=0;
int1 aa=0;
int16 sayi=0,tr=20;

#int_timer1
void tas(){
ab++;
}
#int_timer0
void sn(){sayi=0;
 set_timer0(61);//(255-60)*195*20=1000000us=dahili 1sn icin
 if(tr){ tr--;}
 else{delay_us ( 698 );
      output_low(pin_a0);
      disable_interrupts (global);
      disable_interrupts(int_timer0);
      disable_interrupts(int_timer1);
      sayi=get_timer1();
      aa=1;
      hz=sayi+(65536*ab);   
      tr=20;
                              }}
   void   main() {

      setup_timer_1 (t1_external|t1_div_by_1);
      setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_256);
      enable_interrupts(int_timer0); // timer0
      enable_interrupts(int_timer1);
      enable_interrupts(global);
     
      SET_TRIS_A   (0b00100000);
      SET_TRIS_B   (0b11000000);
      set_timer0(61);
      set_timer1(0);
      
      sayi=0;
      hz=0;

   while(true){
   if(aa==1){


 if(75<=hz)
   output_high(pin_b0);

 
 if(75<=hz<=150)      --> ???
   output_high(pin_b1);
   
 if(hz<=75)   
   output_low(pin_b1);
   
 if(150<=hz<=225)    --> ???
   output_high(pin_b2);
   
 if(hz<=150)
   output_low(pin_b2);
   
 if(225<=hz<=300)    -->???
output_high(pin_b3);
   
 if(hz<=225) 
   output_low(pin_b3);
   
      delay_ms (2);;
      set_timer1(0);
      enable_interrupts(int_timer0);
      enable_interrupts(int_timer1);
      enable_interrupts (global);
      aa=0;
      ab=0;
      sayi=0;
      hz=0;
      khz=0;
      }
          
          
          
          }}

if(150<=hz<=225)
Beli bir aralık tanımlaması bu şekil yapılmıyor

rree

Ufak bir not  Pic kristal frekansını 2 katları veya 50 nin katları şeklinde ayarlarsan. 100 ms veya 1sn değerleri ulaşman daha kolay olur. Örneğin 3.276.800 Hz Lik kristal. 50 nin 2 katlarındandır.

ayhan_eee

Bence 1sn boyunca gelen sinyalleri sayarsan uygun bir sonuç elde edebilirsin.

mustafa_09

Alıntı Yapif(150<=hz<=225)
Beli bir aralık tanımlaması bu şekil yapılmıyor

similasyonda çalışıyor pic e atmadım daha peki nasıl yapabiliriz?

sadogan

Alıntı yapılan: mustafa_09 - 10 Aralık 2012, 11:54:36
similasyonda çalışıyor pic e atmadım daha peki nasıl yapabiliriz?
similasyonda nasıl test yaptın bilmiyorum ama şu kodda hz ye aralık içinde ve dışında degerler
vererek pin_b0 ın durumunu izle istersen
void main(void)
{
 unsigned int8 hz = 251;
  while(TRUE)
  {
      if(150<=hz<=225)output_high(pin_b0);
      else output_low(pin_b0);
     
  }
 }

Bu şekilde aralık tanımlıyorsun.
if(150<=hz&&hz<=225)