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.

Gambar 1. Contoh sinyal PWM dengan duty cycle yang bervariasi

Gambar 2 menampilkan contoh detail sinyal PWM. Sinyal tersebut memiliki frekuensi 1kHz1kHz dan duty cycle 70%70\%. Karena frekuensinya adalah 1kHz1kHz, maka periodenya adalah 1ms1ms. Duty cycle merupakan persentase sinyal tersebut bernilai HIGH dari total periodenya. Karena duty cycle-nya 70%70\%, maka durasi HIGH selama 0.7ms0.7ms dan durasi LOW selama 0.3ms0.3ms. Jika tegangan supply VS=3.3VVS=3.3V, maka tegangan rata-rata dari sinyal PWM ini adalah 70%3.3V=2.31V70\%⋅3.3V=2.31V.

Gambar 2. Penjelasan detail sinyal PWM

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.

Gambar 3. Sinyal sinusoid yang dibuat dari sinyal PWM

Timer dapat digunakan untuk men-generate timing untuk sinyal PWM seperti pada Gambar 4. Timer akan menghitung dari 00 sampai 2n12n−1 dimana nn adalah resolusi timer yang digunakan.

Gambar 4. Cara kerja timer untuk menghasilkan sinyal PWM

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.

Gambar 5. Rangkaian breadboard untuk program pengontrolan LED dengan PWM
Sensor/Aktuator Pin
ESP32 Pin

LED merah

D25

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 6. Hasil program pengontrolan LED dengan PWM

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.

Gambar 7. Pengaruh sinyal PWM terhadap kecerahan LED (kasus rangkaian LED active-high). Sumber: https://deepbluembedded.com/esp32-pwm-tutorial-examples-analogwrite-arduino/

4. Repository Kode Program

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

Last updated