Modul Bahasa c
Transcript of Modul Bahasa c
-
Modul Pelatihan
Robot Line Follower
Berbasis Mikrokontroler
LSO Robotika
Fakultas Teknik
Universitas Muhammadiyah Malang
-
i
Preface
Judul Asli : Modul Robot Line Follower Berbasis Mikrokontroler
Penulis : Novendra Setyawan
Pengawas : Khusnul Hidayat, S.T.
Penata Grafis & Editor : Aulia Arif Wardana
Copyright LSO Robotika
Fakultas Teknik
Universitas Muhammadiyah Malang
2012
Modul ini dibuat sebagai salah satu program dan tujuan LSO Robotika dalam
hal Bakti Pendidikan. Hak cipta dilindungi undang - undang. Barang siapa
memperbanyak atau menjiplak modul ini, harus seizin LSO Robotika FT UMM.
Modul ini bersifat bebas untuk dipergunakan atau diperbanyak, tapi tidak untuk
diperjual belikan oleh umum.
Website : lso-robotika.umm.ac.id
Email : [email protected]
Diterbitkan sendiri oleh : LSO - Robotika FT UMM, 2012
Tingkatan : Dasar Menengah
Terimakasih,
Regards LSO Robotika FT UMM
-
ii
Pendahuluan
Bismillahirrahmanirrahim,
Puji syukur kita panjatkan kehadirat Allah Yang Maha Esa atas segala
rahmat dan karunia-Nya sehingga Modul Pelatihan Robot Line Follower Berbasis
Mikrokontroler dapat diwujudkan. Modul ini dikemas sebagai pegangan bagi
peserta didik dalam pelatihan robot yang di selenggarakan oleh LSO-Robotika FT
UMM. Modul ini memiliki peran strategis dalam perkembangan belajar dan
mengajar pada satu pelatihan, serta merupakan petunjuk praktis agar peserta
didik lebih mandiri dalam belajar.
Modul ini adalah bukti komitmen kami dalam hal Bakti pada Pendidikan,
melalui pengalaman kami di bidang robotika kami turut andil untuk membagi ilmu
dan mengajarkan ilmu yang kami dapat kepada peserta didik / peserta
pelatihan. Akhirnya dengan ini kami mengharapkan Modul Pelatihan ini dapat
dijadikan petunjuk dan dipergunakan dengan sebaik-baiknya.
Salam Robotika,
LSO-Robotika FT UMM.
-
iii
Daftar Isi
Preface ....................................................................................... i
Pendahuluan ............................................................................. ii
Daftar Isi ...................................................................................... iii
Pengenalan Bahasa C ........................................................... 1
I/O (Input dan Output) ........................................................... 11
LCD ........................................................................................... 22
ADC (Analog Digital Converter) ........................................... 29
PWM (Pulse Width Modulation) ............................................. 36
-
Robotics Team
University of Muhammadiyah Malang
Bakti Pendidikan
-
1
Pengenalan Bahasa C
Bahasa C tidak mengenal penulisan dalam kolom, yang ia kenal hanya
penulisan di tiap barisnya. Namun demikian, untuk mempermudah pembacaan
program dan untuk keperluan dokumentasi, sebaiknya penulisan bahasa C diatur
sedemikian rupa sehingga mudah dan enak dibaca.
Berikut contoh penulisan Program Bahasa C:
#include
#include
main ()
{
}
Pengarah Praprosesor
Contoh pengarahan praprosesor dalam penulisan diatas adalah
#include. Pengarah praprosesor ini dipakai untuk membaca file yang
dipakai sebagai header atau library. Contohnya adalah #include
, mega8535.h adalah penunjuk praprosesor yang mengarahkan
menuju file header atau library pada AT Mega 8535. File-file ini mempunyai ciri
yaitu namanya diakhiri dengan ekstensi .h .
Fungsi Penulisan
Dalam penulisan bahasa C selalu berbentuk sebuah Fungsi contohnya adalah
main ( )
{
;
;
}
-
2
Contoh diatas adalah fungsi utama pada program bahasa C. Tanda ( { )
adalah tanda untuk mengawali bagan atau tubuh program, sedangkan tanda ( }
) adalah tanda akhir dari tubuh program .
Tanda ( ) pada Main ( ) merupakan tanda yang berisikan sebuah argument
atau sebuah variabel nilai yang disertakan dalam tubuh program. Dalam
penulisan pernyatan dalam bahasa C harus diahiri dengan tanda ( ; ).
Tipe Data
Tipe data merupakan bagian program yang paling penting karena tipe data
mempengaruhi setiap instruksi yang akan dilaksanakan oleh computer. Misalnya
saja 5 dibagi 2 bisa saja menghasilkan hasil yang berbeda tergantung tipe
datanya. Jika 5 dan 2 bertipe integer maka akan menghasilkan nilai 2, namun jika
keduanya bertipe float maka akan menghasilkan nilai 2.5000000. Pemilihan tipe
data yang tepat akan membuat proses operasi data menjadi lebih efisien dan
efektif.
No Tipe Data Ukuran Jangkauan
1 Char 1 Byte -128 s/d 127
2 Unsigned char 1 byte 0 s/d 255
3 Int 2 Byte -32768 s/d 32767
4 Unsigned int 2 byte 0 s/d 65535
5 Long Int 4 byte -2147483648 s/d 2147483648
6 Unsigned Long int 4 byte 0 s/d 4294967296
7 Float 4 byte -3.4E-38 s/d 3.4E+38
8 Double 8 byte 1.7E-308 s/d 1.7E+308
9 Long Double 10 byte 3.4E-4932 s/d 1.1E+4932
-
3
Deklarasi
Deklarasi Variabel
Variabel adalah suatu pengenal (identifier) yang digunakan untuk mewakili
suatu nilai tertentu di dalam proses program. Bentuk umum pendeklarasian
suatu variable adalah : Nama_tipe nama_variabel;
Contoh :
int x; // Deklarasi x bertipe integer
Dengan demikian x merupakan sebuah variabel dengan tipe data integer.
Jadi jangkauan nilai x dari -32768 s/d 32767.
Deklarasi Konstanta
Konstanta merupakan suatu nilai yang tidak dapat diubah selama proses
program berlangsung. Dalam bahasa C konstanta dideklarasikan
menggunakan preprocessor #define.
Contohnya :
#define PHI 3.14
(atau)
#define nim 0111500382
Deklarasi Fungsi
Fungsi merupakan bagian yang terpisah dari program dan dapat diaktifkan
atau dipanggil di manapun di dalam program. Fungsi dalam bahasa C ada yang
sudah disediakan sebagai fungsi pustaka seperti printf(), scanf(), getch()
dan untuk menggunakannya tidak perlu dideklarasikan.
Fungsi yang perlu dideklarasikan terlebih dahulu adalah fungsi yang dibuat
oleh programmer. Bentuk umum deklarasi sebuah fungsi adalah :
Tipe_fungsi nama_fungsi(parameter_fungsi);
-
4
Contohnya :
float luas_lingkaran(int jari);
void tampil();
int tambah(int x, int y);
Operator
Operator merupakan suatu symbol atau tanda yang digunakan sebagai
perintah dalam eksekusi program.
No Operator Arti Contoh
1 + Penjumlahan X=A+B
2 - Pengurangan X=A-B
3 / Pembagian X=A/B
4 * Perkalian X=A*B
5 < Kurang Dari A= Lebih dari sama
dengan
A>=B
9 == Sama Dengan A==B
10 != Tidak Sama Dengan A!=B
11 && Dan Jika A && B (Operand And)
12 || Atau Jika A|| B (Operand Or)
13 ! Not !A (Menyatakan Bukan A)
14 ++ Penjumlahan 1 X++ memilki arti (X=X+1)
15 -- Pengurangan 1 X-- memilki arti (X=X-1)
Operator Bitwise (MANIPULASI PER BIT)
Operator bitwise digunakan untuk memanipulasi bit-bit dari nilai data yang ada
di memori. Operator bitwise dalam bahasa C di SDCC adalah sebagai berikut :
-
5
> 2 ; // 0x03 digeser kekanan 2 bit hasilnya ditampung di
datanya
Atau
A >> = 1 // Isi variabel A digeser ke kanan 1 bit hasilnya
// kembali disimpan di A
& : Bitwise AND
Contoh:
Hasil = 0x03 & 0x31;
Operasinya
0x03 = 00000011
0x31 = 00110001
________________________________________________
Hasil 0x01 = 00000001
| : Bitwise OR
Contoh:
Hasil = 0x05 | 0x31;
Operasinya
0x01 = 00000001
0x31 = 00110001
________________________________________________
-
6
Hasil 0x01 = 00110001
^ : Bitwise XOR (exclusive OR)
Contoh:
Hasil = 0x02 ^ 0xFA;
Operasinya
0x02 = 00000010
0xFA= 11111010
________________________________________________
Hasil 0x01 = 11111000
~ : Bitwise NOT
Contoh:
Hasil = ~ 0x31;
0x31 = 00110001
Hasil=~0x31 = 11001110 atau Hasil = 11001110
Struktur Kondisi
If
Struktur if dibentuk dari pernyataan if dan sering digunakan untuk menyeleksi
suatu kondisi tunggal. Bila proses yang diseleksi terpenuhi atau bernilai benar,
maka pernyataan yang ada di dalam blok if akan diproses dan dikerjakan.
Bentuk umum struktur kondisi if adalah :
if(kondisi){
pernyataan};
Contoh:
if(X
-
7
Dalam struktur kondisi if.....else minimal terdapat dua pernyataan. Jika kondisi
yang diperiksa bernilai benar atau terpenuhi maka pernyataan pertama yang
dilaksanakan dan jika kondisi yang diperiksa bernilai salah maka pernyataan
yang kedua yang dilaksanakan. Bentuk umumnya adalah sebagai berikut :
if(kondisi){
pernyataan-1};
else{
pernyataan-2};
Contoh:
if(X
-
8
case n : pernyataan-n;break;
default : pernyataan-m;}
Contoh:
switch(A)
{
case 0: X=X+1;break; //Jika A=0 maka X=X+1 Dieksekusi dan
mengecek kondisi lagi
case 1: X=X+2;break; //Jika A=1 maka X=X+2 Dieksekusi dan
mengecek kondisi lagi
case 2: X=X+3;break; //Jika A=2 maka X=X+3 Dieksekusi dan
mengecek kondisi lagi
case 3: X=X+4;break; //Jika A=3 maka X=X+4 Dieksekusi dan
mengecek kondisi lagi
case 4: X=X+5;break; //Jika A=4 maka X=X+5 Dieksekusi dan
mengecek kondisi lagi
case 5: X=X+6;break; //Jika A=5 maka X=X+6 Dieksekusi dan
mengecek kondisi lagi
default: X=X+0;break; //Jika A tidak sama dengan 0,1,2,3,4,5
maka X=X+0
} //Dieksekusi dan mengecek kondisi lagi
While
Perulangan WHILE banyak digunakan pada program yang terstruktur.
Perulangan ini banyak digunakan bila jumlah perulangannya belum diketahui.
Proses perulangan akan terus berlanjut selama kondisinya bernilai benar (true)
dan akan berhenti bila kondisinya bernilai salah.
Bentuk umum dari struktur kondisi ini adalah:
While (ekspresi)
{
Pernyataan_1
Pernyataan_2
}
-
9
Contoh :
While(A
-
10
perulangan for tampaknya lebih efisien karena susunannya lebih simpel dan
sederhana.
Bentuk umum perulangan for adalah sebagai berikut :
for(inisialisasi; syarat; penambahan){
pernyataan;}
Contoh:
for(A=10;A>=0;A--){ // nilai A=10 dan akan dikurangi 1 hingga A>=0
X=A+1;} // nilai X akan sama dengan nilai A+1
-
11
I/O (Input/Output)
Pada bab ini akan membahas tentang fungsi mikrokontroler sebagai input
maupun output. Pada ic mikrokontroler terdapat beberpa kaki ic (pin/port pada
ic) yang dapat digunakan sebagai inputan maupun outputan. Contohnya pada
mikrokontroler berjenis AVR pada tipe AT-Mega 8 mempunyai 23 port sebagai I/O.
Berikut adalah gambar konfigurasi pin pada ic AT-Mega 8
Dari gambar diatas 23 pin I/O adalah PC0-PC5, PB0-PB7,dan PD0-PD7. Pada
penggunanya sebagai I/O terdapat suatu istilah dalam configurasi atau settingan
yang harus di ketahui khususnya dalam pemrogram menggunakan Code Vision
AVR. Istilah itu adalah PORTX.N dan DDRX.N. Maksud dari PORTX.N adalah X
menandakan Abjad dan N adalah menandakan pin. Misalkan PORTB.7 maka itu
menunjukan PB7 pada gambar diatas, hal itu juga berlaku pada DDRX.N.
-
12
DDRX.N adalah suatu konfigurasi yang menyatakan apakah suatu PORTX.N
sebagai inputan atau outputan. Jika dalam pengaplikasianya DDRB.0 = 1 maka
PB0 disetting sebagai outputan, sebaliknya jika DDRB.0 = 0 maka PB0 disetting
sebagai inputan. Jika menggunakan CVAVR penyettingan ini juga bisa disetting
langsung pada dialog box berikut:
dari gambar tersebut kita dapat mensetting PORTA dari bit ke 0 sampai bit ke 7
pada tanda panah diatas. Gambar diatas menunjukan sebuah setingan dimana
PORTA bit 0- bit 7 diseting sebagai inputan.
Pada I/O , PORTX.N digunakan sebagai pernyataan apakah sebuah pin dalam
ic berlogikan 0 (mengeluarkan 0 volt) atau berlogika 1 (mengeluarkan 3-5volt).
Misalkan PORTA.1=1; maka pada pin PA1 akan mengeluarkan tegangan 3-5 volt.
Sebaliknya jika PORTA.1=0; maka PA1 akan berlogika 0 dan mengeluarkan
tegangan 0 volt.
-
13
Latihan 1
Pada latihan 1 kita akan menyalakan led secara bergantian. Langkah-
langkah yang harus kita jalankan adalah:
Setelah membuka program CVAVR pada PC click File kemudian New.
Pada kotak dialog berikut klik project lalu OK dan OK kembali pada printah
selanjutnya.
Setelah itu kita setting jenis mikro yang kita gunakan pada kotak dialog
berikut dengan AT-Mega 8
-
14
Setelah itu kita setting pin yang digunakas sebagai Output pada kotak
dialog Ports
-
15
Setting PORTB Sebagai output semua.
Setelah itu kita klik Program, generate program and save, dan kita ketik
nama file (project) pada kotak dialog.
Berikut adalah contoh listing program penyalaan led
#include
#include
void main(void)
{
int a;
PORTB=0x00;
DDRB=0xFF;
while (1)
{
for(a=0;a
-
16
Cara kerja program :
Pada progam ini kita akan menyalakan led secara bergantian. Untuk itu
diperlukan pendeklarasian register untuk mikrokontroler AT-Mega 8
dan delay . Setelah itu langsung kepada main program. Padamain
program terdapan inisialisasi dimana sebuah variabel a diinisialisasikan dengan
tipe data integer yang berarti bernilai antara -32768 s/d 32767.
Setelah itu ada inisialisasi selanjutnya yaitu PORTB=0x00; yang berarti pada saat
awal program berjalan semua pin yang ada pada PORTB berlogika 0. Setelah
menginisialisasi nilai awal PORTB, kemudian kita inisialisasi PORTB sebagai outputan
dengan memberikan nilai pada DDRB=0xFF; yang berarti semua pin pada PORTB
adalah outputan.
Pada program ini terdapat suatu fungsi perulangan dalam while (1) yang berarti
melakukan suatu pernyataan yang terus berulang tanpa ada sarat untuk
berhenti. Selanjutnya adalah fungsi dalam for(a=0;a
-
17
Program itu dapat kita simulasikan pada aplikasi program Proteus dengan
gambar sebagai berikut.
(Buka pada folder Rangkaian ISIS dengan nama Latihan 1)
Latihan 2
Pada latihan 2 kita akan menyalakan beberapa led dengan sebuah inputan
berupa push button, dengan langkah langkah sebagai berikut.
Setelah membuka program CVAVR pada PC, click File kemudian New.
Pada kotak dialog berikut klik project lalu OK dan OK kembali pada printah
selanjutnya.
-
18
Setelah itu kita setting jenis mikro yang kita gunakan pada kotak dialog
berikut dengan AT-Mega 8
-
19
Setelah itu kita setting pin yang digunakas sebagai Output pada kotak
dialog Ports
Setting PORTB Sebagai output semua.
Setting PINC.0 dan PINC.1 Sebagai input.
Setelah itu kita klik Program, generate program and save, dan kita ketik
nama file (project) pada kotak dialog.
Berikut adalah contoh listing program
#include
#include
-
20
#define tombol_1 PINC.0
#define tombol_2 PINC.1
void main(void)
{
int a;
PORTB=0x00;
DDRB=0xFF;
PORTC=0x03;
DDRC=0x00;
while(10)
{
delay_ms(10);
if(!tombol_1){
PORTB=0xFF;
}
else if(!tombol_2){
for(a=0;a
-
21
Pada perulangan While(1) terdapat fungsi if else dimana pada fungsi
if yang pertama jika kita tekan tombol_1 maka akan menghasilkan logic 0 pada
PINC.0 dan jika kondisi itu terpenuhi maka terdapan pernyataan yang akan di
eksekusi yaitu PORTB=0xFF; yang berarti akan memberi outputan 1 kepada
semua pin pada PORTB. Kemudia pada fungsi if yang ke dua terdapat sebuah
kondisi dimana jika tombol_2 ditekan maka akan memberikan logic 0 pada
PINC.1 dan jika itu terpenuhi maka akan meng eksekusi pernyataan yang sama
pada latihan 1. Jika semua kondisi itu tidak terpenuhi maka akan mengeksekusi
pernyataan PORTB=0, yang akan mematikan semua led.
Program itu dapat disimulasikan pada aplikasi program Proteus dengan
gambar sebagai berikut.
(Buka pada folder Rangkaian ISIS dengan nama Latihan 2)
-
22
LCD
Pada bab ini akan dibahas tentang bagaimana menggunakan LCD dan
konfigurasi untuk menggunakanya. LCD yang biasa digunakan pada
mikrokontroler adalah LCD modul type M1632. Modul tersebut memiliki berdimensi
16x2 yang berarti 16 baris karakter dan memiliki 2 kolom, jadi dapat menampilkan .
Dalam penggunaanya LCD modul M1632 memiliki konfigurasi sebagai berikut.
Pin 1 (Vss)
Vss merupakan pin sambungan untuk satu daya 0 volt.
Pin 2 (Vdd)
Vdd meupakan sambungan catudaya 5 volt
Pin 3 (Vee)
Merupakan pin kontrol Vcc yang digunakan untuk mengatur kontras display.
Pin 4 (RS)
Merupakan register select (RS), masukan yang pertama dari tiga command
control input. Dengan membuat RS menjadi high, data karakter dapat
ditransfer dari dan menuju modulnya.
Pin 5 (R/W)
Read/Write (R/W). Untuk memfungsikan sebagai perintah Write maka R/W
low atau menulis karakter ke modul.
-
23
Pin 6 (Enable)
Enable (E), input ini digunakan untuk transfer aktual dari perintahperintah
atau karakter antara modul dengan hubungan data.
Pin 7 Pin 14 (Data)
Pin 7 sampai 14 adalah delapan jalur data (D0 D7) dimana data dapat
ditransfer ke dan dari display.
Pin 15 dan Pin 16
Pin 15 atau A (+) mempunyai level DC +5 V berfungsi sebagai LED backlight +
sedangkan pin 16 yaitu K (-) memiliki level 0 V
Rangkaian interface antara LCD dan mikrokontroler adalah sebagai berikut.
Pemrograman LCD
Dalam pemrograman LCD menggunakan CVAVR terdapat beberapa istilah
yang harus diketahui yaitu
lcd_gotoxy (x,y)
Berfungsi memberikan letak kordinat untuk menuliskan suatu karakter.
Misalkan lcd_gotoxy(0,1) maka suatu karakter akan ditulis mulai baris ke 0
dan kolom 1.
-
24
lcd_putsf (karakter yang ingin ditulis)
Perintah ini digunakan untuk menuliskan pada lcd. Contoh penggunanya
adalah
lcd_gotoxy(0,0); //karakter dimulai pada baris ke 0 dan
kolom ke 0
lcd_putsf(WS robotika UMM) //menuliskan karakter tersebut
pada LCD
lcd_sprintf (lcd_buffer,%i,nilai variabel yang ingin di tampilkan)
Perintah ini digunakan untuk menampilkan suatu variabel yang berubah
ubah. Contohnya adalah sebagai berikut
lcd_gotoxy(0,0); //karakter dimulai pada baris ke 0 dan
kolom ke 0
sprintf(lcd_buffer,"%6i",kecepatan_ki); //variabel disimpan
dalam array lcd_buffer
lcd_puts(lcd_buffer); //menampilkan isi karakter dalam
lcd_buffer
ftoa(nilai variabel yang ingin di tampilkan,berapa ditampilkan,lcd_buffer)
ftoa adalah salah satu fungsi dalam menampilkan suatu variabel yang
bernilai desimal dengan type data float. Dalam fungsi ini dapat
menampilkan suatu variabel dengan nilai bebrapa digit dibelakang
koma. Contoh penggunaan ftoa :
lcd_gotoxy(0,1); //karakter dimulai pada baris ke 0 dan
kolom ke 1
ftoa(jarak_bawah,1,lcd_buffer); // menyimpan variabel dalam
array
lcd_puts(lcd_buffer); //menampilkan isi karakter dalam
lcd_buffer
-
25
Latihan 3
Pada latihan ini kita akan menampilkan suatu karakter atau kalimat dalam lcd
dengan langkah langkah sebagai berikut :
Setelah membuka program CVAVR pada PC, click File kemudian New.
Pada kotak dialog berikut klik project lalu OK dan OK kembali pada printah
selanjutnya.
-
26
Setelah itu kita setting jenis mikro yang kita gunakan pada kotak dialog
berikut dengan AT-Mega 8
Pada kotak dialog Alphanumeric LCD kita setting konfigurasi untuk lcd
Pada kotak dialog Alphanumeric LCD kita check list untuk Enable
Alphanumeric LCD support
Pada characters/line kita ganti dengan 16 (karena modul lcd 16x2)
Setelah itu konfigurasikan port pada mikrokontroler dengan lcd.
-
27
Setelah itu kita klik Program, generate program and save, dan kita ketik
nama file (project) pada kotak dialog.
Berikut adalah contoh listing program
#include
#include // file header untuk lcd
void main(void)
{
// Alphanumeric LCD initialization
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD
menu:
// RS - PORTD Bit 0
// RD - PORTD Bit 1
// EN - PORTD Bit 2
// D4 - PORTD Bit 4
// D5 - PORTD Bit 5
// D6 - PORTD Bit 6
// D7 - PORTD Bit 7
// Characters/line: 16
lcd_init(16); //lcd 16 karakter
-
28
lcd_gotoxy(4,0); // karakter dimulai pada baris ke 4 dan
kolom ke 0
lcd_putsf("Novendra") ; // menuliskan karakter pada lcd
lcd_gotoxy(0,1); //karakter dimulai pada baris ke 0 dan
kolom ke 1
lcd_putsf("Teknik Elektro") ; // menuliskan karakter pada
lcd
}
(Buka pada folder contoh program dengan nama Latihan 3)
Program itu dapat disimulasikan pada aplikasi program Proteus dengan
gambar sebagai berikut
(Buka pada folder Rangkaian ISIS dengan nama Latihan 3)
-
29
ADC (Analog Digital Converter)
ADC atau Analog Digital Converter adalah salah satu fitur mikrokontroler untuk
mengkonversikan besaran fisis khususnya tegangan dalam bentuk digital berupa
nilai biner. Dalam penerapanya ADC sering digunakan untuk interface terhadap
sensor sensor yang memberi outputan berupa nilai tegangan.
ADC AT Mega 8
Pada AT Mega 8 terdapat 6 pin untuk ADC yang memiliki fidelitas 10 bit yang
dapat digunakan dalam fidelitas 8 bit. Dalam mode penggunaanya hal hal
yang perlu diperhatikan adalah tegangan reffrensi yang digunakan, prescaler
(jumlah pencacah), dan mode operasi.
Untuk menggunakan ADC terdapat beberapa register yang harus dipelajari
diantaranya.
ADMUX (ADC Multiplexer Selection Register)
Konfigurasi register ADMUX adalah sebagai berikut
REFS1 REFS0 ADLAR MUX3 MUX2 MUX1 MUX0
1. REFS1 REFS0
Merupakan bit pengatur tegangan referensi ADC ATMega8535. Memeiliki
Nilai Awal 00 sehingga referensi tegangan berasal dari pin AREF. Detail nilai
yang lain dapat dilihat pada tabel berikut
REFS1 REFS0 Mode tegangan Refrensi
0 0 Tegangan dari AREF
0 1 Tegangan dari AVCC
1 0 Tidak digunakan
1 1 Tegangan internal 2.56 Volt
-
30
2. ADLAR
Merupakan bit pemilih mode data keluaran ADC. Bernilai awal 0, sehingga
2 bit tertinggi data hasil konversinya berada di register ADCH dan 8 bit
sisanya berada di register ADCL, seperti dalam tabel 9.3. Apabila bernilai 1,
maka hasilnya pada tabel berikut
ADLAR=0
- - - - - - ADC9 ADC8
ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0
ADLAR=1
ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2
ADC1 ADC0 - - - - - -
3. MUX3 MUX0
Merupakan bit pemilih saluran pembacaan ADC. Bernilai awal 00000. Untuk
mode single ended input, MUX[4..0] bernilai dari 00000 hingga 00111,
konfigurasinya dalam tabel berikut
-
31
ADCSRA
Merupakan register 8 bit yang berfungsi melakukan manajemen sinyal kontrol
dan status dari ADC yang memiliki susunan dalam tabel berikut
ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0
4. ADEN merupakan bit pengatur aktivasi ADC. Bernilai awal 0. Jika bernilai 1,
maka ADC aktif.
5. ADSC merupakan bit penanda mulainya konversi ADC. Bernilai awal 0
selama konversi ADC akan bernilai 1, sedangkan jika konversi selesai, akan
bernilai 0.
6. ADATE merupakan bit pengatur aktivasi picu otomatis operasi ADC. Bernilai
awal 0, jika bernilai1 maka konversi ADC akan dimulai pada saat transisi
positif dari sinyal picu yang diplih. Pemiliha sinyal picu menggunakan bit
ADTS pada register SFIOR.
7. ADIF merupakan bit penanda akhir suatu konversi ADC. Bernilai awal 0. Jika
bernilai 1, maka konversi ADC pada saluran telah selesai dan data siap
diakses.
8. ADIE merupakan bit pengatur aktivasi interupsi yang berhubungan dengan
akhir konversi ADC. Bernilai awal 0. Jika berniali 1 dan jika konversi ADC telah
selesai, sebuah interupsi akan dieksekusi.
9. ADPS[2..0] merupakan bit pengatur clock ADC. Bernilai awal 000. Detail nilai
bit dalam tabel berikut
ADPS2 ADPS1 ADPS0 Prescaler
0 0 0 2
0 0 1 2
0 1 0 4
0 1 1 8
1 0 0 16
1 0 1 32
1 1 0 64
-
32
1 1 1 128
Latihan 4
Menampilkan ADC yang didapat dari tegangan pada VR (potensio meter) pada
LCD. Untuk dapat melakukanya diperlukan langkah langkah sebagai berikut
Setelah membuka program CVAVR pada PC, click File kemudian New.
Kemudian pilih Project dan click OK. Setelah itu click yes dan OK kembali.
Setting LCD 16x2 pada PORTD bit 0 bit 7.
Setelah itu kita setting pada kotak dialog ADC
Enable-kan ADC dengan menchecklist pada ADC Enable
Lalu checklist pada Use 8 bit untuk menggunakanya dengan fidelitas 8 bit.
Gunakan AREF pin sebagai tegangan refrensi ADC.
Lalu gunakan frequensi paling rendah untuk Prescaler tinggi yaitu 128.
-
33
Setelah itu kita klik Program, generate program and save, dan kita ketik
nama file (project) pada kotak dialog.
Berikut adalah contoh listing program
#include
#include
#include
#include
#define ADC_VREF_TYPE 0x20
unsigned char read_adc(unsigned char adc_input) //fungsi
pembacan ADC
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);// Delay needed for the stabilization of the
ADC input voltage
ADCSRA|=0x40;// Start the AD conversion
while ((ADCSRA & 0x10)==0);// Wait for the AD conversion to
complete
ADCSRA|=0x10;
return ADCH;
}
unsigned char potensio; //inisialisasi potensio 8
bit dengan nilai max 255
char lcd_buffer[16]; //inisialisasi array untuk lcd
void main(void)
{
-
34
// ADC initialization
// ADC Clock frequency: 31,250 kHz
// ADC Voltage Reference: AREF pin
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE & 0xff; //register ADMUX
ADCSRA=0x87; //register ADCSRA
lcd_init(16);
while (1)
{
potensio=read_adc(0); //membaca tegangan potensio pada
pin ADC 0
lcd_gotoxy(0,0); // kordinat ADC pada baris 0 dan
kolom 0
sprintf(lcd_buffer,"ADC=%3i",potensio); // menyimpan
variabel ke array
lcd_puts(lcd_buffer); //menuliskan array lcd_buffer
pada LCD
}
}
(Buka pada folder Contoh Program dengan nama Latihan 4)
Cara kerja Program :
Pada listing program fungsi read_adc ( ) adalah fungsi yang sudah terbentuk
pada CVAVR pada saat kita mengenablekan ADC. Dari itu kita hanya
memanggil fungsi tersebut dan menggunakan variabel potensio dengan type
data unsigned char sebagai variabel yang akan ditampilkan pada LCD
dengan 3 digit nilai
-
35
Listing program tersebut dapat disimulasikan pada rangkaian berikut
(Buka pada folder Rangkaian ISIS dengan nama Latihan 4)
Pada rangkaian ini kita harus menghubungkan tegangan yang sama dengan
tegangan pada inputan ADC dengan AREF dan AVCC yang memiliki tegangan
max 5 volt.
-
36
PWM (Pulse Width Modulation)
PWM (Pulse Width Modulation) dapat digunakan untuk mengatur kecepatan
motor, yaitu dengan cara mengatur lebar pulsa (waktu ON) dari tegangan
sumbernya (tegangan DC). Perbandingan antara waktu ON dan waktu OFF
disebut duty cycle (siklus kerja). Semakin besar siklus kerjanya, akan semakin besar
pula keluaran yang dihasilkan, sehingga kecepatan motor akan semakin besar.
Pembangkitan sinyal PWM dengan mikrokontroler memiliki beberapa keuntungan,
seperti teknik pemrograman yang sederhana, dan rangkaian listrik menjadi
sederhana.
Pada penggunaanya terdapat beberapa register yang harus dipahami, yaitu
diantaranya :
1. Timer/Counter Control Register (TCCR), untuk menentukan mode PWM.
2. Timer/Counter Register (TCNT), digunakan untuk menentukan modulasi
frekuensinya.
3. Output Compare Register (OCR), untuk menentukan nilai siklus kerjanya.
Mode PWM yang akan dibahas adalah mode Fast PWM, karena dalam
perancangan sistem robot ini menggunakan mode Fast PWM. Pada mode Fast
PWM, semakin besar nilai OCR, maka akan semakin besar pula siklus kerja yang
dihasilkan. Keluaran PWM akan berlogika tinggi setelah nilai TOP tercapai sampai
nilai OCR tercapai dan kemudian akan berlogika rendah sampai nilai TOP
tercapai kembali.
Dalam menggunakan PWM untuk mengendalikan motor DC, maka diperlukan
sebuah driver motor sebagai pendukung modulasi. Pada kali ini dalam
pengaturannya menggunakan driver motor dual h-bridge yang sudah terintegrasi
dalam satu IC L298 yang memiliki konvigurasi sebagai berikut
-
37
Pada konfigurasi L298 yang harus diperhatikan adalah sebagai berikut :
1. In 1- In 2 dan In3- In4 control pengendali arah putar Out 1 - Out 2 dan Out 3 -
Out 4 (CW/CCW).
In 1 In 2 Arah putar Motor
0 0 Stop
0 1 CW (clock wise)
1 0 CCW(conter clock
wise)
1 1 Stop
2. ENA dan ENB merupakan pin pengendali kecepatan dengan PWM .ENA
untuk OUT 1-OUT2 dan ENB untuk OUT 3-OUT 4. Kedu pin tersebut
dihubungkan pada OC1A dan OC1B yang merupakan pin keluaran PWM
dari AT-Mega 8.
Latihan 5
Pada latihan 5 kita akan mengontrol motor DC dengan menggunakan potensio
yang dimasukan dalam PIN ADC.Untuk menggunakan PWM dalam AT-Mega 8
dengan menggunakan CVAVR diperlukan langkah langkah sebagai berikut
Setelah membuka program CVAVR pada PC, click File kemudian New.
Kemudian pilih Project dan click OK. Setelah itu click yes dan OK kembali.
-
38
Setting PORTB sebagai Output Semua
Setelah itu kita setting pada kotak dialog ADC
Enable-kan ADC dengan menchecklist pada ADC Enable
Lalu checklist pada Use 8 bit untuk menggunakanya dengan fidelitas 8 bit.
Gunakan AREF pin sebagai tegangan refrensi ADC.
Lalu gunakan frequensi paling rendah untuk Prescaler tinggi yaitu 128.
-
39
Lalu kita setting PWM pada kotak dialog Timers
Pilih clock source dengan system clock dan menggunakan clock dengan
freq menengah
Pilih Mode dengan Mode Fast PWM top=0x00FF yang berarti 8 bit PWM.
Untuk mengeluarkat PWM pada OUTA pilih Non-Inv (non inverting PWM)
PWM dengan glombang non pembalik. Jika ingin mengeluarkan 2 PWM
sekaligus maka lakukan hal yang sama pada OUTB
Checklist pada Timer1 Overflow untuk mendapatkan nilai PWM yang baik.
Setelah itu kita klik Program, generate program and save, dan kita ketik
nama file (project) pada kotak dialog.
-
40
Berikut adalah contoh listing program
#include
#include
#include
unsigned char PWM;
#define ADC_VREF_TYPE 0x00
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void baca_PWM(){
if(PWM>=0 && PWM255){
PWM=255;}
}
else{
PORTB.3=1;
PORTB.4=0 ;
PWM=PWM-128;
PWM=PWM*2;
if(PWM>255){
PWM=255;}
-
41
}
}
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
baca_PWM();
OCR1A=PWM; //Pemberian Nilai PWM yang akan dikeluarkan
pada pin OC1A
}
void main(void)
{
PORTB=0x00;
DDRB=0xff;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR1A=0x81; //register untuk pengaturan PWM
TCCR1B=0x0B; //register untuk pengaturan PWM
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
TIMSK=0x04;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x87;
#asm("sei")
while (1)
{
-
42
PWM=read_adc(0); //Pembacaan adc sebagai input
pengaturan kecepatan motor
}
}
Cara Kerja Program :
Pada contoh program diatas motor diatur dengan inputan berupa sebuah
potensio (VR) dimana jika potensio berputar kekanan maka motor maju dan
jika potensio berputar kekiri motor mundur. Pemberian PWM dilakukan pada
interupt agar update nilai PWM lebih baik.
Pada awal mula program adalah membaca ADC pada looping While(1) yang
diwakili dengan Variabel PWM. Setelah itu diolah nilai ADC, untuk nilai antara 0-
127 motor berputar kearah maju dengan kecepatan PWM yang sama dengan
dua kali lipat nilai ADC. Begitu pula sebaliknya, pada nilai 128-255 motor
berputar mundur dengan nilai PWM yang memiliki persaman sebagai berikut :
PWM=PWM-128;
PWM=PWM*2;
Pada persamaan tersebut jika nilai ADC full 255 maka nilai PWM akan sama
dengan PWM=(255-128)x 2= 254 dan saat ADC /Potensio di tengah maka nilai
PWM akan sama dengan PWM=(128-128)x 2= 0.
-
LSO Robotika
Fakultas Teknik
Universitas Muhammadiyah Malang