- Apa itu PWM (Pulse with Modulation)?
- PWM dalam STM32
- Komponen Diperlukan
- Perincian Pin STM32
- Diagram dan Sambungan Litar
- Pengaturcaraan STM32
Dalam artikel sebelumnya, kita telah melihat mengenai penukaran ADC menggunakan STM32. Dalam tutorial ini, kita akan belajar mengenai PWM (Pulse Width Modulation) di STM32 dan bagaimana kita dapat mengawal kecerahan LED atau kelajuan kipas DC menggunakan teknik PWM.
Kita tahu bahawa terdapat dua jenis isyarat: Analog dan Digital. Isyarat analog mempunyai voltan seperti (3V, 1V… dll) dan isyarat digital mempunyai (1 'dan 0's). Output sensor adalah isyarat analog dan isyarat analog ini ditukar menjadi digital menggunakan ADC, kerana pengawal mikro hanya memahami digital. Setelah memproses nilai ADC tersebut, sekali lagi output perlu ditukar menjadi bentuk analog untuk menggerakkan peranti analog. Untuk itu kami menggunakan kaedah tertentu seperti penukar PWM, Digital to Analog (DAC) dll.
Apa itu PWM (Pulse with Modulation)?
PWM adalah cara untuk mengawal peranti analog menggunakan nilai digital seperti mengawal kelajuan motor, kecerahan led dll Kami tahu bahawa motor dan led berfungsi pada isyarat analog. Tetapi PWM tidak memberikan output analog yang murni, PWM kelihatan seperti isyarat analog yang dibuat oleh denyutan pendek, yang disediakan oleh kitaran tugas.
Kitaran tugas PWM
Peratusan masa di mana isyarat PWM kekal TINGGI (tepat pada waktunya) disebut sebagai kitaran tugas. Sekiranya isyarat sentiasa AKTIF, ia berada dalam kitaran tugas 100% dan jika sentiasa mati, ia adalah kitaran tugas 0%.
Duty Cycle = Hidupkan waktu / (Hidupkan waktu + Matikan masa)
PWM dalam STM32
STM32F103C8 mempunyai 15 pin PWM dan 10 pin ADC. Terdapat 7 pemasa dan setiap output PWM disediakan oleh saluran yang dihubungkan dengan 4 pemasa. Ia memiliki resolusi PWM 16-bit (2 16), iaitu pembilang dan pemboleh ubahnya boleh sebesar 65535. Dengan kadar jam 72MHz, output PWM dapat memiliki jangka waktu maksimum sekitar satu milisaat.
- Jadi nilai 65535 memberikan KECERGASAN LENGKAP LED dan KECEPATAN PENUH DC Kipas (100% Duty Cycle)
- Begitu juga nilai 32767 yang memberikan HALF BRIGHTNESS LED dan HALF SPEED DC Fan (50% Duty Cycle)
- Dan nilai 13107 memberi (20%) KECERGASAN DAN (20%) SPEED (20% Duty Cycle)
Dalam tutorial ini, kami menggunakan potensiometer dan STM32 untuk mengubah kecerahan LED dan kelajuan kipas DC dengan teknik PWM. LCD 16x2 digunakan untuk memaparkan nilai ADC (0-4095) dan pemboleh ubah yang diubah (nilai PWM) yang merupakan output (0-65535).
Berikut adalah beberapa contoh PWM dengan Mikrokontroler lain:
- Menjana PWM menggunakan PIC Microcontroller dengan MPLAB dan XC8
- Kawalan Motor Servo dengan Raspberry Pi
- Dimmer LED Berasaskan Arduino menggunakan PWM
- Modulasi lebar nadi (PWM) menggunakan MSP430G2
Lihat semua projek berkaitan PWM di sini.
Komponen Diperlukan
- STM32F103C8
- Kipas DC
- IC Pemandu Motor ULN2003
- LED (MERAH)
- LCD (16x2)
- Potensiometer
- Papan roti
- Bateri 9V
- Wayar Pelompat
Kipas DC: Kipas DC yang digunakan di sini adalah kipas BLDC dari PC lama. Ia memerlukan bekalan luaran jadi kita menggunakan bateri 9V dc.
ULN2003 Motor Driver IC: Digunakan untuk menggerakkan motor dalam satu arah kerana motor tidak arah dan juga daya luaran diperlukan untuk kipas. Ketahui lebih lanjut mengenai Litar Pemandu Motor berasaskan ULN2003 di sini. Berikut adalah gambar rajah ULN2003:
Pin (IN1 hingga IN7) adalah pin input dan (OUT 1 hingga OUT 7) adalah pin output yang sepadan. COM diberikan voltan sumber positif yang diperlukan untuk peranti output.
LED: LED berwarna MERAH digunakan yang memancarkan cahaya MERAH. Sebarang warna boleh digunakan.
Potentiometers: Dua potensiometer digunakan satu untuk pembahagi voltan untuk input analog ke ADC dan satu lagi untuk mengawal kecerahan led.
Perincian Pin STM32
Seperti yang kita lihat pin PWM ditunjukkan dalam format gelombang (~), terdapat 15 pin seperti itu, pin ADC diwakili dalam warna hijau, 10 pin ADC ada yang digunakan untuk input analog.
Diagram dan Sambungan Litar
Sambungan STM32 dengan pelbagai komponen dijelaskan seperti di bawah:
STM32 dengan Input Analog (ADC)
Potensiometer yang terdapat di sebelah kiri litar digunakan sebagai pengatur voltan yang mengatur voltan dari pin 3.3V. Keluaran dari potensiometer iaitu pin pusat potensiometer disambungkan ke pin ADC (PA4) STM32.
STM32 dengan LED
Pin output STM32 PWM (PA9) disambungkan ke pin positif LED melalui perintang siri dan kapasitor.
LED dengan Perintang dan Kapasitor
Perintang secara bersiri dan kapasitor secara selari disambungkan dengan LED untuk menghasilkan gelombang Analog yang betul dari output PWM kerana output analog tidak tulen dari ketika dihasilkan secara langsung dari pin PWM.
STM32 dengan ULN2003 & ULN2003 dengan Kipas
Pin output STM32 PWM (PA8) disambungkan ke pin Input (IN1) ULN2003 IC dan pin output yang sesuai (OUT1) ULN2003 disambungkan ke wayar negatif DC FAN.
Pin positif kipas DC disambungkan ke pin COM IC ULN2003 dan bateri luaran (9V DC) juga disambungkan ke pin COM yang sama dengan IC ULN2003. Pin GND ULN2003 disambungkan ke pin GND STM32 dan negatif bateri disambungkan ke pin GND yang sama.
STM32 dengan LCD (16x2)
No Pin LCD |
Nama Pin LCD |
Nama Pin STM32 |
1 |
Tanah (Gnd) |
Tanah (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin dari Pusat Potensiometer |
4 |
Daftar Pilih (RS) |
PB11 |
5 |
Baca / Tulis (RW) |
Tanah (G) |
6 |
Aktifkan (EN) |
PB10 |
7 |
Bit Data 0 (DB0) |
Tiada Sambungan (NC) |
8 |
Bit Data 1 (DB1) |
Tiada Sambungan (NC) |
9 |
Bit Data 2 (DB2) |
Tiada Sambungan (NC) |
10 |
Bit Data 3 (DB3) |
Tiada Sambungan (NC) |
11 |
Bit Data 4 (DB4) |
PB0 |
12 |
Bit Data 5 (DB5) |
PB1 |
13 |
Bit Data 6 (DB6) |
PC13 |
14 |
Bit Data 7 (DB7) |
PC14 |
15 |
Positif LED |
5V |
16 |
Negatif LED |
Tanah (G) |
Potensiometer di sebelah kanan digunakan untuk mengawal kontras paparan LCD. Jadual di atas menunjukkan hubungan antara LCD dan STM32.
Pengaturcaraan STM32
Seperti tutorial sebelumnya, kami memprogram STM32F103C8 dengan Arduino IDE melalui port USB tanpa menggunakan pengaturcara FTDI. Untuk mengetahui mengenai pengaturcaraan STM32 dengan Arduino IDE ikuti pautan. Kita dapat meneruskan pengaturcaraan seperti di Arduino. Kod lengkap diberikan pada akhir.
Dalam pengekodan ini kita akan mengambil nilai analog input dari pin ADC (PA4) yang disambungkan ke pin tengah potensiometer kiri dan kemudian menukar nilai Analog (0-3.3V) menjadi format digital atau bilangan bulat (0-4095). Nilai digital ini selanjutnya disediakan sebagai output PWM untuk mengawal kecerahan LED dan kelajuan kipas DC. LCD 16x2 digunakan untuk memaparkan ADC dan nilai yang dipetakan (nilai output PWM).
Mula-mula kita perlu memasukkan fail tajuk LCD, menyatakan pin LCD dan memulakannya menggunakan kod di bawah. Ketahui lebih lanjut mengenai menghubungkan LCD dengan STM32 di sini.
#sertakan
Seterusnya menyatakan dan tentukan nama pin menggunakan pin STM32
const int analoginput = PA4; // Input dari potensiometer const int led = PA9; // Keluaran LED const int fan = PA8; // keluaran kipas
Sekarang di dalam persediaan () , kita perlu memaparkan beberapa pesan dan membersihkannya setelah beberapa saat dan menentukan pin INPUT dan pin output PWM
lcd.begin (16,2); // Mempersiapkan LCD lcd.clear (); // Membersihkan LCD lcd.setCursor (0,0); // Tetapkan kursor pada baris0 dan lajur0 lcd.print ("CIRCUIT DIGEST"); // Memaparkan Circuit Digest lcd.setCursor (0,1); // Tetapkan Kursor pada lajur0 dan baris1 lcd.print ("PWM MENGGUNAKAN STM32"); // Memaparkan PWM menggunakan kelewatan STM32 (2000); // Masa Kelewatan lcd.clear (); // Membersihkan LCD pinMode (analoginput, INPUT); // tetapkan analog mode input sebagai INPUT pinMode (led, PWM); // tetapkan mod pin dipimpin sebagai pinMode output PWM (kipas, PWM); // tetapkan kipas mod pin sebagai output PWM
Pin input Analog (PA4) ditetapkan sebagai INPUT oleh pinMode (analoginput, INPUT), pin LED ditetapkan sebagai output PWM oleh pinMode (led, PWM) dan pin kipas ditetapkan sebagai output PWM oleh pinMode (kipas, PWM) . Di sini pin output PWM disambungkan ke LED (PA9) dan Kipas (PA8).
Selanjutnya dalam fungsi gelung void () , kita membaca isyarat Analog dari pin ADC (PA4) dan menyimpannya dalam pemboleh ubah integer yang menukar voltan analog menjadi nilai integer digital (0-4095) dengan menggunakan kod di bawah int valueadc = analogRead (analoginput);
Perkara penting yang perlu diperhatikan di sini ialah pin PWM iaitu saluran STM32 mempunyai resolusi 16-Bit (0-65535) jadi kita perlu memetakannya dengan nilai analog menggunakan fungsi peta seperti di bawah
hasil int = peta (nilaiadc, 0, 4095, 0, 65535).
Sekiranya pemetaan tidak digunakan, kita tidak akan mendapat kelajuan penuh kipas atau kecerahan penuh LED dengan mengubah potensiometer.
Kemudian kami menulis output PWM ke LED dengan menggunakan pwmWrite (led, hasil) dan output PWM ke kipas dengan menggunakan fungsi pwmWrite (kipas, hasil ).
Akhirnya kami memaparkan nilai input Analog (nilai ADC) dan nilai output (nilai PWM) pada paparan LCD dengan menggunakan arahan berikut
lcd.setCursor (0,0); // Tetapkan kursor pada baris0 dan lajur0 lcd.print ("nilai ADC ="); // mencetak perkataan "" lcd.print (valueadc); // memaparkan nilaiadc lcd.setCursor (0,1); // Tetapkan Kursor pada lajur0 dan baris1 lcd.print ("Output ="); // mencetak perkataan dalam "" lcd.print (hasil); // memaparkan hasil nilai
Kod Lengkap dengan Video demonstrasi diberikan di bawah.