Arduino: Timer kullanarak Frekansmetre Yapımı (Making the frequency meter using timer)

Bu uygulamada Timer1 sayıcı girişinden (Arduino Uno pin 5) girilen pulseleri sayarak saniyedeki pulse değerini (frekansı) bulacağız. Bir saniyelik süreyi Timer2’yi kullanarak elde edeceğiz. Sinyal kaynağını yine Arduino üzerinden analogWrite fonksiyonu ile üreteceğiz. Bu tip çalışma mantığı olan devreler yüksek frekanslarda daha doğru sonuçlar vermektedir. Düşük frekanslı sinyalleri daha hassas ölçmek için peryot süresini bulup oradan frekansın hesaplanması gerekmektedir.

Devir sayacı olarak kullanılmak istenirse RPS (saniyedeki dönme sayısı) ile 60 çarpılarak RPM (dakikadaki dönme sayısı) bulunabilir.

Yukarıdaki blok şemada Timer1 sayıcı/zamanlayıcı bölümü görülmektedir. Atmega328p MCU PD5 pini (Arduino pin 5)  harici sayıcı giriş pinidir. Bu pinden düşen kenar veya yükselen kenar tetikleme yapılabilmektedir. Bu uygulamada düşen kenar tetikleme yapacağız.

Frekans kaynağının giriş voltaj değerinin 5V’tan büyük veya küçük olması durumunda devrenin sayım yapabilmesi ve değişik dalga şekillerinin okunabilmesi için ara bir devreye ihtiyaç vardır. Bunun için tek transistörlü bir devre yeterli olmaktadır. Ancak giriş geriliminin 0.7 üzerinde olması gerekmektedir.


#define LED       13

#define tacho     5 // TMR1 için harici sayıcı giriş pini

#define pwmMos    6  // kare dalga üretim pini Not: Pin çıkışını doğrudan uygulamayınız. 1k-10k direnç ile uygulayınız.

uint16_t sayac_timer2, sayi;

boolean oku;

void setupTimer1() {

noInterrupts();

TCCR1A = 0;

TCCR1B = 0;

TCNT1 = 0;

TCCR1B |= (1 << CS12) | (1 << CS11); // Harici giriş (pin 5), düşen kenar tetikleme

interrupts();

}

void setupTimer2() {

noInterrupts();

// Clear registers

TCCR2A = 0;

TCCR2B = 0;

TCNT2 = 0;

OCR2A = 124;  // 1000 Hz (16000000/((124+1)*128))- 1 ms peryot

TCCR2A |= (1 << WGM21);   // CTC

TCCR2B |= (1 << CS22) | (1 << CS20); // Prescaler 128

TIMSK2 |= (1 << OCIE2A);  // Output Compare Match A Interrupt Enable

interrupts();

}

ISR(TIMER2_COMPA_vect) {       //Timer2 karşılaştırma kesmesi

sayac_timer2++;

if(sayac_timer2==1000) {sayac_timer2=0;sayi=TCNT1;TCNT1=0;oku=1;} // her 1000ms=1sn okuma yapılıyor.

}

void setup() {

pinMode(LED,OUTPUT);

pinMode(tacho,INPUT);

Serial.begin(9600);

setupTimer1();

setupTimer2();

analogWrite(pwmMos,127); // 1 KHz,  kare dalga üretiliyor

}

void loop() {

if(oku)

{

Serial.print("Frekans = ");

Serial.print(sayi); // frekans değerini 977 olarak terminal ekranına yazdı

Serial.println(" Hz");

oku=0;

}

}

 

 

Yorum bırakın