You are on page 1of 27

Modul 4 Praktikum

Sistem Berbasis Mikroprosesor

Disusun oleh :
Muhammad Fauzan Ridho, S.T., M.T.

JURUSAN TEKNIK ELEKTRO


UNIVERSITAS BANGKA BELITUNG
Percobaan 4 :

Pulse Width Modulation (PWM) dari Mikrokontroler

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 1. Sinyal PWM dengan duty cycle 60%


Pada umumnya, sinyal PWM akan tetap dalam pada posisi ON (High) untuk waktu yang
ditentukan, kemudian akan OFF (Low) selama sisa periodenya. Sebagai pengguna, kita dapat
menentukan berapa lama PWM berada dalam posisi ON. Caranya yaitu dengan mengendalikan
siklus kerja (duty cylce) dari PWM. Pada saat PWM dalam posisi ON, siklus kerja atau duty cylce
memiliki nilai 100%. Sedangkan pada saat PWM OFF, disebut juga PWM dalam posisi duty cylce
0%. Untuk menghitung siklus kerja PWM, Anda dapat menggunakan formula berikut ini:
𝑡𝑂𝑁 𝑡𝑂𝑁
𝐷𝑢𝑡𝑦 𝐶𝑦𝑐𝑙𝑒 = 𝐴𝑡𝑎𝑢 𝐷𝑢𝑡𝑦 𝐶𝑦𝑐𝑙𝑒 =
(𝑡𝑂𝑁 + 𝑡𝑂𝐹𝐹 ) 𝑡𝑡𝑜𝑡𝑎𝑙
Dimana:
𝑡𝑂𝑁 = 𝑤𝑎𝑘𝑡𝑢 𝑜𝑛 (ℎ𝑖𝑔ℎ)
𝑡𝑂𝐹𝐹 = 𝑤𝑎𝑘𝑡𝑢 𝑜𝑓𝑓 (𝑙𝑜𝑤)
𝑡𝑡𝑜𝑡𝑎𝑙 = 𝑝𝑒𝑟𝑖𝑜𝑑𝑒 𝑔𝑒𝑙𝑜𝑚𝑏𝑎𝑛𝑔 (ℎ𝑎𝑠𝑖𝑙 𝑝𝑒𝑛𝑗𝑢𝑚𝑙𝑎ℎ𝑎𝑛 𝑎𝑛𝑡𝑎𝑟𝑎 𝑡𝑒𝑔𝑎𝑛𝑔𝑎𝑛 𝑜𝑛 + 𝑜𝑓𝑓 )

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
𝐹𝑟𝑒𝑞𝑢𝑒𝑛𝑐𝑦 =
𝑇𝑖𝑚𝑒 𝑃𝑒𝑟𝑖𝑜𝑑

Keterangan : Time Periode atau Periode Waktu = Waktu ON + Waktu OFF

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 :

𝑉𝑜𝑢𝑡 = 𝐷𝑢𝑡𝑦 𝐶𝑦𝑐𝑙𝑒 × 𝑉𝑖𝑛

b. PWM dengan fungsi analogWrite (Arduino)


Pada mikrokontroler berbasis Arduino, pengguna dapat mengatur nilai duty cycle
perangkat yang menggunakan sinyal PWM pada pin-pin tertentu yang ditujukan khusus untuk
mebangkitkan sinyal PWM. Pin-pin ini disebut pin PWM, dan penomorannya berbeda setiap
mikrokontroler yang berbasis Arduino :

Table 1. Pin PWM dan frekuensi PWM mikrokontroler berbasis arduino


