December 5, 2021

Blogna Kang U-2 Man

STM32, Embedded System, Microcontroller, ARM Cortex-M, RTOS, FreeRTOS

LED PWM dengan STM32

5 min read

بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيم

Pada tutorial kali ini, Insya Allah saya akan menjelaskan bagaimana menggunakan fitur Timer yang dimiliki oleh STM32, yaitu sebagai pembangkit sinyal PWM. Sinyal PWM banyak digunakan untuk untuk mengendalikan motor dalam aplikasi robotika atau pun pengendalian mesin industri, digunakan untuk converter daya (dari DC ke AC, DC ke DC, atau AC ke DC), amplifier digital, atau sekedar untuk mengendalikan kecerahan dari sebuah LED seperti yang akan dibahas di tutorial ini.

Bagi yang belum membaca artikel tentang Timer STM32, silakan di-klik link berikut

  1. Pengenalan Timer Bagian 1
  2. Pengenalan Timer Bagian 2
  3. Pengenalan Timer Bagian 3

TENTANG PWM

PWM atau Pulse Width Modulation adalah sebuah metode untuk mengatur daya rata-rata dari sebuah sinyal listrik dengan cara memotong/membagi menjadi bagian diskret. Tegangan rata-rata (dan juga arus rata-rata) dikendalikan dengan cara meng-on off dengan sangat cepat, semakin lama waktu ONnya maka tegangan atau daya akan semakin besar. Dari sinilah istilah PWM berasal, sinyal saat ON adalah pulse, dan mengatur waktu ON artinya mengatur lebar pulsa. Perbandingan antara waktu ON terhadap periode dari sinyal PWM dinamakan dengan duty cycle, biasanya dinyatakan dengan persen (%). Duty cycle 50% artinya waktu ON dan waktu OFF sinyal adalah sama.

Duty Cycle (Source Wikipedia)

Frekuensi juga perlu diperhatikan, biasanya tergantung aplikasi, sebagai contoh untuk lampu dimmer sekitar 120 Hz, di pengendalian motor frekuensi beberapa kHz sampau beberapa puluh kHz. Di ampifier digital atau konversi daya mungkin sampai beberapa ratus kHz. Sumber.

PEMBANGKITAN PWM DI STM32

Dalam tutorial kali ini, saya akan menggunakan board STM32F407 Discovery, namun teknik bisa diterapkan ke board atau type STM32 mana saja.

Board STM32F407 Discovery

PENENTUAN PIN PWM

Langkah pertama adalam menentukan pin mana yang akan dipakai sebagai pin PWM, tidak semua pin bisa dijadikan sebagai pin PWM, hanya pin yang punya fungsi alternatif sebagai channel dari sebuah timer yang bisa digunakan sebagai pembangkit PWM. Ya, walaupun semua pin sebenarnya bisa diprogram untuk mengeluarkan sinyal PWM, namun kalau tidak terhubung ke timer, maka harus dikontrol secara software.

Untuk melihat pin mana yang terhubung ke timer bisa dilihat dari datasheet atau paling gampang menggunakan STM32CubeMX. Tinggal klik pin yang bersangkutan, lalu cek apakah ada fungsi alternatif sebagai channel timer.

Menentukan Pin PWM

Sebagai contoh pin PD13 dari STM32F407VG mempunyai fungsi alternatif sebagai TIM4_CH2, maka pin ini bisa digunakan untuk membangkitkan sinyal PWM. Di board STM32F4 Discovery pin ini terhubung ke LED. Dan semua pin yang terhubung ke LED di board ini juga terhubung ke timer, sehingga semuanya bisa dijadikan sebagai pembangkit sinyal PWM.

Koneksi LED di Board STM32F4 Discovery

AKTIVASI PIN PWM

Setelah ditentukan pin mana yang akan dipakai untuk sinyal PWM, maka fungsi PWM harus diaktifkan di pin tersebut. Di konfigurasi timer yang bersangkutan (dalam hal ini Timer 4/TIM4), klik channel yang terhubung ke pin yang bersangkutan sebagai pembangkit PWM (Channel 2).

Aktivasi pin PWM

PENGATURAN FREKUENSI PWM

Untuk mengatur frekuensi PWM, maka kita perlu mengatur berapa frekuensi timer. Frekuensi timer ini ditentukan oleh sumber clock dari CPU dan nilai pre-scaler atau pembagi.

Konfigurasi ClockS STM32F407

