Anda di halaman 1dari 34

Praktikum Teknologi Sensor

Percobaan 6. Rotari Enkoder untuk Feedback Kendali


Kecepatan motor DC Brushed

I. Tujuan
a. Mahasiswa dapat membangkitkan sinyal PWM dengan menggunakan fasilitas timer pada
mikrokontroler baik secara hardware
b. Mahasiswa dapat menggunakan timer pada mikrokontroler untuk men-sampling data rotary
encoder untuk membaca data kecepatan
c. Mahasiswa dapat menggunakan timer pada mikrokontroler untuk men-sampling
memmanggil fungsi kontrol
d. Mahasiswa dapat membuat program pengaturan kecepatan motor DC brushed dengan
metode PID

II. Pendahuluan
Motor DC brushed adalah salah satu jenis motor listrik yang memerlukan supply tegangan arus
searah pada kumparan rotor untuk diubah menjadi energi gerak mekanik. Motor DC yang digunakan
pada praktikum ini adalah jenis PMDC, yang menggunakan magnet permanen untuk membangkitkan
medan magnet pada bagian stator dari motor. Kontroler PID (Proportional–Integral–Derivative
controller) merupakan kontroler umpan balik yang banyakdigunakan pada sistem kontrol industri.

Gambar 1. Diagram blok kendali PID secara umum

Mekatronika PENS - Praktikum Teknologi Aktuator 1


Sebuah kontroler PID secara terus menerus menghitung nilai error sebagai beda antara setpoint
yang diinginkan dan variabel proses terukur (kondisi aktual dari variable sistem yang dikendalikan).

dengan nilai KP, KI, dan KD yang semuanya positif, yang merupakan koefisien (gain) untuk term
proporsional, integral, dan derivatif, secara berurutan (atau P, I, dan D). Pada model ini:
 Kendali P bertanggung jawab terhadap nilai error aktual,. Contohnya, jika nilai kesalahan
besar dan positif, maka keluaran kontrol juga besar dan positif.
 Kendali I bertanggung jawab terhadap nilai error sebelumnya (total error yang sudah
terjadi). Contoh, jika keluaran saat ini kurang besar, maka kesalahan akan terakumulasi terus
menerus, dan kontroler akan merespon dengan keluaran lebih tinggi.
 Kendali D bertanggung jawab untuk kemungkinan nilai error yang akan datang, berdasarkan
pada rate perubahan error (laju error) terhadap waktu.

Driver
Setpoint PID Control Motor Output
Motor

Perhitungan Rotari
kecepatan Enkoder

Sampling

Gambar 2. Diagram blok kendali PID untuk kecepatan motor

A. Modul Praktikum : Modul ADROIT-AVR.

Modul kontroler yang digunakan pada percobaan ini menggunakan ADROIT-AVR, yaitu rangkaian
pengendali utama dari robot AdRoiT. Rangkaian ini akan mengendalikan gerakan robot melalui
modul aktuator yang ada. ADROIT-AVR dilengkapi dengan rangkaian regulator, 2 buah driver motor
DC dan beberapa sensor onboard. Selain itu bisa juga dihubungkan dengan sensor maupun aktuator
tambahan yang bisa dihubungkan melalui jalur komunikasi UART dan I2C.

Mekatronika PENS - Praktikum Teknologi Aktuator 2


1 8 9
2

3
5
4 6

7 10 11

Gambar 3. Modul Rangkaian AdRoiT AVR (tampak atas)


Keterangan:
1. Indikator Power, indikator USART, dan 4 LED untuk keperluan umum
2. KonektorLCD Text
3. Konektor ISP (sharing dengan UART 2)
4. Konektor Supply ke Batere
5. Switching regulator 5V
6. Saklar Power
7. 4 buah Push Button untuk keperluan umum
8. Konektor ADC 7 kanal
9. Konektor Motor Servo B (Servo 5-8)
10. Dip-Switch 4 bit
11. Konektor Motor Servo A (Servo 1-4)

Mekatronika PENS - Praktikum Teknologi Aktuator 3


5 6
11
1
12
4 7
3
8
2 10

9
13
Gambar 4. Modul Rangkaian AdRoiT AVR (tampak bawah)
Keterangan:
1. Konektor Motor DC 1 (motor penggerak kanan)
2. Konektor Motor DC 2 (motor penggerak kiri)
3. Driver motor DC (motor 1 dan 2)
4. Mikrokontroler ATMega128
5. Konektor UART Depan (UART 1)
6. Konektor I2C
7. MPU6050 (Accelerometer 3 axis + Gyroscope 3 axis )
8. HMC5883L (Magnetometer 3 axis)
9. Konektor UART Belakang (UART 1)
10. Regulator 3,3V
11. Tombol reset
12. Buzzer
13. Sekering

B. Skematik Rangkaian
a. Rangkaian LED

Modul ADROIT-AVR dilengkapi dengan empat buah LED untuk keperluan umum. LED tersebut
terhungung pada PORTC bit-4 sampai dengan bit-7. Sifat dari LED adalah active high, sehingga LED
akan menyala saat diberi logika 1. Bit-bit pada port ini harus difungsikan sebagai output.

Mekatronika PENS - Praktikum Teknologi Aktuator 4


b. Rangkaian Push Button

Modul ADROIT-AVR dilengkapi dengan empat buah push button untuk keperluan umum. Push
button tersebut terhungung pada PORTC bit-0 sampai dengan bit-3. Sifat dari push button adalah
active low, sehingga push button akan menghasilkan logika 0 saat ditekan. Supaya logika ketika push
button tidak ditekan bisa menghasilkan logika 1, maka internal pull-up dari PORTC pada bit-0 sampai
dengan bit-3 harus diaktifkan. Selain itu bit-bit pada port tersebut harus diinisialisasi sebagai input.

c. Rangkaian Dipswitch

Modul ADROIT-AVR dilengkapi dengan empat bitdip-switch untuk keperluan umum. Dip-switch
tersebut terhungung pada PORTG bit-0, 1, 2 dan 4. Sifat dari dip-switch adalah active low, sehingga
ketika aktif (terhubung) akan menghasilkan logika 0. Supaya logika ketika tidak aktif bisa
menghasilkan logika 1, maka internal pull-up dari PORTG pada bit-0, 1,2, dan 4 harus diaktifkan.
Selain itu bit-bit pada port tersebut harus diinisialisasi sebagai input.

d. Rangkaian LCD

Mekatronika PENS - Praktikum Teknologi Aktuator 5


Modul ADROIT-AVR dilengkapi sebuah LCD text yang terdiri dari 16x2 karakter. LCD tersebut
terhungung pada PORTA dengan konfigurasi seperti gambar di atas. Pada programnya port A
tersebut harus diinisialisasi sebagai output untuk bisa men-drive LCD.

e. Rangkaian ADC

Modul ADROIT-AVR dilengkapi dengan 8 kanal ADC. Akan tetapi jumlah kanal ADC yang bisa
dihubungkan ke rangkaian luar hanya ada 7 kanal, karena salah satu kanal digunakan untuk
monitoring tegangan supply. Masing-masing bit bisa tetap dikonfigurasikan sebagai input untuk
interface dengan ADC.

f. Rangkaian Motor Servo

