Praktik dasar PWM dengan Arduino

[ [ Contoh kode dasar untuk Arduino ] ]

Dalam upaya untuk dapat melakukan percobaan penyakelaran menggunakan PWM dengan baik, sejauh ini sudah ada dua artikel yang disusun untuk memudahkan proses belajar. Yang pertama fokus pada frekuensi, periode, dan duty cycle. Yang kedua lebih fokus pada proses pencarian nilai besaran rata-rata (average) dan rms.

Pembangkitan gelombang PWM dapat dilakukan dengan beberapa cara dan menggunakan beberpa komponen/alat yang berbeda. Di laboratorium beberapa peralatan yang berbeda sudah coba dipraktikkan agar mahasiswa memiliki wawasan lebih dan mampu melakukan evaluasi mengenai trade-off untuk masing-masing alat. Penting juga untuk diingat bahwa dalam proses pembelajaran di perguruan tinggi (baik akademik maupun vokasi), kepraktisan semata bukanlah satu-satunya pertimbangan utama. Ada hal-hal lain yang terkadang lebih penting, berkaitan dengan proses pembentukan sikap, pelatihan kemampuan untuk berpikir kritis, information literacy, dan cara berpikir ilmiah.

Untuk kepentingan pembelajaran, sistem Arduino sangat baik untuk dipakai sebagai sarana untuk memahami PWM (Pulse Width Modulation). Pada sistem ini pengguna dapat mempelajari dari pengaturan yang paling eksplisit sampai ke pengaturan yang otomatis dengan menggunakan pustaka (library).

Menurut saya ada dua cara dalam hal penggunaan Arduino untuk mempelajari PWM. Sebut saja pendekatan educational dan pendekatan practical. Banyak orang (termasuk mahasiswa) cenderung untuk langsung belajar hanya dengan pendekatan praktis. Cara ini sangat tidak menguntungkan, akan mengganggu pengubahan potensi menjadi capaian pembelajaran dengan kedalaman yang baik. Perlu diingat bahwa perguruan tinggi baik akademis maupun vokasi bukanlah lembaga kursus keterampilan. Ada hal-hal yang eksplisit maupun implisit, langsung maupun tidak langsung yang perlu dipelajari untuk memperoleh tingkat pemahaman yang lebih baik. Mengenai pengetahuan praktis (know-how) saat ini sering dapat dipelajari dengan mudah dan singkat dengan bantuan Internet. Beberapa contoh sudah sering diberikan di situs ini dan bahkan nanti di dalam artikel ini sendiri. Baik berupa kutipan, rujukan, maupun tautan (link).

Cara pertama, cara educational menggunakan contoh kode Blink yang telah tersedia sebagai cotoh di Arduino IDE. Pengguna dilatih untuk secara langsung melihat dampak/akibat dari perubahan parameter (variabel) atau bahkan perubahan kode. Cara pengaturan yang ‘eksplisit’ ini memang kurang praktis, baris kode menjadi lebih panjang. [Update] Bahkan akurasinya pun bukan yang paling baik. Tetapi sekali lagi perlu diingat tujuan utama pada lingkungan belajar di perguruan tinggi berbeda dengan di lingkungan produksi. Setelah pemahaman dasar yang cukup bisa diperoleh, setelah nuansa/’feel’ dan attitude yang tepat bisa didapat maka perlihan ke cara lain yang lebih praktis tidak begitu sulit untuk dilakukan.

Cara kedua adalah pendekatan cara produksi. Di bagian “Sumber belajar” di akhir artikel ini sudah saya coba kumpulkan cukup banyak bahan belajar lanjutan. Isinya antara lain pengembangan penggunaan PWM dengan mengacu pada fasilitas dasar yang disediakan oleh sistem Arduino, yaitu dengan memanggil fungsi analogWrite(). Penggunaan fungsi ini untuk mendapatkan sinyal PWM tentu jauh lebuh praktis dari cara pertama, lagi pula cara ini akan membebaskan prosesor untuk melakukan tugas yang lain. [Update] Selain dengan cara mempergunakan fungsi millis(). Namum dalam belajar cara standar ini sebaiknya dipakai setelah mempelajari cara pertama.

Untuk dapat memahami penggunaan cara pertama (modifikasi kode Blink) dengan baik, mahasiswa perlu benar-benar paham tentang frekuensi, periode, dan duty cycle

