pıc ile frekansmetre

Başlatan asof544, 07 Nisan 2015, 13:51:02

asof544

Merhba pıc ile frekans metre nasıl  çalışır? ve yapılır* yardımcı olanlar teşekkürler
frekans değerlerini nasıl referans alcağız yani belli bir frekans değerleri için bazı portları aktif yapabilirmiyiz?

ete

Frekans nedir? Sorusunun yanıtını , belirli bir zaman dilimi (1sn) içinde gelen puls sayısı şeklinde açıklanır. Bu durumda frekansmetre de 1 sn içinde gelen pals leri sayan sistem olarak açıklanabilir.
Açıklamaya ıygun olarak 1 sn lik bir zaman tutularak bu esnada gelen pulsler sayılır ve sonuçta sayılan değer ekrana verilir. Çalışma şekli böyle. 1 sn (1000 ms) bir işlemci için büyük bir zaman dilimi olduğu için bazen daha kısa süreli bir zaman tutularak hesaplama yapılarak da frekans sayılabilir ama bu sistemin hata yapma olsaılığı yüksek olur. Frekans değer elinizde olduğu müddetçe bu değere bağlı olarak portlarda istediğinizi elbette yapabilirsiniz.

Ete

asof544

yani sayıvcı ve kaydedici uygulamlarını iyi bilmeliyim eyvallah

Hattuşa

@ETE hocam frekansmetre ile ilgili 2 soru sormak istiyorum;
soruma geçmeden önce elimdeki devre  10khz ile 200 khz arası (ortalma) bir ölçüm yapılacak, yalnız frekans ölçümü münkün olduğunca hassas olmalı..
1. yapacağım devrede giriş frekansını cd4024 gibi bölücü ile bölerekmi daha hassas okurum.
2. int girişinden düşen veya yükselen kenar takibi ile mi ölçmek hassas olur yoksa T0CKI pini ile sayarak mı daha hassas okuma yapabilirim

bana ne önerirsiniz?

ete

Frekansı bölerek okumak demek çözünürlüğü düşürmek anlamına gelir ki buda hassasiyetin azalması demektir.
10 khz için (1000/10=)100 us lik bir sayma yapman gerekiyor.
200 khz için (1000/200=)5 us lik bir sayma yapman gerekiyor ki bu durumda 4 mhz kristal ile yada çalışma frekansı ile yeterli hassasiyeti sağlayamazsın. En azından 10 Mhz veya üzeri kristal frekansı ile ölçüm yapmanda yarar var.
en güzeli benimde kullandığım 1000 ms zaman tutup Tmr1 sayacını harici kaynaktan (frekans kaynağı) saydırmak. Bölme oranını 1/1 alarak direk sayma yapmanda yarar var.
Ete

Hattuşa

slm ete hocam bir sorum olacaktı,
şimdi 2 kanal frekans kaynağım var ve ben bu iki frekansı bir işlemci ile okutup ekrana yazdırmak istiyorum. sorunum frekans aralıkları çok geniş şöyle ki;
1. kanal => 1 hz ile 94 khz arası
2. kanal => 1 hz ile 520 khz arası

bunu en basit şekilde nasıl yapabilirim?

ete

Pro-TR,
Fazla alternatifin yok. Ya zaman tutup o zaman içinde gelecek pals leri sayacaksın yada gelen sinyalin peryodunu ölçeceksin.
Yada her ikisini aynı anda yapacaksın.
Olaya 94 khz açısından bakarsak, peryodu yaklaşık (1000/94=) 10,64 us dir. Bu süre ölçülebilir bir süredir. Puls olarak ölçmeye kaltığında 1 sn de 94.000 puls eder ki direk sayamazsın bölme kullanman gerekir. 4 e bölerek saydığını varsayarsak sayacın 23.500 sayacak demektir.

