Salam ngOOprekers !! Kali ini kita bertemu kembali pada tutorial belajar AVR. 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 ngooprek 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.
Ada yang tidak tahu dengan motor DC ? saya rasa semua pembaca ngooprek sudah tahu tentang motor DC, jadi saya tidak perlu lagi menjelaskan secara panjang lebar

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.
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>
#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;
}
}
}
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=0×00;
DDRB=0×07;
// 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=0×00;
DDRB=0×07;
// 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=0×05;
TCNT1H=0×00;
TCNT1L=0×00;
ICR1H=0×00;
ICR1L=0×00;
OCR1AH=0×00;
OCR1AL=0×00;
OCR1BH=0×00;
OCR1BL=0×00;
// 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=0×05;
TCNT1H=0×00;
TCNT1L=0×00;
ICR1H=0×00;
ICR1L=0×00;
OCR1AH=0×00;
OCR1AL=0×00;
OCR1BH=0×00;
OCR1BL=0×00;
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);
}
}
// 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.
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.
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

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>
#include <delay.h>
unsigned char dataStepper[]={0b0011,0b0110,0b1100,0b1001};
int i=0;
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);
}
}
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);
}
}
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
{
// 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=0×00;
DDRB=0x0F;
// 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=0×00;
DDRB=0x0F;
while (1) {
// Place your code here
putarKanan(100);
putarKiri(200);
putarKanan(200);
putarKiri(100);
}
}
// 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.
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>
#include <delay.h>
// Declare your global variables here
void servo(int derajat) {
OCR1A=((derajat+90)*10+600)/4;
}
OCR1A=((derajat+90)*10+600)/4;
}
void main(void)
{
// Declare your local variables here
{
// 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=0×00;
DDRB=0×06;
// 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=0×00;
DDRB=0×06;
// 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=0×00;
TCNT1L=0×00;
ICR1H=0×00;
ICR1L=0×00;
OCR1AH=0×00;
OCR1AL=0×00;
OCR1BH=0×00;
OCR1BL=0×00;
// 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=0×00;
TCNT1L=0×00;
ICR1H=0×00;
ICR1L=0×00;
OCR1AH=0×00;
OCR1AL=0×00;
OCR1BH=0×00;
OCR1BL=0×00;
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);
}
}
}
// 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);
}
}
}
Semoga tulisan ini bermanfaat bagi anda sekalian
TERIMA KASIH
TERIMA KASIH
No comments:
Post a Comment