Board Pin PWM Frekuensi PWM
Uno, Nano, Mini 3, 5, 6, 9, 10, 11 490 Hz (pins 5 dan 6: 980 Hz)
Mega 2 - 13, 44 - 46 490 Hz (pins 4 dan 13: 980 Hz)
Leonardo, Micro, Yún 3, 5, 6, 9, 10, 11, 13 490 Hz (pins 3 dan 11: 980 Hz)
Uno WiFi Rev.2 3, 5, 6, 9, 10 976 Hz
MKR boards * 0 - 8, 10, A3 (18), A4 (19) 732 Hz
MKR1000 WiFi * 0 - 8, 10, 11, A3 (18), A4 (19) 732 Hz
Zero * 3 - 13, A0 (14), A1 (15) 732 Hz
Due ** 2-13 1000 Hz
pins 3 dan 9: 490 Hz, pins 5 dan 6:
101 3, 5, 6, 9
980 Hz
Gambar 3. Pin PWM pada development board Arduino
Perlu diingat, pin ini terhubung dengan pin OCn pada mirkokontroler ATmega. Untuk
mengatur duty cycle yang dihasilkan oleh pin PWM tersebut, pengguna / programmer dapat
menggunakan fungsi khusus analogWrite() yang dibuat untuk platform pemrograman
berbasis Arduino. Fungsi analogWrite() memiliki parameter sebagai berikut :
analogWrite(pin PWM, duty cycle)
Fungsi analogWrite() akan membangkitkan sinyal PWM pada pin PWM, yang memiliki
resolusi PWM sebesar 8-bit (0-255) dengan frekuensi 490 Hz (pada pin tertentu f = 980 Hz).
Sebagai contoh, apabila kita hendak membangkitkan sinyal PWM dengan duty cycle 50%
dari nilai resolusi maksimum (255) pada pin 5, maka program akan terlihat sebagai berikut :

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

Gambar 6. Prescaler yang bisa diatur pada register TCCRnB


Untuk mengatur timer 1 dalam mode fast PWM, kita butuh mengatur register
TCCR1A dan TCCR1B dengan mengaktifkan beberapa bit, untuk memilih mode operasi
timer yaitu mode . Serta untuk mengatur Fast PWM dalam mode non-inverting ketika
menggunakan kedua register OCR1A dan OCR1B, bit -7 dan bit – 5 (COM1A1 dan
COM1B1) harus di set menjadi 1, dan bit – 6 dan bit -4 (COM1A0 dan COM1B0) harus di
set menjadi 0 pada TCCR1A.
Sementara untuk mengatur Fast PWM dalam mode inverting ketika menggunakan
kedua register OCR1A dan OCR1B, bit -7 dan bit – 5 (COM1A1 dan COM1B1) harus di
set menjadi 1, dan bit – 6 dan bit -4 (COM1A0 dan COM1B0) harus di set menjadi 1 pada
TCCR1A.

Gambar 7. Pemilihan mode non-inverting dan inverting Fast PWM


Sementara untuk mebuat timer dalam mode fast PWM, maka bit WGM10, WGM11,
WGM12, dan WGM13 perlu diaktifkan sesuai tabel pada gambar 7.
Gambar 8. Tabel pilihan mode Fast PWM untuk timer 1
Sebagai contoh apabila kita hendak menggunakan Fast PWM dengan resolusi 10-bit
(nilai TOP = 1023) dengan prescaler 64, maka bit yang perlu di set menjadi 1 adalah
WGM10 dan WGM11 pada register TCCR1A, serta WGM12 pada register TCCR1B, serta
bit CS11 dan CS10 pada TCCR1B di set menjadi 1.
Pada mode fast PWM, fekuensi PWM dapat dihitung dengan menggunakan
persamaan berikut :
𝑓𝑐𝑙𝑜𝑐𝑘 𝐼/𝑂
𝑓𝐹𝑃𝑊𝑀 =
𝑁 (𝑇𝑂𝑃 + 1)
Dimana 𝒇𝒄𝒍𝒐𝒄𝒌 𝑰/𝑶 adalah frekuensi clock CPU mikrokontroler , dan N adalah
prescaler yang dipakai (1, 8, 64, 256, 1024). Sebagai contoh Atmega328 pada Arduino
uno memiliki frekuensi XTAL 16 Mhz, maka jika memakai prescaler 64 dengan resolusi
PWM 10-bit (TOP = 1023) , akan menghasilkan nilai frekuensi PWM sebesar :
16000000
𝑓𝐹𝑃𝑊𝑀 = = 244.14 𝐻𝑧
64(1023 + 1)
frekuensi PWM dapat diatur secara fleksibel dengan cara memvariasikan nilai TOP
pada PWM. Hal ini dapat dilakukan dengan cara menyimpan nilai TOP pada register ICR1
atau OCR1A, yang dapat dilakukan dengan mengganti mode Fast PWM ke mode 14 atau
mode 15 pada tabel (Fast PWM dengan nilai TOP ICR1 atau OCR1A). Sebagai contoh,
sebuah servo motor dapat dikendalikan dengan sinyal PWM dengan frekuensi 50 Hz,
maka untuk menghitung nilai TOP dengan prescaler 64 agar mendapatkan frekuensi
tersebut adalah sebagai berikut :
16000000
50 𝐻𝑧 =
64(𝑇𝑂𝑃 + 1)
16000000
𝑇𝑂𝑃 = ( ) − 1 = 4999
64 ∗ 50
Apabila ditulis ke dalam program dengan nilai duty cycle 50% dengan nilai TOP
disimpan pada register ICR1 (mode operasi 14), baris kode akan terlihat seperti berikut :
void setup() {
DDRB |= (1 << DDB1) | (1 << DDB2);
TCNT1 = 0;
TCCR1A = 0;
TCCR1B = 0;
//NON-INVERTED PWM
TCCR1A|=(1<<COM1A1)|(1<<COM1B1)|(1 << WGM11);
//PRESCALER = 64 MODE 14(FAST PWM, TOP = ICR1)
TCCR1B|=(1 << WGM12)|(1<<WGM13)|(1<<CS11)|(1<<CS10);
ICR1=4999; //fPWM=50Hz (Period = 20ms Standard).
}

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