Ortak noktayı bul ak açısından diğer frekansıda inceleyelim. 520 khz lik sinyalin peryodunu ölçmeye kalkarsan 1000/520=1,923 us çıkarki normal şartlarda bunu hassas bir şekilde ölçmek zor. Ancak 32 mhz ve üzeri frekanslarda çalışan bir programla ölçüm alabilirsin. Puls olarak saymak istersek,
1 sn de 520.000 puls sayman gerekir. Diğeri gibi 4 e bölerek saysak 130.000 sayarsınki buda taşma yaratır. O halde 8 e bölmen gerekecektir. Böylece limit de bir değer olan 65.000 bulursun.
Bu durumda her iki frekansıda değerlendirmek açısından puls sayman daha uygun gözüküyor.
1 sn lik zaman tutarak çalışırsan ki daha az zaman tutarak sayac değerini düşürmek mümkün olabilir.
Önce 4 e bölerek çalışma yapman ve sayac da taşma olmuş ise sıfırlayıp bu sefer bölmeyi 8 e ayarlayarak yeniden sayma yapman gerekir. Hep sayac diyorum ama bu Tmr1 sayacını dışarıdan giriş yaptırarak saydırma işlemini kast ediyorum. Ozaman bir zaman sayacı değil bir olay sayacı olarak çalışır. 16 bit olduğu için kolaylıkla işini görür.
Olaya daha kısa zaman dilimleri açısından bakarsak. Diyelimki 1 ms lik zaman tuttum.
Birinde 94 diğerinde ise 520 sayman gerekiyor. Belkide sinyalin seviyesini tespit etmek açısından önce tutulacak zamanı 1 ms yapıp 1/1 bölme ile gelen pulsleri say. Böylece otomatikman 1000 e bölme uygulamış olursun. Ancak düşük frekanslarda sayacın sana sıfır değerle dönecektir. Bu durumda süreyi artırarak yeniden sayman gerekebilir.
Basit ancak karmaşık bir konu. Yazdıklarımdan bir pay çıkartıp kendine en uygun yolu bulabilirsin.
Ya uzun süre tutup 1/1 bölme ile gelen palsleri sayacak ve sayac değeri taşmış ise ki taşma olunca PIR1.0 set edilir, o zaman bölme oranını artıracaksın. Taşma olmadan hangi bölme oranı ile çalışmış isen ona göre hesap yapacaksın. Başka çaresi yok.

Ete

Hattuşa

#7
ete hocam yanıtınız için tşk ederim. kullandığım protonun helpinden "counter" komutunun kullanım tarifnamesinde 20mhz kristalle 125 khz e kadar ölçüm yapabileceğimizi yazmış hadi 1hz-94khz kanalını  bununla kurtarmış olalım (çok hassas olmazsa da işimi görür)

diğer kanalıda T1CKI den giriş yapıp TMR1 den saymaya çalışınca 520khz i ölçümleyebilirim ancak multi-calcilatorde ölçebileceğim min. frekaans 76,286 hz diyor, yoksa benmi yanlış anladım. yani benim sıkıntım düşük frekansları okuyamamak sanırım

T0CKI 8 bit sayıcı eğer oda 16 bit sayıcı olsaydı böyle bir sorunum olmazdı diye düşünüyorum

ete

Düşük frekansları okumak gerçekten zordur. 1 Hz için şöyle bir düşün istersen 1000 ms zaman tuttun ve yalnızca 1 puls geldi. Onuda yakalayabilirsen çünki 1 puls tuttuğun zaman aralığına denk gelmeyebilirde. Bu nedenle düşük frekanslar için kesinlikle peryod ölçülmeli bana kalırsa

Ete

Hattuşa

ETE hocam; benim kafamı ağrıtan konu timerlerde kullandığımız TMR0,TMR1L ve TMR1H değerlerinin taşmasını nasıl tespit edecez. şöyle ki bir frekans ölçüyoruz  ola ki frekans yüksek oldu ve 65535 değerinden fazla çıktı misal 70000 bu değeri asla göremeyiz. zira TMR1L ve TMR1H değeri 65535 değerinden sonra 0 lanıp tekrar baştan saymaya başlar ve aslında 70000 olması gereken değer 4465 görürüz. peki bu taşmayı tespit etme şansımız yokmu? aynı şekilde byte mertebesinde ki TMR0L değerinin 255 'i aşması durumunda da aynı