Kode contoh Blink dapat diperoleh di Arduino IDE dengan mencarinya seperti pada contoh berikut:

Gambar 1. Mencari kode contoh Blink di Arduino IDE

Berikut adalah isi kode asli dari Blink:

/*
  Blink

  Turns an LED on for one second, then off for one second, repeatedly.

  Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO
  it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to
  the correct LED pin independent of which board is used.
  If you want to know what pin the on-board LED is connected to on your Arduino
  model, check the Technical Specs of your board at:
  https://www.arduino.cc/en/Main/Products

  modified 8 May 2014
  by Scott Fitzgerald
  modified 2 Sep 2016
  by Arturo Guadalupi
  modified 8 Sep 2016
  by Colby Newman

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/Blink
*/

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}

Kode Blink yang asli dibuat untuk demonstrasi kedip LED. Umumnya tiap papan Arduino (semisal Uno atau Nano) telah dilengkapi LED yang dapat dipakai sebagai indikator. Pada Arduino Uno dan Arduino Nano, LED_BUILTIN merupakan konstanta yang mengacu pada Pin 13. Untuk keperluan praktik, pin 13 ini bisa diganti oleh pin lain selama pin pengganti tersebut juga merupakan pin yang memiliki kemampuan untuk mengeluarkan sinyal PWM. Pada gambar Arduino Uno pinout maupun Arduino Nano pinout pin-pin itu ditandai dan ditulis sebagai “PWM pin”.

Pada bagian ini kita bisa memulai secara bertahap melakukan modifikasi kode Blink sehingga bisa sesuai dengan keperluan pembelajaran praktik penyakelaran PWM. Misalnya bisa dipakai untuk pembelajaran praktik penyakelaran Mosfet.

Berikut adalah kode modifikasi pertama untuk Arduino Blink:

/*
	Kode modifikasi penyakelaran Mosfet dengan PWM
*/

// const uint8_t MOSFET_PWM = 3;
const byte MOSFET_PWM = 3;

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin xxx as an output.
  pinMode(MOSFET_PWM, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(MOSFET_PWM, HIGH);  
  // delay(500);
  delayMicroseconds(500);         
  digitalWrite(MOSFET_PWM, LOW);   
  // delay(500);
  delayMicroseconds(500);        
}

Pada kode di atas, di baris 6 saya telah mempergunakan konstanta baru yaitu MOSFET_PWM. Penamaan ini bebas sepanjang mematuhi pengaturan dari tata cara kode oleh Arduino. Untuk penundaan (delay) terdapat dua pilihan, yaitu delay() dan delayMicroseconds(). Pendundaan yang pertama berlangsung dalam orde millisecond sedangkan yang kedua dalam orde microsecond. Penundaan yang kedua dipakai jika anda perlu untuk menghasilkan PWM dalam frekuensi yang lebih tinggi. Artinya periode satu siklus penuh sinyal akan semakin singkat.

Salah satu kelemahan cara ini adalah bahwa akan ada timing verhead, ada waktu yang dihabiskan untuk menjalankan kode beralih dari satu loop ke loop lain. Pada tahap mula belajar, ketidakakuratan ini gampang untuk diabaikan. Tetapi pada kode produksi, cara lain yang lebih baik perlu dilakukan/dipilih.

Kode kemudian bisa disimulasikan dengan UnoArdusim, sebuah simulator Arduino Uno yang bisa dipakai dengan bebas kerena secarala legal memang gratis. Sekadar agar tampilannya bisa dilihat dengan mudah maka pada simulasi waktu penundaan diganti menjadi lebih lama.

Gambar 2.  Simulasi dengan UnoArdusim

Berikut ini adalah capture simulasi untuk penundaan sebesar 50 ms.

Gambar 3.  PWM 50%, 50 ms, pin 3

Setelah berhasil melakukan simulasi dengan software berikutnya kita bisa melakukan simulasi dengan hardware. Bergantung pada beberapa faktor, dalam engineering (kerekayasaan) orang sering perlu melakukan simulasi dengan software terlebih dahulu bahkan sebelum mencobanya dengan prototype perangkat keras. Meskipun sepertinya ‘bertele-tele’ dan menyulitkan, langkah sistematis ini justru seringkali menyelamatkan dan menghindarkan banyak kesulitan yang tidak perlu.

