Anda di halaman 1dari 11

EMBEDDED SYSTEM

LAPORAN PRAKTIKUM 3

Oleh :
Amrullah Salafi Setiono 2141170162
Kelas 2D – D4

Dosen Pengajar :
Leonardo Kamajaya, S.ST., M.Sc.

PROGRAM STUDI D-IV TEKNIK ELEKTRONIKA


JURUSAN TEKNIK ELEKTRO
POLITEKNIK NEGERI MALANG
2023
I. TUJUAN
1. Mahasiswa/i mampu mengoprasikan unit timer pada ESP32.
2. Mahasiswa/i mampu membangkitakan sinyal PWM dengan menggunakan
ESP32.
3. Mahasiswa/i mampu mengendalikan sinyal PWM dari ESP32 secara
asycronous.

II. DASAR TEORI

1. Timer dan Time Sampling

Timer merupakan unit pencacah otomatis yang ada didalam sebuah


mikrokontroller dan embedded system. Kinerja dari timer memanfaatkan besarnya
sumber clock yang dimiliki oleh chip dari mikrokontroller ataupun embedded system.
Sebagai contoh pada board ESP32 DOIT DEVKIT V1 memiliki kecepatan clock
sebesar 80MHz. Clock yang digunakan untuk melakukan cacahan otomatis dari timer
dapat diatur berdasarkan besar nilai pembagi dari clock sumber yang diinputkan.
Sebagai contoh sebuah timer ESP32 digunakan untuk melakukan proses interupsi
overflow setiap 100ms atau 0.1 detik. Sebagai contoh resolusi timer yang digunakan
adalah 16 bit atau sebesar 65535 gitungan untuk mencapai overflow. Maka prescaler
yang dibutuhkan dapat dihitung untuk menemukan clock yang tepat agar dalam 0.1
detik didapatkan 65535 clock.

𝐶𝑙𝑜𝑐𝑘 = 80𝑀𝐻𝑧
1𝑠 = 80.000.000 𝑐𝑜𝑢𝑛𝑡𝑠
1 𝑐𝑜𝑢𝑛𝑡 = 80𝑛𝑠
1 𝑐𝑜𝑢𝑛𝑡 = 80𝑛𝑠 𝑥 𝑁
80.000.000
𝑁=
100.000
𝑁 = 800

Didapatakan nilai prescaler yang dibutuhkan untuk membuat interrupt timer


sebesar 0.1 detik adalah 800. Inilah keunggulan yang dimiliki dari ESP32
dibandingkan dengan Arduino atau mikrokontroller ATmega lainnya, nilai prescaler
yang didapat memiliki nilai fleksibilitas yang tinggi. Jika pada ATmega nilai
rescalernya telah ditentukan, pada ESP32 dapat ditentukan sesuai kebutuhan.

2. Pulse Width Modulation


Pulse Width Modulation atau yang lebih dikenal dengan singkatannya yaitu
PWM merupakan gelombang output berbentuk kotak yang dihasilkan oleh timer yang
ada pada mikrokontroler atau embedded system. Dimana gelombang PWM yang
memiliki sinyal yang bernilai HIGH dan LOW dapat diatur lebar pulsanya atau Duty
Cyclenya berdasarkan konfigurasi pada timernya.
PWM dapat digunakan untuk berbagai macam manfaat, sebagai contoh dapat
digunakan untuk mengatur intensitas cahaya yang dihasilkan oleh LED, kemudian
mengatur kecepatan sebuah motor DC, mengatur keluaran sinyal atau tegangan dari
rangkaian konverter dan inverter, dan masih banyak lagi. Pada ESP32 terdapat 8 unit
Timer, yang masing – masing terhubung kedalam 2 channel timer.

Seperti yang ditunjukkan pada gambar diatas, terdapat 8 unit timer yang terbagi
menjadi 2 bagian yaitu unit timer untuk high speed, dan unit taimer untuk low speed.
Dimana masing – masing unit timer tersebut terhubung kedalam 2 buah channel
timer. 16 channel timer ini dapat dioperasikan secara diferensial untuk pengaturan
Duty Cycle gelombang yang dihasilkan, tetapi untuk besar frekuensi timer yang
dihasilkan hanya bisa diatur untuk 8 unit saja. Sebagai contoh unit timer 0 terhubung
pada channel 0 dan channel 1. Untuk nilai Duty Cycle pada channel 0 dan 1 dapat
berbeda, namun untuk nilai frekuensinya tidak dapat dibedakan.