Gambar 8. Tabel pilihan mode Phase correct PWM untuk timer 1


Untuk menghitung frekuensi dan Duty Cycle PWM pada mode phase correct PWM,
dapat digunakan persamaan berikut :
𝑓𝑐𝑙𝑜𝑐𝑘 𝐼/𝑂
𝑓𝑃𝐶𝑃𝑊𝑀 =
2 × 𝑁 × 𝑇𝑂𝑃
Sebagai contoh sinyal phase correct PWM dengan resolusi PWM 10-bit (nilai TOP =
1023) dengan menggunakan prescaler 64 dari frekuensi clock 16 Mhz, maka frekuensi
PWM yang didapatkan adalah :
16000000
𝑓𝑃𝐶𝑃𝑊𝑀 = = 122.189 𝐻𝑧
2 ∗ 64 ∗ 1023
Seperti halnya fast PWM, mode phase correct PWM memiliki mode operasi yang
dapat menyimpan nilai TOP pada register ICR1 atau OCR1A, sehingga nilai frekuensi PWM
dan resolusi PWM dapat diatur dengan mengatur nilai pada ICR1 atau OCR1A. untuk
menghitung resolusi PWM pada mode phase correct dapat menggunakan persamaan
yang sama dengan cara menghitung resolusi fast PWM :
log(𝑇𝑂𝑃 + 1)
𝑅𝑃𝐶𝑃𝑊𝑀 =
log(2)
Sebagai contoh untuk membat Sinyal PWM dalam mode phase correct dengan
frekuensi 50 Hz dan prescaler 64 dari frekuensi clock 16 mhz, memerlukan nilai TOP
sebesar :
16000000 𝐻𝑧
50 𝐻𝑧 =
2 ∗ 64 ∗ 𝑇𝑂𝑃
16000000
𝑇𝑂𝑃 = = 2500
2 ∗ 64 ∗ 50
Dengan nilai TOP sebesar itu, sinyal PWM akan memiliki resolusi sebesar :
log(2500)
𝑅= = 11.28 ≈ 11 𝑏𝑖𝑡
log(2)
Dalam program baris kode dengan frekuensi, resolusi, dan mode phase correct
tersebut akan terlihat sebagai berikut :
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 10 (phase correct PWM TOP = ICR1)
TCCR1B |= (1<<WGM13)|(1<<CS11)|(1<<CS10);
ICR1 = 2500; // f = 50 Hz (20 ms pulse)
}

void loop() {
OCR1A = 1250; // 50% duty cycle
OCR1B = 1250;
}

B. Percobaan Pengendalian motor Servo dengan sinyal PWM

• Dasar Teori Motor Servo


Motor servo merupakan perangkat atau aktuator putar (motor) yang dirancang
dengan sistem kontrol feedback loop tertutup (close loop), sehingga dapat memastikan
dan menentukan posisi sudut dari poros output motor.

Gambar 9. Motor Servo


