Kamis, 22 Juli 2010

Pengendalian 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 <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);

}
}



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