Modul ADROIT-AVR dilengkapi dengan 8 kanal PWM generator, 3 diantaranya bisa dibangkitkan
dengan hardware PWM generator menggunakan timer 1 dengan resolusi 16 bit. Sedangkan 5 kanal
sisanya bisa dikendalikan dengan emulasi PWM dengan menggunakan interupsi timer. Bit-bit pada
masing-masing kanal harus dikonfigurasikan sebagai output supaya bisa menggunakannya untuk
melakukan interface ke motor Servo.

g. Rangkaian Buzzer

Mekatronika PENS - Praktikum Teknologi Aktuator 6


Modul ADROIT-AVR dilengkapi dengan sebuah buzzer yang bisa diatur frekwensi outputnya.
Frekwensi yang dibangkitkan bisa dikendalikan dengan menggunakan timer 0 dari mikrokontroler.
PORT B bit 0 harus dikonfigurasi sebagai output untuk mengendalikan buzzer.

h. Rangkaian Driver Motor

Modul ADROIT-AVR dilengkapi dengan dua buah driver motor yang dilengkapi juga dengan fasilitas
antarmuka untuk rotary encoder. Masing-masing enkoder bisa digunakan untuk melakukan
antarmuka dengan mode bidirectional encoder. Pengaturan kecepatan dari motor DC dilakukan
melalui timer 0, sedangkan rotary encoder dibaca dengan memanfaatkan ekternal interrupt 6 dan 7.
PORTE bit 2, 3, 4 dan 5 dikonfigurasikan sebagai output untuk men-drive motor. Sedangkan PORTB
0, 1 dan PORT E 6, 7 dikonfigurasikan sebagai input dengan pull-up aktif untuk keperluan interface
dengan rotary encoder.

i. Rangkaian Motor dengan Rotary Encoder

Mekatronika PENS - Praktikum Teknologi Aktuator 7


Modul ADROIT V1 dilengkapi dengan 2 buah motor DC gearbox dengan rasio 17 .1:1 dan
menghasilkan kecepatah shaft sebesar 400 rpm pada tegangan 6Volt. Torsi luaran nominal dari
motor adalah sebesar 0,4 Kgcm. Motor juga dilengkapi dengan rotary encoder jenis incremental
sebanyak 2 kanal dengan resolusi sebesar 8 pulsa per rotasi. Motor Bekerja pada tegangan nominal
sebesar 6 sampai dengan 9 Volt dengan arus nominal sebesar 400 mA.

Gambar 5. Motor DC Brushed yang dilengkapi dengan gearbox dan rotary enkoder

j. Rangkaian Sensor IMU

Modul ADROIT-AVR dilengkapi sebuah sensor IMU yang mengasilkan pembacaan data 3 axis
Gyroscope dan 3 axis Accelerometer. Sensor ini terhubung dengan mikrokontroler menggunakan
antarmuka I2C.

k. Rangkaian Magnetic Compass

Modul ADROIT-AVR dilengkapi sebuah sensor magnetic compas yang bisa membaca medan
magnet sekitar dalam arah 3 axis. Sensor ini terhubung dengan mikrokontroler menggunakan
antarmuka I2C melalui IC IMU MPU6050.

Mekatronika PENS - Praktikum Teknologi Aktuator 8


III. Peralatan
1. Modul mikrokontroler ADROIT-AVR
2. Modul Motor DC brushed
3. Kabel USB-ISP + Converter
4. PC dengan program CodeVision AVR atau Code::Block + AVR-GCC
5. Program ISP Programmer (Khazama AVR Programmer)
6. Power Supply + Kabel

IV. Prosedur Percobaan


A. Konfigurasi Project dengan CodeWizzardAVR
1. Persiapkan peralatan yang akan digunakan
2. Hubungkan ISP programmer pada port USB PC dengan port ISP programmer yang ada pada
modul ADROIT-AVR
3. Buka Program CodeVisonAVR pada PC
4. Buat program untuk membuat pengaturan pergerakan motor stepper dengan mengunakan
metode wave drive dengan menggunakan CodeVisionAVR
5. Buka jendela CodeWizard melalui menu File, New, Project

Pilih OK

Pilih Yes
Pilih AT90…  OK

Mekatronika PENS - Praktikum Teknologi Aktuator 9


Pilih Chip = ATmega128, dan set Clock = 16

Masuk ke Ports  Port A, Set semua bit di Port A sebagai output (untuk interface ke LCD
text)

Mekatronika PENS - Praktikum Teknologi Aktuator 10


Pilih Ports  Port B, atur kofigurasi sebagai berikut:
Bit-0 = input dengan pull up active
Bit-1 = input dengan pull up tidak aktif (tidak digunakan)
Bit-2 = input dengan pull up active
Bit-3 = output dengan nilai awal 0 (servo 5)
Bit-4 = output dengan nilai awal 0 (buzzer)
Bit-5 = output dengan nilai awal 0 (servo 6)
Bit-6 = output dengan nilai awal 0 (servo 7)
Bit-7 = output dengan nilai awal 0 (servo 8)

Pilih Ports  Port C, atur kofigurasi sebagai berikut:


Bit-0 = input dengan pull up active (push button 1)
Bit-1 = input dengan pull up active (push button 2)
Bit-2 = input dengan pull up active (push button 3)
Bit-3 = input dengan pull up active (push button 4)
Bit-4 = output dengan nilai awal 0 (LED 1)
Bit-5 = output dengan nilai awal 0 (LED 2)
Bit-6 = output dengan nilai awal 0 (LED 3)
Bit-7 = output dengan nilai awal 0 (LED 4)

Mekatronika PENS - Praktikum Teknologi Aktuator 11


Pilih Ports  Port D, atur kofigurasi sebagai berikut:
Bit-0 – Bit-3 digunakan untuk I2C dan USART (tidak perlu dikonfigurasi disini)
Bit-4 = output dengan nilai awal 0 (servo 1)
Bit-5 = output dengan nilai awal 0 (servo 2)
Bit-6 = output dengan nilai awal 0 (servo 3)
Bit-7 = output dengan nilai awal 0 (servo 4)

Pilih Ports  Port E, atur kofingurasi sebagai berikut:


Bit-0 – Bit-1 digunakan untuk USART (tidak perlu dikonfigurasi disini)
Bit-2 = output dengan nilai awal 0 (Motor 2 Direction)
Bit-3 = output dengan nilai awal 0 (Motor 2 PWM)
Bit-4 = output dengan nilai awal 0 (Motor 1 PWM)
Bit-5 = output dengan nilai awal 0 (Motor 1 Direction)
Bit-6 = input dengan pull-up aktif (Input encoder motor 1)
Bit-7 = input dengan pull-up aktif (Input encoder motor 2)

Pilih Ports  Port F, tidak perlu dikonfigurasi karena digunakan untuk input ADC
(defaultnya sebagai input floating)

Mekatronika PENS - Praktikum Teknologi Aktuator 12


Pilih Ports  Port G, atur kofingurasi sebagai berikut:
Bit-0 = input dengan pull-up aktif (Dipswitch bit-1)
Bit-1 = input dengan pull-up aktif (Dipswitch bit-2)
Bit-2 = input dengan pull-up aktif (Dipswitch bit-3)
Bit-3 = input dengan pull-up aktif (Dipswitch bit-4)
Bit-4 = input dengan pull-up tidak aktif (tidak digunakan)

6. Lakukan setting untuk Buzzer dengan masuk pada tab Timers  Timer 0

