You are on page 1of 19

Kendali Motor Servo Menggunakan PWM dari Timer

DECEMBER 30, 2012 33 COMMENTS

motor servo adalah sebuah aktuator yang bergerak dalam poros yang mempunyai spesifikasi untuk control posisi sudut yang presisi.
Banyak jenis motor servo. Ada yang dikontrol secara serial ataupun dengan PWM. Kali ini kita akan mencoba megatur posisi dari
sebuah motor servo dengan menggunakan PWM yang dibangkitkan dari timer1. PWM harus diatur agar memenuhi standar sinyal input
untuk motor servo sehingga motor servo dapat bergerak sesuai dengan perintah yang kita kirimkan lewat PWM.

Review motor servo.

Nilai input PWM pada setiap servo terkadang berbeda sesuai merek. Misalnya saja Servo Futaba tipe Futaba S3003 Standard Servo.
0.388ms = 0 degree.
1.264ms = 90 degrees. (neutral position)
2.14ms = 180 degrees.
Akan tetapi kita coba dengan setting pada proteus seperti berikut.
Mari kita mulai.Buat sebuah folder untuk project yang akan kita buat. Semua file project akan disimpan di folder ini. Buat folder dengan
nama motor servo.
Pertama buat new project, lalu masukan chip ATMega8535, ambil dari library.
masukan juga komponen motor servo
Lalu rangkai seperti gambar sirkuit di bawah ini.
Untuk komponen VCC dan Ground bisa di drag dari Terminals mode.
Sekarang kita beralih ke codevisionAVR. Buat new project. Klik File, lalu New.
Kemudian pilih Project, lalu klik OK.

Jika muncul pertanyaan seperti di bawah ini. Klik Yes.


