Arduino AC Frekansmetre Yapımı

Arduino AC frekansmetre ile, 110/220/380V ve 50/60Hz değerli AC hatlarının frekansını ve periyotunu ölçebilirsiniz. Eğer ses sinyalleri ya da 5Vpp gibi değerleri ölçen bir frekansmetre istiyorsanız bu yazımıza göz atabilirsiniz.

Bu projede, 16×2 LCD ekrana frekans ve periyot değerlerini yazdırıyoruz, eğer LCD ekranınız yoksa, seri ekrandan da değerleri görebilirsiniz.

Bu proje ile herhangi bir garanti verilmemektedir, riski size ait olmak üzere yapın!

Frekans, 1 saniyedeki döngü sayısıdır (tam dönüş). Ana ölçü birimi Hertz’dir (Hz). Periyot 1 çevrimi (dönüşü) tamamlamak için gereken süredir, ana birimi saniyedir. Frekans = 1/periyot.

Evlerde kullanılan alternatif akım (AC) frekansı 50 veya 60Hz’dir, çoğu ülke 50Hz kullanır. 50Hz frekans için periyot 20 milisaniyedir ve 60Hz için periyot yaklaşık 16.67 milisaniyedir.

Gerekli Malzemeler

  • Geliştirme kartı (Arduino UNO)
  • 16×2 LCD ekran
  • Dirençler: 330 Ω, 120kΩ 2W, 10kΩ
  • 10kΩ potansiyometre
  • PC817 optokuplör
  • 1N4007 diyot
  • Devre tahtası
  • Bağlantı kabloları

Devre Şeması

Arduino AC Frekansmetre Yapımı arduino ac frekansmetre,arduino ac frekans okuyucu,arduino frekansmetre

AC girişi, PC817 optokuplör maksimum ters voltajı 6V olduğundan, negatif yarım döngüleri ortadan kaldırmak için 1N4007 diyotunun kullanıldığı yerde gösterildiği gibi devreye bağlanır.

Optokuplör LED’inden (IF) geçen akımı sınırlayan 120k ohm direnç (ve ayrıca 1N4007 diyot) aracılığıyla AC ana şebekeye bağlanır. 120k ohm direnç ve 220V kaynağı ile, tepe ileri akımı eşittir (diyot voltajlarını ihmal ederek):
220x√2/120k = 2,59 mA ve RMS akımı (yarım dalga) = 2,59/2 = 1,3 mA olarak hesaplanır.

PC817 optokuplörün çıkışı Arduino’ya şu şekilde bağlanır:
Emitter Arduino GND’sine bağlanır,
Kollektör Arduino dijital pin 2’ye bağlıdır. Bu pin aynı zamanda harici kesme 0 içindir.
Kollektör Arduino +5V pinine 10k ohm pull up direnci ile bağlanır.

Optokuplör LED’i ileriye doğru kutuplandığında, çıkışı (transistör toplayıcı) GND’ye (mantık 0) bağlanır. Sinyal negatif döngüleri sırasında PC817 çıkışı mantık 1’dir. Optokuplör ile yüksek gerilim tarafı alçak gerilim tarafından izole edilmiştir.

Arduino Kodu

#include <LiquidCrystal.h>


LiquidCrystal lcd(3, 4, 5, 6, 7, 8); //(RS, E, D4, D5, D6, D7)

void setup(void) {
  Serial.begin(9600);

  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Frek =");
  lcd.setCursor(0, 1);
  lcd.print("Peri =");

  // Timer1 ayarları
  TCCR1A = 0;
  TCCR1B = 2;   //  Timer1 1/8
  TCNT1  = 0;   //  Timer1 preload değeri 0 (reset)
  TIMSK1 = 1;   //  Timer1 overflow interrupt

  EIFR |= 1;  //  INT0 flag temizleme
  attachInterrupt(0, timer1_get, FALLING);  //  harici interrupt (INT0) aktiflestirme
}

uint16_t tmr1 = 0;
float periyot, frekans;

void timer1_get() {
  tmr1 = TCNT1;
  TCNT1  = 0;   //  Timer1 sıfırlama
}

ISR(TIMER1_OVF_vect) {  // Timer1 interrupt service routine (ISR)
  tmr1 = 0;
}

// main loop
void loop() {

  // Timer1 değeri kaydetme
  uint16_t deger = tmr1;
  // ms cinsinden periyot
  // 8.0 Timer1 prescaler ve 16000 = MCU_CLK/1000
  periyot = 8.0 * deger / 16000;

  if (deger == 0)
    frekans = 0;   // 0'a bölme engelleme
  else
    frekans = 16000000.0 / (8UL * deger);

  lcd.setCursor(7, 0);
  lcd.print(frekans);
  lcd.print(" Hz  ");


  lcd.setCursor(7, 1);
  lcd.print(periyot);
  lcd.print(" ms  ");

  Serial.print("Frekans: ");
  Serial.print(frekans);
  Serial.print(" Hz / ");
  Serial.print("Periyot: ");
  Serial.print(periyot);
  Serial.println(" ms");
  delay(500);

}

Kod Açıklamaları

Bu projede optokuplör çıkışının düşmesini (yüksekten düşüğe) algılamak için harici kesme 0 kullandık. Bu kesme, aşağıda gösterildiği gibi başlatılır:

 EIFR |= 1;  //  INT0 flag temizleme
  attachInterrupt(0, timer1_get, FALLING);  //  harici interrupt (INT0) aktiflestirme

Bir kesme olduğunda, Arduino doğrudan timer1_get() işlevini yürütür.
Frekansı ölçmek basittir, Timer1 modülü 2 ardışık kesinti arasındaki süreyi ölçmek için kullanılır, bu da 2 ardışık düşen olay arasındaki süreye sahip olduğumuz anlamına gelir. timer1_get() işlevi çağrıldığında, Timer1 değerini tmr1 adlı bir değişkende saklar.

Timer1 modülü her 1 mikrosaniyede 2 artacak şekilde yapılandırılmıştır (ön ölçekleyici = 8) ve tmr1 değişkenini sıfırlamak için taşma kesintisi etkinleştirilir (sinyal kaldırıldığında yardımcı olur).
Ön ölçekleyici = 8 ile, Timer1 modülünün saat girişi şuna eşittir: Timer1_CLK = 16MHz/8 = 2MHz.

Bu konfigürasyon ile Arduino’nun ölçebileceği en düşük frekans yaklaşık 31Hz’dir.

Periyot Hesabı

Dönem (us olarak) = Timer1_degeri/Timer1_CLK = Timer1_degeri/16000000/8
Dönem(us olarak) = 8 x Timer1_degeri/16000000
Dönem (ms olarak) = 8 x Timer1_degeri/16000

Frekans Hesabı

Frekans = 1/periyot
Frekans (Hz olarak) = 16000000/(8 x Timer1_degeri)

Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.