Rabu, 11 Mei 2011

PENGHITUNG KECEPATAN MOTOR DC MENGGUNAKAN OPTOCOUPLER DENGAN CODEVISION AVR


PENGHITUNG KECEPATAN MOTOR DC MENGGUNAKAN OPTOCOUPLER DENGAN CODEVISION AVR

April 17, 2011




ElectrO-cOntrOl Project encoder, kecepatan motor, motor DC, optocoupler, rotary encoder, speed DC motor Leave a comment

Pada dasarnya aplikasi ini hampir sama dengan aplikasi penghitung frekuensi (Frequency Counter), dimana letak perbedaanya hanya pada perumusannya saja, dimana perumusan tersebut tergantung dari pengubahan detik ke menit dan banyaknya pulsa encoder dalam 1 putaran motor DC.

Jika menggunakan optocoupler sebagai sensor anda harus menggunakan rotary encoder yang di-couple dengan as motor dc untuk mendeteksi kecepatan putaran motor DC. Biasanya pada rotary encoder dibuat lubang-lubang sebagai representasi banyaknya pulsa. Dan anda harus menentukan terlebih dahulu banyaknya pendeteksian pulsa atau lubang dalam pada rotary encoder untuk satu putaran yang dilakukan motor DC. Karena banyaknya pulsa atau lubang akan mempengaruhi perumusan perhitungan kecepatan motor dc, dan semakin banyak pulsa atau lubang maka akan meningkatkan resolusi pembacaan kecepatan motor DC, dengan kata lain pembacaan kecepatan akan semakin presisi.

Dan jika motor DC anda sudah mempunyai internal encoder, anda hanya tinggal menghubungkan saja output internal encoder motor DC anda ke pin INT0 atau PD2.

Saya sendiri menggunakan rotary encoder sebanyak 20 lubang sehingga perumusan kecepatan motor DC menjadi:

pulsa=frekuensi*60/20; atau pulsa=frekuensi*30;

Dimana angka 60 digunakan untuk mengubah kedalam satuan RPM (round per minute), karena timer yang saya gunakan hanya membaca selama 1 detik, jika dikalikan sebanyak 60 maka akan menjadi 1 menit. Dan angka 20 adalah banyaknya lubang atau pulsa rotary encoder.


Pada schematic diatas penggunaan saklar pada optocoupler hanyasebagai pemicu saja (trigger), jika pada implementasi riilnya. Pemicu ini berasal dari lubang-lubang atau pulsa dari encoder.

Jika teman-teman masih bingung mengenai fitur Timer dan Counter serta eksternal interupsi dapat membacanya pada menu TUTORIAL AVR.

Berikut adalah listing program lengkapnya:

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

#include //sertakan librari mega16.h
#include //sertakan librari lcd.h
#include //sertakan librari delay.h
#include //sertakan librari stdio.h
#include //sertakan librari stdlib.h

// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0×15 ;PORTC
#endasm

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

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0x8a;//mengisi kembali nilai timer dengan 8a agar dapat men-timer selama 10ms
looping++;//jika looping=100 baca nilai frekuensi dan set kembali frekuensi=0
if (looping>=100)//dimana 10msx100=1 detik
{
looping=0;
pulsa=frekuensi*60/20;
frekuensi=0;
lcd_clear();
}
}

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

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: Off
// INT2: Off
GICR|=0×40;
MCUCR=0×02;
MCUCSR=0×00;
GIFR=0×40;

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

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0×80;
SFIOR=0×00;

// LCD module initialization
lcd_init(16);

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

while (1)
{
lcd_gotoxy(0,0);
lcd_putsf(“ElektrO-cOntrOl”);
ftoa(pulsa,1,temp);
lcd_gotoxy(0,1);
lcd_puts(temp);
lcd_gotoxy(0,5);
lcd_putsf(“RPM”);
};
}

1 komentar:

  1. copas dari http://electrocontrol.wordpress.com/2011/04/17/penghitung-kecepatan-motor-dc-menggunakan-optocoupler-dengan-codevision-avr/
    gausah sok nulis kalo copas

    BalasHapus