Bab 10 Pulse-Width Modulation

1. PWM

Pulse-width modulation (PWM) merupakan sinyal kotak dengan durasi HIGH dan LOW yang bervariasi seperti pada Gambar 1. Sinyal PWM akan menghasilkan tegangan rata-rata yang merupakan tegangan pseudo analog. Semakin lama durasi HIGH-nya, maka tegangan rata-rata yang dihasilkan akan semakin besar, dan berlaku sebaliknya.

Tegangan pseudo analog ini dapat digunakan untuk aplikasi pengontrolan kecerahan LED, kecepatan motor DC, atau motor servo. Sinyal PWM ini dibuat dengan menggunakan timer, tetapi pada Arduino sudah terdapat library untuk men-generate sinyal PWM tanpa harus berurusan dengan low-level hardware-nya.

Dengan memvariasikan nilai duty cycle PWM terhadap waktu, maka kita dapat membuat sinyal analog seperti contohnya sinyal sinusoid pada Gambar 3. Sinyal analog seperti ini dapat digunakan untuk pengontrolan LED ataupun kecepatan motor DC.

Titik a merupakan hitungan timer untuk nilai duty cycle, sedangkan titik b merupakan hitungan timer untuk periode. Dari kedua titik tersebut, maka kita bisa menentukan kapan GPIO output harus bernilai HIGH dan LOW. Pada titik a GPIO berubah dari HIGH menjadi LOW, sedangkan pada titik b GPIO berubah dari LOW menjadi HIGH.

2. Library PWM

Pada ESP32, blok untuk men-generate sinyal PWM bernama LED control (LEDC). Fungsi utama blok ini yaitu untuk mengontrol kecerahan LED, akan tetapi sinyal PWM ini juga bisa digunakan untuk kebutuhan lain. ESP32 memiliki 16 channel PWM yang dapat men-generate 16 sinyal PWM yang berbeda.

Ada beberapa fungsi utama yang diperlukan untuk mengkonfigurasi PWM pada ESP32 seperti pada kode berikut ini. Fungsi ledcSetup berfungsi untuk mengkonfigurasi channel PWM. Fungsi ledcAttachPin berfungsi untuk menghubungkan channel PWM dengan pin GPIO output. Fungsi ledcWrite berfungsi untuk menulis nilai duty cycle untuk channel PWM.

double ledcSetup(uint8_t channel, double freq, uint8_t resolution_bits);
void ledcAttachPin(uint8_t pin, uint8_t channel);
void ledcWrite(uint8_t channel, uint32_t duty);

Duty cycle pada program dinyatakan dalam integer (bukan percent) sesuai resolusi yang digunakan. Sebagai contoh jika resolusi PWM 8-bit, maka range nilai duty cycle dari 0-255, sedangkan jika resolusi PWM 10-bit, maka range nilai duty cycle dari 0-1023.

3. Contoh Program

Pada contoh program ini, kita akan mempelajari contoh penggunaan PWM. Contoh program ini menggunakan satu buah LED. Kita akan mengatur kecerahan LED tersebut.

Untuk dapat menjalankan contoh program ini diperlukan beberapa komponen:

  • Development board ESP32

  • 1 buah LED

  • 1 buah resistor 100Ω

  • Breadboard

  • Kabel jumper

Ilustrasi koneksi dari komponen-komponen ke ESP32 ditampilkan pada Gambar 5. Pin yang digunakan untuk menghubungkan komponen-komponen ke ESP32 ditampilkan pada tabel berikut ini. LED tersebut menggunakan rangkaian active-low.

Kode berikut ini menampilkan contoh program pengontrolan LED dengan PWM. Berikut ini penjelasan cara kerja program tersebut:

  • Pada line 2, kita mendefinisikan pin untuk LED.

  • Pada line 5-7, kita mendefinisikan parameter untuk PWM yaitu channel 0, frekuensi 1kHz, dan resolusi 10-bit.

  • Pada line 12, kita melakukan inisialisasi untuk PWM channel 0.

  • Pada line 15, kita menghubungkan channel PWM 0 ke GPIO yang terhubung dengan LED.

  • Pada line 21-25, kita menurunkan kecerahan LED dengan cara menaikan duty cycle PWM dari 0-1023 dengan kenaikan setiap 20 nilai per 25 ms. Perlu diingat bahwa kita menggunakan rangkaian LED active-low, sehingga semakin besar duty cycle-nya, maka LED akan semakin redup. Karena pada kondisi ketika GPIO tersebut HIGH, LED akan mati.

  • Pada line 28-31, kita menaikan kecerahan LED dengan cara menurunkan duty cycle PWM dari 1023-0 dengan penurunan setiap 20 nilai per 25 ms.

pwm-led.ino
// LED pin
#define LEDPIN  25

// Parameter untuk PWM
const int channel = 0;
const int freq = 1000;
const int res = 10;

void setup()
{
  // Inisialisasi PWM
  ledcSetup(channel, freq, res);
  
  // Hubungkan channel PWM ke LED
  ledcAttachPin(LEDPIN, channel);
}

void loop()
{
  // Decrease brightness LED (active-low LED)
  for (int i = 0; i <= 1023; i += 20)
  {
    ledcWrite(channel, i);
    delay(25);
  }
  
  // Increase brightness LED (active-low LED)
  for (int i = 1023; i >= 0; i -= 20)
  {
    ledcWrite(channel, i);
    delay(25);
  }
}

Gambar 6 menampilkan hasil dari program pengontrolan kecerahan LED dengan PWM. Kecerahan LED akan perlahan-lahan naik dari kondisi mati sampai menyala penuh, kemudian akan perlahan-lahan kembali ke kondisi mati.

Gambar 7 menampilkan animasi pengaruh sinyal PWM terhadap kecerahan LED. Pada contoh kasus ini rangkaian yang digunakan yaitu active-high, sehingga semakin besar duty cycle, maka LED akan semakin terang.

4. Repository Kode Program

Kode program untuk pengontrolan LED dengan PWM dapat didapatkan di repository ini: pwm-led.

Last updated