12bit PWM menggunakan modul PCA9685
1. Apa itu PWM dan kegunaannya
PWM adalah kependekan dari Pulse Width Modulation yang dapat diartikan sebagai gelombang pulsa kotak yang bisa diatur durasi ON atau OFF nya. Nilai yang menggambarkan perbandingan durasi ON terhadap panjang gelombang disebut sebagai siklus kerja atau duty-cycle. Duty-Cycle 50% berarti pada 100% panjang gelombang, 50% nya adalah ON dan 50% sisanya adalah OFF seperti pada gambar berikut.
Duty-Cycle 80% berarti pada 100% panjang gelombang, 80% nya adalah ON dan 20% sisanya adalah OFF seperti pada gambar berikut.
Duty-Cycle PWM berbeda dengan frekuensi, Frekuensi adalah banyaknya gelombang dalam 1 detik (satuan waktu) sedangkan duty-cycle PWM adalah besarnya prosentase ON pada satu gelombang.
Contoh:
- Frekuensi 10 Hz, Duty-Cycle 60%, dalam 1 detik ada 10 pulsa, panjang satu pulsa = 1 detik/10 = 100ms, dan dalam 100ms tersebut 60ms = ON, 40ms = OFF
- Frekuensi 10 Hz, Duty-Cycle 80%, dalam 1 detik ada 10 pulsa, panjang satu pulsa = 1 detik/10 = 100ms, dan dalam 100ms tersebut 80ms = ON, 20ms = OFF
- Frekuensi 50 Hz, Duty-Cycle 40%, dalam 1 detik ada 50 pulsa, panjang satu pulsa = 1 detik/50= 20ms, dan dalam 20ms tersebut 8ms = ON, 12ms = OFF
- Frekuensi 50 Hz, Duty-Cycle 80%, dalam 1 detik ada 50 pulsa, panjang satu pulsa = 1 detik/50= 20ms, dan dalam 20ms tersebut 16ms = ON, 4ms = OFF
Kegunaan dari PWM ini umumnya sebagai pengatur intensitas energi atau sebagai jalur komunikasi data secara digital. Sebagai contoh adalah pada penggunaan pengaturan intensitas LED dan pada pengaturan energi heater/pemanas listrik, apabila coil/elemen pemanas tersebut mengikuti signal PWM, maka semakin besar besar duty-cycle nya maka panas yang ditansfer akan semakin besar pula. Berbeda dengan perbedaan frekuensi pada duty cycle yang konstant, walupun frekuensinya lebih cepat namun perbandingan ON dan OFF nya akan selalau konstant sehingga intensitas energi yang ditansfer juga tidak berubah.
2. Menggunakan modul PCA9685
PCA9685 adalah sebuah IC untuk membangkitkan PWM sebanyak 16 jalur dan IC ini mempunyai jalur komunikasi TWI/I2C. Modul PCA9685 banyak sekali dipasaran dengan tampilan seprti pada gambar berikut. Modul ini mempunyai output 16 jalur yang dapat diatur duty-cycle nya secara berbeda untuk masing-masing jalur namun masih dalam frekuensi yang sama.
Berikut adalah contoh wiring diagram untuk mencoba modul ini menggunakan outseal PLC untuk digunakan mengontrol servo motor SG90.
Pengaturan alamat slave dilakukan melalui hardware dengan menyambung atau memutus jumper A0 hingga A5 (lihat gambar). Pin A0 hingga A5 merupakan penyusun bit pada slave adress sesuai dengan gambar berikut.
Pada saat A0 hingga A5 tidak tersambung, maka nilai alamat slave dari PCA9685 adalah 1000000 + R/W. Pada standard penulisan alamat I2C, bit awal adalah bit status Read/Write, sehingga alamat sesungguhnya hanya dari bit kedua hingga ke 8 yakni "1000000" (bin) = 0x40 (hex) = 64 (dec). Anda dapat mengubah alamat I2C dari modul ini melalui pin A0 hingga A5.
Pengaturan PWM untuk modul PCA9685 ini dilakukan menggunakan 2 instruksi khusus pada outseal studio yakni: SETPCA9685 dan PWM9685.
SETPCA9685 digunakan untuk mengatur frekuensi pulsa yang dilakukan dengan mengatur nilai Prescale, sedangkan instruksi PWM9685 digunakan untuk mengatur duty-cycle pada masing-masing jalur.