III. PROSEDUR PRAKTIKUM


 Buatlah program untuk membuat jam digital dengan interface Serial Monitor
dengan tampilan: hh : mm : ss, dengan memanfaatkan timer dari dalam ESP32

 Buatlah program untuk mengendalikan 3 buah led dengan rate perubahan


dutycycle yang berbeda – beda
 Buatlah program untuk menyalakan 3 buah led dengan menggunakan PWM secara
bergantian. Duty Cycle PWM dinaikkan sebesar 10% setiap 0.5 detik sekali (time
sampling dengan menggunakan timer). Jika LED 1 Duty Cyclenya telah mencapai
100%, LED 1 tersebut dimatikan dan bergantian menyalakan LED 2 dengan duty Cycle
yang sama ditambahkan 10% setiap samplingnya hingga 100%, dan dilanjutkan
menyalakan LED 3 dengan cara yang sama. Proses ini diulangi secara terus menerus.

IV. HASIL PERCOBAAN


 PERCOBAAN 1

 PERCOBAAN 2
 PERCOBAAN 3

V. ANALISA
 PERCOBAAN 1

Pada percobaan 1 serial menampilkan sebuah timer / clock yang diprogram


menggunakan timer interrupt overflow pada ESP32, pada saat detik mencapai angka 60
nilai variable detik akan direset menjadi 0 dan menambahkan 1 nilai pada variable
menit, begitu pula pada variable menit, pada saat nilai mencapai 60 maka nilai variable
menit akan direset menjadi 0 dan menambahkan 1 nilai pada variable jam.

 PERCOBAAN 2

Pada percobaan 2 led menyala sesuai dengan nilai PWM yang telah
ditentukan, ketiga lampu tersebut menyala dengan tingkat kecerahan yang berbeda
beda sesuai dengan nilai PWM. Tingkat kecerahan ini didapatkan dengan mengalikan
nilai maksimum PWM dengan persentase yang diinginkan, contoh untuk 50% maka
(1023 * 50%), sehingga didapatkan nilai sebesar 511.5 atau dibulatkan menjadi 512,
nilai tersebut akan menyalakan lampu LED dengan tingkat kecerahan hanya 50% saja.

 PERCOBAAN 3

Pada percobaan 3 sama halnya dengan percobaan 2 namun, pada percobaan 3


kali ini nilai PWM dinaikkan sebesar 10% setiap 0.5 detik sekali sampai nilai Duty
Cyclenya mencapai nilai 100%, jika LED 1 Duty Cyclenya mencapai 100%, led 1
tersebut mati, dan bergantian menyalakan LED 2 dengan Duty Cycle yang sama
ditambahkan 10% sama halnya dengan LED 3.

VI. KESIMPULAN
Kesimpulan dari praktikum diatas adalah :

 ESP32 dapat memanfaatkan fitur timer untuk menghitung waktu secara akurat dan
melakukan tindakan tertentu setelah waktu tertentu telah berlalu.
 ESP32 dapat melakukan timer interrupt overflow, yang dimana interrupt akan ter-
trigger apabila waktu tertentu telah terpenuhi.
 ESP32 dapat memanfaatkan fitur PWM untuk mengontrol tingkat kecerahan pada
lampu LED atau kecepatan motor dengan mengatur Duty Cyclenya masing
masing.
 ESP32 dapat mengatur Duty Cycle PWM untuk naik atau turun sesuai keinginan
berdasarkan waktu yang telah ditentukan.

Dengan demikian fitur timer dan PWM pada ESP32 sangat berguna dalam pengembangan
aplikasi IoT yang membutuhkan pengaturan waktu dan kontrol perangkat listrik, seperti
motor DC, lampu LED, dll.

VII. LAMPIRAN
Program Percobaan 1
hw_timer_t * timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;