Setelah itu kita lakukan pengaturan untuk project yang akan kita buat. Pertama setting chip yang akan digunakan. Kita gunakan
ATmega8535 dan nilai clock yaitu 16 MHz. (dalam pemrograman, tanda titik berarti koma, untuk memisahkan bilangan decimal. Missal
3,7 maka diketik 3.7 dan begitu pula jika kita memasukan nilai clock 11,059200MHz maka diketik 11.059200 MHz.
Lalu kita lakukan setting pada bagian Timer1. Kita akan gunakan Timer1 ini untuk membangkitkan sinyal PWM yang digunakan untuk
mengontrol motor servo. Lakukan setting di bawah ini.

kita akan menggunakan mode


// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 250.000 kHz
// Mode: Fast PWM top=ICR1
// OC1A output: Non-Inv.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
Dari informasi diatas kita dapati bahwa counter akan berjalan dalam interval waktu T=1/250kHz yaitu 4us, dan akan menggunaka mode
Fast PWM. Dengan nilai TOP counter yaitu ICR1 1387 atau 4999. Hal ini dikarenakan kita membutuhkan sinya PWM dengan lebar
perioda 20ms atau frekuensi 50Hz untuk mengendalikan servo. Berikut perhitungannya.
Sedangkan nilai lebar pulsa high dari PWM atau lebar dutty cycle positif akan ditentukan oleh register OCR1.
Dutty cycle: perbandingan lebar perioda HIGH dengan lebar perioda gelombang.
perhitungan OCR1 untuk menghasilkan lebar pulsa dari 1ms 2ms (sesuai settingan servo di simulasi proteus) adalah.
OCR1A= (((sudut + 90)/90)*1000)/4;
Dimana nilai 1ms 2ms tersebut akan menghasilkan nilai sudut dari -900 sampai 900. Perhitungan di atas didapat berdasarkan bahwa
couter berjalan dalam interval 250kHz atau 4us sehingga untuk menghasilkan gelombang 1ms 2ms adalah.
Atau jika kita menggunakan MS-Exel untuk mendapat persamaannya maka setelah membuat table dari data sumbu x untuk sudut x={-
90,90} dan y untuk OCR1A={250,500} maka kita bisa mendapatkan persamaan linier dengan cara klik kanan pada garis yang ada di
table dan klik Add Trendline.

Lalu setting seperti berikut.


Maka akan muncul persamaan.

y = 1.388x + 375
dan kita ganti nilai x dan y sehingga menjadi.
OCR1A = (unsigned int)((1.388*(float)sudut) + 375);
Sekarang kita masukan ke program.
1 /*****************************************************
2 Chip type : ATmega8535
Program type : Application
3 Clock frequency : 16.000000 MHz
4 Memory model : Small
5 External SRAM size : 0
6 Data Stack size : 128
7 *****************************************************/
8
#include <mega8535.h>
9 #include <delay.h>
10
11 // Declare your global variables here
12 void set_servo(int sudut)
13 {
OCR1A= (((sudut + 90)/90)*1000)/4;
14 //OCR1A = (unsigned int)((1.388*(float)sudut) + 375);
15 }
16
17 void main(void)
18 {
19 // Declare your local variables here
20
// Input/Output Ports initialization
21 // Port A initialization
22 // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In
23 Func1=In Func0=In
24 // State7=T State6=T State5=T State4=T State3=T State2=T
State1=T State0=T
25 PORTA=0x00;
26 DDRA=0x00;
27
28 // Port B initialization
29 // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In
30 Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T
31 State1=T State0=T
32 PORTB=0x00;
33 DDRB=0x00;
34
35 // Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In
36
Func1=In Func0=In
37 // State7=T State6=T State5=T State4=T State3=T State2=T
38 State1=T State0=T
39 PORTC=0x00;
40 DDRC=0x00;
41
// Port D initialization
42 // Func7=In Func6=In Func5=Out Func4=In Func3=In Func2=In
43 Func1=In Func0=In
44 // State7=T State6=T State5=0 State4=T State3=T State2=T
45 State1=T State0=T
46 PORTD=0x00;
DDRD=0x20;
47
48 // Timer/Counter 0 initialization
49 // Clock source: System Clock
50 // Clock value: Timer 0 Stopped
51 // Mode: Normal top=FFh
52 // OC0 output: Disconnected
TCCR0=0x00;
53 TCNT0=0x00;
54 OCR0=0x00;
55
56 // Timer/Counter 1 initialization
57 // Clock source: System Clock
// Clock value: 250.000 kHz
58 // Mode: Fast PWM top=ICR1
59 // OC1A output: Non-Inv.
60 // OC1B output: Discon.
61 // Noise Canceler: Off
62 // Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
63 // Input Capture Interrupt: Off
64 // Compare A Match Interrupt: Off
65 // Compare B Match Interrupt: Off
66 TCCR1A=0x82;
TCCR1B=0x1B;
67 TCNT1H=0x00;
68 TCNT1L=0x00;
69 ICR1H=0x13;
70 ICR1L=0x87;
71 OCR1AH=0x00;
OCR1AL=0x00;
72 OCR1BH=0x00;
73 OCR1BL=0x00;
74
75 // Timer/Counter 2 initialization
76 // Clock source: System Clock
77 // Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
78 // OC2 output: Disconnected
79 ASSR=0x00;
80 TCCR2=0x00;
81 TCNT2=0x00;
OCR2=0x00;
82
83 // External Interrupt(s) initialization
84 // INT0: Off
85 // INT1: Off
86 // INT2: Off
87 MCUCR=0x00;
MCUCSR=0x00;
88
89 // Timer(s)/Counter(s) Interrupt(s) initialization
90 TIMSK=0x00;
91
92 // Analog Comparator initialization
93 // Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
94 ACSR=0x80;
95 SFIOR=0x00;
96
97 while (1)
98 {
99 // Place your code here
set_servo(-90); //set servo ke -90 derajat
100 delay_ms(1000); //tahan posisi servo selama 1000ms
101
102 set_servo(90); //set servo ke 90 derajat
103 delay_ms(1000); //tahan posisi servo selama 1000ms
};
104 }
105
106
107
108
109
110
111
112
113
114
115
116
Lalu klik Make the project.
Klik OK, maka akan ter-generate file .hex. File inilah yang akan diupload ke dalam mikrokontroler.
Seperti biasa jangan lupa lakukan pengaturan di chip ATMEGA8535.
Klik pada ikon folder Program File. Browse file .hex yang sudah kita generate tadi di codevisionAVR.

Atur CKSEL Fuses menjadi Ext. Clock dan Clock Frequency dengan nilai clock 16MHz yang sudah kita atur juga pada codevisionAVR.
Klik OK.
Setelah proses setting selesai, maka langsung saja klik Play.
Untuk melihat sinyal yang mengatur motor servo bisa kita tambahkan osiloskop pada rangkaian proteus yang sudah kita buat.
Kita capture di jalur input servo.
Maka bisa dilihat sinyal PWM-nya.

You might also like