Anda di halaman 1dari 6

Pengendali Motor DC dengan Mikrokontroler ATmega8535

Setelah sebelumnya saya posting cara membuat sistem minimum ATmega8535, sekarang
saatnya kita bereksperimen menggunakan sistem minimum ini. Dipostingan ini saya mencoba
berbagi ilmu yang sesungguhnya masih sangat sedikit ilmu tentang mikrokontroler yang saya
ketahui, yaitu kita akan mengontrol motor DC dengan mikrokontroler ATmega8535.
Pengontrolan disini maksudnya kita akan mengontrol motor DC antara lain arah putarannya dan
kecepatan berputar motor DC tersebut.

Motor DC dapat berputar karena adanya induksi ketika motor tersebut dihubungkan ke sumber
tegangan DC. Pengontrolan motor DC jika dilakukan dengan mikrokontroler lebih mudah
dibandingkan tanpa mikrokontroler. Kita dapat merubah arah putaran motor DC secara langsung
dengan mengubah polaritas sumber tegangan. Untuk mengubah kecepatan motor DC dapat
dilakukan dengan merubah-rubah besarnya sumber tegangan. Pengontrolan dengan
mikrokontroler juga berprinsip seperti tersebut, tetapi dengan sistem yang otomatis. Kita tidak
perlu merubah kabel dari motor ke baterai jika ingin merubah arah putarannya, kita cukup
memberikan logika 0 atau 1 ke mikrokontroler yang dilakukan pada program di mikrokontroler
tersebut. Untuk merubah kecepatannya juga lebih mudah karena kita cukup menggunakan fitur
PWM yang ada pada mikrokontroler tersebut. Mungkin masih banyak yang belum tahu apa itu
PWM

PWM (Pulse Width Modulation) adalah teknik mendapatkan efek sinyal analog dari sebuah
sinyal digital yang terputus-putus. PWM dapat dibangkitkan hanya dengan menggunakan digital
i/o yang difungsikan sebagai output.

Pada contoh gelombang diatas, perbandingan waktu antara sinyal high (1) dan sinyal low (0)
adalah sama. Gelombang diatas dikatakan memiliki duty cycle 50%. Duty cycle adalah
perbandingan antara lebar sinyal high (1) dengan lebar keseluruhan siklus (cycle). Jika amplitudo
gelombang PWM adalah 5 volt, maka tegangan rata rata (seolah olah analog) yang kita dapatkan
adalah 2,5 volt. Berikut contoh gelombang PWM dengan duty cycle 10%, jika amplitudo
gelombang 5 volt maka akan didapatkan tegangan rata rata analog 0,5 volt.
Pada ATMEGA8535 ada 2 cara membangkitkan PWM, yang pertama PWM dapat dibangkitkan
dari port input/outputnya yang difungsikan sebagai output. Yang kedua adalah dengan
memanfaatkan fasilitas PWM dari fungsi timer/counter yang telah disediakan. Dengan adanya
fasilitas ini proses pengaturan waktu high/low sinyal digital tidak akan mengganggu urutan
program lain yang sedang dieksekusi oleh processor. Selain itu, dengan menggunakan fasilitas
ini kita tinggal memasukkan berapa porsi periode waktu on dan off gelombang PWM pada
sebuah register. OCR1A, OCR1B dan OCR2 adalah register tempat mengatur duty cycle PWM.

Berikut ini skematik Pengendalian Motor DC dengan Mikrokontroler ATmega8535 yang saya
buat sendiri, silahkan trace sendiri, atau jika ingin saya buatkan silahkan request di bagian komen
dibawah ini.Klik gambar untuk memperbesar

Rangkaian saya pisahkan menjadi tiga bagian utama agar kita mudah dalam memahami serta
menganalisi rangkaian kita ini, yaitu bagian sistem minimum, Driver motor, dan motor (sebagai
beban utama). Sistem minimum sama seperti pada postingan saya sebelumnya, bagian
selanjutnya yaitu driver. sebenarnya kita dapat langsung menghubungkan mikrokontroler ke
motor tanpa driver, hal ini bisa dilakukan jika motor yang kita gunakan merupakan motor kecil.
untuk motor besar kita memerlukan driver, driver ini bisa dibuat juga dengan mosfet (sering
disebut H-Bridge), kita gunakan saja yang lebih praktis yaitu ic driver L298, driver ijenis ni
mampu mengendalikan 2 buah motor dan juga dilengkapi kaki-kaki untuk mengendalikan PWM.