int interruptCount = 0, detik = 0, menit = 0, jam = 0, lastDetik =


0;

void IRAM_ATTR onTimer(){


portENTER_CRITICAL_ISR(&timerMux);
if(++interruptCount){
detik++;
if(detik >= 60){
detik = 0;
menit++;
if(menit >= 60){
menit = 0;
jam++;
if(jam >= 24){
jam = 0;
}
}
}
interruptCount=0;
}
portEXIT_CRITICAL_ISR(&timerMux);
}

void setup() {
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &onTimer, true);
timerAlarmWrite(timer, 1000000, true);
timerAlarmEnable(timer);
Serial.begin(115200);
}

void loop() {
if(lastDetik != detik){
Serial.print(jam);
Serial.print(" : ");
Serial.print(menit);
Serial.print(" : ");
Serial.println(detik);
lastDetik = detik;
}
}

Penjelasan tiap fungsi program :


1. hw_timer_t * timer = NULL;
Membuat pointer timer yang akan menunjuk pada timer pada ESP32.
2. portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
Membuat variabel timerMux dengan tipe portMUX_TYPE yang digunakan
untuk mengontrol akses kritis pada timer.
3. int interruptCount = 0, detik = 0, menit = 0, jam = 0,
lastDetik = 0;
Membuat beberapa variabel yang akan digunakan pada program, yaitu
interruptCount untuk menghitung interrupt, detik, menit, dan jam
untuk menyimpan waktu, serta lastDetik untuk menyimpan detik terakhir
yang sudah diproses.
4. void IRAM_ATTR onTimer(){...}
Merupakan fungsi interrupt pada timer. Setiap kali timer menghasilkan interrupt,
maka fungsi ini akan dipanggil. Fungsi ini berisi logika untuk menghitung waktu.
5. portENTER_CRITICAL_ISR(&timerMux);
Digunakan untuk mengambil akses kritis pada timer.
6. if(++interruptCount){...}
Menghitung jumlah interrupt yang telah terjadi dan melakukan pengecekan jika
interrupt sudah terjadi.
7. detik++;
Menambah nilai detik.
8. if(detik >= 60){...}
Jika detik sudah mencapai 60, maka akan direset ke 0 dan menambah nilai menit.
9. if(menit >= 60){...}
Jika menit sudah mencapai 60, maka akan direset ke 0 dan menambah nilai jam.
10. if(jam >= 24){...}
Jika jam sudah mencapai 24, maka akan direset ke 0.
11. interruptCount=0;
Reset interruptCount menjadi 0.
12. portEXIT_CRITICAL_ISR(&timerMux);
Keluar dari akses kritis pada timer.
13. void setup() {...}
Merupakan fungsi setup yang akan dijalankan pertama kali saat program
dijalankan. Pada fungsi ini, timer akan diinisialisasi dan diatur agar menghasilkan
interrupt setiap 1 detik.
14. timer = timerBegin(0, 80, true);
Menginisialisasi timer dengan nilai prescaler 80 dan timer 0.
15. timerAttachInterrupt(timer, &onTimer, true);
Mengatur interrupt pada timer dan menggunakan fungsi onTimer sebagai
interrupt handler.
16. timerAlarmWrite(timer, 1000000, true);
Mengatur alarm pada timer dengan nilai 1 detik (1000000 mikrodetik).
17. timerAlarmEnable(timer);
Mengaktifkan alarm pada timer.
18. Serial.begin(115200);
Menginisialisasi Serial untuk debugging.
19. void loop() {...}
Merupakan fungsi loop yang akan terus menerus berjalan

Program Percobaan 2
int LED1 = 5;
int LED2 = 16;
int LED3 = 17;

const int DUTY_CYCLE1 = 52;


const int DUTY_CYCLE2 = 614;
const int DUTY_CYCLE3 = 1023;

void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
}

void loop() {
analogWrite(LED1, DUTY_CYCLE1);
analogWrite(LED2, DUTY_CYCLE2);
analogWrite(LED3, DUTY_CYCLE3);
}

Penjelasan tiap fungsi program :


1. int LED1 = 5;
int LED2 = 16;
int LED3 = 17;