Sebuah servo motor dilengkapi dengan rangkaian pengendali, sebuah motor,
potesiometer, dan gear di dalamnya. Pada motor servo , motor terpasang roda gigi yang
tersambung ke roda control pada potensiometer. Saat motor berputar, resistansi
potensiometer akan berubah, sehingga rangkaian kontrol dapat dengan tepat mengatur
jumlah dan arah putaran motor.

Gambar 10. Komponen motor servo


Ketika poros motor berada pada posisi yang diinginkan, daya yang disuplai ke motor
dihentikan. Jika tidak, motor diputar ke arah yang sesuai. Posisi yang diinginkan dikirim
melalui pulsa listrik melalui kabel sinyal. Kecepatan motor sebanding dengan perbedaan
antara posisi aktual dan posisi yang diinginkan. Jadi jika motor berada di dekat posisi yang
diinginkan, ia akan berputar perlahan, jika tidak maka akan berputar cepat, ini disebut
sebagai kontrol proporsional. Servo dikontrol dengan mengirimkan pulsa listrik dengan
lebar variabel, atau biasa disebut Pulse Width Modulation (PWM) melalui kabel . Ada
pulsa minimum, pulsa maksimum, dan tingkat pengulangan.
Motor servo biasanya hanya bisa berputar 90° 92searah mana pun dengan total 92ea
rah 180°. Posisi netral motor didefinisikan sebagai posisi di mana servo memiliki jumlah
putaran potensial yang sama di kedua arah searah jarum jam atau berlawanan arah jarum
jam.
PWM yang dikirim ke motor akan menentukan posisi poros, dan berdasarkan pada
durasi pulsa yang dikirim melalui kabel, motor akan berputar ke posisi yang diinginkan.
Motor servo diharuskan agar mampu menerima pulsa setiap 20 milidetik (ms), dimana 92
pulsa tersebut akan menentukan seberapa jauh motor berputar.
Contohnya, pulsa 1,5 ms akan membuat motor berputar ke posisi 90°. Apabila Lebih
pendek dari 1.5ms, maka motor akan bergerak berlawanan 92arah jarum jam menuju
posisi 0°, dan apabila lebih dari 1.5ms akan mengubah putaran servo 92 searah jarum
jam menuju posisi 180°.

Gambar 11. Diagram timing motor servo


Servo standard dapat dikendalikan menggunakan sinyal PWM dengan range
frekuensi mulai dari 40 Hz hingga 200 Hz, namun biasanya kebanyakan motor servo
standar yang ada di pasaran menggunakan frekuensi 50 Hz atau pulsa 20 ms.
• Tujuan Percobaan
Percobaan ini bertujuan untuk memahami dan mempraktikkan cara kerja pengendalian
motor servo menggunakan sinyal PWM yang menggunakan timer pada mikrokontroler
Atmega328P.
• Alat dan Bahan
1) Komputer yang telah terinstall Arduino IDE
2) Board Arduino UNO
3) 1 x Breadboard
4) 2 x potensiometer 10K Ohm
5) 2 x motor servo MG90S / MG996R
6) 1 x osiloskop
7) Kabel jumper secukupnya
• Rangkaian Percobaan

Gambar 12. Rangkaian percobaan pengendalian motor servo


• Program Percobaan
Phase Correct 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 10 (phase correct PWM TOP = ICR1) prescaler = 64
TCCR1B |= (1<<WGM13)|(1<<CS11)|(1<<CS10);
ICR1 = 2500; // 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, 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));
}

• Langkah – Langkah Percobaan


