RSS

PENGHITUNG FREKUENSI (FREQUENCY COUNTER) MENGGUNAKAN CODEVISION AVR

17 Apr

Penghitung frekuensi (Frequency Counter) digunakan untuk menghitung banyaknya gelombang dalam satu detik, sehingga mempunyai satuan Hz (Hertz).

Untuk menghitung pulsa (frekuensi) yang berasal dari luar digunakan sebuah eksternal interupt (EXT INT). EXT INT merupakan fitur AVR Atmega 8535 yang berfungsi untuk mencacah sinyal dari luar.

Secara garis besar agar dapat menghitung sebuah frekuensi gelombang atau pulsa (Hz) mempunyai cara kerja sebagai berikut yaitu sebuah EXT INT untuk menghitung frekuensi dan lamanya perhitungan frekuensi tersebut adalah 1 detik. Sehingga didapat banyaknya frekuensi atau pulsa dalam 1 detik, dengan kata lain Hz.

Untuk itu diperlukan sebuah interupt (EXT INT) dan sebuah timer untuk membuat timer selama 1 detik. Disini saya telah membuat program penghitung frekuensi dan telah berhasil diimplementasikan pada rangkaian sesungguhnya. Untuk eksternal interupt digunakan EXT INT0 dan timernya menggunakan Timer1. Jika masih bingung mengenai timer dan interupsi eksternal, silakan baca tutorial Timer dan Counter serta Interupsi Eksternal AVR. Pada Atmega8535 atau Atmega16 EXT INT0 berasal dari pin INT0 atau PD2. Berikut adalah schematicnya.



Sedangkan untuk listing program lengkapnya:

int frekuensi=0;
float pulsa;
char temp[8];

#include <mega16.h>
#include <lcd.h>
#include <delay.h>
#include <stdlib.h>

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
frekuensi++;//baca frekuensi yg masuk trus di increament
}

// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Reinitialize Timer 1 value
    TCNT1H=0xD23A >> 8;
    TCNT1L=0xD23A & 0xff;
    pulsa=frekuensi;
    frekuensi=0;
    lcd_clear();
}

void tampilkan_LCD()
{
if (pulsa>=1000)
    {
    pulsa=pulsa/1000;
    ftoa(pulsa,1,temp);
    lcd_gotoxy(0,1);
    lcd_puts(temp);
    lcd_gotoxy(0,5);
    lcd_putsf(“KHz”);
    }

    ftoa(pulsa,1,temp);
    lcd_gotoxy(0,1);
    lcd_puts(temp);
    lcd_gotoxy(0,5);
    lcd_putsf(“Hz”);
}

void main(void)
{
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 11.719 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0xD2;
TCNT1L=0x3A;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: Off
// INT2: Off
GICR|=0x40;
MCUCR=0x02;
MCUCSR=0x00;
GIFR=0x40;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// LCD module initialization
lcd_init(16);

// Global enable interrupts
#asm(“sei”)

while (1)
      {
      lcd_gotoxy(0,0);
      lcd_putsf(“ElektrO-cOntrOl”);
      tampilkan_LCD();
      };
}

Jika ingin mendapatkan file program dalam bentuk CodeVision AVR silakan download pada link dibawah ini.

File program CodeVision AVR frekuensi counter

Semoga bermanfaat…

 
15 Comments

Posted by on April 17, 2011 in AVR Projects

 

Tags: , , , , ,

