MODUL 2 PWM, ADC, INTERRUPT, & MILLIS
1. Tujuan[Kembali]
a) Memahami cara penggunaan PWM, ADC, Interrupt, dan Millis pada
Development Board yang digunakan
b) Memahami cara menggunakan komponen input dan output yang
mengimplementasikan PWM, ADC, Interrupt, dan Millis pada Development Board
yang digunakan
2. Alat dan Bahan[Kembali]
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
3. Dasar Teori[Kembali]
A.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 (%).
Gambar 1. Duty Cycle
Duty Cycle = tON / ttotal
Ton = Waktu ON atau Waktu dimana tegangan keluaran berada pada posisi
tinggi (high atau 1)
Toff = Waktu OFF atau Waktu dimana tegangan keluaran berada pada posisi
rendah (low atau 0)
Ttotal = 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.
B. 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.
C. INTERRUPT
Interrupt adalah mekanisme yang memungkinkan suatu
instruksi atau perangkat I/O untuk menghentikan sementara eksekusi
normal prosesor agar dapat 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 ke interrupt handler dengan menulis bit 26 hingga 31
pada register NVIC ISPR.
D. 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.
E. 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. Arduino Uno
F. STM32F103C8
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 3. 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