Untuk bisa mempergunakan perangkat keras Arduino dengan aman, ada baiknya memperhatikan ilustrasi sistem Arduino Uno dan Arduino Nano berikut:

Gambar 4. Arduino Uno pinpout

Gambar 5. Arduino Nano pinout

 

Pengujian dengan perangkat keras

Pengujian dengan perangkat keras Arduino dilakukan dengan bantuan logic analyzer dan oscilloscope. Kedua instrumen itu memungkinkan kita untuk lebih mudah melihat aksi ON/OFF dari pin Arduino bahkan untuk rentang waktu yang sangat singkat.

Gambar 6. Pengujian dengan perangkat keras

Modifikasi kode untuk contoh penyakelaran yang lebih cepat.

/*
	Kode modifikasi penyakelaran Mosfet dengan PWM
*/

// const uint8_t MOSFET_PWM = 3;
const byte MOSFET_PWM = 3;

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin xxx as an output.
  pinMode(MOSFET_PWM, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(MOSFET_PWM, HIGH);  
  // delay(500);
  delayMicroseconds(50);         
  digitalWrite(MOSFET_PWM, LOW);   
  // delay(500);
  delayMicroseconds(50);      
}

Hasilnya akan terlihat seperti berikut di logic analyzer:

Gambar 7. Hasil pengujian untuk penggaturan penundaan 50 μs

Gambar 8. Setup pengujian dengan oscillocope 100 MHz, 1 GSa/s

Gambar 9. Hasil pengukuran dengan oscilloscope

Dengan memberikan penundaan sebesar 50 μs saat rentang ON dan 50 μs saat rentang OFF, sepintas kita bisa berharap akan mendapatkan periode sebesar 100 μs (0,100 ms). Ini artinya gelombang itu akan memiliki frekuensi sebesar 10 kHz dengan duty cycle sebesar 50 %. Tetapi kalau melihat pada Gambar 7, frekuensi gelombang yang diukur tidak memiliki frekuensi setinggi 10 kHz, tetapi hanya 9,44 kHz (karena periodenya sebesar 0,1059 ms). Hal seperti ini dapat kita gunakan untuk berlatih penalaran dan penyusunan hipotesis.

Dugaan pertama adalah selisih terjadi karena keterbatasan kemampuan alat ukut logic analyzer yang dipakai. Dugaan kedua adalah karena memang gelombang penyakelaran yang dihasilkan oleh papan Arduino memang tidak secepat yang diharapkan. Untuk lebih mempersempit jumlah dugaan akan kemungkinan penyebab dan untuk melakukan pembuktian, diperlukan alat ukur yang berbeda dan diusahakan lebih baik dari yang dipakai sebelumnya.

Saya mempergunakan oscilloscope seperti pada Gambar 8 untuk mengukur sinyal yang sama. Hasilnya terlihat pada Gambar 9, frekuensi yang diukur juga tidak mencapai 10 kHz (periode 100 μs atau 0,10 ms). Sampai di sini, sudah patut diduga bahwa letak masalahnya bukan pada kedua alat ukur (meskipun kemungkinan itu memang masih ada). Kemungkinan terbesarnya ada pada papan Arduino itu sendiri.

Apakah yang menyebabkan papan/sistem Arduino tidak mampu membangkitkan penyakelaran hingga mencapai 10 kHz? Ada beberapa kemungkinan, tetapi untuk contoh ini sebenarnya mudah ditelusuri (salah satu) faktor yang menyebabkan. Cek fakta, lihat kembali ke kode program. Sekalipun memang benar penundaan untuk pulse width adalah sebesar 50 μs tetapi jangan dilupakan di sana terdapat baris-baris kode lain yang perlu dieksekusi oleh mikrokontroler. Kode-kode ini dalam dialek bahasa C memerlukan waktu untuk juga dieksekusi. Terlebih lagi untuk high-level language, waktu yang diperlukan umumnya lebih lama daripada bahasa rakitan (assembly). Hal semacam ini sering disebut sebagai overhead time.