1) Pada percobaan ini, pertama motor servo dikendalikan dengan menggunakan PWM
dalam mode Phase correct PWM pada mode 10 (TOP = ICR1) dengan frekuensi 50
Hz (servo standard). Hitunglah nilai TOP dengan menggunakan persamaan yang
diberikan :
𝑓𝑐𝑙𝑜𝑐𝑘 𝐼/𝑂
𝑓𝑃𝐶𝑃𝑊𝑀 =
2 × 𝑁 × 𝑇𝑂𝑃
Mikrokontroler memiliki frekuensi clock 16 Mhz, dan pada percobaan ini sinyal
clock di bagi dengan prescaler 64.
2) Rangkailah komponen sesuai dengan rangkaian yang diberikan, kemudian
uploadlah program pada mikrokontroler.
3) Putar kedua potesiometer pada posisi 0 (nilai resistansi max) hingga posisi penuh,
perhatikan apakah posisi mata servo berputar dari 0o − 180o atau 90o − −90o
jika tidak, maka ubah range duty cycle dengan hitungan berikut :
1000 𝜇𝑠
𝑛𝑖𝑙𝑎𝑖 𝑃𝑊𝑀 𝑠𝑒𝑟𝑣𝑜 =
𝑓𝐶𝑃𝑈
𝑛𝑖𝑙𝑎𝑖 𝑝𝑟𝑒𝑠𝑐𝑎𝑙𝑒𝑟
𝑓𝑐𝑝𝑢
Dengan nilai 𝑝𝑟𝑒𝑠𝑐𝑎𝑙𝑒𝑟 diubah terlebih dahulu menjadi satuan 𝜇𝑠. (1 ms untuk sudut

0o /90o dan 2 ms untuk sudut 180o /−90o , tergantung datasheet servo).


Dikarenakan mode PWM dalam mode Phase correct, PWM yang didapatkan dari
perhitungan harus dibagi dengan 2.
4) Hubungkan channel 1 osiloskop pada pin 9 dan osiloskop channel 2 pada pin 10.
Periksalah grafik pulsa, aturlah pengaturan osiloskop hingga dapat membaca pulsa
PWM dari mikrokontroler (Volt/Div = 2 V , time / div = 25 - 100 ms).
5) Ubahlah posisi servo sesuai dengan tabel berikut, kemudian buatlah dan
lengkapilah table berikut sesuai dengan pengukuran dari osiloskop :
Posisi Sudut Panjang pulsa ON Nilai PWM
Servo 1 Servo 2
Servo 1 Servo 2 Servo 1 Servo 2
(OCR1B) (OCR1A)
0 0
45 45
90 90
135 135
180 180

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.

Gambar 13. Rangkaian H-Bridge driver untuk motor DC


Sebuah motor DC berputar searah jarum jam (clockwise) atau berlawanan arah jarum
jam (counter clockwise), tergantung pada bagaimana Anda menghubungkan kabel positif
dan negatifnya. Untuk mengenal konsep pengendalian arah motor DC dengan rangkaian
H-bridge, kita akan menggantikan rangkaian H-bridge dengan 4 buah switch yaitu
switch/saklar 1, 2, 3, 4.
Jika Anda menutup saklar 1 dan 4, Anda akan menghubungkan kabel positif ke sisi
kiri motor dan kabel negatif ke sisi lainnya. Motor akan mulai berputar ke satu arah seperti
berikut :
Gambar 14. Keadaan saat switch 1 dan 4 ditutup
Jika Anda malah menutup saklar 2 dan 3, Anda akan menghubungkan kabel positif ke
sisi kanan dan kabel negatif ke sisi kiri. Motor akan berputar ke arah yang berlawanan
seperti berikut :

Gambar 14. Keadaan saat switch 2 dan 3 ditutup


Pada pengaplikasiannya switch tersebut digantikan dengan menggunakan transistor
yang pada dasarnya juga merupakan switch yang dapat di trigger menggunakan tegangan
listrik tertentu, sehingga memungkinkan rangkaian H-bridge dapat dikendalikan dengan
menggunakan sebuah mikrokontroler atau perangkat digital lain.
Rangkaian H-Bridge umumnya sudah dikemas dalam bentuk IC (integrated circuit)
sehingga membuatnya dapat digunakan dalam bentuk yang lebih praktis. Beberapa IC
driver motor yang populer adalah IC L293D atau L298N. Pada percobaan ini kita akan
menggunakan driver L298N sebagai IC H-bridge.
L298N adalah dual H-Bridge IC, sehingga memungkinkan IC mengendalikan dua
motor pada saat yang bersaman. L298N dapat mengendalikan motor hingga tegangan 12
Volt, dengan arus maksimum sebesar 2A. Berikut skematik pinout dari modul l298N
beserta fungsinya.

Gambar 15. Driver motor L298N


