📈
Ween's Lab
UdemyYouTubeTikTok
  • Welcome
  • 📻FPGA Tutorials
    • FPGA Boards: Getting Started
      • Getting Started with PYNQ on Kria KV260 Vision AI Starter Kit
      • Getting Started with PYNQ on Red Pitaya STEMlab 125-14
      • Getting Started with PYNQ on ZYBO
    • FPGA Ethernet Tutorial
      • FPGA Tutorial Ethernet 1: Simple TCP Server
    • PYNQ FPGA Tutorial 101
      • Part 0: Introduction
      • Part 1: GPIO
      • Part 2: Custom IP
      • Part 3: Memory
      • Part 4: ANN Processor
    • PYNQ FPGA Tutorial 102
      • Part 0: Introduction
      • Part 1: Memory Mapped
      • Part 2: Direct Memory Access
      • Part 3: AXI-Lite Multiplier
      • Part 4: AXI-Stream Multiplier with DMA
      • Part 5: AXI-Lite GCD
      • Part 6: AXI-Stream GCD with DMA
      • Part 7: Access to DDR from PL
    • ZYNQ FPGA Tutorial
      • Part 1: Gate-Level Combinational Circuit
      • Part 2: RT-Level Combinational Circuit
      • Part 3: Regular Sequential Circuit
      • Part 4: FSM Sequential Circuit
      • Part 5: ZYNQ Architecture
      • Part 6: ARM CPU and FPGA Module
      • Part 7: FPGA Memory
      • Part 8: Hardware Accelerator for Neural Networks
    • ZYNQ FPGA Linux Kernel Module
      • Cross Compiling Kernel, Kernel Module, and User Program for PYNQ
      • Configure PL to PS Interrupt in Kernel Module
      • Configure AXI DMA in Kernel Module
  • 📟Proyek Arduino
    • Kumpulan Proyek
      • Rangkaian LED
      • LED Berkedip Nyala Api
      • LED Chaser
      • LED Binary Counter
      • OLED 128x4 Bitcoin Ticker
      • Rangkaian Button
      • Button Multifungsi
      • Button Interrupt
      • Button Debouncing
    • Pelatihan Mikrokontroler Arduino ESP32
      • Bab 1 Pengenalan Mikrokontroler
      • Bab 2 Pengenalan Arduino
      • Bab 3 Pengenalan Bahasa C
      • Bab 4 Digital Output
      • Bab 5 Digital Input
      • Bab 6 Serial Communication
      • Bab 7 Analog-to-Digital Conversion
      • Bab 8 Interrupt
      • Bab 9 Timer
      • Bab 10 Pulse-Width Modulation
      • Bab 11 SPI Communication
      • Bab 12 I2C Communication
  • 💰Finance
    • Coding for Finance
      • Build a Bitcoin Price Alert with Google Cloud and Telegram
      • Build a Bitcoin Ticker with ESP32 and Arduino
      • Stock Price Forecasting with LSTM
    • Trading dan Investasi
      • Istilah Ekonomi, Keuangan, Bisnis, Trading, dan Investasi
      • Jalan Menuju Financial Abundance
      • Memahami Korelasi Emas, Oil, Dollar, BTC, Bonds, dan Saham
      • Mindset Trading dan Investasi
      • Rangkuman Buku: Rahasia Analisis Fundamental Saham
      • Rangkuman Buku: The Psychology of Money
      • Rangkuman Kuliah: Introduction to Adaptive Markets
      • Rumus Menjadi Orang Kaya
  • 📝Life
    • Life Quotes
Powered by GitBook
On this page
  • 1. PWM
  • 2. Library PWM
  • 3. Contoh Program
  • 4. Repository Kode Program
  1. Proyek Arduino
  2. Pelatihan Mikrokontroler Arduino ESP32

Bab 10 Pulse-Width Modulation

PreviousBab 9 TimerNextBab 11 SPI Communication

Last updated 1 year ago

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.

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 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

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

Timer dapat digunakan untuk men-generate timing untuk sinyal PWM seperti pada Gambar 4. Timer akan menghitung dari 000 sampai 2n−12n−12n−1 dimana nnn adalah resolusi timer yang digunakan.

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

📟
pwm-led
Gambar 1. Contoh sinyal PWM dengan duty cycle yang bervariasi
Gambar 2. Penjelasan detail sinyal PWM
Gambar 3. Sinyal sinusoid yang dibuat dari sinyal PWM
Gambar 4. Cara kerja timer untuk menghasilkan sinyal PWM
Gambar 5. Rangkaian breadboard untuk program pengontrolan LED dengan PWM
Gambar 6. Hasil program pengontrolan LED dengan PWM
Gambar 7. Pengaruh sinyal PWM terhadap kecerahan LED (kasus rangkaian LED active-high). Sumber:
https://deepbluembedded.com/esp32-pwm-tutorial-examples-analogwrite-arduino/