- Apa itu PWM (Pulse dengan Modulasi)?
- PWM di STM32
- Komponen Diperlukan
- Rincian Pin STM32
- Diagram Sirkuit dan Koneksi
- Pemrograman STM32
Pada artikel sebelumnya kita telah melihat tentang konversi ADC menggunakan STM32. Dalam tutorial ini, kita akan belajar tentang PWM (Pulse Width Modulation) di STM32 dan bagaimana cara mengontrol kecerahan LED atau kecepatan kipas DC menggunakan teknik PWM.
Kita tahu bahwa ada dua jenis sinyal: Analog dan Digital. Sinyal analog memiliki tegangan seperti (3V, 1Vā¦ dll) dan sinyal digital memiliki (1 'dan 0). Keluaran sensor berupa sinyal analog dan sinyal analog ini diubah menjadi digital menggunakan ADC, karena mikrokontroler hanya memahami digital. Setelah memproses nilai ADC tersebut, lagi-lagi keluarannya perlu diubah menjadi bentuk analog untuk menggerakkan perangkat analog. Untuk itu kami menggunakan metode tertentu seperti PWM, konverter Digital ke Analog (DAC) dll.
Apa itu PWM (Pulse dengan Modulasi)?
PWM adalah cara untuk mengontrol perangkat analog menggunakan nilai digital seperti mengontrol kecepatan motor, kecerahan led dll. Kita tahu bahwa motor dan led bekerja pada sinyal analog. Tetapi PWM tidak memberikan output analog murni, PWM tampak seperti sinyal analog yang dibuat oleh pulsa pendek, yang disediakan oleh duty cycle.
Siklus kerja PWM
Persentase waktu di mana sinyal PWM tetap TINGGI (tepat waktu) disebut siklus kerja. Jika sinyal selalu ON maka dalam siklus kerja 100% dan jika selalu mati itu adalah siklus kerja 0%.
Duty Cycle = Turn ON time / (Turn ON time + Turn OFF time)
PWM di STM32
STM32F103C8 memiliki 15 pin PWM dan 10 pin ADC. Ada 7 timer dan setiap keluaran PWM disediakan oleh saluran yang terhubung ke 4 timer. Ini memiliki resolusi PWM 16-bit (2 16), yaitu pencacah dan variabel bisa sebesar 65535. Dengan clock rate 72MHz, output PWM dapat memiliki periode maksimum sekitar satu milidetik.
- Jadi nilai 65535 memberikan KECERAHAN PENUH LED DAN KECEPATAN PENUH dari Kipas DC (Siklus Kerja 100%)
- Demikian juga nilai 32767 memberikan KECERAHAN SETENGAH LED DAN SETENGAH KECEPATAN Kipas DC (50% Siklus Kerja)
- Dan nilai 13107 memberikan (20%) KECERAHAN DAN (20%) KECEPATAN (20% Siklus Tugas)
Dalam tutorial ini, kami menggunakan potensiometer dan STM32 untuk memvariasikan kecerahan LED dan kecepatan kipas DC dengan teknik PWM. LCD 16x2 digunakan untuk menampilkan nilai ADC (0-4095) dan variabel yang dimodifikasi (nilai PWM) yaitu output (0-65535).
Berikut beberapa contoh PWM dengan Mikrokontroler lainnya:
- Pembangkit PWM menggunakan Mikrokontroler PIC dengan MPLAB dan XC8
- Kontrol Motor Servo dengan Raspberry Pi
- Dimmer LED Berbasis Arduino menggunakan PWM
- Modulasi Lebar Pulsa (PWM) menggunakan MSP430G2
Periksa semua proyek terkait PWM di sini.
Komponen Diperlukan
- STM32F103C8
- Kipas DC
- ULN2003 IC Driver Motor
- LED (MERAH)
- LCD (16x2)
- Potensiometer
- Papan tempat memotong roti
- Baterai 9V
- Kabel Jumper
Kipas DC: Kipas DC yang digunakan disini adalah kipas BLDC dari PC lama. Dibutuhkan suplai dari luar jadi kami menggunakan baterai DC 9V.
ULN2003 Motor Driver IC: Digunakan untuk menggerakkan motor dalam satu arah karena motor searah dan juga daya eksternal diperlukan untuk kipas. Pelajari lebih lanjut tentang Sirkuit Driver Motor berbasis ULN2003 di sini. Di bawah ini adalah diagram pic ULN2003:
Pin (IN1 hingga IN7) adalah pin input dan (OUT 1 hingga OUT 7) adalah pin output yang sesuai. COM diberikan tegangan sumber positif yang diperlukan untuk perangkat keluaran.
LED: LED berwarna MERAH digunakan yang memancarkan cahaya MERAH. Warna apa saja bisa digunakan.
Potensiometer: Dua potensiometer digunakan, satu untuk pembagi tegangan untuk input analog ke ADC dan yang lainnya untuk mengontrol kecerahan led.
Rincian Pin STM32
Seperti yang bisa kita lihat pin PWM ditunjukkan dalam format gelombang (~), ada 15 pin seperti itu, pin ADC diwakili dalam warna hijau, 10 pin ADC ada yang digunakan untuk input analog.
Diagram Sirkuit dan Koneksi
Koneksi STM32 dengan berbagai komponen dijelaskan sebagai berikut:
STM32 dengan Input Analog (ADC)
Potensiometer yang ada di sisi kiri rangkaian digunakan sebagai pengatur tegangan yang mengatur tegangan dari pin 3.3V. Output dari potensiometer yaitu pin tengah potensiometer dihubungkan ke pin ADC (PA4) STM32.
STM32 dengan LED
Pin keluaran STM32 PWM (PA9) dihubungkan ke pin positif LED melalui resistor seri dan kapasitor.
LED dengan Resistor dan Kapasitor
Sebuah resistor dalam seri dan kapasitor secara paralel dihubungkan dengan LED untuk menghasilkan gelombang Analog yang benar dari keluaran PWM karena keluaran analog tidak murni dari saat dihasilkan langsung dari pin PWM.
STM32 dengan ULN2003 & ULN2003 dengan Fan
Pin output STM32 PWM (PA8) dihubungkan ke pin Input (IN1) dari ULN2003 IC dan pin output yang sesuai (OUT1) dari ULN2003 dihubungkan ke kabel negatif dari DC FAN.
Pin positif dari kipas DC dihubungkan ke pin COM IC ULN2003 dan baterai eksternal (9V DC) juga dihubungkan ke pin COM yang sama dari IC ULN2003. Pin GND ULN2003 dihubungkan ke pin GND STM32 dan negatif baterai dihubungkan ke pin GND yang sama.
STM32 dengan LCD (16x2)
Pin LCD Tidak Ada |
Nama Pin LCD |
Nama Pin STM32 |
1 |
Tanah (Gnd) |
Tanah (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin dari Center of Potentiometer |
4 |
Register Select (RS) |
PB11 |
5 |
Baca / Tulis (RW) |
Tanah (G) |
6 |
Aktifkan (EN) |
PB10 |
7 |
Data Bit 0 (DB0) |
Tidak Ada Koneksi (NC) |
8 |
Data Bit 1 (DB1) |
Tidak Ada Koneksi (NC) |
9 |
Data Bit 2 (DB2) |
Tidak Ada Koneksi (NC) |
10 |
Data Bit 3 (DB3) |
Tidak Ada Koneksi (NC) |
11 |
Data Bit 4 (DB4) |
PB0 |
12 |
Data Bit 5 (DB5) |
PB1 |
13 |
Data Bit 6 (DB6) |
PC13 |
14 |
Data Bit 7 (DB7) |
PC14 |
15 |
LED Positif |
5V |
16 |
LED Negatif |
Tanah (G) |
Potensiometer di sisi kanan digunakan untuk mengontrol kontras layar LCD. Tabel di atas menunjukkan hubungan antara LCD dan STM32.
Pemrograman STM32
Seperti tutorial sebelumnya, kami memprogram STM32F103C8 dengan Arduino IDE melalui port USB tanpa menggunakan programmer FTDI. Untuk mempelajari tentang pemrograman STM32 dengan Arduino IDE ikuti tautannya. Kami dapat melanjutkan pemrograman seperti di Arduino. Kode lengkap diberikan di akhir.
Dalam pengkodean ini kita akan mengambil nilai analog input dari pin ADC (PA4) yang dihubungkan ke pin tengah potensiometer kiri dan kemudian mengubah nilai Analog (0-3.3V) menjadi format digital atau integer (0-4095). Nilai digital ini selanjutnya disediakan sebagai keluaran PWM untuk mengontrol kecerahan LED dan kecepatan kipas DC. LCD 16x2 digunakan untuk menampilkan ADC dan nilai yang dipetakan (nilai keluaran PWM).
Pertama kita perlu menyertakan file header LCD, mendeklarasikan pin LCD dan menginisialisasinya menggunakan kode di bawah ini. Pelajari lebih lanjut tentang antarmuka LCD dengan STM32 di sini.
#include
Selanjutnya nyatakan dan tentukan nama pin menggunakan pin STM32
const int analoginput = PA4; // Masukan dari potensiometer const int led = PA9; // Keluaran LED const int fan = PA8; // keluaran kipas
Sekarang di dalam setup () , kita perlu menampilkan beberapa pesan dan menghapusnya setelah beberapa detik dan menentukan pin INPUT dan pin keluaran PWM
lcd.begin (16,2); // Menyiapkan LCD lcd.clear (); // Menghapus LCD lcd.setCursor (0,0); // Set kursor pada baris0 dan kolom0 lcd.print ("CIRCUIT DIGEST"); // Menampilkan Circuit Digest lcd.setCursor (0,1); // Set Cursor di kolom0 dan baris1 lcd.print ("PWM USING STM32"); // Menampilkan PWM menggunakan penundaan STM32 (2000); // Waktu Tunda lcd.clear (); // Menghapus LCD pinMode (analoginput, INPUT); // setel input analog mode pin sebagai INPUT pinMode (led, PWM); // atur mode pin yang dipimpin sebagai pinMode keluaran PWM (fan, PWM); // atur kipas mode pin sebagai keluaran PWM
Pin input analog (PA4) diatur sebagai INPUT oleh pinMode (analoginput, INPUT), pin LED diatur sebagai output PWM dengan pinMode (led, PWM) dan pin kipas diatur sebagai output PWM dengan pinMode (kipas, PWM) . Di sini pin output PWM dihubungkan ke LED (PA9) dan Fan (PA8).
Selanjutnya pada fungsi void loop () , kita membaca sinyal Analog dari pin ADC (PA4) dan menyimpannya dalam variabel integer yang mengubah tegangan analog menjadi nilai integer digital (0-4095) dengan menggunakan kode di bawah ini int valueadc = analogRead (analoginput);
Hal penting yang perlu diperhatikan disini adalah pin PWM yaitu channel STM32 memiliki resolusi 16-Bit (0-65535) sehingga perlu kita petakan dengan nilai analog menggunakan fungsi map seperti di bawah ini.
int result = map (valueadc, 0, 4095, 0, 65535).
Jika pemetaan tidak digunakan, kami tidak akan mendapatkan kecepatan penuh kipas atau kecerahan penuh LED dengan memvariasikan potensiometer.
Kemudian kita menulis keluaran PWM ke LED dengan menggunakan pwmWrite (led, result) dan keluaran PWM ke kipas dengan menggunakan fungsi pwmWrite (fan, result ).
Terakhir kami menampilkan nilai input Analog (nilai ADC) dan nilai output (nilai PWM) pada layar LCD dengan menggunakan perintah berikut
lcd.setCursor (0,0); // Setel kursor pada baris0 dan kolom0 lcd.print ("ADC value ="); // mencetak kata āā lcd.print (valueadc); // menampilkan valueadc lcd.setCursor (0,1); // Setel Kursor pada kolom0 dan baris1 lcd.print ("Output ="); // mencetak kata-kata dalam "" lcd.print (hasil); // menampilkan hasil nilai
Kode Lengkap dengan Video demonstrasi diberikan di bawah ini.