ete

Her bir timer da taşma olduğunda kesme bayarağını set eder. Kesme açıksa program kesmeye gider kapalı ise hiç bir şey yapmaz bekler. İp ucun budur. Ancak önceden bayarakların set edilmiş olması ihtimalini ortadan kaldırmak için ölçmeye başlamadan önce bayraklar sıfırlanmalıdır.

Ete

Hattuşa

Alıntı yapılan: ete - 04 Haziran 2017, 19:10:37
Her bir timer da taşma olduğunda kesme bayarağını set eder. Kesme açıksa program kesmeye gider kapalı ise hiç bir şey yapmaz bekler. İp ucun budur. Ancak önceden bayarakların set edilmiş olması ihtimalini ortadan kaldırmak için ölçmeye başlamadan önce bayraklar sıfırlanmalıdır.

Ete

açlık adamın aklını alıyor hocam, şimdi okudum kendi yazdıklarımı çok safça buluyorum kendimi  :'( :'( :'(

en son T1CKI ile mükemmel saydırıyordum. ancak dediğiniz gibi TMR0 'ı 10mS ye ye alıyorum hz mertebesinde belirli bir frekansın altını okumakta sıkıntı çekiyorum. dediğiniz gibi 10mS çok az,

T0CKI girişi 8 bitlik keşke oda 16 bitlik olsa hiç bir şeye gerek kalmaksızın işlemi bitirebilirdim.  TMR0 in 16 bitlik olan küçük (16F628A yapısında) sanırım işimi görecek, peki bunu microchipin sitesinde nasıl bulabilirim ona bakıyorum

Hattuşa

#12
ETE hocam akşam akşam gene bişeyler saçmalamak istiyorum.
şimdi T1CKI pininden frekans ölçmek istedim. şöyle bir algoritma kurmak istedim.

KeSMe:
Context Save
if T0IF =1 then
TMR0 =60

If SaY =SaYaC Then
Fr2.LowByte =TMR1L
Fr2.HighByte =TMR1H

TMR1L =0
TMR1H =0
SaY =0
EndIf
Inc SaY
T0IF =0
endif

if TMR1IF =1 then

sayac =100
TMR1IF =0
endif
Context Restore



şimdi burda yapmak istediğim olay şu TMR0 ı 10mS de bir kesme oluşacak şekilde kurdum. kesme içinde de başka bir sayac çalıştırıp (sayac adlı) bu sayac değerini 1,10,100 olarak secimli yapmak istiyorum. yani yüksek frekanslarda 10mS lik süre boyunca frekans peryodunu saymak, orta frekansları 100mS süre ile saymak, düşük frekanslarda daha hassas okuma yapabilmek ve pulseleri kaçırmamak adına 1000mS süre ile okuma yapmak istiyorum. dün soruyu sorarken saçmaladığım konu buydu. şimdi TMR1 sayacı frekans sayımı esnasında taşma yaptığımda bekleme süresini kısaltmak istiyorum. ama TMR1IE yi  aktif etmeme rağmen TMR1 kesmesine sokamıyorum. dolayısıyla TMR1 sayıcısı taşma yaaptığında devre saçmalıyor veya donuyor.

kaçırdığım bişeyler olabilirmi?

ete

TMR1 kesmesi için iki register kullanılıyor. Birisi INTCON registeri 6. biti (Set edilmeli) ve diğeride PIE1 registeri sıfır nolu biti.
Bazı işlemcilerde bitlerin yeri değişebilir buna dikkat et. Yalnızca PIE1.0 bitini set etmekle kesmeyi açmış olmuyorsun. INTCON.6 yıda set etmen gerek (Peripheral Interrupt Enable bit)

Ete

Hattuşa

hocam burdaki saçmalamayı çözemedim bir türlü  ;D ;D ;D

bir bakabilirmisiniz?


Powered by EzPortal