➢ 1 = Jumper 5V enable, jika dijumper maka tegangan IC akan diambil dari input
tegangan motor (8) yang telah diturunkan dengan regulator .
➢ 2 = Jumper enable Motor A. Jika dijumper maka kecepatan motor akan
maksimum dan konstan berdasarkan input power motor yang digunakan.
➢ 3 = Jumper enable Motor B. Jika dijumper maka kecepatan motor akan
maksimum dan konstan berdasarkan input power motor yang digunakan.
➢ 4 dan 5 = Out 1 dan Out 2 = Pin out Motor A.
➢ 6 dan 7 = Out 4 dan Out 3 = Pin out Motor B.
➢ 8 = Sumber tegangan Motor.
➢ 9 = Ground.
➢ 10 = Sumber tegangan IC (Tegangan operasional). Dapat berfungsi sebagai
Input maupun Output tergantung kondisi.
➢ 11 = ENA , Berfungsi sebagai Enable motor A. Terdapat tiga keadaan yang
memungkinkan, pertama dihubungkan menggunakan jumper 2, kedua
dihubungkan ke pin PWM mikrokontroler untuk mengatur kecepatan motor,
ketiga dibiarkan terbuka yang mengakibatkan keluaran pin motor A tidak
aktif.
➢ 12, 13, 14, 15 = Input Out 1, Input Out 2, Input Out 3, Input Out 4. Input yang
diterima berupa input digital (HIGH atau LOW).
➢ 16 = ENB = Berfungsi sebagai Enable motor B. Terdapat tiga keadaan yang
memungkinkan, pertama dihubungkan menggunakan jumper 3, kedua
dihubungkan ke pin PWM mikrokontroler untuk mengatur kecepatan motor,
ketiga dibiarkan terbuka yang mengakibatkan keluaran pin motor A tidak
aktif.

Untuk mengendalikan motor menggunakan driver l298N, yang harus diperhatikan


adalah pemberian sinyal HIGH dan LOW pada pin IN1, IN2, IN3, dan IN4, serta pemberian
sinyal PWM pada ENA dan ENB, dikarenakan pin tersebut mempengaruhi arah putar dan
kecepatan motor DC. Tabel kebenaran berikut dapat menjelaskan cara kerja kendali
putaran dan kecepatan motor DC.

Tabel 2. Tabel kebenaran driver L298N

IN1 IN2 ENA Arah putaran


LOW LOW PWM STOP
HIGH HIGH PWM SHORT CIRCUIT
HIGH LOW PWM CLOCKWISE
LOW HIGH PWM COUNTER
CLOCKWISE

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

Gambar 12. Rangkaian percobaan pengendalian motor dc dengan PWM

• Program percobaan
bool cw_dir = true; //flag untuk mengubah puatran

//function untuk arah clockwise


void CW(int speed){
PORTB |= (1<<DDB0);
PORTB &= ~(1<<DDB3);
OCR1A = speed;
}

//function untuk arah counter clockwise


void CCW(int speed){
PORTB &= ~(1<<DDB0);
PORTB |= (1<<DDB3);
OCR1A = speed;
}

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

// jika tombol 1 ditekan, arah = clockwise


if(button1 == 1){
cw_dir = true;
}
// jika tombol 2 ditekan, arah == counter clockwise
else if(button2 == 1){
cw_dir = false;
}
else{
cw_dir = cw_dir;
}
if(cw_dir){
CW(duty_cycle);
}
else{
CCW(duty_cycle);
}
//print nilai duty cycle
Serial.println(OCR1A);
}

• Langkah – langkah percobaan


1) Rangkailah komponen sesuai dengan rangkaian yang diberikan, kemudian
uploadlah progam ke mikrokontroler
2) Hitunglah frekuensi PWM yang digunakan dengan persamaan untuk menghitung
frekuensi fast PWM :

𝑓𝑐𝑙𝑜𝑐𝑘 𝐼/𝑂
𝑓𝐹𝑃𝑊𝑀 =
𝑁 (𝑇𝑂𝑃 + 1)

3) Putar potensiometer pada posisi 0, sehingga motor dalam keadaan stop.


4) Hubungkan channel 1 osiloskop untuk membaca sinyal PWM pada pin 9.
5) Kemudian putar potensiometer hingga menunjukkan PWM pada tabel berikut,
amati pergeseran sinyal PWM pada osiloskop, kemudian lengkapilah tabel berikut
sesuai pembacaan osiloskop.

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.

You might also like