7. Lakukan setting untuk Motor Servo 7, 6, 8 dengan masuk pada tab Timers  Timer 1
Timer satu juga digunakan untuk membangkitkan interupsi dengan periode 5ms untuk
mencacah pembangkitan pulsa PWM untuk motor servo yang mempunyai periode 20ms.
Selain itu interupsi juga digunakan untuk pewaktuan update perhitungan sinyal IMU
(digunakan pada praktikum selanjutnya)
Interupsi diaktifkan pada 2 kondisi, yaitu:
 Timer1 Overflow Interrupt
 Input Capture Interrupt

Mekatronika PENS - Praktikum Teknologi Aktuator 13


Nilai ICR1 = 1387H = 4999 desimal  2MHz/ (4999+1) = 40KHz  T=5ms
8. Lakukan setting timer untuk pewaktuan komputasi kendali kecepatan motor DC setiap 1ms
atau frekwensi interupsi = 1KHz, dengan cara masuk pada tab Timers  Timer 2

Mode CTC dengan Top dari nilai OCR2, dimana Frek. Interrup yang dihasilkan dapat dihitung
dengan Fint = Fclk/(Top+1) , dimana periode interupsinya adalah T int = 1/Fint
OCR2+1 = 250KHz/10000 = 250, maka OCR2=250-1=249d = F9h
9. Lakukan setting untuk PWM pada motor dengan masuk pada tab Timers  Timer 3
Timer 3 menggunakan 2 buah kanal PWM dengan sifat inverted, karena driver motor nilai
PWMnya active low dengan frekwensi 20KHz. Selain itu timer ini juga digunakan untuk
membangkitkan frekwensi interupsi sebesar 40KHz untuk keperluan mengemulasi sinyal

Mekatronika PENS - Praktikum Teknologi Aktuator 14


PWM untuk dihubungkan ke port servo 1 sampai dengan 5. Oleh karena itu maka digunakan
mode Phase correct PWM untuk menghasilkan frekswensi PWM ke motor yang tidak terlalu
tinggi (separuh dari 40KHz = 20KHz), berikut cara perhitungannya:
FPWM = Fclk/(2*N*Top)
dimana: Fclk = 16MHZ, dari kristal yang terpasang pada modul
N = prescaler = 1
Top = isi dari ICR3
Maka untuk mendapatkan frekwensi PWM sebesar 30KHz, maka:
ICR3 = 16000000/(2*20000) = 400d = 190h
OCR3 disgunakan untuk membangkitkan interupsi dengan frekwensi 40KHz, maka OCR3C=
0xc8 = 200 // frekwensi interupsi = 16000000/400 = 40KHz  interupsi terjadi setiap di
tengah sisi naik dan sisi turun dari sinyal segitiga (TCNT3) yaitu saat isi OCR3C = TCNT3 -->
interupsi ini digunakan untuk membangkitkan sinyal PWM dari Servo 1-5 dengan frekwensi
interupsi sebesar 40KHz.

10. Selanjutnya aktifkan mode external interrupt untuk interface pada rotary encoder yang
terhubung ke Ext IRQ 6 dan 7

Mekatronika PENS - Praktikum Teknologi Aktuator 15


11. Masuk ke seting komunikasi dengan menggunakan USART1 (untuk mempersiapkan
keperluan komunikasi dengan alat luar pada praktikum selanjutnya)

12. Masuk ke seting ADC (optional, bisa di-skip Karena tidak dibutuhkan dalam percobaan ini)

Mekatronika PENS - Praktikum Teknologi Aktuator 16


13. Simpan Project melalui menu Program  Generate, Save and Exit

Simpan file ke lokasi yang Anda pilih di computer, misal dengan nama MotorDC.
Ada 3 jenis file yang akan dihasilkan, yaitu:
a. File C Compiler (*.c)
b. File Project (*.prj)
c. File CodewizzardAVR Project (*.cwp)
Ketiganya bisa diberi nama yang sama untuk memudahkan kita dalam mengingat file-file
tersebut.

B. Pengaturan Kecepatan secara open loop


1. Setelah Anda selesai melakukan proses configurasi melalui CodeWizzardAVR pada bagian A,
Selanjutnya akan muncul file yang Anda simpan tadi pada jendela editor dari CV AVR. Untuk
mempermudah manajemen program, bisa ditambahkan file header yang menyimpan alias

Mekatronika PENS - Praktikum Teknologi Aktuator 17


dari fungsi fungsi port dan beberapa penamaan yang lain dengan membuat file source baru
melalui menu File  New , pilih Source, dan OK

Di dalam file baru tersebut tambahkan deklarasi alias sebagai berikut:


#ifndef _myDEF_
#define _myDEF_

#define ON 1
#define OFF 0

// Definisi Port LCD


#define LCD_PORT PORTA
#define SetLCD_RS (PORTA.0 = 1)
#define ClrLCD_RS (PORTA.0 = 0)
#define LCD_RS (o) (o ? SetLCD_RS:ClrLCD_RS)

#define SetLCD_RW (PORTA.1 = 1)


#define ClrLCD_RW (PORTA.0 = 0)
#define LCD_RW (o) (o ? SetLCD_RW:ClrLCD_RW)

#define SetLCD_EN (PORTA.2 = 1)


#define ClrLCD_EN (PORTA.2 = 0)
#define LCD_EN (o) (o ? SetLCD_EN:ClrLCD_EN)

#define SetLCD_BL (PORTA.3 = 1)


#define ClrLCD_BL (PORTA.3 = 0)
#define LCD_BL (o) (o ? SetLCD_BL:ClrLCD_BL)

// Definisi Port Servo


#define SetP_Servo1 (PORTD.7 = 1)
#define ClrP_Servo1 (PORTD.7 = 0)
#define P_Servo1 (o) (o ? SetP_Servo1:ClrP_Servo1)

#define SetP_Servo2 (PORTD.6 = 1)


#define ClrP_Servo2 (PORTD.6 = 0)
#define P_Servo2 (o) (o ? SetP_Servo2:ClrP_Servo2)

#define SetP_Servo3 (PORTD.5 = 1)


#define ClrP_Servo3 (PORTD.5 = 0)
#define P_Servo3 (o) (o ? SetP_Servo3:ClrP_Servo3)

#define SetP_Servo4 (PORTD.4 = 1)


#define ClrP_Servo4 (PORTD.4 = 0)
#define P_Servo4 (o) (o ? SetP_Servo4:ClrP_Servo4)

#define SetP_Servo5 (PORTB.3 = 1)


#define ClrP_Servo5 (PORTB.3 = 0)
#define P_Servo5 (o) (o ? SetP_Servo5:ClrP_Servo5)

#define SetP_Servo6 (PORTB.5 = 1)


#define ClrP_Servo6 (PORTB.5 = 0)
#define P_Servo6 (o) (o ? SetP_Servo6:ClrP_Servo6)

#define SetP_Servo7 (PORTB.6 = 1)


#define ClrP_Servo7 (PORTB.6 = 0)
#define P_Servo7 (o) (o ? SetP_Servo7:ClrP_Servo7)

#define SetP_Servo8 (PORTB.7 = 1)


#define ClrP_Servo8 (PORTB.7 = 0)
#define P_Servo8 (o) (o ? SetP_Servo8:ClrP_Servo8)

#define dServo6 OCR1A


#define dServo7 OCR1B

Mekatronika PENS - Praktikum Teknologi Aktuator 18


#define dServo8 OCR1C

//#define BacadServo8 peekw(&OCR1CL)


