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:
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:
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