M2 - PWM, ADC, INTERRUPT, & MILLIS
PWM,ADC,INTERRUPT & MILLIS
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
3.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 (%).
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.
3.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.
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.
3.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.
3.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:
Komentar
Posting Komentar