//#define BacaPwmM1 peekw(&OCR3BL)
//#define BacaPwmM2 peekw(&OCR3AL)

// Definisi Port Push Button (aktif high)


#define Tombol1 ((PINC&8)==0 ? 1:0)
#define Tombol2 ((PINC&4)==0 ? 1:0)
#define Tombol3 ((PINC&2)==0 ? 1:0)
#define Tombol4 ((PINC&1)==0 ? 1:0)

// Definisi LED --> SetLEDx = menyalakan LEDx, ClrLEDx = mematikan LEDx


#define SetLED1 (PORTC.4 = 1)
#define ClrLED1 (PORTC.4 = 0)
#define SetLED2 (PORTC.5 = 1)
#define ClrLED2 (PORTC.5 = 0)
#define SetLED3 (PORTC.6 = 1)
#define ClrLED3 (PORTC.6 = 0)
#define SetLED4 (PORTC.7 = 1)
#define ClrLED4 (PORTC.7 = 0)

// menyalakan atau mematikan LED (o=1=On, o=0=Off)


#define LED1(o) (o ? SetLED1:ClrLED1)
#define LED2(o) (o ? SetLED2:ClrLED2)
#define LED3(o) (o ? SetLED3:ClrLED3)
#define LED4(o) (o ? SetLED4:ClrLED4)

// Definisi Port Motor kiri


#define PwmMKi(o) OCR3BH = ((unsigned char)(o>>8)); OCR3BL = (unsigned char)o;
#define SetDirMKi (PORTE.5 = 1)
#define ClrDirMKi (PORTE.5 = 0)
#define DirMKi(o) (o ? SetDirMKi:ClrDirMKi)

// Definisi Port Motor kanan


#define PwmMKa(o) OCR3AH = ((unsigned char)(o>>8)); OCR3AL = (unsigned char)o;
#define SetDirMKa (PORTE.2 = 1)
#define ClrDirMKa (PORTE.2 = 0)
#define DirMKa(o) (o ? SetDirMKa:ClrDirMKa)

// definisi arah putaran motor roda


#define MKi_CCW SetDirMKi
#define MKi_CW ClrDirMKi
#define MKa_CW SetDirMKa
#define MKa_CCW ClrDirMKa

// Definisi Port Enkoder Motor


#define Set_P_Enkoder1A (PORTE. 6 = 1) //PORTE.6 INT6
#define Clr_P_Enkoder1A (PORTE. 6 = 0)
#define _P_Enkoder1A(o) (o ? Set_P_Enkoder1A:Clr_P_Enkoder1A)
#define P_Enkoder1A ((PINE.6)==1 ? 1:0)

#define Set_P_Enkoder1B (PORTB.0 = 1) //PINB.0


#define Clr_P_Enkoder1B (PORTB.0 = 0)
#define _P_Enkoder1B(o) (o ? Set_P_Enkoder1B:Clr_P_Enkoder1B)
#define P_Enkoder1B ((PINB.0)==1 ? 1:0)

#define Set_P_Enkoder2A (PORTE.7 = 1) //PORTE.7 INT7


#define Clr_P_Enkoder2A (PORTE.7 = 0)
#define _P_Enkoder2A(o) (o ? Set_P_Enkoder2A:Clr_P_Enkoder2A)
#define P_Enkoder2A ((PINE.7)==1 ? 1:0)

#define Set_P_Enkoder2B (PORTB.2 = 1) //PINB.2


#define Clr_P_Enkoder2B (PORTB.2 = 0)
#define _P_Enkoder2B(o) (o ? Set_P_Enkoder2B:Clr_P_Enkoder2B)
#define P_Enkoder2B ((PINB.2)==1 ? 1:0)

// Definisi Port Mode (dipswitch)


#define MODE ((~PING) & 0B00001111)
#define MODE1 ((PING & 8) ==0 ? 1:0)
#define MODE2 ((PING & 4) ==0 ? 1:0)
#define MODE3 ((PING & 2) ==0 ? 1:0)
#define MODE4 ((PING & 1) ==0 ? 1:0)

// DipSwitchx adalah alias dari MODEx


#define DipSwitch MODE
#define DipSwitch1 MODE1

Mekatronika PENS - Praktikum Teknologi Aktuator 19


#define DipSwitch2 MODE2
#define DipSwitch3 MODE3
#define DipSwitch4 MODE4
#endif

2. Selanjutnya simpan file dengan dama Definisi.h melalui menu File  Save As
3. Untuk bisa mengakses LCD, diperlukan proses inisialisasi dan beberapa fungsi yang lain.
Untuk itu fungsi-fungsi yang digunakan untuk mengakses LCD text sebaiknya diletakkan pada
file yang terpisah juga. Seperti langkah sebelumnya bisa ditambahkan file header yang
menyimpan fungsi-fungsi LCD dengan membuat file source baru melalui menu File  New ,
pilih Source, dan OK

Di dalam file baru tersebut tambahkan deklarasi alias sebagai berikut:


#ifndef _myLCD_
#define _myLCD_

// Fungsi LCD
#include <delay.h>
#define DelayLCD 50 // nilai delay untuk penulisan atau penghapusan LCD

#pragma used+
// sub fungsi pengiriman command ke LCD
void LCD_Init_Cmd(unsigned char xData)
{ LCD_PORT = 0B00000100 | (xData & 0xF0);
delay_us(1); LCD_EN(0);
}

// sub fungsi penulisan 1 byte perintah ke LCD


void LCD_Perintah(unsigned char xData)
{ //LCD_RS=0; LCD_RW=0; LCD_EN=1;
LCD_RS(0);
LCD_PORT = 0B00001100 | (xData & 0xF0);
delay_us(1); LCD_EN(0);
delay_us(5);
LCD_PORT = 0B00001100 | (xData << 4);
delay_us(1); LCD_EN(0);
delay_us(700);
LCD_EN(1);
}

// sub fungsi penulisan 1 byte data ke LCD


void LCD_Data(unsigned char xData)
{ //LCD_RS=1; LCD_RW=0; LCD_EN=1;
LCD_RS(1);
LCD_PORT = 0B00001101 | (xData & 0xF0);
delay_us(1); LCD_EN(0);
delay_us(5);
LCD_PORT = 0B00001101 | (xData << 4);
delay_us(1); LCD_EN(0);
delay_us(40);
LCD_EN(1);
}

// sub fungsi inisialisasi LCD dengan data transfer 4 bit


void LCD_Init(void)
{ delay_ms(50); LCD_Init_Cmd(0x30);
delay_ms(5); LCD_Init_Cmd(0x30);

Mekatronika PENS - Praktikum Teknologi Aktuator 20


delay_ms(1); LCD_Init_Cmd(0x30);
delay_ms(1); LCD_Init_Cmd(0x20);
LCD_Perintah(0x28); //4-bit/2-line
LCD_Perintah(0x10); // Set cursor
LCD_Perintah(0x0c); // Display ON; Cursor off
LCD_Perintah(0x06); // Entry mode =increment, no shift
LCD_Perintah(0x01); // Hapus layar
}

// fungi untuk mengatur posisi kursor dari LCD


void LCD_GotoXY(unsigned char x, unsigned char y)
{ unsigned char baris;
if (y==0) LCD_Perintah(0x80 + x); // baris 1 --> y=0
else LCD_Perintah(0x80 + x + 0x40); // baris 2 --> y=1
}

