You are on page 1of 9

Belajar AVR Kontrol Motor

DC, Stepper dan Servo 12


Salam, Materi yang akan disampaikan pada kali ini adalah pemrograman kendali
motor. Motor merupakan perangkat aktuator yang paling banyak digunakan pada
aplikasi robot ataupun mesin industri. Kali ini kita akan membahas tentang
pengontrolan tiga jenis motor yaitu motor DC, motor servo, dan motor stepper.
1. Motor DC
Ada yang tidak tahu dengan motor DC ? saya rasa semua pembaca sudah tahu
tentang motor DC, jadi saya tidak perlu lagi menjelaskan secara panjang lebar
.
Kali ini yang akan kita bahas adalah cara pengontrolannya dengan menggunakan
mikrokontroler ATMega8. Untuk mengendalikan motor DC, kita tidak bisa
menghubungkan langsung ke mikrokontroler. Kita membutuhkan sebuah supir
atau bahasa kerennya adalah driver. Driver ini yang nantinya bertugas
meneruskan perintah dari mikrokontroler menjadi sebuah gerakan motor DC yang
memiliki arah putaran dan kecepatan tertentu. Rangkaian driver motor yang akan
kita gunakan kali ini dibentuk oleh sebuah H-bridge mosfet. Skematik
rangkaiannya dapat dilihat pada gambar di bawah ini.

Seperti terlihat pada gambar diatas, driver motor terbuhung ke pin PORTB.0 dan
PORTB.1 pada mikrokontroler ATMega8. Diman pin PORTB.1 ini merupakan jalur
pwm yang nantinya dapat digunakan untuk mengatur kecepatan putar dari motor
DC yang dikendalikan.

Untuk memulai pemrograman terlebih dahulu buat sebuah project baru. Pada
code wizard anda perlu mengatur pin PORTB.0 dan PORTB.1 agar dapat
berfungsi sebagai input. Kemudian kita perlu mengatur konfigurasi dari timer 1
agar PORTB.1 dapat berfungsi untuk mengeluarkan PWM. Pengaturan pada
Timer1 dapat dilihat pada gambar di bawah ini.

Selanjutnya kita akan membuat fungsi untuk mengontrol driver motor tersebut.
Anda dapat menulis source code di bawah ini.
#include <mega8.h>
#include <delay.h>
void kontrolMotor(unsigned char direction, unsigned char pwm) {
if (pwm==0) { // Program untuk ngerem/break
PORTB.0 = 0;
OCR1A = 0;
}
else {
if (direction==1) {
PORTB.0 = 0;
OCR1A = pwm;
}
else {
PORTB.0 = 1;
OCR1A = 255 pwm;
}
}
}
// Declare your global variables here

void main(void)
{
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=0 State1=0 State0=0
PORTB=000;
DDRB=007;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 15.625 kHz
// Mode: Ph. correct PWM top=0x00FF
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA1;
TCCR1B=005;
TCNT1H=000;
TCNT1L=000;
ICR1H=000;
ICR1L=000;
OCR1AH=000;
OCR1AL=000;
OCR1BH=000;
OCR1BL=000;
while (1) {
// Place your code here
kontrolMotor(1, 150);
delay_ms(5000);
kontrolMotor(0, 0);
delay_ms(5000);
kontrolMotor(0, 50);
delay_ms(5000);
kontrolMotor(0, 0);
delay_ms(5000);
kontrolMotor(1,255);
delay_ms(5000);
}
}

Fungsi kontrolMotor memiliki dua buah parameter input yaitu direction dan
kecepatan, direction menunjukkan arah putaran, sedangkan kecepatan
menunjukkan nilai dari kecepatan motor. Nilai direction dapat diisi dengan nilai
0 atau 1 dimana 1 menunjukkan bahwa arah putaran motor adalah CW
sedangkan 0 menunjukkan bahwa arah putaran motor adalah CCW.
Parameter kecepatan dapat diisi dengan nilai 0-255, dimana nilai tersebut

merupakan representasi dari kecepatan motor dari berhenti, lambat, hingga


cepat.
Pada fungsi kontrolMotor sudah terdapat perintah untuk melakukan
pengereman/break. Jika dilihat pada potongan program, pada saat pwm bernilai 0
maka PORTB.0 akan berlogika low dan OCR1A bernilai 0, berarti juga berlogika
low. Sehingga jika dilihat dari gambar rangkaian driver, kondisi ini akan membuat
kedua transistor 2n2222 akan menjadi off dan kedua mosfet IRF9640 akan
menjadi on dan membuat kedua kutub motor terhubung ke +12V. Hal ini akan
membuat motor akan sedikit seret untuk diputar, sehingga dapat dimanfaatkan
untuk pengereman.
Pada program diatas pengaturan kecepatan motor dilakukan melalui pin
OCR1A/PORTB.1. Jika direction bernilai 1, pin pengatur direction (PORTB.0)
akan low, sehingga untuk pengaturan kecepatannya dapat dilakukan dengan
mengatur lebar pulsa positif pada pin OCR1A. Sedangkan jika direction bernilai
0, pin PORTB.0 akan high, sehingga untuk pengaturan kecepetannya dapat
dilakukan dengan mengatur lebar pulsa low pada pin OCR1A. Oleh karena itu
pada kondisi ini OCR1A bernilai 255 pwm.
Sekarang saatnya kita panggil fungsi diatas dari blok while(1) selanjutnya
jalankan program pada minimum system anda. Amati arah dan kecepatan putaran
motor tesebut.
2. Motor Stepper
Satu lagi motor yang akan kita bahas pada kali ini adalah motor stepper. Motor ini
banyak ditemukan pada printer, jadi kalau punya printer rusak dibongkar saja
kemudian motornya diambil untuk bahan praktek kita kali ini . Sama seperti
motor DC, motor stepper juga memerlukan rangkaian driver tersendiri untuk
pengontrolannya. Rangkaian driver stepper dapat dilihat pada gambar di bawah
ini.

