Laman

Minggu, 04 Desember 2016

Kendali Motor Servo Dengan Fitur Timer 1 Menggunakan Bahasa C AVR

Motor servo merupakan sebuah motor yang bergerak sesuai kontrol sudut diberikan. Disini saya memakai servo SG90 dengan besar sudut antara -90o sampai dengan 90o dan memiliki spesifikasi seperti pada gambar berikut:
Untuk memangkitkan sinyal PWM yang dibutuhkan oleh servo tersebut. Saya menggunakan fitur dari Timer 1 dengan mode “Fast PWM”. Untuk menentukan nilai frekuensi keluaran (osilasi)nya dapat ditentukan dengan rumus berikut:

Servo tersebut membutuhkan frekuensi sebesar 50 Hz, maka kita harus menentukan nilai TOP dari Timer1 jika diketahui frekuensi kristalnya 12MHz dan Prescaler’nya 64!
Penyelesaian;












Setelah diketahui nilai frekuensinya maka kita bisa langsung membuat programnya. Adapun langkah2nya sebagai berikut:

1.   Perangkat lunak yang kita adalah CodeVision AVR dengan bahasa pemrogramannya bahasa c. langkah pertamanya adalah kita langsung masuk ke perangkat lunaknya seperti pada screenshot pada gambar dibawah ini yang saya tandai warna merah,
2. Langsung control+N dan buat project baru kemudian gunakan CodeWizardAVR untuk mempermudah penginisialisasian fitur Timer 1
3.      Untuk inisialisasinya ikuti saja gambar berikut:
4.      Lalu, klik ikon yang telah dilingkari warna merah pada gambar dibawah ini:
5.      Setelah itu skrip dari program timer akan keluar dengan sendirinya.

Untuk menentukan nilai dari Duty Cyclenya dapat ditentukan dengan rumus berikut: 

Nah, karena nilai duty cycle pada motor servo sebesar 1-2ms maka besar nilai duty cyclenya adalah
Maka range kerja dari duty cycle motor servo tersebut antara 5-10% saja.
Setelah duty cycle’nya diketahui dapat diperhitungkan nilai OCRn-nya sebagai berikut:

Nah, inilah skrip dari kendali servo:
#include <mega16.h>
#include <delay.h>

// Declare your global variables here
void servo(int pwm)
{
OCR1A=pwm;
//nilai OCR1A
}
void main(void)
{
PORTD=0x00;
DDRD=0x30;

// Inisialisasi Timer/Counter 1
// Sumber Clock: System Clock
// Nilai Clock: 187.500 kHz
// Mode: Fast PWM top=ICR1
// Keluaran OC1A: Tak-Membalik.
// Keluaran OC1B: Tak-Terpakai.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Interuspsi Overflow Timer1: Off
// Interupsi Input Capture: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA2;
TCCR1B=0x1B;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x0E;
ICR1L=0xA5;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

while (1)
{
// Place your code here
servo(231); //0 derajat
}
}


Tidak ada komentar:

Posting Komentar