Professional Documents
Culture Documents
Modul 4 Praktikum Berbasis Mikroprosesor
Modul 4 Praktikum Berbasis Mikroprosesor
Disusun oleh :
Muhammad Fauzan Ridho, S.T., M.T.
A. Dasar Teori
a. Sinyal Pulse Width Modulation (PWM)
PWM atau Pulse width modulation adalah sebuah cara atau metode yang digunakan
dengan tujuan untuk memanipulasi lebar sinyal dengan nilai amplitudo dan frekuensi yang
tetap untuk mendapatkan tegangan keluaran yang bervariasi. PWM memiliki cara kerja yang
berbanding terbalik dengan ADC (Analog Digital Converter). Jika ADC berfungsi untuk
mengkonversikan sinyal analog ke digital, PWM ini melakukan fungsi sebaliknya. Yaitu untuk
menghasilkan sinyal analog dari perangkat digital.
sinyal PWM melakukan pengaturan lebar pulsa dalam suatu frekuensi yang konstan untuk
mendapatkan tegangan keluaran yang bervariasi berdasarkan lebar pulsa HIGH sinyal. Semakin
besar lebar pulsa atau Pulse Width-nya maka tegangan yang dihasilkan semakin mendekati
tegangan maksimum, dan juga sebaliknya. Tegangan seakan-akan bervariasi berdasarkan Pulse
Width-nya.
Gambar 2. Pengaruh persen siklus kerja (duty cycle) pada lebar pulsa sinyal PWM
Nilai dari duty cycle pada sinyal PWM yang dihasilkan oleh perangkat digital, akan
dipengaruhi oleh nilai resolusi PWM yang digunakan suatu perangkat digital seperti
mikrokontroler (8-bit, 10-bit, 12-bit, dll).
Selain siklus kerja terdapat Frekuensi sinyal PWM yang menentukan seberapa cepat PWM
menyelesaikan satu periode. Satu Periode adalah waktu ON dan OFF penuh dari sinyal PWM
seperti yang ditunjukkan pada gambar di atas. Berikut ini adalah persamaan untuk menghitung
Frekuensi :
1
𝐹𝑟𝑒𝑞𝑢𝑒𝑛𝑐𝑦 =
𝑇𝑖𝑚𝑒 𝑃𝑒𝑟𝑖𝑜𝑑
Biasanya sinyal PWM yang dihasilkan oleh mikrokontroler adalah sekitar 500 Hz.
Frekuensi PWM yang tinggi seperti 30 KHz hingga 60 Khz, digunakan dalam perangkat switching
yang berkecepatan tinggi seperti inverter atau konverter. Namun tidak semua aplikasi
membutuhkan frekuensi tinggi. Sebagai contoh, untuk mengendalikan motor servo kita hanya
perlu menghasilkan sinyal PWM dengan frekuensi 50Hz, frekuensi sinyal PWM ini juga dapat
dikendalikan oleh program untuk semua mikrokontroler.
Tegangan output sinyal PWM yang telah diubah menjadi analog akan menjadi persentase
dari siklus kerja (Duty Cycle). Misalnya jika tegangan operasi 5V maka sinyal PWM juga akan
memiliki 5V ketika tinggi. Apabila Duty Cycle atau siklus kerja adalah 100%, maka tegangan output
akan menjadi 5V. Sedangkan untuk siklus kerja 50% akan menjadi 2.5V. Demikian juga apabila
siklus kerja 60% maka Tegangan Output analognya akan menjadi 3V. Formula perhitungan
tegangan output sinyal PWM ini dapat dilihat seperti persamaan dibawah ini :
void setup() {
pinMode(5, OUTPUT);
}
void loop() {
analogWrite(5, 127);
}
c. PWM dengan menggunakan Timers (mikrokontroler AVR)
Menggunakan function analogWrite() memungkinkan pengguna dengan mudah
membangkitkan sinyal PWM dari mikrokontroler berbasis Arduino, namun terbatas hanya pada
resolusi 8-bit dengan frekuensi 490 Hz. Untuk beberapa aplikasi yang menggunakan frekuensi
tinggi seperti switching power supply, atau signal generator, frekuensi tersebut tidak cukup.
Beberapa board Arduino yang berbasis pada mikrokontroler keluarga AVR / Atmega,
sinyal PWM dapat diatur dengan memodifikasi regsister dan timers pada mikrokontroler
tersebut.Hal ini memungkinkan pengguna membuat sinyal PWM yang dapat diatur frekuensinya
dan resolusi nya. Kita sudah mempelajari dari percobaan sebelumnya bahwa Atmega328P
memilki 3 Timer, yaitu timer 0, timer 1, dan timer 2. Menggunakan timer 0, timer 1, dan timer 2
untuk membangkitkan sinyal PWM pada board Arduino, harus menggunakan pin output yang
tepat. Sebagagi contoh pada board Arduino yang menggunakan Atmega328P (Arduino Uno, Nano,
Pro Mini), PWM yang menggunakan timer 0, akan mengeluarkan output pada pin 6 dan pin 5
(OC0A dan OC0B), PWM yang menggunakan timer 1, akan mengeluarkan output pada pin 9 dan
pin 10 (OC1A dan OC1B), PWM yang menggunakan timer 2, akan mengeluarkan output pada
pin 11 dan pin 4 (OC2A dan OC2B).
Gambar 4. Mappin pin output compare timer PWM dan digital pin board Arduino uno
Catatan : Sinyal PWM menggunakan timer pada dasar teori dan percobaan ini, akan
menggunakan timer 1 dikarenakan resolusi 16-bit serta agar tidak mengganggu function
arduino yang membutuhkan timers 0 dan timers 2, namun contoh ini dapat digunakan juga pada
timer 0 dan timer 2.
(a) Mode Fast PWM
Pada mode fast PWM non-inverting, counter akan menghitung dari BOTTOM
(0x00) sampai MAX / TOP (0xFF / 255 pada resolusi 8-bit) dan mengulang kembali dari
BOTTOM. Register OCR1A/OCR1B akan di clear apabila counter mencapai nilai compare
match antara TCNT1 dan OCR1A/OCR1B dan akan di set saat BOTTOM.
Dari sinilah kita dapat mengatur lebar pulsa atau duty cyclenya. Frekuensi dari pulsa
terpengaruh sesuai frekuensi oscillator (CPU), dan prescaler yang dipakai. Sedangkan
duty cycle dapat diatur dengan mengubah nilai OCR1A / OCR1B dengan range dari 0x00 –
0xFF (resolusi 8-bit).
Gambar 5. Hitungan Register TCNTn dan OCn pada mode Fast PWM (non-inverting dan
inverting
void loop() {
OCR1A = 2500;
OCR1B = 2500;
}
Sementara untuk resolusi PWM pada mode fast PWM, dapat diatur pada nilai tetap
8-bit, 9-bit, atau 10-bit (mode operasi 5, 6, 7) atau dapat di definisikan dengan
menetapkan nilai pada register ICR1 atau OCR1A (mode operasi 14 dan 15). Dengan
menetapkan nilai TOP pada register ICR1 atau OCR1A maka resolusi PWM pada mode Fast
PWM dapat dihitung dengan persamaan berikut :
log(𝑇𝑂𝑃 + 1)
𝑅𝐹𝑃𝑊𝑀 =
log(2)
Sebagai contoh mode fast PWM dengan nilai TOP = 4999, memiliki resolusi PWM :
log(4999 + 1)
𝑅𝐹𝑃𝑊𝑀 = = 12.26 ≈ 12 𝑏𝑖𝑡
log(2)
(b) Mode phase correct PWM
Pada mode Phase correct Non - Inverting, counter menghitung dari BOTTOM (0x00)
ke MAX /TOP (0xFF / 255 / 8-bit), lalu dari MAX / TOP ke BOTTOM. OC1 akan di clear
apabila counter mencapai compare match dengan OCR1 saat up counting dari BOTTOM
ke MAX dan OC1 akan di set apabila counter mencapai compare match dengan OCR1 saat
down counting dari MAX /TOP ke BOTTOM.
Gambar 9. Hitungan Register TCNTn dan OCn pada mode Phase correct PWM (non-
inverting dan inverting
Untuk mengkatifkan mode operasi Phase correct PWM pada timer 1, mode operasi
yang dijalankan adalah mode 1, mode 2, mode 3, mode 10 dan mode 11, dengan
mengubah register TCCR1A dan TCR1B sesuai tabel mode operasi. Sementara untuk
mengatur sinyal PWM menjadi mode non-inverting atau inverting dilakukan dengan
mengatur bit COM1A1, COM1B1, COM1A0, COM1B0 sesuai tabel mode sinyal phase
correct PWM.
Gambar 10. Pemilihan mode non-inverting dan inverting phase correct PWM
void loop() {
OCR1A = 1250; // 50% duty cycle
OCR1B = 1250;
}
void loop() {
// baca nilai analog potensiometer
int duty_cycle = analogRead(A0);
int duty_cycle2 = analogRead(A1);
//set range potensiometer 0-1023 menjadi duty cycle 250-500
duty_cycle = map(duty_cycle, 0, 1023, 125, 250);
duty_cycle2 = map(duty_cycle2, 0, 1023, 125, 250);
//gunakan nilai potensiometer untuk mengatur duty cycle
OCR1A = duty_cycle;
OCR1B = duty_cycle2;
Serial.print("PWM1 : " + String(OCR1A));
Serial.println(" PWM2 : " + String(OCR1B));
}
Fast PWM :
void setup() {
// Set pin 9 dan 10 sebagai output
DDRB |= (1<<DDB1)|(1<<DDB2);
TCNT1 = 0;
TCCR1A = 0;
TCCR1B = 0;
// Non-inverting PWM
TCCR1A |= (1<<COM1A1)|(1<<COM1B1)|(1<<WGM11);
// set mode 14 (fast PWM TOP = ICR1)
TCCR1B |= (1<<WGM13)|(1<<WGM12)|(1<<CS11)|(1<<CS10);
ICR1 = 4999; // f = 50 Hz (20 ms pulse)
Serial.begin(9600);
}
void loop() {
// baca nilai analog potensiometer
int duty_cycle = analogRead(A0);
int duty_cycle2 = analogRead(A1);
//set range potensiometer 0-1023 menjadi duty cycle 250-500
duty_cycle = map(duty_cycle, 0, 1023, 250, 500);
duty_cycle2 = map(duty_cycle2, 0, 1023, 250, 500);
//gunakan nilai konversi potensiometer untuk mengatur duty cyle
OCR1A = duty_cycle;
OCR1B = duty_cycle2;
Serial.print("PWM1 : " + String(OCR1A));
Serial.println(" PWM2 : " + String(OCR1B));
}
6) Setelah selesai catatlah hasil pengamatan dan fotolah bentuk pulsa PWM masing
masing sudut yang tampil pada osiloskop. Kemudian ukurlah frekuensi 1 periode
kedua pulsa dengan menggunakan kursor osiloskop kemudian catat hasilnya.
7) Lanjutkan dengan mengupload program kedua, yaitu mode fast PWM dengan
mode 14 (TOP = ICR1). Ulangi Langkah yang sama dengan menghitung nilai TOP
menggunakan persamaan :
𝑓𝑐𝑙𝑜𝑐𝑘 𝐼/𝑂
𝑓𝐹𝑃𝑊𝑀 =
𝑁 (𝑇𝑂𝑃 + 1)
Kemudian ukurlah pulsa PWM dan buatlah table dengan prosedur yang sama
seperti untuk mode phase correct PWM. Untuk mode fast PWM nilai PWM tidak
perlu dibagi dengan 2.
8) Amatilah perbedaan cara pergeseran pulsa PWM saat servo bergerak pada kedua
mode PWM. Jelaskan sebab dari perbedaan tersebut pada laporan anda, dan
jelaskan analisa anda dalam percobaan ini melalu penjelasan dari baris kode
pemrograman pada percobaan ini.
C. Percobaan Pengendalian Motor DC dengan Sinyal PWM dan Rangkaian H-Bridge
• Dasar Teori rangkaian H-Bridge
H-Bridge Driver adalah rangkaian yang dapat mengatur tegangan pada outputnya
dengan acuan input PWM yang diberikan. Dinamakan rangkaian H-Bridge karena memang
bentuk dari skema rangkaian seperti huruf "H" dimana pada bagian tengah digunakan
layaknya sebuah jembatan. Rangkaian ini umumnya digunakan untuk mengatur arah dan
kecepatan putar motor DC dan fungsi-fungsi lain yang menggunakan sinyal PWM sebagai
pengatur tegangan, misalnya Peltier. Rangkaian Driver dapat dirancang menggunakan 4
buah Transistor, yang terdiri dari 2 buah transistor NPN dan 2 buah transistor PNP, serta
biasanya untuk menjaga agar transistor tidak rusak ketika melakukan reverse direction
atau pada saat kondisi motor dalam keadaan penegreman (keempat transistor HIGH),
rangkaian H-bridge dilengkapi dengan 4 buah dioda proteksi.
Tabel diatas juga berlaku untuk IN3, IN4, dan ENB untuk mengendalikan motor yang
dipasang pada OUT3 dan OUT4.
• Tujuan percobaan
Memahami dan mengaplikasikan cara pengendalian motor DC dengan menggunakan
sinyal PWM dari mikrokontroler.
• Alat dan bahan
o Komputer yang telah terinstall Arduino IDE
o Board Arduino UNO
o 1 x Breadboard
o 1 x potensiometer 10K Ohm
o 1 x motor DC 7 – 12 V
o 1 x Modul driver motor L298N
o Power Supply 7 – 12 V
o 2 x Push button
o 2 x resistor 10K Ohm
o Osiloskop
o Kabel jumper secukupnya
• Rangkaian percobaan
• Program percobaan
bool cw_dir = true; //flag untuk mengubah puatran
void setup() {
//set baudrate serial
Serial.begin(9600);
//set pin 8, 9, dan 11 sebagai output
DDRB |= (1<<DDB0)|(1<<DDB1)|(1<<DDB3);
//set pin 12 dan 13 sebagai input
DDRB &= ~(1<<DDB4) & ~(1<<DDB5);
//clear counter
TCNT1 = 0;
TCCR1A = 0;
TCCR1B = 0;
//PWM non-Inverting
TCCR1A |= (1<<COM1A1)|(1<<WGM11);
// mode 14 (fast PWM, TOP = ICR1), prescaler = 64
TCCR1B |= (1<<WGM12)|(1<<WGM13)|(1<<CS10)|(1<<CS11);
ICR1 = 4999;
}
void loop() {
// pembacaan dilakukan di ADC0 (A0)
// refs0 => 0 , refs1 => 1, refrensi = vcc
ADMUX |= 0b01000000;
// mulai konversi analog digital
// set prescaler jadi 1x
ADCSRA |= 0b11000000;
// tunggu deteksi akhir konversi
while (bit_is_set(ADCSRA,ADSC));
//geser ADC data register HIGH untuk mendapatkan nilai desimal ADC
int duty_cycle = ADCL | (ADCH << 8);
//ubah adc menjadi pwm
duty_cycle = map(duty_cycle, 0, 1023, 0, 4999);
//baca tombol 1
int button1 = (PINB >> 4 & 0b00010000 >> 4);
//baca tombol 2
int button2 = (PINB >> 5 & 0b00100000 >> 5);
𝑓𝑐𝑙𝑜𝑐𝑘 𝐼/𝑂
𝑓𝐹𝑃𝑊𝑀 =
𝑁 (𝑇𝑂𝑃 + 1)
Persen duty cycle Panjang pulsa ON Pangjang Pulsa OFF Nilai PWM
25%
50%
75%
95%
6) Hitunglah nilai PWM berdasarkan persen menggunakan persamaan :
𝑛𝑖𝑙𝑎𝑖 𝑃𝑊𝑀
% 𝑑𝑢𝑡𝑦 𝑐𝑦𝑐𝑙𝑒 =
𝑇𝑂𝑃
7) Ukurlah frekuensi sinyal PWM dengan kursor osiloskop dengan membaca 1 periode
gelombang sinyal PWM (T ON + T OFF). Bandingkan dengan hasil perhitungan
sebelumnya.
8) Putar potensiometer pada posisi 0, sehingga motor berhenti, kemudian tekan switch
1. Naikkan potensiometer hingga motor berputar dengan kecepatan 50%, amati apa
yang terjadi. Kemudian putar potensiometer pada posisi 0, hingga motor berhenti,
kemudian tekan switch 2. Naikkan potensiometer hingga motor berputar dengan
kecepatan 50%, kemudian amati apa yang terjadi.
9) Catatlah hasil semua hasil pengamatan anda. Jelaskan analisa anda mengenai
percobaan ini, tambahkan penjelasan dari baris kode program yang diberikan
untuk mendukung analisa anda.