Frekansmetre (Kesme Kullanarak)

PICMAN

Üye
Katılım
13 Ocak 2009
Mesajlar
23
Puanları
1
Merhabalar;

Sizlere kesme ile yapmış olduğum basit bir frekansmetre uygulamasını paylaşıyorum.

Genelde basit frekansmetre uygualmarında Counter komutu kullanılır.
Bu komut ile frkans öçlmek için 1sn deki palsleri saymak gerekir, bu işlemde döngüde 1sn kayba yol açar. Yani aynı anda USART, I2C, SPI, 1-wire,.... gibi protokollerle diğer entegreler ile haberleşmemizde gecikmeler yada aksaklıklar yaşanabilir.
Bu sorunu az da olsa ortadan kaldırmak için frekansı kesme ile okumak en mantıklısıdır.

Bunun için PIC in RB0 ve TMR1 kesmelerini kullandım. Bu şekilde 1sn deki darbeleri değilde, 2 darbe arasındaki süreyi ölçüp F=1/T formülünden frekansı hesaplamak daha mantıklıdır. Bu süreyi en uzun ölçebilmek için 16 bitlik saycı olan Timer1 i kullandım.

PIC in dış kesmesi olan RB0(INT) ve TMR1 taşma kesmeleri aktif hale getirilir. Her düşen kenarda (INT) dış kesme oluşur. Timer1 in içeriği okunur ve sıfırlanır. Okunan Timer1 değeri bize 2 pals arasındaki süreyi verir. Bu süreyide F=1/T ile hesaplarsak frekansı ölçmüş oluruz.
Eğer timer1 in max sayma süresince düşen kenar gelmez ise bu sefer, TMR1 taşma kemesi olşur ve Frekans değeri sıfırlanır.


Timer1 Hesaplamaları (PIC osc:4mhz):
Tmr1 Bölme Oranı = 1:4
Fkomut = Fosc / 4 = 4 / 4 = 1Mhz
Tkomut= 1/Fkomut = 1 / 1MHz = 1us
TMR1 SaymaAralığıSüresi = Tkomut * Tmr1oranı = 1 * 4 = 4us

Bu değerlere göre;
Min Frekans (TMR1 ın max saymasıdır)
4us * 65536 = 262,1 ms dir. (F = 3,8 Hz)

Max Frekans (TMR1 ın min saymasıdır)
4us * 2 = 8 us dir. (F = 125 KHz)

Min ve Max frekanslara göre PIC osc değiştirilebilir.

Bu yöntem ile frekans değiştiğinde, LCD ekranda değerin hızlı değiştiğini göreceksiniz.

Not: ISIS de 20khz den sonrasında işlemciyi zorladığı için ölçüm yavaşlıyor....
 
ben de bu kullandım a amaa rasındaki farkne olduğuınu bielemdim
 
link ölü kardeş
 
link ölü bu konuyla bilgisi olan biri var mı ? yol gösterecek?
 
Merhabalar;

Sizlere kesme ile yapmış olduğum basit bir frekansmetre uygulamasını paylaşıyorum.


Genelde basit frekansmetre uygualmarında Counter komutu kullanılır.
Bu komut ile frkans öçlmek için 1sn deki palsleri saymak gerekir, bu işlemde döngüde 1sn kayba yol açar. Yani aynı anda USART, I2C, SPI, 1-wire,.... gibi protokollerle diğer entegreler ile haberleşmemizde gecikmeler yada aksaklıklar yaşanabilir.
Bu sorunu az da olsa ortadan kaldırmak için frekansı kesme ile okumak en mantıklısıdır.

Bunun için PIC in RB0 ve TMR1 kesmelerini kullandım. Bu şekilde 1sn deki darbeleri değilde, 2 darbe arasındaki süreyi ölçüp F=1/T formülünden frekansı hesaplamak daha mantıklıdır. Bu süreyi en uzun ölçebilmek için 16 bitlik saycı olan Timer1 i kullandım.

PIC in dış kesmesi olan RB0(INT) ve TMR1 taşma kesmeleri aktif hale getirilir. Her düşen kenarda (INT) dış kesme oluşur. Timer1 in içeriği okunur ve sıfırlanır. Okunan Timer1 değeri bize 2 pals arasındaki süreyi verir. Bu süreyide F=1/T ile hesaplarsak frekansı ölçmüş oluruz.
Eğer timer1 in max sayma süresince düşen kenar gelmez ise bu sefer, TMR1 taşma kemesi olşur ve Frekans değeri sıfırlanır.

Timer1 Hesaplamaları (PIC osc:4mhz):
Tmr1 Bölme Oranı = 1:4
Fkomut = Fosc / 4 = 4 / 4 = 1Mhz
Tkomut= 1/Fkomut = 1 / 1MHz = 1us
TMR1 SaymaAralığıSüresi = Tkomut * Tmr1oranı = 1 * 4 = 4us

Bu değerlere göre;
Min Frekans (TMR1 ın max saymasıdır)
4us * 65536 = 262,1 ms dir. (F = 3,8 Hz)

Max Frekans (TMR1 ın min saymasıdır)
4us * 2 = 8 us dir. (F = 125 KHz)

Min ve Max frekanslara göre PIC osc değiştirilebilir.

Bu yöntem ile frekans değiştiğinde, LCD ekranda değerin hızlı değiştiğini göreceksiniz.

Not: ISIS de 20khz den sonrasında işlemciyi zorladığı için ölçüm yavaşlıyor....

sağ elinle sol kulağını tutmuşsun. int0 kesmesi ile tmr1 saydıracağına rb6 pininden tmr1 i external clock modunda rising,yada falling edge saydırıp 1snde bir okusaydın dahada mantıklı olmazmıydı?

ayrıca counter komutu kullanmış olduğunda ana programda 1sn beklesen dahi diğer işlemleri kesme yaparsın I2C,uart,spi bunların hepsinin interruptı mevcut.
 

Forum istatistikleri

Konular
128,133
Mesajlar
915,308
Kullanıcılar
449,849
Son üye
cagan20

Yeni konular

Geri
Üst