15 responses to “PENGHITUNG FREKUENSI (FREQUENCY COUNTER) MENGGUNAKAN CODEVISION AVR

  1. My World

    May 18, 2011 at 00:39

    Mas… Punya code vision AVR yang FULL Version enggak… Kalau ada, aku minta ya mas. Boleh kan di kirim ke email saya, sama serial numbernya. Soalnya TA yg saya kerjakan harus makai yg full version, karena kalau makai yg evolution jumlah codenya dibatasi. Makasih ya mas sebelumnya….

     
    • ElectrO-cOntrOl

      May 20, 2011 at 15:18

      saya sih punya, tapi dalam minggu2 ini saya sedang tidak ada koneksi internet jadi saya sulit untuk menguploadnya… mungkin nanti ketika saya sudah ada koneksi internet akan saya kirimkan..

       
  2. Septianto Hadi Wibowo

    May 26, 2011 at 21:10

    Mas, kalo kita mau ngontrol frekuensi menggunakan inputan value frekuensi dari keypad bisa gak menggunakan mikro?
    kalau bisa, boleh gak minta contoh programnya?
    trims.

     
    • ElectrO-cOntrOl Team

      May 27, 2011 at 08:03

      saya masih kurang mengerti maksud dari pertanyaan anda! mungkin maksudnya keypad digunakan untuk menset nilai dari frekuensi, kemudian mikro sebagai penghasil frekuensi tsb. Bisa saja, tapi kesulitannya ketika anda men-generate frekuensi menggunakan mikro, kesulitan utamanya adalah membuat periode gelombang yg benar2 presisi. Saya blm pernah membuat aplikasi tsb, jd saya tdk punya programnya.

       
  3. Septianto Hadi Wibowo

    May 29, 2011 at 14:24

    ohya lupa, salam kenal…
    yah krang lebih gt mksd sya mas, kita nyetting dr keypad trz msuk k mikro n dr mikro ngluarin frek. yg sesuai dgn settingan kita.
    saya pernah dapet program penghasil frek. tp pke bahasa Basic n gak bisa d setting menggunakan keypad. tapi nilai frek yg d hasilkan cukup bagus walaupun gak bner2 presisi. klo mas (maaf saya belum tahu nama mas) mau contoh programnya, saya bisa krim k email mas.
    ohya mas, sya dah nyoba program di atas, cm sya ada beberapa pertanyaan:
    1. settingan menampilkan nilai frek. kok cm sbntr yah, cm sktr 1 detik?
    2. maksimum nilai frek. yg bsa terbaca brapa pada program di atas? soalnya sya coba masukan frek 100 Hz tidak terbaca.
    Trima kasih.
    Salam.

     
    • ElectrO-cOntrOl Team

      May 30, 2011 at 12:18

      karena frekuensi adalah banyaknya gelombang dalam 1 detik, makanya saya pakai 1 detik.
      untuk nilai maksimum pengukurannya saya kurang tahu.. apakah anda mencobanya lewat simulasi atau hardware sesungguhnya? soalnya saya pernah simulasikan berbeda dengan yg sesungguhnya

       
  4. Septianto Hadi Wibowo

    May 30, 2011 at 13:44

    saya coba lewat simulasi pake proteus mas…
    klo cm tampil 1 detik itu bukannya karena settingan program d mikronya yah mas?
    soalny klo sya liat d osciloscope gelombangnya bsa kbaca terus2an…

     
    • ElectrO-cOntrOl Team

      May 30, 2011 at 22:42

      maksudnya begini mas, sebenarnya jika ada pulsa yg masuk saya hitung terus menerus, tapi sengaja saya hitung frekuensi gelombangnya setiap 1detik, karena frekuensi kan banyaknya gelombang per detik. makanya kenapa diosiloskop selalu tampil terus2an.

       
  5. bayu

    June 1, 2011 at 10:47

    saya maw tanya,rangkaian frekuensimeter diatas bisa mendeteksi frekuensi mulai brp saja?apabila input frekuensi saya beri pulsa dari sensor LED-IR&fotodioda apakah bisa?

     
    • ElectrO-cOntrOl Team

      June 1, 2011 at 11:47

      saya belum nyoba sampai maksimal tapi untuk input dari potodioda bisa saja yg penting inputnya falling edge atau (dari high ke low)

       
  6. arya

    June 3, 2011 at 21:56

    mas , mau nanya gmna klo mau nampilin width + (lebar Pulsa yang high ) sama (width _) lebar pulsa low nya . ditampilin dengan frekuensi nya sekalian ….. !! mau ta pake buat ngukur sinyal PWM mas …. minta contoh listing programnya dong . kirim ke email ya makasi

     
  7. Agus Faudin

    June 10, 2011 at 10:07

    mas, mw nny.
    kalo atmega16 itu diganti attiny,
    cara menentukan nilai TCNT0 ny gmn??
    untuk penyimpanan hitungan timer counterny.
    mksh.

     
    • ElectrO-cOntrOl Team

      June 10, 2011 at 14:48

      waduh, maaf mas, saya belum pernah pakai attiny, jadi saya kurang mengerti, apakah antara mega16 sama atau tidak dengan attiny. mohon maaf

       
  8. Edi Wanto

    June 14, 2011 at 12:11

    PENGEN IKUT BELAJAR…SAYNG SAYA MASIH TERLALU POLOS, BOLEH IKUTAN BELAJAR GAK GAN…TAPI MAAF KALO SAYA OOT BANGET…………

     

Leave a reply to Septianto Hadi Wibowo Cancel reply