Motor stepper yang saya gunakan pada praktek kali ini adalah motor stepper
yang mempunyai step angle sebesar 1.8 derajat. Anda juga dapat menggunakan
motor stepper yang memiliki step angle lain, tidak perlu sama dengan punya
saya. Untuk mengontrol putaran dari motor stepper kita harus mengaktifkan
kumparan motor stepper secara bergantian. Buatlah sebuah project baru dengan
pengaturan PORTB sebagai output semua. Selanjutnya perhatikan dan tuliskan
program di bawah ini.
#include <mega8.h>
#include <delay.h>
unsigned char dataStepper[]={0b0011,0b0110,0b1100,0b1001};
int i=0;
void putarKanan(int step) {
int j=0;
while (j<step) {
j++;
i++;
if (i>=4) {
i=0;
}
PORTB = dataStepper[i];
delay_ms(3);
}
}
void putarKiri(int step) {
int j=0;
while (j<step) {
j++;
i;
if (i<=-1) {
i=3;

}
PORTB = dataStepper[i];
delay_ms(3);
}
}
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=0
PORTB=000;
DDRB=0x0F;
while (1) {
// Place your code here
putarKanan(100);
putarKiri(200);
putarKanan(200);
putarKiri(100);
}
}

Pada program diatas saya sudah definisikan urutan pengaktifan kumparan pada
sebuah array, sehingga untuk melakukan proses pemanggilan secara berulang
gampang. Seperti dilihat pada program diatas, untuk menggerakkan motor
stepper kita membutuhkan 4 buah step, dimana 1 stepnya dapat menggerakkan
motor sebesar 1.8 derajat atau sesuai resolusi motor stepper anda. Jika nilai step
angle telah diketahui, kita dapat dengan mudah menggerakkan motor ke arah
sudut tertentu dengan perhitungan

Jumlah step = sudut / step angle


Arah putaran dapat anda atur melalui program, tingga memanggil fungsi putarKiri
maka arah putaran motor akan berubah.

3. Motor Servo
Motor servo merupaan motor yang sudah dilengkapi dengan rangkaian kontrol
dan sensor posisi. Sehingga kita tidak perlu direpotkan lagi untuk membuat
rangkaian drivernya. Motor servo ini dirangcang khusus agar dapat berputar
pada posisi tertentu.Motor servo ini banyak diaplikasikan pada bidang
aeromodeling ataupun robot berkaki. Jika anda ingin membeli motor servo maka
carilah di toko aeromodeling ataupun mainna RC. Hal yang perlu kita ketahui
pada motor servo adalah besarnya pulsa minimum dan maksimum untuk
mengontrol posisinya. Untuk servo motor hitech biasanya lebar pulsa berkisar
antara 600uS 2400uS ,, 600us menunjukkan nilai untuk sudut minimal (-90
derajat) dan 2400us menunjukkan nilai untuk sudut maksimal (90 derajat).
Hubungan motor servo dengan mikrokontroler depat dilihat pada gambar berikut.
Kita akan menggunakan pin OC1A untuk mengeluarkan sinyal PWM pada servo.
Untuk power ke servo sebaiknya anda menggunakan sumber tegangan yang
terpisah, atau menggunakan baterai tersendiri.
Untuk pengontrolan motor servo ini kita juga menggunakan metode PWM, namun
besarnya PWM harus sesuai dengan spesifikasi motor yaitu pulsa highnya
berkisar dari 600us 2400us dan besarnya frekuensi sekitar 50Hz. Untuk
mencoba pemrograman, sekarang buatlah project baru dengan pengaturan pada
timer 1 seperti berikut ini.
Program lengkapnya seperti di bawah ini, Sebelum blok while(1) tambahkan baris
ICP1 = 4999. Pada program diatas saya sudah membuatkan fungsi yang
memudahkan anda untuk mengendalikan motor pada posisi tertentu. Dengan
memanggil fungsi tersebut anda tinggal memasukkan parameter sudut yang akan

dituju. Besarnya sudut adalah -90 s/d 90 dimana nilai 0 berarti posisi horn motor
servo berada pada tengah-tengah.

#include <mega8.h>
#include <delay.h>
// Declare your global variables here
void servo(int derajat) {
OCR1A=((derajat+90)*10+600)/4;
}
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=0 State1=0 State0=T
PORTB=000;
DDRB=006;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 250.000 kHz
// Mode: Fast PWM top=ICR1
// OC1A output: Non-Inv.

// OC1B output: Non-Inv.


// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA2;
TCCR1B=0x1B;
TCNT1H=000;
TCNT1L=000;
ICR1H=000;
ICR1L=000;
OCR1AH=000;
OCR1AL=000;
OCR1BH=000;
OCR1BL=000;
ICR1=4999;
while (1) {
// Place your code here
int i;
servo(-90);
delay_ms(1000);
servo(0);
delay_ms(1000);
servo(90);
delay_ms(1000);
servo(-90);
delay_ms(1000);
for (i=-90; i<90; i++) {
servo(i);
delay_ms(50);
}
for (i=90; i>-90; i) {
servo(i);
delay_ms(50);
}
}
}

You might also like