(gambar detail PWM)
Pada instruksi SETPCA9685, terdapat kolom isian "Prescale". Prescale ini digunakan untuk menentukan frekuensi pada semua output (16 jalur). Frekuensi pada 16 jalur output ini akan selalu sama yang dapat ditentukan melalui persamaan berikut:
clock yang digunakan pada board modul PCA9685 ini adalah clock internal sebesar 25Mhz sehingga persamaan dapat diubah menjadi
Misal: Frekuensi yang diinginkan adalah 200Hz, maka nilai prescale yang harus diberikan adalah
Misal: Frekuensi yang diinginkan adalah 50Hz, maka nilai prescale yang harus diberikan adalah
`"prescale"="pembulatan"("25 MHz"/(4096*50))-1=121`Maximum frekuensi PWM adalah 1526 Hz dicapai dengan nilai prescale = 3
dan minimum frekuensi PWM adalah 24 Hz dicapai dengan nilai prescale = 255
Setelah frekuensi diatur menggunakan instruksi SETPCA9685, maka panjang 1 pulsa dari gelombang yang dibangkitkan akan dicacah menjadi 12bit (4096) secara internal oleh chip PCA9685 tersebut (lihat gambar detail PWM). Dengan pencacahan inilah Pengaturan duty-cycle pada tiap jalur PWM dilakukan menggunakan instruksi PWM9685 pada kolom "Start ON" dan "Start OFF". Berikut kolom-kolom isian pada instruksi PWM9685:
Jalur : Jalur PWM pada module (0~15), 0 = jalur ke 1, 1 = jalur ke 2 dan
15 = jalur ke 16 (terakhir)
Start ON : pada cacah waktu keberapa pulsa
berubah menjadi ON
Start OFF : pada cacah waktu keberapa pulsa berubah
menjadi OFF
Untuk mendapatkan pulsa dengan duty-cycle 50% maka
Start ON = 0
Start OFF = 1/2 dari full (4096) = 2048
Start ON dapat dimulai tidak dari 0 yang menyebabkan terdapat 2 fase OFF dan 1 fase ON pada setiap pulsa (lihat gambar) tetapi akan lebih mudah menganalisanya jika dimulai dari 0
Instruksi SETPCA9685 harus diberikan ke hardware satu kali saja atau tidak berulang-ulang dalam waktu yang sangat cepat sehingga instruksi OSR diperlukan agar instruksi ini hanya di eksekusi sekali saja tepat disaat PLC power mulai
Pada contoh berikut instruksi SETPCA9685 di gunakan untuk mengatur
frekuensi menjadi 50Hz dan di depan instruksi ini diberi instruksi OSR agar
instruksi ini di jalankan sekali saat PLC mulai dijalankan (anak tangga no
0).
Pada anak tangga nomor 1 instruksi PWM9685 digunakan untuk
mengatur jalur pertama pada board modul PCA9685 agar membuat pulsa PWM
dengan duty-cycle 50%.
Pada anak tangga nomor 2 instruksi PWM9685
digunakan untuk mengatur jalur terakhir pada board modul PCA9685 agar
membuat pulsa PWM dengan duty-cycle 25%.
Untuk membuat nilai pengaturan duty-cycle agar dapat diakses melalui HMI/SCADA maka kolom isisan "Start OFF" dapat diikat pada variabel dan agar PLC tidak mengirim signal pengaturan duty-cycle secara terus menerus maka instruksi OSC diperlukan sebelum instruksi PWM9685 seperti pada gambar dibawah ini. Anak tangga nomor 1 dan 2 digunakan untuk memberi nilai awal pada variabel I.1 dan I.3.
Untuk mencoba instruksi ini pada motor servo SG90 maka kita hanya cukup mengatur frekuensi pada 50Hz saja dan mengatur duty cycle agar sesuai dengan pengaturan sudut servo sesuai dengan datasheet SG90