- Apa itu Sinyal PWM?
- PWM menggunakan PIC16F877A:
- Pemrograman PIC untuk menghasilkan sinyal PWM:
- Skema dan Pengujian:
- Bekerja pada Perangkat Keras:
Ini adalah tutorial 10 kami mempelajari mikrokontroler PIC menggunakan MPLAB dan XC8. Sampai sekarang, kami telah membahas banyak tutorial dasar seperti LED berkedip dengan PIC, Timer di PIC, antarmuka LCD, antarmuka 7-segmen, ADC menggunakan PIC dll. Jika Anda seorang pemula absolut, silakan kunjungi daftar lengkap tutorial PIC di sini dan mulai belajar.
Dalam tutorial ini, kita akan belajar cara menghasilkan sinyal PWM menggunakan PIC PIC16F877A. MCU PIC kami memiliki modul khusus yang disebut modul Compare Capture (CCP) yang dapat digunakan untuk menghasilkan sinyal PWM. Di sini, kami akan menghasilkan PWM 5 kHz dengan siklus kerja variabel dari 0% hingga 100%. Untuk memvariasikan duty cycle kita menggunakan potensiometer, oleh karena itu disarankan untuk mempelajari tutorial ADC sebelum memulai dengan PWM. Modul PWM juga menggunakan timer untuk mengatur frekuensinya, maka pelajari cara menggunakan timer terlebih dahulu di sini. Selanjutnya, dalam tutorial ini kita akan menggunakan rangkaian RC dan LED untuk mengubah nilai PWM menjadi tegangan Analog dan menggunakannya untuk meredupkan lampu LED.
Apa itu Sinyal PWM?
Pulse Width Modulation (PWM) adalah sinyal digital yang paling umum digunakan dalam rangkaian kontrol. Sinyal ini disetel tinggi (5v) dan rendah (0v) dalam waktu dan kecepatan yang telah ditentukan. Waktu di mana sinyal tetap tinggi disebut "waktu hidup" dan waktu di mana sinyal tetap rendah disebut "waktu mati". Ada dua parameter penting untuk PWM seperti yang dibahas di bawah ini:
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)
Frekuensi PWM:
Frekuensi sinyal PWM menentukan seberapa cepat PWM menyelesaikan satu periode. Satu Periode lengkap ON dan OFF dari sinyal PWM seperti yang ditunjukkan pada gambar di atas. Dalam tutorial kami, kami akan mengatur frekuensi 5KHz.
PWM menggunakan PIC16F877A:
Sinyal PWM dapat dihasilkan di Mikrokontroler PIC kami dengan menggunakan modul CCP (Bandingkan Capture PWM). Resolusi sinyal PWM kita adalah 10-bit, yaitu untuk nilai 0 akan ada duty cycle 0% dan untuk nilai 1024 (2 ^ 10) ada duty cycle 100%. Ada dua modul CCP di PIC MCU kami (CCP1 dan CCP2), ini berarti kami dapat menghasilkan dua sinyal PWM pada dua pin berbeda (pin 17 dan 16) secara bersamaan, dalam tutorial kami menggunakan CCP1 untuk menghasilkan sinyal PWM pada pin 17.
Register berikut digunakan untuk menghasilkan sinyal PWM menggunakan PIC MCU kami:
- CCP1CON (Daftar Kontrol CCP1)
- T2CON (Timer 2 Control Register)
- PR2 (Timer 2 modul Periode Register)
- CCPR1L (CCP Register 1 Rendah)
Pemrograman PIC untuk menghasilkan sinyal PWM:
Dalam program kami, kami akan membaca tegangan Analog 0-5v dari potensiometer dan memetakannya ke 0-1024 menggunakan modul ADC kami. Kemudian kita menghasilkan sinyal PWM dengan frekuensi 5000Hz dan memvariasikan duty cycle-nya berdasarkan tegangan analog masukan. Yaitu 0-1024 akan diubah menjadi 0% -100% Siklus kerja. Tutorial ini mengasumsikan bahwa Anda telah belajar menggunakan ADC di PIC jika belum, bacalah dari sini, karena kami akan melewatkan detailnya di tutorial ini.
Jadi, setelah bit konfigurasi disetel dan program ditulis untuk membaca nilai Analog, kita dapat melanjutkan dengan PWM.
Langkah-langkah berikut harus diambil saat mengkonfigurasi modul CCP untuk operasi PWM:
- Setel periode PWM dengan menulis ke register PR2.
- Setel siklus tugas PWM dengan menulis ke register CCPR1L dan bit CCP1CON <5: 4>.
- Jadikan pin CCP1 sebagai output dengan membersihkan bit TRISC <2>.
- Setel nilai prescale TMR2 dan aktifkan Timer2 dengan menulis ke T2CON.
- Konfigurasi modul CCP1 untuk operasi PWM.
Ada dua fungsi penting dalam program ini untuk menghasilkan sinyal PWM. Salah satunya adalah fungsi PWM_Initialize () yang akan menginisialisasi register yang diperlukan untuk mengatur modul PWM dan kemudian mengatur frekuensi di mana PWM harus beroperasi, fungsi lainnya adalah fungsi PWM_Duty () yang akan mengatur siklus kerja sinyal PWM di register yang diperlukan.
PWM_Inisialisasi () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // Menyetel rumus PR2 menggunakan Lembar Data // Membuat PWM berfungsi di 5KHZ CCP1M3 = 1; CCP1M2 = 1; // Konfigurasi modul CCP1 T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Konfigurasi modul Timer TRISC2 = 0; // jadikan pin port pada C sebagai keluaran}
Fungsi di atas adalah fungsi inisialisasi PWM, pada fungsi ini modul CCP1 diatur untuk menggunakan PWM dengan membuat bit CCP1M3 dan CCP1M2 setinggi.
Prescaler modul pengatur waktu diatur dengan membuat bit T2CKPS0 setinggi dan T2CKPS1 rendah, bit TMR2ON diatur untuk memulai pengatur waktu.
Sekarang, kita harus mengatur Frekuensi sinyal PWM. Nilai frekuensi harus ditulis ke register PR2. Frekuensi yang diinginkan dapat diatur dengan menggunakan rumus di bawah ini
Periode PWM = * 4 * TOSC * (Nilai Pra Skala TMR2)
Menata ulang rumus ini untuk mendapatkan PR2 akan menghasilkan
PR2 = (Periode / (4 * Tosc * TMR2 Prescale)) - 1
Kita tahu bahwa Periode = (1 / PWM_freq) dan Tosc = (1 / _XTAL_FREQ). Karena itu…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
Setelah frekuensi disetel, fungsi ini tidak perlu dipanggil lagi kecuali dan sampai kita perlu mengubah frekuensi lagi. Dalam tutorial kami, saya telah menetapkan PWM_freq = 5000; sehingga kita bisa mendapatkan frekuensi operasi 5 KHz untuk sinyal PWM kita.
Sekarang mari kita atur duty cycle dari PWM dengan menggunakan fungsi di bawah ini
PWM_Duty (unsigned int duty) {if (duty <1023) {duty = ((float) duty / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // Pada pengurangan // duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = tugas & 1; // Simpan bit pertama CCP1Y = duty & 2; // Simpan bit ke-0 CCPR1L = duty >> 2; // Simpan sisa 8 bit}}
Sinyal PWM kami memiliki resolusi 10-bit sehingga nilai ini tidak dapat disimpan dalam satu register karena PIC kami hanya memiliki jalur data 8-bit. Jadi kita telah menggunakan dua bit lain dari CCP1CON <5: 4> (CCP1X dan CCP1Y) untuk menyimpan dua LSB terakhir dan kemudian menyimpan 8 bit yang tersisa di Register CCPR1L.
Waktu siklus kerja PWM dapat dihitung dengan menggunakan rumus di bawah ini:
Siklus Tugas PWM = (CCPRIL: CCP1CON <5: 4>) * Tosc * (Nilai Prescale TMR2)
Mengatur ulang rumus ini untuk mendapatkan nilai CCPR1L dan CCP1CON akan memberikan:
CCPRIL: CCP1Con <5: 4> = Siklus Tugas PWM / (Nilai Prescale Tosc * TMR2)
Nilai ADC kita akan menjadi 0-1024 kita perlu berada di 0% -100% maka, PWM Duty Cycle = duty / 1023. Selanjutnya untuk mengubah duty cycle ini menjadi periode waktu kita harus mengalikannya dengan periode (1 / PWM_freq)
Kita juga tahu bahwa Tosc = (1 / PWM_freq), karenanya..
Tugas = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
Menyelesaikan persamaan di atas akan memberi kita:
Duty = ((float) duty / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
Anda dapat memeriksa program lengkap di bagian Kode di bawah ini bersama dengan Video rinci.
Skema dan Pengujian:
Seperti biasa mari kita verifikasi output menggunakan simulasi Proteus. The Circuit Diagram ditunjukkan di bawah ini.
Hubungkan potensiometer ke pin ke- 7 untuk memasukkan tegangan 0-5. Modul CCP1 dengan pin 17 (RC2), disini akan dihasilkan PWM yang dapat diverifikasi menggunakan osiloskop digital. Selanjutnya untuk mengubahnya menjadi tegangan variabel kami telah menggunakan RC-filter dan LED untuk memverifikasi keluaran tanpa ruang lingkup.
Apa itu RC-Filter?
Sebuah RC filter atau Low pass filter adalah rangkaian sederhana dengan dua elemen pasif yaitu resistor dan kapasitor. Kedua komponen ini digunakan untuk menyaring frekuensi sinyal PWM kami dan menjadikannya tegangan DC variabel.
Jika kita memeriksa rangkaian, ketika tegangan variabel diterapkan ke input R, kapasitor C akan mulai mengisi daya. Sekarang berdasarkan nilai kapasitor, kapasitor akan membutuhkan waktu untuk terisi penuh, setelah diisi maka akan memblokir arus DC (Ingat kapasitor memblokir DC tetapi memungkinkan AC) maka tegangan input DC akan muncul di output. PWM frekuensi tinggi (sinyal AC) akan di-ground-kan melalui kapasitor. Jadi DC murni diperoleh melintasi kapasitor. Nilai 1000Ohm dan 1uf ditemukan sesuai untuk proyek ini. Menghitung nilai R dan C melibatkan analisis rangkaian menggunakan fungsi transfer, yang berada di luar cakupan tutorial ini.
Output dari program dapat diverifikasi menggunakan Osiloskop Digital seperti yang ditunjukkan di bawah ini, ubah Potensiometer dan siklus kerja PWM harus berubah. Kita juga bisa melihat tegangan keluaran rangkaian RC menggunakan Voltmeter. Jika semuanya berfungsi seperti yang diharapkan, kami dapat melanjutkan dengan perangkat keras kami. Lebih lanjut periksa Video di bagian akhir untuk proses lengkap.
Bekerja pada Perangkat Keras:
Pengaturan perangkat keras proyek ini sangat sederhana, kami hanya akan menggunakan kembali papan Perf PIC kami yang ditunjukkan di bawah ini.
Kami juga akan membutuhkan potensiometer untuk memasukkan tegangan analog, saya telah memasang beberapa kabel ujung betina ke pot saya (ditunjukkan di bawah) sehingga kami dapat langsung menghubungkannya ke papan PIC Perf.
Akhirnya untuk memverifikasi output kita membutuhkan rangkaian RC dan LED untuk melihat bagaimana sinyal PWM bekerja, saya hanya menggunakan papan perf kecil dan menyolder rangkaian RC dan LED (untuk mengontrol kecerahan) padanya seperti yang ditunjukkan di bawah ini
Kita dapat menggunakan kabel penghubung wanita ke wanita sederhana dan menghubungkannya sesuai dengan skema yang ditunjukkan di atas. Setelah koneksi selesai, unggah program ke PIC menggunakan pickit3 kami dan Anda harus bisa mendapatkan tegangan variabel berdasarkan input potensiometer Anda. Output variabel digunakan untuk mengontrol kecerahan LED di sini.
Saya menggunakan multimeter saya untuk mengukur output variabel, kami juga dapat melihat kecerahan LED berubah untuk level tegangan yang berbeda.
Itu saja kami telah memprogram untuk membaca tegangan Analog dari POT dan mengubahnya menjadi sinyal PWM yang pada gilirannya telah diubah menjadi tegangan Variabel menggunakan filter RC dan hasilnya diverifikasi menggunakan perangkat keras kami. Jika Anda ragu atau terjebak di suatu tempat, silakan gunakan bagian komentar di bawah ini, kami akan dengan senang hati membantu Anda. Pekerjaan lengkap sedang bekerja di video.
Juga periksa Tutorial PWM kami yang lain di mikrokontroler lain:
- Tutorial PWM Raspberry Pi
- PWM dengan Arduino Due
- Dimmer LED Berbasis Arduino menggunakan PWM
- Power LED Dimmer menggunakan Mikrokontroler ATmega32