// fungi untuk menulis text yang disimpan ke ROM


void LCD_TextF(unsigned char flash *text)
{ while (*text!=0)
{ LCD_Data(*text);text++;}
}

// fungi untuk menulis text yang disimpan di RAM


void LCD_Text(unsigned char *text)
{ while (*text!=0)
{ LCD_Data(*text);text++;}
}

// fungi untuk menulis text yang disimpan ke ROM ke LCD baris ke(0=baris 1, 1=Baris 2)
void LCD_TulisF(unsigned char Baris, unsigned char flash *text)
{ LCD_GotoXY(0,Baris);LCD_TextF(text);
}

// fungsi untuk menghapus layar LCD


void LCD_Hapus(void) // menghapus seluruh layar
{ LCD_Perintah(0x01);
delay_us(1);
}

// fungsi untuk menghapus LCD pada baris ke (0=baris 1, 1=Baris 2) secara langsung
void LCD_HapusBaris(unsigned char Baris) // menghapus baris tanpa delay
{ unsigned char i;
LCD_GotoXY(0,Baris);
for(i=0;i<16;i++) LCD_Data(' ');
}

// fungsi untuk menghapus LCD pada baris ke (0=baris 1, 1=Baris 2) dari kiri layar
void LCD_HapusKiri(unsigned char Baris)
{ unsigned char i;
LCD_GotoXY(0,Baris);
for(i=0;i<16;i++) { LCD_Data(' '); delay_ms(DelayLCD);}
}

// fungsi untuk menghapus LCD pada baris ke (0=baris 1, 1=Baris 2) dari kanan layar
void LCD_HapusKanan(unsigned char Baris)
{ int8_t i,j;
j = 0x80 + 0x40*Baris;
for(i=15;i>-1;i--)
{ LCD_Perintah (j+i); LCD_Data(' '); delay_ms(DelayLCD);}
}

// menuliskan string (16 karakter)dari arah kiri dgn delay pada (0=baris 1, 1=Baris 2)
void LCD_TulisKiri(unsigned char Baris, unsigned char flash *text)
{ unsigned char i;
LCD_GotoXY(0,Baris);
for(i=0;i<16;i++)
{ LCD_Data(*(text+i)); delay_ms(DelayLCD);}
}

// menuliskan string (16 karakter) dari arah kanan dgn delay


void LCD_TulisKanan(unsigned char Baris, unsigned char flash *text)
{ int8_t i,j;
j = 0x80 + 0x40*Baris;
for(i=15;i>-1;i--)
{ LCD_Perintah (j+i); LCD_Data(*(text+i)); delay_ms(DelayLCD);}
}

Mekatronika PENS - Praktikum Teknologi Aktuator 21


// menuliskan string (16 karakter) dari arah kanan dgn delay
void LCD_TulisTengah(unsigned char Baris, unsigned char flash *text)
{ int8_t i,j;
j = 0x80 + 0x40*Baris;
for(i=7;i>-1;i--)
{ LCD_Perintah (j+i); LCD_Data(*(text+i)); delay_ms(DelayLCD);
LCD_Perintah (j-i+15); LCD_Data(*(text-i+15)); delay_ms(DelayLCD);
}
}

// menuliskan string (16 karakter) dari arah kanan dgn delay


void LCD_TulisPinggir(unsigned char Baris, unsigned char flash *text)
{ int8_t i,j;
j = 0x80 + 0x40*Baris;
for(i=0;i<8;i++)
{ LCD_Perintah (j+i); LCD_Data(*(text+i)); delay_ms(DelayLCD);
LCD_Perintah (j-i+15); LCD_Data(*(text-i+15)); delay_ms(DelayLCD);
}
}

// menuliskan nilai desimal dengan panjang 4 angka (-9999 sd 9999)


void LCD_Angka4(unsigned short x)
{ if(x<0){ x*=-1; LCD_Data('-');}
LCD_Data(x/1000+0x30); // menulis ribuan
LCD_Data((x%1000)/100+0x30); // menulis ratusan
LCD_Data((x%100)/10+0x30); // menulis puluhan
LCD_Data(x%10+0x30); // menulis satuan
}

// menuliskan nilai desimal dengan panjang 4 angka (-999 sd 999)


void LCD_Angka3(unsigned short x)
{ if(x<0){ x*=-1; LCD_Data('-');}
LCD_Data(x/100+0x30); // menulis ratusan
LCD_Data((x%100)/10+0x30); // menulis puluhan
LCD_Data(x%10+0x30); // menulis satuan
}//

// menuliskan nilai desimal dengan jangkauan (-128 sd 127)


void LCD_sByte(signed char x)
{ if(x<0){ x*=-1; LCD_Data('-');}
LCD_Data(x/100+0x30); // menulis ratusan
LCD_Data((x%100)/10+0x30); // menulis puluhan
LCD_Data(x%10+0x30); // menulis satuan
}

// menuliskan nilai desimal positif dengan jangkauan (0 sd 255)


void LCD_uByte(unsigned char x)
{ LCD_Data(x/100+0x30); // menulis ratusan
LCD_Data((x%100)/10+0x30); // menulis puluhan
LCD_Data(x%10+0x30); // menulis satuan
}

// menuliskan nilai biner dari sebuah byte data (data 8 bit)


void LCD_Biner(unsigned char x)
{ unsigned char i;
for(i=0;i<8;i++)
{ if( (x&(1<<(7-i)))==0 )
{LCD_Data('0');}
else
{LCD_Data('1');}
}
}
#pragma used-
#endif

4. Selanjutnya simpan file tersebut dengan dama LCD.h melalui menu File  Save As
5. Masukkan include #include "Definisi.h" dan #include "LCD.h" dibawah #include
<mega128.h>
6. Deklarasikan Variabel global dibawah file include di atas
#define SetGlobalInterrupt #asm("sei")
#define ClrGlobalInterrupt #asm("cli")

Mekatronika PENS - Praktikum Teknologi Aktuator 22


int EnkoderKi, EnkoderKa; // untuk menyimpan data posisi enkoder
unsigned int dCounterKi, dCounterKa; // data counter untuk kecepatan

7. Tambahkan program berikut pada fungsi interupsi eksternal (dibawah deklarasi variable
global pada bagian yang sudah tersedia). Program ini adalah untuk membaca data rotary
encoder, baik data posisi maupun variable counter yang selanjutnya akan disampling untuk
mendapatkan data kecepatan, yaitu:

// External Interrupt 6 service routine


interrupt [EXT_INT6] void ext_int6_isr(void)
{
// Place your code here
if(P_Enkoder1A)
{ if(P_Enkoder1B) {ClrGlobalInterrupt; EnkoderKi--;}
else {ClrGlobalInterrupt; EnkoderKi++;}
}
else
{ if(P_Enkoder1B) {ClrGlobalInterrupt; EnkoderKi++;}
else {ClrGlobalInterrupt; EnkoderKi--;}
}
SetGlobalInterrupt;
dCounterKi++;
}

// External Interrupt 7 service routine


interrupt [EXT_INT7] void ext_int7_isr(void)
{
// Place your code here
if(P_Enkoder2A)
{ if(P_Enkoder2B) {ClrGlobalInterrupt; EnkoderKa++;}
else {ClrGlobalInterrupt; EnkoderKa--;}
}
else
{ if(P_Enkoder2B) {ClrGlobalInterrupt; EnkoderKa--;}
else {ClrGlobalInterrupt; EnkoderKa++;}
}
SetGlobalInterrupt;
dCounterKa++;
}

