Professional Documents
Culture Documents
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
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
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.