Sudah sering disampaikan bahwa di engineering (rekayasa), pada banyak keadaan dengan kedalaman yang berbeda-beda, selalu diperlukan apa yang disebut sebagai model. Ini adalah wakil dari kondisi yang sebenarnya, dan tentu saja tidak sama persis dengan aslinya. Pemodelan ini membawa pada konsep lain, yaitu approximation. Untuk banyak hal, sistem fisik di alam semesta ini, hanya dapat ditangani dengan aproksimasi atau pendekatan. Misalnya suatu model diode tidak perlu harus sama persis dengan diode yang sesungguhnya. Ada hal-hal, ada aspek-aspek tertentu yang bisa diabaikan. Pengabaikan ini pun diatur/dilakukan dalam beberapa tingkat, sesuai keperluan kedalaman informasi.

Prinsip yang sama juga berlaku pada contoh kode program di atas ini. Penyakelaran dengan sinyal sebesar 10 kHz (periode 0,10 ms) dan duty cycle sebesar 50 % adalah pendekatan/aproksimasi (approximation).

Sebagaimana yang telah diulas di awal artikel, cara educational seperti ini sengaja dipilih untuk mengawali pembelajaran dan untuk awal praktik di laboratorium agar mahasiswa bisa melatih penalarannya dengan lebih baik. Juga berkenalan dengan ketidakidealan sistem perangkat lunak dan perangkat keras.

 

Langkah berikutnya bandingkan antara penyakelaran dengan cara educational yang telah dicoba sebelumnya dengan penggunaan fungsi analogWrite() pada pin 3.

Variasi kode yang ketiga:

/*
	Kode modifikasi penyakelaran Mosfet dengan PWM
*/

// const uint8_t MOSFET_PWM = 3;
const byte MOSFET_PWM = 3;

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin xxx as an output.
  pinMode(MOSFET_PWM, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(MOSFET_PWM, HIGH);  
  // delay(500);
  delayMicroseconds(150);         
  digitalWrite(MOSFET_PWM, LOW);   
  // delay(500);
  delayMicroseconds(1870);     
}

Gambar 10. Pengukuran penyakelaran pin 3 dari variasi kode yang ketiga

Variasi kode yang keempat:

/*

Uji coba PWM


*/

#define PWM_PIN_A 3

const uint8_t pwmValue01 = 20;


void setup(void){
	pinMode(PWM_PIN_A, OUTPUT);
}


void loop(void){
	analogWrite(PWM_PIN_A, pwmValue01);
}

Gambar 11. Pengukuran penyakelaran pin 3 dari variasi kode yang keempat

Gambar 11 adalah hasil pengukuran terhadap variasi kode yang keempat, yang merupakan ‘kode produksi’. Cara ini lebih banyak akan dipergunakan saat pengembangan sistem yang praktikal daripada cara educational sebelumnya. Cara ini lebih singkat dalam penulisan kode program dan membebaskan mikrokontroler untuk dapat melakukan hal lain selain menunggu habisnya waktu tunda pada kode.

Pada Arduino Uno dan Arduino Nano terdafat dua frekuensi PWM secara default. Yang pertama adalah 490 Hz dan dan yang kedua 980 Hz (pin 5 dan pin 6). Kedua frekuensi ini berdasarkan pengaturan produsen dan tidak mudah untuk diubah. Cara pengubahan nilai frekuensi PWM ini dapat dicari di bagian link di akhir artikel.

Gambar 10 adalah hasil pengukuran pada pembangkitan PWM dengan menggunakan variasi kode yang ketiga. Bisa dilihat bahwa dengan cara ini pengguna dapat mendekati nilai frekuensi default Arduino (490 Hz) dan duty cycle yang hampir sama. Waku penundaan untuk tetap ON adalah sebesar 150 μs dan penundaan untuk tetap OFF sebesar 1870 μs. Jika saja waktu yang dipakai untuk semua kode lain dapat diabaikan, maka duty cycle akan sebesar 7,426 %. Ada pun hasil pengukuran pada pin 3 dengan logic analyzer menunjukkan duty cycle sebesar 7,502 %.

Pada kode variasi yang keempat, nilai 20 dari 256 (8-bit) menunjukkan perbandingan 7,813 %. Pada Gambar 11, nilai duty cycle terukur dan terhitung sebesar 7,845 %. Bandingkan hasil ini dengan hasil dari variasi kode yang ketiga.

