Senin, 30 Januari 2012

REALISASI LOW PASS FILTER PADA DISKRET PROGRAMMING

Low Pass Filter digunakan untuk melewatkan frekuensi rendah. Batasan frekuensi yang akan dilewatkan disebut frekuensi cut off, dimana persamaan dari frekuensi cut off adalah:
Persamaan diskret dari penurunan Low Pass Filter adalah:

Dimana:

Penurunan persamaan Low Pass Filter diatas dapat didownload pada file pdf DISINI.

Hasil dari pengujian dengan menggunakan Low Pass Filter yang telah saya lakukan dapat dilihat pada gambar dibawah ini.
sinyal berfrekuensi tinggi yang akan di Low Pass Filter.

Gambar diatas merupakan sinyal yang berfrekuensi tinggi yang terdiri dari noise. Sinyal yang sebenarnya seharusnya selalu bernilai 0 dan tidak memiliki frekuensi (seperti sinyal DC dengan nilai 0). Tetapi sinyal tersebut mempunyai nilai yang berubah-ubah dan berfrekuensi tinggi, hal ini dikarenakan adanya noise pada sinyal tersebut. Jika saya ingin melewatkan frekuensi dibawah 0,5 Hz (batasan frekuensi atau frekuensi cut off = 0,5 Hz), maka hasilnya akan seperti gambar dibawah ini.
garis warna hijau adalah sinyal hasil low pass filter


Dari hasil kedua gambar diatas sinyal keluaran dari Low Pass Filter (garis warna hijau) hanya melewatkan frekuensi dibawah frekuensi cut off yang bernilai 0,5 Hz.

Untuk dapat merealisasikan ke dalam bahasa pemrograman, maka kita dituntut terlebih dahulu untuk merancang batasan frekuensi yang akan dilewatkan (frekuensi cut off). Pada persamaan diskret dari penurunan Low Pass Filter, terdapat sebuah variabel bernama koefisien filter (a), variabel inilah yang akan menentukan nilai dari frekuensi cut off.

Pengujian diatas saya menggunakan frekuensi cut off sebesar 0,5 Hz, maka untuk menentukan nilai koefisien filter (a), sebagai berikut:
frekuensi cut off = 0,5 Hz.

 
















dt adalah waktu sampling yang digunakan untuk mengeksekusi  instruksi Low Pass Filter pada program, waktu sampling yang saya gunakan adalah 10 ms atau 0,01 detik.

Sehingga realisasi persamaan Low Pass Filter kedalam bahasa pemrograman menjadi:

Berikut adalah cuplikan listing program dari Low Pass Filter:

/*****************************************************
Chip type               : ATmega8535
Program type            : Application
AVR Core Clock frequency: 12.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 128
*****************************************************/
float low_pass, a=0.97;
int ambil_sinyal;
char temp_serial[8];

#include <mega8535.h>
#include <delay.h>
#include <stdlib.h>
#include <stdio.h>

// Timer 0 overflow interrupt service routine
// Interupt akan dieksekusi sesuai waktu sampling 10 ms atau 0.01 detik
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0x8A;

    //Algoritma Low Pass Filter
    low_pass=(float)(a*low_pass)+((1-a)*ambil_sinyal);
//     y(i)      =        a*     y(i-1)   +  (1-a)*     x(i)
}

#define ADC_VREF_TYPE 0x00

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}


//untuk mengirim data ke PC, agar dapat diplot ke grafik
void kirim_data_ke_PC()
{
      putchar('a');//header data pertama
      itoa(ambil_sinyal,temp_serial);
      puts(temp_serial);  
     
      putchar('b');//header data kedua
      ftoa(low_pass,1,temp_serial);
      puts(temp_serial);
}

void main(void)
{
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 11.719 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x05;
TCNT0=0x8A;
OCR0=0x00;

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

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x4D;

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

// ADC initialization
// ADC Clock frequency: 750.000 kHz
// ADC Voltage Reference: AREF pin
// ADC High Speed Mode: Off
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;
SFIOR&=0xEF;

// Global enable interrupts
#asm("sei")

while (1)
      {
      ambil_sinyal=read_adc(0);//sinyal masukan dibaca dari ADC
      kirim_data_ke_PC();
      };
}

4 komentar:

  1. simulasi pengukuran LPFnya pake software apa gan?
    pake proteus kah atau menggunakan osiloskop?
    trims

    BalasHapus
  2. saya tampilin pake serial komunikasi ke komputer dengan C#

    BalasHapus
  3. Mungkin untuk agan2 yang sedang belajar elektronika anda bisa membeli komponen nya disini http://www.tokopedia.com/komponenelektro

    BalasHapus
  4. post sangat bermanfaat gan, tolong kunjungi my website http://excellenttei2.hol.es/

    BalasHapus