Sumber clock timer untuk STM32F407 ada 2 yaitu

  • Clock Timer APB1, dengan frekuensi 2x frekuensi APB1 dan maksimal sampai 84 MHz
  • Clock Timer APB2, 2x frekuensi APB2, maksimal sampai 168 MHz.

Untuk mengetahui berapa frekuensi sumber clock timer, maka perlu diketahui timer yang digunakan terhubung ke bus APB1 atau APB2, bisa dilihat di blok diagram yang ada di datasheet STM32F407.

Blok Diagram STM32F407

Di STM32F407, TIM4 terhubung dengan bus APB1, maka frekuensi sumber maksimal adalah 84 MHz. Dalam contoh program tutorial ini, frekuensi CPU di-set di 168MHz, dan frekuensi timer APB1 di-set di 84 MHz.

Frekuensi Timer kemudian ditentukan dengan nilai pre-scaler. Rumusnya adalah sebagai berikut:

Pre-Scalar = (Frekuensi Timer APB/Frekuensi Timer) – 1

Sebagai contoh kita menginginkan frekuensi timer adalah 1 MHz, dengan frekuensi APB timer 84 MHz maka nilai pre-skalar adalah:

Pre-Skalar = (84 MHz/1MHz) -1
= 83

Setelah menentukan frekuensi timer, maka frekuensi PWM bisa ditentukan. Untuk menentukan frekuensi sangat mudah, dengan mengisi register auto-reload (TIMx_ARR) yang pada dasarnya adalah mengatur seberapa cepat timer akan overflow ,jika arah cacahan naik. Atau bisa dikatakan merupakan nilai pre-skalar dari frekuensi timer. Di STM32CubeMX parameter ini dinamakan dengan Counter Periode. Dan rumusnya adalah sebagai berikut:

Counter Periode = (Frekuensi Timer/Frekuensi PWM) – 1

Sebagai contoh jika menginginkan frekuensi PWM adalah 400 Hz, maka:

Counter Periode = (1.000.000/400) -1
= 2499

Karena Timer 4 adalah timer 16 bit, maka Pre-Skalar dan Counter Periode adalah bilangan 16 bit.

Lalu bagaimana untuk mengatur duty cycle? Duty cycle diatur dengan mengatur nilai register capture/compare (TIMx_CCRx). Di STM32CubeMx nilai ini dinyatakan sebagai Pulse. Nilai pulse tidak boleh melebihi nilai Counter Periode. Jika nilai Pulse sama dengan nilai Counter Periode ini artinya duty cycle 100%. Sehingga

Pulse =Duty Cycle x Counter Periode

Pengaturan Timer 4 untuk PWM

Pengaturan lain yang perlu diperhatikan adalah CH Polarity, ini seperti gerbang NOT bagi pin PWM, jika CH Polarity bernilai High, maka sinyal PWM akan normal, sedangkan jika bernilai Low maka sinyal PWM akan dibalik (invers).

PWM MULTICHANNEL

Timer biasanya mempunyai beberapa channel, seperti dalam contoh ini Timer 4 mempunyai 4 channel. Semua channel bisa difungsikan sebagai pembangkit sinyal PWM secara mandiri. Namun perlu diingat bahwa, kita hanya bisa mengatur duty cycle untuk masing-masing channel, sedangkan frekuensi tidak. Semua channel akan mempunyai frekuensi yang sama.

INI PROGRAMNYA

Dalam contoh program ini akan memfungsikan pin PD12 dan PD13 sebagai pin PWM. Di board STM32F407 Discovery pin ini terhubung ke LED hijau (PD12) dan LED oranye (PD13). Kedua pin terhubung ke Timer 4 Channel 1 (PD12) dan Channel 2 (PD13). PWM Channel 1 diprogram untuk mengeluarkan sinyal PWM dengan duty cycle 25%, sedangkan Channel 2 duty cycle akan diubah-ubah.

Perlu diperhatikan bahwa, fungsi inisialisasi yang dihasilkan oleh STM32CubeMX tidak menjalankan pembangkit PWM, sehingga harus dijalankan melalui program. Potongan program berikut akan menjalankan pembangkit PWM di channel 1 dan channel 2. Channel 2 diberi nilai duty cycle 50%, sedangkan channel 1 25%.

Dan di loop utama akan mengubah-ubah duty cycle channel 2 (naik turun), sehingga akan terlihat LED orange nyala terang-redup dan sebaliknya secara terus menerus.

Program untuk tutorial ini bisa diunduh di sini.

Semoga bermanfaat.

Visits: 6 Visits: 98004

Leave a Reply

Your email address will not be published. Required fields are marked *

Copyright © All rights reserved. | Newsphere by AF themes.