8. Kecepatan aktual dari motor didapatkan dengan cara melakukan sampling pada data sensor
rotary encoder dan dicari selisihnya dengan data sebelumnya. Semakin cepat putaran
motor, maka semakin besar pula jumlah pulsa dari encoder yang didapatkan setiap waktu
sampling.
9. Tambahkan program pada interupsi timer2 compare match (interupsi setiap 1 ms sekali).
Timer ini digunakan untuk melakukan proses perhitungan kecepatan motor dari rotary
encoder dan juga pemanggil fungsi kendali kecepatan motor dengan PID. Masing-masing
proses sebenarnya dilakukan secara bergiliran setiap 10ms sekali. Hal ini dilakukan supaya
program tidak terjebak terlalu lama pada program interupsi, sehingga dilakukan proses
pencacahan pada hitungan tertentu untuk setiap eksekusi prosesnya. Berikut kodenya:
// Timer2 output compare interrupt service routine
interrupt [TIM2_COMP] void timer2_comp_isr(void) // interupsi setiap 1 ms
{
// Place your code here
static unsigned char _dCounterKi=0, _dCounterKa=0, Timer2Tick=10;
SetGlobalInterrupt;
if(--Timer2Tick==0) Timer2Tick=10; // timer 1 ms dicacah 10 x
switch(Timer2Tick)

Mekatronika PENS - Praktikum Teknologi Aktuator 23


{ case 9: //dilakukan perhitungan kecepatan motor kiri saat nilai cacahan=9
// hitung selisih saat tidak overflow
if(dCounterKi>_dCounterKi) dSpeedKi = dCounterKi - _dCounterKi;
// hitung selisih saat overflow
else dSpeedKi = 0xFF - _dCounterKi + dCounterKi + 1;
// update data _dCounterKi
_dCounterKi = dCounterKi;
break;
case 8: //dilakukan perhitungan PID motor kiri saat nilai cacahan=8
HitungPIDmotorKi(); // menghitung PID motor 1
break;
case 4: //dilakukan perhitungan kecepatan motor kanan saat nilai cacahan=9
// hitung selisih saat tidak overflow
if(dCounterKa>_dCounterKa) dSpeedKa = dCounterKa - _dCounterKa;
// hitung selisih saat overflow
else dSpeedKa = 0xFF - _dCounterKa + dCounterKa + 1;
// update data _dCounterKa
_dCounterKa = dCounterKa;
break;
case 3: // dilakukan perhitungan PID motor kanan saat nilai cacahan=3
HitungPIDmotorKa(); // menghitung PID motor 2 jika mode PID motor
diaktifkan
break;
}
}

10. Tambahkan prototype fungsi perhitungan PID kecepatan motor kanan dan kiri yang nantinya
akan dipanggil oleh fungsi interupsi timer 2 compare match. Prototipe fungsi ini nantinya
akan kita isi dengan fungsi kendali PID untuk pengaturan kecepatan motor DC yang ada.

void HitungPIDmotorKa() // menghitung PID motor kanan (dihitung setiap 10ms sekali)
{
}

void HitungPIDmotorKi() // menghitung PID motor kiri (dihitung setiap 10ms sekali)
{
}

11. Lakukan editing program di dalam fungsi main, pada program sekitar looping while (1)
dengan kode:
// Tulis keterangan (label) pada LCD
PwmMKa(100); // 25% pengaturtan kecepatan dengan model open loop
PwmMKi(100); // 25% pengaturtan kecepatan dengan model open loop
LCD_TulisF(0,"Kecepatan.Ka:");
LCD_TulisF(1,"Kecepatan.Ki:");

while (1)
{
// Place your code here
// menampilkan data kecepatan aktual motor Kanan (pulsa/10ms)
LCD_GotoXY(13,0); LCD_Angka3(dSpeedKa); LCD_Data(' ');
// menampilkan data kecepatan aktual motor Kiri (pulsa/10ms)
LCD_GotoXY(13,1); LCD_Angka3(dSpeedKi); LCD_Data(' ');
}

12. Selanjutnya Build Project dengan menekan Ctrl+F9, atau melalui menu Project  Build

Mekatronika PENS - Praktikum Teknologi Aktuator 24


Apabila tidak ada error, maka hex file dari project akan dihasilkan dari proses ini.
13. Unggah file hasil build (*.hex) dengan menggunakan ISP Programmer (Khazama AVR
Programmer)
Pilih AVR: ATmega128
Load Flash to buffer, melalui menu File
14. Masuk ke folder yang tertera pada keterangan lokasi file (bagian atas jendela) yang ada pada
Code visionAVR, lalu masuk ke folder EXE. Lalu pilih file hex yang baru saja Anda buat,
selanjutnya tekan Open.
15. Koneksikan USB programmer dari port USB di PC ke modul board ADROIT-AVR yang
digunakan.
16. Selanjutnya Kembali ke jendela program Khazama AVR Programmer, lalu tekan Auto
Program. Skip warning apabila muncul dengan menekan tombok OK. Apabila koneksi benar,
seharusnya program akan terkirim ke Board AVR.
17. Apabila program sudah benar, seharusnya motor berputar dengan kecepatan yang sama
(25% kecepatan penuh), dan LCD akan menampilkan data kecepatan dari motor kiri dan
kanan dengan nilai yang hamper sama.
18. Apabila kecepatan motor secara pengamatan sama, tetapi nilai kecepatan yang muncul pada
LCD tidak sama, kemungkinan besar terdapat masalah pada piringan (disk) dari rotary
encoder yang terdapat pada belakang motor. Posisi yang ideal antara disk dan sensor
berkisar antara 0.5 s/d 0.8 mm.

Mekatronika PENS - Praktikum Teknologi Aktuator 25


19. Sampai saat ini program PID kecepatan motor belum diimplementasikan, sehingga apabila
diberi beban, maka kecepatan motor akan turun. Implementasi kendali kecepatan bisa
dilakukan apabila data pembacaan kecepatan actual motor sudah bisa didapatkan dengan
baik, karena kendali kecepatan akan menggunakan data ini sebagai feedback perhitungan
kendalinya.

C. Pengaturan kecepatan dengan PID


