MODUL II PWM, ADC, INTERRUPT, & MILLIS
MODUL I GENERAL INPUT DAN OUTPUT
a) Asistensi dilakukan 1x
b) Praktikum dilakukan 1x
a) Memahami cara penggunaan input dan output digital pada mikrokontroler
b) Menggunakan komponen input dan output sederhana dengan Raspberry Pi Pico
c) Menggunakan komponen Input dan Output sederhana dengan STM32F103C8
a) Raspberry Pi Pico
b) STM32F103C8
c) LED
d) Push Button
e) LED RGB
f) Touch Sensor
g) Sensor Soil Moisture
h) Potensiometer
i) DHT22
j) Motor DC (Dinamo DC, Motor Servo, dan Motor Stepper
k) LDR dan Photodioda
l) Breadboard
m) Resistor
n) Transistor
o) Driver Motor Stepper ULN2003
1.4.1 PWM
PWM (Pulse Width Modulation) adalah salah satu teknik modulasi
dengan mengubah lebar pulsa (duty cylce) dengan nilai amplitudo dan
frekuensi yang tetap. Satu siklus pulsa merupakan kondisi high kemudian
berada di zona transisi ke kondisi low. Lebar pulsa PWM berbanding lurus
dengan amplitudo sinyal asli yang belum termodulasi.
Duty Cycle adalah perbandingan antara waktu ON (lebar pulsa High)
dengan perioda. Duty Cycle biasanya dinyatakan dalam bentuk persen (%).
Duty Cycle
Ton
Toff
Ttotal
= tON / ttotal
= Waktu ON atau Waktu dimana tegangan keluaran
berada pada posisi tinggi (high atau 1)
= Waktu OFF atau Waktu dimana tegangan keluaran
berada pada posisi rendah (low atau 0)
= Waktu satu siklus atau penjumlahan antara Ton dengan
Toff atau disebut juga dengan “periode satu gelombang”
PWM pada STM32 dihasilkan menggunakan timer internal yang
berfungsi sebagai penghitung waktu dengan berbagai mode operasi.
Mikrokontroler ini memiliki empat timer 16-bit (TIM1–TIM4), yang dapat
dikonfigurasi untuk menghasilkan sinyal dengan frekuensi dan duty cycle
tertentu. Timer bekerja dengan menghitung hingga nilai tertentu berdasarkan frekuensi clock, lalu mengubah status register untuk
menghasilkan gelombang persegi.
STM32 memiliki 15 pin yang mendukung PWM, beberapa di antaranya
berasal dari timer tingkat lanjut seperti TIM1, yang memiliki fitur tambahan
seperti complementary output. Selain menghasilkan sinyal PWM, timer
juga bisa digunakan untuk mengukur sinyal eksternal (input capture),
menghasilkan sinyal berbasis waktu (output compare), dan membuat satu
pulsa berdasarkan trigger (one pulse mode). PWM sering digunakan untuk
mengontrol kecepatan motor, mengatur kecerahan LED, dan berbagai
aplikasi berbasis waktu lainnya.
Pada Raspberry Pi Pico, terdapat blok PWM yang terdiri dari 8 unit
(slice), dan masing-masing slice dapat mengendalikan dua sinyal PWM atau
mengukur frekuensi serta duty cycle dari sinyal input. Dengan total 16
output PWM yang dapat dikontrol, semua 30 pin GPIO bisa digunakan
untuk PWM. Setiap slice memiliki fitur utama seperti penghitung 16-bit,
pembagi clock presisi, dua output independen dengan duty cycle 0–100%,
serta mode pengukuran frekuensi dan duty cycle. PWM pada Raspberry Pi
Pico juga mendukung pengaturan fase secara presisi serta dapat diaktifkan
atau dinonaktifkan secara bersamaan melalui satu register kontrol global,
sehingga memungkinkan sinkronisasi beberapa output untuk aplikasi yang
lebih kompleks.
1.4.2 ADC
ADC atau Analog to Digital Converter merupakan salah satu perangkat
elektronika yang digunakan sebagai penghubung dalam pemrosesan sinyal
analog oleh sistem digital. Fungsi utama dari fitur ini adalah mengubah
sinyal masukan yang masih dalam bentuk sinyal analog menjadi sinyal
digital dengan bentuk kode-kode digital.
Pada mikrokontroler STM32, terdapat dua ADC (Analog-to-Digital
Converter) 12-bit yang masing-masing memiliki hingga 16 kanal eksternal.
ADC ini dapat beroperasi dalam mode single-shot atau scan mode. Pada
scan mode, konversi dilakukan secara otomatis pada sekelompok input
analog yang dipilih. Selain itu, ADC ini memiliki fitur tambahan seperti
simultaneous sample and hold, interleaved sample and hold, serta single
shunt. ADC juga dapat dihubungkan dengan DMA untuk meningkatkan
efisiensi transfer data. Mikrokontroler ini dilengkapi dengan fitur analog
watchdog yang memungkinkan pemantauan tegangan hasil konversi dengan
akurasi tinggi, serta dapat menghasilkan interupsi jika tegangan berada di
luar ambang batas yang telah diprogram. Selain itu, ADC dapat
disinkronkan dengan timer internal (TIMx dan TIM1) untuk memulai
konversi, pemicu injeksi, serta pemicu DMA, sehingga memungkinkan
aplikasi untuk melakukan konversi ADC secara terkoordinasi dengan timer.
Raspberry Pi Pico memiliki empat ADC (Analog-to-Digital Converter)
12-bit dengan metode SAR, tetapi hanya tiga kanal yang dapat digunakan
secara eksternal, yaitu ADC0, ADC1, dan ADC2, yang terhubung ke pin
GP26, GP27, dan GP28. Kanal keempat (ADC4) digunakan secara internal
untuk membaca suhu dari sensor suhu bawaan. Konversi ADC dapat
dilakukan dalam tiga mode: polling, interrupt, dan FIFO dengan DMA.
Kecepatan konversi ADC adalah 2μs per sampel atau 500 ribu sampel per
detik (500kS/s). Mikrocontroller RP2040 berjalan pada frekuensi 48MHz
yang berasal dari USB PLL, dan setiap konversi ADC membutuhkan 96
siklus CPU, sehingga waktu samplingnya adalah 2μs per sampel.
1.4.3 INTERRUPT
Interrupt adalah mekanisme yang mdapat diproses lebih dulu seperti memiliki prioritas tertinggi. Misalnya, saat
prosesor menjalankan tugas utama, ia juga dapat terus memantau apakah ada
kejadian atau sinyal dari sensor yang memicu interrupt. Ketika terjadi
interrupt eksternal, prosesor akan menghentikan sementara tugas utamanya
untuk menangani interrupt terlebih dahulu, kemudian melanjutkan eksekusi
normal setelah selesai menangani interrupt tersebut. Fungsi yang menangani
interrupt disebut Interrupt Service Routine (ISR), yang dieksekusi secara
otomatis setiap kali interrupt terjadi.
Pada STM32F103C8, semua pin GPIO dapat digunakan sebagai pin
interrupt, berbeda dengan Arduino Uno yang hanya memiliki pin tertentu
(misalnya pin 2 dan 3). Untuk mengaktifkan interrupt di STM32
menggunakan
Arduino
IDE,
digunakan
fungsi
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode). Parameter pin
menentukan pin mana yang digunakan untuk interrupt, ISR adalah fungsi
yang dijalankan saat interrupt terjadi, dan mode menentukan jenis perubahan
sinyal yang memicu interrupt. Mode yang tersedia adalah RISING (dari
LOW ke HIGH), FALLING (dari HIGH ke LOW), dan CHANGE (baik dari
LOW ke HIGH maupun HIGH ke LOW). Saat menggunakan lebih dari satu
interrupt secara bersamaan, terkadang perlu memperhatikan batasan tertentu
dalam pemrograman.
Pada RP2040, setiap inti prosesor dilengkapi dengan ARM Nested
Vectored Interrupt Controller (NVIC) yang memiliki 32 jalur interrupt.
Namun, hanya 26 jalur pertama yang digunakan, sedangkan jalur IRQ 26
hingga 31 tidak aktif. Setiap NVIC menerima interrupt yang sama, kecuali
untuk GPIO, di mana setiap bank GPIO memiliki satu interrupt per inti. Ini
berarti, misalnya, core 0 dapat menerima interrupt dari GPIO 0 di bank 0,
sementara core 1 menerima interrupt dari GPIO 1 di bank yang sama secara
independen. Jika diperlukan, inti prosesor masih bisa dipaksa masuk keemungkinkan suatu instruksi atau
perangkat I/O untuk menghentikan sementara eksekusi normal prosesor agar interrupt handler dengan menulis bit 26 hingga 31 pada register NVIC ISPR.
1.4.4 MILLIS
Fungsi millis() pada mikrokontroler, seperti pada platform Arduino
dan STM32 (dengan HAL), digunakan untuk menghitung waktu dalam
milidetik sejak perangkat mulai berjalan. Berbeda dengan delay(), yang
menghentikan eksekusi program selama waktu tertentu, millis()
memungkinkan sistem untuk menjalankan beberapa tugas secara bersamaan
tanpa menghentikan proses lainnya. Hal ini berguna dalam aplikasi yang
memerlukan multitasking berbasis waktu, seperti pengendalian sensor,
komunikasi serial, atau implementasi sistem real-time. Dalam STM32
dengan
HAL, millis() dapat diimplementasikan menggunakan
HAL_GetTick(), yang mengandalkan interrupt timer internal untuk
mencatat waktu yang terus berjalan sejak mikrokontroler diaktifkan.
Sementara itu, pada platform seperti Raspberry Pi Pico yang sering
diprogram
menggunakan
MicroPython,
fungsi
utime.ticks_ms()
menyediakan fungsionalitas yang sepadan. Fungsi ini mengembalikan nilai
penghitung milidetik yang bersifat monotonik (terus bertambah) sejak
sistem dimulai atau modul utime dimuat. Sama seperti millis() dan
HAL_GetTick(), nilai ticks_ms() juga akan mengalami wrap-around
(kembali ke nol) setelah mencapai batasnya, sehingga penggunaan fungsi
utime.ticks_diff() menjadi penting untuk perhitungan selisih waktu yang
akurat dan aman terhadap overflow. Dengan demikian, utime.ticks_ms()
memungkinkan implementasi pola penjadwalan dan delay non-blocking
yang serupa untuk menciptakan aplikasi yang responsif di lingkungan
MicroPython.
1.4.5 Raspberry Pi Pico
Raspberry Pi Pico adalah papan rangkaian elektronik yang di dalamnya terdapat komponen utama chip mikrokontroler RP2040, yang dirancang dan diproduksi oleh Raspberry Pi Foundatio. Tidak seperti komputer mini raspberry Pi lainnya yang menjalankan sistem operasi seperti Linux, Pico dirancang untuk tugas-tugas yang lebih sederhana dan langsung (embedded system), seperti membaca sensor, mengontrol perangkat, atau melakukan pengolahan data pada tingkat hardware. Adapun spesifikasi dari Raspberry Pi Pico adalah sebagai berikut:
Gambar 1. Raspberry Pi Pico
1.4.6 STM32103C8
STM32F103C8 adalah mikrokontroler berbasis ARM Cortex-M3 yang dikembangkan oleh STMicroelectronics. Mikrokontroler ini sering digunakan dalam pengembangan sistem tertanam karena kinerjanya yang baik, konsumsi daya yang rendah, dan kompatibilitas dengan berbagai protokol komunikasi. Pada praktikum ini, kita menggunakan STM32F103C8 yang dapat diprogram menggunakan berbagai metode, termasuk komunikasi serial (USART), SWD (Serial Wire Debug), atau JTAG untuk berhubungan dengan komputer maupun perangkat lain. Adapun spesifikasi dari STM32F4 yang digunakan dalam praktikum ini adalah sebagai berikut:
Gambar 2. STM32F103C8
A. BAGIAN-BAGIAN PENDUKUNG
1) Raspberry Pi Pico
1. RAM (Random Access Memory)
Raspberry Pi Pico dilengkapi dengan 264KB SRAM on-chip. Kapasitas RAM yang
lebih besar ini memungkinkan Pico menjalankan aplikasi yang lebih kompleks dan
menyimpan data lebih banyak.
2. Memori Flash Eksternal
Raspberry Pi Pico tidak memiliki ROM tradisional. Sebagai gantinya, ia menggunakan
memori flash eksternal. Kapasitas memori flash ini dapat bervariasi, umumnya antara
2MB hingga 16MB, tergantung pada konfigurasi. Memori flash ini digunakan untuk
menyimpan firmware dan program pengguna. Penggunaan memori flash eksternal
pada Pico memberikan fleksibilitas lebih besar dalam hal kapasitas penyimpanan
program.
3. Crystal Oscillator
Raspberry Pi Pico menggunakan crystal oscillator untuk menghasilkan sinyal clock
yang stabil. Sinyal clock ini penting untuk mengatur kecepatan operasi mikrokontroler
dan komponen lainnya.
4. Regulator Tegangan
Untuk memastikan pasokan tegangan yang stabil ke mikrokontroler.
5. Pin GPIO (General Purpose Input/Output):
Untuk menghubungkan Pico ke berbagai perangkat eksternal seperti sensor, motor,
dan LED.
2) STM32
1. RAM (Random Access Memory)
STM32F103C8 dilengkapi dengan 20KB SRAM on-chip. Kapasitas RAM ini
memungkinkan mikrokontroler menjalankan berbagai aplikasi serta menyimpan data
sementara selama eksekusi program.
2. Memori Flash Internal
STM32F103C8 memiliki memori flash internal sebesar 64KB atau 128KB, yang
digunakan untuk menyimpan firmware dan program pengguna. Memori ini
memungkinkan penyimpanan kode program secara permanen tanpa memerlukan
media penyimpanan eksternal
3. Crystal Oscillator
STM32F103C8 menggunakan crystal oscillator eksternal (biasanya 8MHz) yang
bekerja dengan PLL untuk meningkatkan frekuensi clock hingga 72MHz. Sinyal clock
yang stabil ini penting untuk mengatur kecepatan operasi mikrokontroler dan
komponen lainnya.
4. Regulator Tegangan
STM32F103C8 memiliki sistem pengaturan tegangan internal yang memastikan
pasokan daya stabil ke mikrokontroler. Tegangan operasi yang didukung berkisar
antara 2.0V hingga 3.6V.
5. Pin GPIO (General Purpose Input/Output)
STM32F103C8 memiliki hingga 37 pin GPIO yang dapat digunakan untuk
menghubungkan berbagai perangkat eksternal seperti sensor, motor, LED, serta
komunikasi dengan antarmuka seperti UART, SPI, dan I²C.
Komentar
Posting Komentar