Memprogram STM32 Nucleo dengan STM32CubeIDE Bagian 2: Mengatur PWM, Frekuensi dan Duty Cycle

Kembali lagi ke postingan part 2 masih tentang mikrokontroller STM32, kali ini penulis ingin menulis tentang bagaimana cara membuat PWM pada STM32, mengatur frekuensi serta duty cycle sesuai dengan yang diinginkan karena kebutuhan frekuensi bergantung pada aplikasi/projek yang akan kita buat.

Jika pembaca mencari artikel ini di google tentu sudah tahu apa yang dimaksud dengan PWM sehingga tidak perlu dijelaskan lagi. Untuk yang belum paham mungkin di kesempatan lain penulis akan membahas apa itu PWM.

Untuk membuat PWM kita membutuhkan fungsi TIMER, atau TIMx pada STM32 dimana x adalah nomor TIMER. Pada STM32F446RE mempunyai 14 TIMER dari TIM1 hingga TIM14, disini kita akan mencoba menggunakan TIM1 dengan frekuensi PWM yang dibangkitkan sebesar 2KHz.

Seperti biasa, buat Project Baru terus beri nama, kemudian pilih board yang digunakan, maka akan tampil konfigurasi Pinout.

Pada Category, pilih Timers kemudian klik TIM1, Pada Clock Source pilih Internal Clock
kita menggunakan Channel 1 untuk membangkitan PWM dengan cara memilih PWM Generation CH1, seperti yang terlihat gambar dibawah

Masuk ke tab Clock Configuration, maka akan terlihat konfigurasi clock bawaan sistem nya

Pada sisi kanan terlihat ada beberapa Bus dengan nilai frekuensi konfigurasi Clocknya, yang terpenting adalah APB1 dan APB2. Bus ini terhubung ke periferal dan fitur tertentu terutama TIMER yang bisa dilihat di datasheet berikut

Pada halaman 57-58, terlihat hubungan antara periferal dengan bus. Jika dilihat pada tabel diatas periferal TIM1 yang kita gunakan untuk membangkitkan PWM ini berada di bus APB2. sehingga APB2 time clock yang besar frekuensinya sebesar 84MHz ini mempengaruhi pengaturan yang akan kita buat selanjutnya karena TIM1 ini berada di bus APB2.

Kembali lagi ke tab Pinout & Configuration pada CubeIDE
Karena frekuensi clock APB2 sebesar 84MHz, sedangkan frekuensi PWM yang kita inginkan adalah 2KHz, maka harus diturunkan terlebih dahulu menggunakan Prescaler. Berdasarkan datasheet di bagian TIM1&TIM8 main features halaman 449, Prescaler ini mempunyai besar 16-bit sehingga rentang nilainya antara 1 hingga 65536

Kita tahu bahwa frekuensi APB2 sebesar 84MHz, penulis disini menggunakan prescaler sebesar 42 sehingga frekuensi yang dihasilkan adalah 2MHz (84MHz/42 = 2MHz) atau 2 juta tick dalam satu detik (2 juta tick per detik).
Agar PWM menjadi 2KHz atau 2 ribu tick per detik harus dibagi lagi di bagian Counter Period. Sesuai dengan namanya, Counter Period ini akan menghitung hingga waktu tertentu dalam satu period nya. Jika clock nya 2.000.000 tick dalam satu detik jika ingin diubah menjadi 2000 tick dapat dibagi dengan 1000 (2000000/1000 = 2000 atau 2 KHz), sehingga Counter Period nya sebesar 1000.

Oleh karena itu, Prescaler diisi dengan 42-1, Counter Period diisi dengan 1000-1. Catatan: terkadang ada beberapa board nucleo yang diisi langsung dengan besar 42 dan 1000 tanpa dikurangi -1 terlebih dahulu.

Lihat gambar pinout

Terlihat bahwa pin PWM (TIM1_CH1) berada di PA8 atau D7, setelah itu generate code dengan menekan ikon gear, kita selesai mengkonfigurasi menjadi pin PWM.
Sekarang buka file main.c untuk mulai menulis kode

Masukan kode berikut didalam int main diluar while loop

Fungsi diatas adalah untuk memulai membangkitankan fungsi PWM. Jika kita menggunakan TIM2, &htim1 bisa diganti dengan &htim2 sesuai yang digunakan, sama juga jika kita menggunakan channel 2 maka TIM_CHANNEL_1 dapat diganti dengan TIM_CHANNEL_2

Selanjutnya adalah mengatur duty cycle, besarannya dapat diatur menggunakan fungsi berikut

Ingat ga sebelumnya kita memasukkan nilai counter period sebesar 1000, karena itu nilai maksimal duty cycle nya juga sebesar 1000. Kalo di Arduino nilai maksimal duty cycle kan cuman 255. Kalo kita ingin duty cycle sebesar 50%, maka

Jika ingin 33% maka

Full Program int main

Gimana kalo frekuensinya saya ubah menjadi 10KHz dengan APB2 clock tetap sebesar 84MHz?

saya bisa menggunakan kombinasi berikut

Prescaler = 42-1
Counter Period = 200-1

Prescaler = 84-1
Counter Period = 100-1

Prescaler = 2-1
Counter Period = 4200-1

Semakin besar nilai counter period maka rentang duty cycle juga semakin besar dan resolusinya semakin tinggi. Berikut merupakan pembacaan osiloskop

Terima Kasih kepada para pembaca, sekian tulisan tentang PWM. Mohon koreksinya jika ada tulisan yang kurang tepat di kolom komentar

One thought on “Memprogram STM32 Nucleo dengan STM32CubeIDE Bagian 2: Mengatur PWM, Frekuensi dan Duty Cycle

  • 14/08/2021 at 14:39
    Permalink

    terimakasih kak, akhirnya motor saya bisa bergerak juga. kemudian saya ingin bertanya, bagaimana cara agar kita bisa mengatur gerakan motor kira seperti pause, kemudian bergerak lagi ketika ditekan? terimakasih

    Reply

Leave a Reply

Your email address will not be published.