1. Kendali PID dilakukan dengan tujuan untuk mendapatkan kecepatan motor yang lebih stabil,
sesuai dengan set point yang diberikan. Stabil dalam hal ini salah satu tujuannya adalah
kecepatannya dapat dipertahankan mendekati kecepatan yang diinginkan, meskipun motor
mengalami fluktuasi pada beban atau fluktuasi pada tegangan sumber. (dalam taraf yang
masih terkendali). Kendali PID yang diimplementasikan pada percobaan ini dihitung setiap
10 ms sekali, dan perhitungan antara motor kiri dan kanan dilakukan secara bergantian
setiap 5 ms sekali. Kendali Proporsional dihitung dengan memanfaatkan error (selisih antara
nilai setpoint kecepatan dengan nilai kecepatan aktual). Nilai error ini dikalikan dengan
konstanta (KP gain), yang nantinya akan memberikan kontribusi kontrol yang proporsional
terhadap nilai error yang didapatkan. Sedangkan kendali Integral dilakukan dengan
menghitung terlebih dahulu nilai total error terhadap waktu (integral error). Nilai ini
selanjutnya dikalikan dengan sebuah konstanta integral (KI gain). Khusus untuk kendali
Integral, perlu ditambahkan sebuah mekanisme pembatas, sehingga nilai integral error tidak
terlalu besar atau terlalu kecil, sehingga membuat sistem mudah mengalami saturasi
(biasanya pembatas dipasang pada nilai aktuasi maksimal/minimal yang bisa diberikan ke
sistem). Kendali Integral ini selanjutnya dijumlahkan dengan kendali Proporsional. Yang
terakhir adalah menghitung kendali Differential yang merupakan perkalian antara nilai
perubahan error terhadap waktu, dengan kontanta Differential (KD gain). Kendali Differential
ini setelah dijumlahkan dengan nilai kendali sebelumnya akan membentuk nilai aktuasi
kendali PID yang siap diberikan kepada sistem. Dalam hal ini nilai keluaran dari PID akan
diubah menjadi nilai PWM yang digunakan untuk memberikan pengaturan kecepatan pada
motor.
2. Untuk menambahkan program kendali PID kecepatan motor, lakukan edit pada prototype
fungsi kendali PID pada percobaan B, menjadi:
#define MaxPWM (signed short) 400
// konstanta gain PID motor kanan (edit disini untuk mengubah respon kontroler)
#define KPmKa (signed short) 8
#define KImKa (signed short) 10
#define KDmKa (signed short) 1
// konstanta gain PID motor kiri (edit disini untuk mengubah respon kontroler)
#define KPmKi (signed short) 8

Mekatronika PENS - Praktikum Teknologi Aktuator 26


#define KImKi (signed short) 10
#define KDmKi (signed short) 1

void HitungPIDmotorKa() // menghitung PID motor kanan (dihitung setiap 10ms sekali)
{
signed char ErrorMKa, dErrorMKa;
signed short U;
static signed char iErrorMKa=0, lastErrorMKa=0;
// Menghitung PID Motor kanan
if(SpeedKa>0)
{ ErrorMKa = (signed char)SpeedKa-(signed char)dSpeedKa; // nilai error
iErrorMKa+=ErrorMKa; // integral error
if(iErrorMKa>40) iErrorMKa = 40; // pembatas nilai inegral error
else if(iErrorMKa<-40)iErrorMKa = -40; // +- 10% nilai aktuasi
dErrorMKa = lastErrorMKa - ErrorMKa; // nilai perubahan error
lastErrorMKa = ErrorMKa; // update nilai last Error
U = ErrorMKa * KPmKa; // Hitung kendali proporsional
U+= iErrorMKa * KImKa; // menambahkan kendali Integral
U+= dErrorMKa * KDmKa; // menambahkan kendali Differential
if (U>MaxPWM) // membatasi nilai aktuasi (maksimal PWM)
{ PwmMKa(MaxPWM);}
else if (U>0)
{ PwmMKa(U); }
else // nilai minimal PWM=0 (motor tidak dibalik arahnya)
{ PwmMKa(0); }
}
else {PwmMKa(0); iErrorMKa=0; lastErrorMKa=0;}
}

void HitungPIDmotorKi() // menghitung PID motor kiri (dihitung setiap 10ms sekali)
{
signed char ErrorMKi, dErrorMKi;
signed short U;
static signed char iErrorMKi=0, lastErrorMKi=0;
// Menghitung PID Motor kiri
if(SpeedKa>0)
{ ErrorMKi = (signed char)SpeedKi-(signed char)dSpeedKi; // nilai error
iErrorMKi+=ErrorMKi; // integral error
if(iErrorMKi>40) iErrorMKi = 40; // pembatas nilai inegral error
else if(iErrorMKi<-40)iErrorMKi = -40; // +- 10% nilai aktuasi
dErrorMKi = lastErrorMKi - ErrorMKi; // nilai perubahan error
lastErrorMKi = ErrorMKi; // update nilai last Error
U = ErrorMKi * KPmKi; // Hitung kendali proporsional
U+= iErrorMKi * KImKi; // menambahkan kendali Integral
U+= dErrorMKi * KDmKi; // menambahkan kendali Differential
if (U>MaxPWM) // membatasi nilai aktuasi (maksimal PWM)
{ PwmMKi(MaxPWM);}
else if (U>0)
{ PwmMKi(U); }
else // nilai minimal PWM=0 (motor tidak dibalik arahnya)
{ PwmMKi(0); }
}
else {PwmMKi(0); iErrorMKi=0; lastErrorMKi=0;}
}

3. Lakukan editing program di dalam fungsi main, pada program sekitar looping while (1)
dengan kode:
SpeedKa = 0; // nilai awal kecepatan motor kanan = 0
SpeedKi = 0; // nilai awal kecepatan motor kiri = 0

// inisialisasi LCD
LCD_Init();

// menuliskan data kecepatan motor kiri dan kanan


// data kecepatan motor maksimal dengan PID = 20 (saat tegangan supply 8V)
// nilai akan berkurang saat tegangan supply lebih rendah
SpeedKa = 10; // nilai setpoint kecepatan motor kanan = 0
SpeedKi = 10; // nilai setpoint kecepatan motor kiri = 0
// Tulis keterangan (label) pada LCD
LCD_TulisF(0,"Kecepatan.Ka:");
LCD_TulisF(1,"Kecepatan.Ki:");

while (1)

Mekatronika PENS - Praktikum Teknologi Aktuator 27


{
// Place your code here
// menampilkan data kecepatan aktual motor Kanan (pulsa/10ms)
LCD_GotoXY(13,0); LCD_sByte(dSpeedKa); LCD_Data(' ');
// menampilkan data kecepatan aktual motor Kiri (pulsa/10ms)
LCD_GotoXY(13,1); LCD_ sByte(dSpeedKi); LCD_Data(' ');
}

4. Ulangi seperti langkah 12 sampai dengan 16 dari percobaan B untuk mengupdate isi
program pada mikrokontroler.
5. Apabila program berjalan dengan baik, seharusnya motor berputar dengan kecepatan yang
sama, dan data kecepatan motor yang ditampilkan pada LCD mendekati/sama dengan nilai
setpointnya.
6. Kecepatan motor dapat diatur dengan mengubah setpoint kecepatan motor (variabel
SpeedKa dan variabel SpeedKi).
7. Konstanta gain dari masing-masing kontroler dapat diatur sesuai kebutuhan. Berikut perilaku
secara umum dari pengaruh PID gain terhadap respon system, yaitu:
 KP gain ketika dinaikkan akan mempercepat respon motor terhadap nilai setpoint
yang diberikan atau perubahan terhadap perubahan beban. Akan tetapi apabila
nilainya dinaikkan, maka kemungkinan terjadi overshoot juga akan naik.
 KI gain ketika diperbesar akan cepat mengurangi steady state error, dan bisa
mempercepat tercapainya setpoint selama perubahan setpoint mengarah ke arah
yang sama (berlanjut membesar atau mengecil dari nilai sebelumnya). Sehingga KI
gain yang besar cocok untuk aplikasi pengaturan kecepatan motor yang setpoint-nya
cenderung statis. Akan tetapi naiknya KI gain ini akan menaikkan kemungkinan
terjadinya osilasi dari respon kecepatan (biasanya frekwensi osilasi relatif rendah
jika osilasi tersebut disebabkan oleh nilai KI gain yang terlalu besar). Selain itu
naiknya nilai KI gain akan menyebabkan respon kendali kecepatan justru akan
melambat apabila nilai setpoint yang diberikann bersifat fluktuatif.
 KD gain ketika dinaikkan akan mempercepat repon sistem terhadap perubahan