Membuat variable LED 1, LED 2, LED 3 yang terhubung pada pin nomor 5,
16, dan 17 pada ESP32.

2. const int DUTY_CYCLE1 = 52;


const int DUTY_CYCLE2 = 614;
const int DUTY_CYCLE3 = 1023;

membuat nilai variable konstanta untuk PWM.


3. void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
}

Mengatur konfigurasi pin sebagai OUTPUT

4. void loop() {
analogWrite(LED1, DUTY_CYCLE1);
analogWrite(LED2, DUTY_CYCLE2);
analogWrite(LED3, DUTY_CYCLE3);
}

Looping program untuk menyalakan LED dengan fungsi analogWrite, dimana


fungsi tersebut digunakan untuk mengatur PWM pada masing-masing LED.

Program Percobaan 3

const int LED1_PIN = 26; // PWM pin untuk LED 1


const int LED2_PIN = 27; // PWM pin untuk LED 2
const int LED3_PIN = 14; // PWM pin untuk LED 3

const int PWM_FREQ = 5000; // Frekuensi PWM


const int PWM_RES = 8; // Resolusi PWM

int led = 1; // Variable untuk menentukan LED mana yang akan


dinyalakan

int dutyCycle = 0; // Duty cycle awal

void setup() {
// Set pin sebagai output
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
pinMode(LED3_PIN, OUTPUT);

// Konfigurasi PWM
ledcSetup(0, PWM_FREQ, PWM_RES);
ledcSetup(1, PWM_FREQ, PWM_RES);
ledcSetup(2, PWM_FREQ, PWM_RES);

// Bind PWM pin ke channel PWM


ledcAttachPin(LED1_PIN, 0);
ledcAttachPin(LED2_PIN, 1);
ledcAttachPin(LED3_PIN, 2);
}
void loop() {
// Atur duty cycle sesuai variabel dutyCycle
if (led == 1) {
ledcWrite(0, dutyCycle);
} else if (led == 2) {
ledcWrite(1, dutyCycle);
} else if (led == 3) {
ledcWrite(2, dutyCycle);
}

// Tunggu selama 0.5 detik


delay(500);

// Tambahkan duty cycle sebesar 10%


dutyCycle += 10;

// Jika duty cycle sudah mencapai 100%, matikan LED dan pindah ke
LED berikutnya
if (dutyCycle >= 100) {
dutyCycle = 0;
led += 1;
if (led > 3) {
led = 1;
}
// Matikan LED sebelumnya
if (led == 1) {
ledcWrite(2, 0);
} else if (led == 2) {
ledcWrite(0, 0);
} else if (led == 3) {
ledcWrite(1, 0);
}
}
}

Penjelasan tiap fungsi program :

 const int LED1_PIN, const int LED2_PIN, dan const int


LED3_PIN digunakan untuk menyimpan nomor pin PWM yang akan digunakan
untuk mengendalikan masing-masing LED.
 const int PWM_FREQ dan const int PWM_RES digunakan untuk mengatur
frekuensi dan resolusi dari sinyal PWM yang akan digunakan.
 Pada bagian void setup(), pin LED diatur sebagai output dan kemudian
dilakukan konfigurasi untuk modul PWM. Setiap channel PWM diatur dengan
ledcSetup() dan diikatkan ke pin LED yang sesuai dengan
ledcAttachPin().
 Pada bagian void loop(), program akan mengatur duty cycle untuk masing-
masing LED sesuai dengan variabel dutyCycle menggunakan ledcWrite().
Kemudian, program akan menunggu selama 0.5 detik menggunakan
delay(500).
 Setelah menunggu selama 0.5 detik, program akan menambahkan duty cycle
sebesar 10%. Jika duty cycle sudah mencapai 100%, maka LED akan dimatikan
dan program akan pindah ke LED berikutnya. Jika program sudah sampai ke LED
ketiga, maka program akan kembali ke LED pertama. LED sebelumnya akan
dimatikan menggunakan ledcWrite() dengan duty cycle 0.
 Perubahan duty cycle dan pengaturan LED yang dinyalakan dilakukan secara
berulang-ulang sampai program dihentikan.

Anda mungkin juga menyukai