Untuk percobaan kita ini kita hanya menggunakan satu motor dc saja, berikut ini foto dari
rangkaian yang saya buat.
Untuk programnya anda bisa lihat di bawah ini. Gunakan software AVR studio (setelah AVR
studio terinstal instal juga WinAVR agar AVRstudio-nya mendukung bahasa C, sebab
AVRstudio standarnya menggunakan bahasa assembly). Untuk mendownload program anda bisa
menggunakan downloader serial atapun downloader USB yang juga sudah saya posting. Berikut
programnya
#include
#include
#include

#define DDR_motor DDRD //DDR untuk Motor


#define PORT_motor PORTD //PORT untuk Motor

#define en_ka 5 // Enable L298 untuk motor kanan


#define dirA_ka 2 // Direction A untuk motor kanan
#define dirB_ka 3 // Direction B untuk motor kanan
#define pwm_kanan OCR1A

void delay_ms(int ms)


{for (int i=0;i

void maju(unsigned int pwm)


{
PORT_motor |=(1<
PORT_motor &=~(1<
pwm_kanan=pwm; //pwm motor kanan
}

void mundur(unsigned int pwm)


{
PORT_motor |=(1<
PORT_motor &=~(1<
pwm_kanan=pwm; //pwm motor kanan
}

int main (void)


{

DDR_motor=0xFF;
PORT_motor=0x00;

TCCR1A= (1<<
(1<<
(1<<

TCCR1B= (0<<
(0<<<
TCNT1=0x0000;
OCR1A=0;
OCR1B=0;
sei( );

while(1)
{
mundur(1000);
delay_ms(5000);
maju(700);
delay_ms(3000);

}
}

lihat program utama, motor akan mundur dengan PWM 1000 selama 5000ms (5 detik) kemudian
motor akan maju denan PWM 700 selama 3000ms (3 detik). dan program akan berulang-
ulang.Kecepatan maksimal dari motor terjadi jika kita beri nilai PWM 1000 dan minimum
(motor berhenti) jika nilai PWM 0, lihat di program utama, yaitu mundur(1000) maksudnya
motor akan berputar mundur dengan kecepatan maksimal karena PWM nya1000
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define DDR_motor DDRD //DDR untuk Motor


#define PORT_motor PORTD //PORT untuk Motor

#define en_ka 5 // Enable L298 untuk motor kanan


#define dirA_ka 2 // Direction A untuk motor kanan
#define dirB_ka 3 // Direction B untuk motor kanan
#define pwm_kanan OCR1A

void delay_ms(int ms)


{for (int i=0;i<ms;i++){_delay_ms(1);}}

void maju(unsigned int pwm)


{
PORT_motor |=(1<<dirA_ka); //motor maju
PORT_motor &=~(1<<dirB_ka);
pwm_kanan=pwm; //pwm motor kanan
}

void mundur(unsigned int pwm)


{
PORT_motor |=(1<<dirB_ka); //motor maju
PORT_motor &=~(1<<dirA_ka);
pwm_kanan=pwm; //pwm motor kanan
}

int main (void)


{

DDR_motor=0xFF;
PORT_motor=0x00;

TCCR1A= (1<<WGM11)|(1<<WGM10)|
(1<<COM1A1)|(0<<COM1A0)|
(1<<COM1B1)|(0<<COM1B0);

TCCR1B= (0<<WGM13)|(1<<WGM12)|
(0<<CS12)|(0<<CS11)|(1<<CS10);
TCNT1=0x0000;
OCR1A=0;
OCR1B=0;
sei( );

while(1)
{
mundur(1000);
delay_ms(5000);
maju(700);
delay_ms(3000);

}
}