setpoint. Sehingga KD gain yang besar diperlukan pada pengaturan kecepatan motor
yang kecepatannya cenderung dinamis. Akan tetapi apabila nilainya terlalu besar
akan membuat kecepatan mortor mudah berosilasi. Biasanya frekwensi osilasi yang
dihasilkan relatif tinggi jika osilasi tersebut disebabkan oleh nilai KD gain yang terlalu
besar.

D. Tugas

Mekatronika PENS - Praktikum Teknologi Aktuator 28


1. Bandingkan respon kecepatan motor saat dikendalikan dengan secara open loop
(pengaturan PWM secara langsung) dengan ketika kendali PID diimplementasikan, saat
diberi perubahan kecepatan secara periodik setiap 500ms sekali dengan kecepatan:
a. 0% dan 100%
b. 20% dan 80%
2. Dengan memberikan perubahan kecepatan secara periodik setiap 500ms sekali dengan
kecepatan 0 ke 100%, amati apa yang terjadi ketika
a. KP dinaikkan, missal 10x dari nilai pada percobaan?
b. KP diturunkan, missal 10x dari nilai pada percobaan?

Mekatronika PENS - Praktikum Teknologi Aktuator 29


Fitur Tambahan
Untuk mengakses buzzer pada modul bisa ditambahkan file myByzzer.h yang berisi:

/*********************************************************
Project : ADROIT AVR Rev.3
Version : 1
Date : 3/13/2014
Author : Eko Henfri Binugroho
Company : ER2C
Code : Buzzer access and tone generator
*********************************************************/

#ifndef _myBuzzer_
#define _myBuzzer_

#include <mega128.h>
#include <delay.h>

// Definisi Nada Buzzer


#define C4 261
#define CS4 277
#define D4 293
#define DS4 311
#define E4 329
#define F4 349
#define FS4 370
#define G4 392
#define GS4 415
#define A4 440
#define AS4 466
#define B4 494

#define C5 523
#define CS5 554
#define D5 587
#define DS5 622
#define E5 659
#define F5 698
#define FS5 740
#define G5 783
#define GS5 830
#define A5 880
#define AS5 932
#define B5 987

#define C6 1046

Mekatronika PENS - Praktikum Teknologi Aktuator 30


#define CS6 1109
#define D6 1174
#define DS6 1244
#define E6 1318
#define F6 1370
#define FS6 1480
#define G6 1568
#define GS6 1661
#define A6 1760
#define AS6 1864
#define B6 1975

#define C7 2093
#define CS7 2217
#define D7 2349
#define DS7 2489
#define E7 2639
#define F7 2793
#define FS7 2960
#define G7 3136
#define GS7 3322
#define A7 3520
#define AS7 3729
#define B7 3951

// ----------------- Fungsi Buzzer ----------------------------


#pragma used+
void BuzzerOff(); // mematikan buzzer
void FBuzzer(uunsigned short x); // membunyikan buzzer dengan frekwensi tertentu (dalam
Hz)
void Buzzer(uunsigned short Frek, uunsigned short Tempo); // menyalakan buzzer dengan frek
dan waktu
void Nada1(void); // contoh preset nada 1
void Nada2(void); // contoh preset nada 2
void Nada3(void); // contoh preset nada 3
void Nada4(void); // contoh preset nada 4

void BuzzerOff()
{ TCCR0=0x00; PORTB.4=0; ASSR=0x00; }

void FBuzzer(unsigned uunsigned short x)


{
if(x>=125 && x<=10000)
{ if (x>=2000)
{ TCCR0=0x1A; TCNT0=0;
OCR0 = 500000 / x;
}

Mekatronika PENS - Praktikum Teknologi Aktuator 31


if (x>=1000)
{ TCCR0=0x1B; TCNT0=0;
OCR0 = 250000 / x;
}
else if (x>=500)
{ TCCR0=0x1C; TCNT0=0;
OCR0 = 125000 / x;
}
else if (x>=250)
{ TCCR0=0x1D; TCNT0=0;
OCR0 = 67500 / x;
}
else
{ TCCR0=0x1E; TCNT0=0;
OCR0 = 33750 / x;
}
}
else
{ BuzzerOff();
}
}

void Buzzer(uunsigned short Frek, uunsigned short Tempo)


{ FBuzzer(Frek); delay_ms(Tempo);BuzzerOff();}

void Nada1(void)
{ Buzzer(1000,100);Buzzer(500,20);
Buzzer(3000,50);Buzzer(500,20);
Buzzer(3000,100);Buzzer(500,20);
Buzzer(2000,50);
}

void Nada2(void)
{ Buzzer(3000,100);Buzzer(500,20);
Buzzer(2500,150);Buzzer(500,20);
Buzzer(1000,50);Buzzer(500,20);
Buzzer(3000,50);
}

void Nada3(void)
{ Buzzer(3000,50);Buzzer(500,20);
Buzzer(1000,150);Buzzer(500,20);
Buzzer(3000,100);Buzzer(500,20);
Buzzer(2000,50);
}

Mekatronika PENS - Praktikum Teknologi Aktuator 32


void Nada4(void)
{ Buzzer(2000,150);Buzzer(500,20);
Buzzer(3000,50);Buzzer(500,20);
Buzzer(3500,50);Buzzer(500,20);
Buzzer(3000,100);
}
#pragma used-

#endif

Mekatronika PENS - Praktikum Teknologi Aktuator 33


Untuk mengaktifkan lagu sebagai background suara, maka perlu ditambahkan program berikut pada
interupsi timer 1 saat input capture, yaitu
// Timer1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
// Place your code here
static unsigned char ServoCounter=0, LaguTick=0, TempoTick=0;

if(++TempoTick>=Tempo[LaguTick]) // Apakah hitungan tempo terpenuhi


{ TempoTick = 0; // reset hitungan tempo
FBuzzer(Melodi[LaguTick]); // mengeluarkan nada ke buzzer
if (++LaguTick>=JumlahNada) LaguTick=0; // reset kembali deretan nada ketika lagu selesai
}

Untuk bisa mengakses lagu, maka kedua data melodi dan tempo dari lagu perlu dideklarasikan pada
program main, yaitu:

//Super Mario --> 78 Nada


unsigned short flash Melodi[] = {
E7, E7, 0, E7, 0, C7, E7, 0, G7, 0, 0, 0, G6, 0, 0, 0,
C7, 0, 0, G6, 0, 0, E6, 0, 0, A6, 0, B6, 0,AS6, A6, 0,
G6, E7, G7, A7, 0, F7, G7, 0, E7, 0, C7, D7, B6, 0, 0,
C7, 0, 0, G6, 0, 0, E6, 0, 0, A6, 0, B6, 0,AS6, A6, 0,
G6, E7, G7, A7, 0, F7, G7, 0, E7, 0, C7, D7, B6, 0, 0};

unsigned char flash Tempo[] = {


30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,
30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,
35,35,35,24,30,30,30,30,30,30,30,30,30,30,30,
30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,
35,35,35,24,30,30,30,30,30,30,30,30,30,30,30};
#define JumlahNada 78

Mekatronika PENS - Praktikum Teknologi Aktuator 34

Anda mungkin juga menyukai