Sampai di sini anda seharusnya sudah bisa menentukan nilai duty cycle, periode dan frekuensi berdasarkan nilai penundaan yang diberikan pada kode program variasi yang ketiga di atas. Jika masih ada kebingungan atau ada yang terlupakan, silakan baca kembali artikel di link ini. Nah bisakah anda melakukan hal yang sebaliknya? Jika anda diberikan sebuah nilai frekuensi dan sebuah nilai duty cycle, bisakah anda menentukan nilai masing-masing penundaan di kode program ‘variasi kode yang ketiga’?

 

Lihatlah kode program yang telah di-capture berikut ini, dapatkah anda memahaminya?

Gambar 12. Kode program pengembangan, variasi kelima

Gambar 13. Hasil pengukuran logic analyzer terhadap kerja kode variasi kelima

Gambar 14. Keluaran komunikasi serial

Anda bisa mengubah-ubah kode variasi kelima dan melakukan modifikasi yang sesuai untuk pembelajaran anda.

 

Kode dasar variasi ketiga ini dipakai untuk melakukan eksperimen pada praktikum penyakelaran Mosfet. Pada dasarnya variasi-variasi kode program ini dapat dipakai untuk penyakelaran BJT, Mosfet, IGBT, SCR, TRIAC, LED, dan komponen lain dengan rangkaian yang sesuai.

 

[intense_tabs direction=”right” active_tab_background_color=”#000000″ active_tab_font_color=”#ffff00″ trigger=”click”] [intense_tab title=”Video01″ border=”3px solid #e8e8e8″ link_target=”_self” content_background_color=”#000000″ content_font_color=”#ffffff” icon_size=”1″ icon_position=”left”]

[/intense_tab] [intense_tab title=”Video02″ border=”3px solid #e8e8e8″ link_target=”_self” icon_size=”1″ content_background_color=”#000000″ content_font_color=”#ffffff” icon_position=”left”]

[/intense_tab] [intense_tab title=”Video03″ border=”3px solid #e8e8e8″ link_target=”_self” icon_size=”1″ content_background_color=”#000000″ content_font_color=”#ffffff” icon_position=”left”]

[/intense_tab] [intense_tab title=”Video04″ border=”3px solid #e8e8e8″ link_target=”_self” icon_size=”1″ content_background_color=”#000000″ content_font_color=”#ffffff” icon_position=”left”]

[/intense_tab] [intense_tab title=”Video05″ border=”3px solid #e8e8e8″ link_target=”_self” icon_size=”1″ content_background_color=”#000000″ content_font_color=”#ffffff” icon_position=”left”]

[/intense_tab] [intense_tab title=”Video06″ border=”3px solid #e8e8e8″ link_target=”_self” icon_size=”1″ content_background_color=”#000000″ content_font_color=”#ffffff” icon_position=”left”]

[/intense_tab] [intense_tab title=”Video07″ border=”3px solid #e8e8e8″ link_target=”_self” icon_size=”1″ content_background_color=”#000000″ content_font_color=”#ffffff” icon_position=”left”]

[/intense_tab] [/intense_tabs]

 

Sumber belajar:

 

Save

7 Comments

  1. maaf pak semisal 24 pulsa konstan setelahnya 1 berdiri pulsa lagi dan meneruskan 24 pulsa secara terus menerus mempengaruhi nilai frequensinya pak sermisal contoh pada sensor ckp dan cmp pada kendaraan pak

    • Memang sebagaimana judul dan isinya halaman ini ditujukan sebagai dasar permulaan untuk memahami tentang PWM. As simple as possible.Baru kemudian kedalamannya dan aplikasinya akan perlu disesuaikan dengan masing-masing keperluan. Sebagian penggunaan lebih kritis dan penggunaan yang lainnya.Di beberapa aplikasi mungkin akan terganggu dengan waktu yang dipakai oleh uC untuk melakukan housekeeping.

      Terima kasih infonya. Untuk lebih menjelaskan penekanan tujuan artikel nanti saya coba perbarui lagi dengan pengulangan di beberapa tempat.

  2. Maaf pak mau bertanya.
    . Untuk mengatur pwm mulai dari 10Hz sampai 20Khz itu bagaimana… Lalu untuk hasil frekuensinya agar dapat ditampilkan di serial monitor

Leave a Reply to Wicak Cancel reply

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