- Apakah Isyarat PWM?
- PWM menggunakan PIC16F877A:
- Memprogram PIC untuk menghasilkan isyarat PWM:
- Skematik dan Ujian:
- Mengusahakan Perkakasan:
Ini adalah tutorial ke-10 kami untuk belajar mikrokontroler PIC menggunakan MPLAB dan XC8. Hingga kini, kami telah membahas banyak tutorial asas seperti LED berkedip dengan PIC, Timer dalam PIC, interfacing LCD, interfacing 7-segmen, ADC using PIC dll. Sekiranya anda seorang pemula mutlak, sila lawati senarai lengkap tutorial PIC di sini dan mula belajar.
Dalam tutorial ini, kita akan belajar Cara menghasilkan isyarat PWM menggunakan PIC PIC16F877A. PIC MCU kami mempunyai modul khas yang disebut Bandingkan modul tangkapan (CCP) yang boleh digunakan untuk menghasilkan isyarat PWM. Di sini, kita akan menghasilkan PWM 5 kHz dengan kitaran tugas berubah dari 0% hingga 100%. Untuk mengubah siklus tugas kita menggunakan potensiometer, oleh itu disarankan untuk mempelajari tutorial ADC sebelum memulai dengan PWM. Modul PWM juga menggunakan pemasa untuk menetapkan frekuensinya, jadi pelajari cara menggunakan pemasa terlebih dahulu di sini. Selanjutnya, dalam tutorial ini kita akan menggunakan rangkaian RC dan LED untuk menukar nilai PWM ke voltan Analog dan menggunakannya untuk meredupkan cahaya LED.
Apakah Isyarat PWM?
Pulse Width Modulation (PWM) adalah isyarat digital yang paling biasa digunakan dalam litar kawalan. Isyarat ini ditetapkan tinggi (5v) dan rendah (0v) dalam masa dan kelajuan yang telah ditetapkan. Masa di mana sinyal tetap tinggi disebut "tepat waktu" dan masa di mana isyarat tetap rendah disebut "waktu mati". Terdapat dua parameter penting untuk PWM seperti yang dibincangkan di bawah:
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)
Kekerapan PWM:
Kekerapan isyarat PWM menentukan seberapa pantas PWM menyelesaikan satu tempoh. Satu Tempoh selesai ON dan OFF isyarat PWM seperti yang ditunjukkan dalam gambar di atas. Dalam tutorial kami, kami akan menetapkan frekuensi 5KHz.
PWM menggunakan PIC16F877A:
Isyarat PWM dapat dihasilkan dalam PIC Microcontroller kami dengan menggunakan modul CCP (Bandingkan Tangkap PWM). Resolusi isyarat PWM kami adalah 10-bit, iaitu untuk nilai 0 akan ada kitaran tugas 0% dan untuk nilai 1024 (2 ^ 10) akan ada kitaran tugas 100%. Terdapat dua modul CCP dalam PIC MCU kami (CCP1 Dan CCP2), ini bermaksud kami dapat menghasilkan dua isyarat PWM pada dua pin berbeza (pin 17 dan 16) secara serentak, dalam tutorial kami menggunakan CCP1 untuk menghasilkan isyarat PWM pada pin 17.
Daftar berikut digunakan untuk menghasilkan isyarat PWM menggunakan PIC MCU kami:
- CCP1CON (Daftar kawalan CCP1)
- T2CON (Daftar Kawalan Pemasa 2)
- PR2 (Timer 2 modul Daftar Tempoh)
- CCPR1L (Daftar CCP 1 Rendah)
Memprogram PIC untuk menghasilkan isyarat PWM:
Dalam program kami, kami akan membaca voltan Analog 0-5v dari potensiometer dan memetakannya ke 0-1024 menggunakan modul ADC kami. Kemudian kami menghasilkan isyarat PWM dengan frekuensi 5000Hz dan mengubah kitaran tugasnya berdasarkan voltan Analog input. Iaitu 0-1024 akan ditukar menjadi 0% -100% Duty cycle. Tutorial ini mengandaikan bahawa anda sudah belajar menggunakan ADC dalam PIC jika tidak, bacalah dari sini, kerana kami akan melangkau butiran mengenainya dalam tutorial ini.
Oleh itu, setelah bit konfigurasi ditetapkan dan program ditulis untuk membaca nilai Analog, kita boleh meneruskan PWM.
Langkah-langkah berikut harus diambil ketika mengkonfigurasi modul CCP untuk operasi PWM:
- Tetapkan tempoh PWM dengan menulis ke daftar PR2.
- Tetapkan kitaran tugas PWM dengan menulis ke CCPR1L register dan CCP1CON <5: 4> bit.
- Jadikan pin CCP1 sebagai output dengan membersihkan bit TRISC <2>.
- Tetapkan nilai preskala TMR2 dan aktifkan Timer2 dengan menulis ke T2CON.
- Konfigurasikan modul CCP1 untuk operasi PWM.
Terdapat dua fungsi penting dalam program ini untuk menghasilkan isyarat PWM. Salah satunya adalah fungsi PWM_Initialize () yang akan menginisialisasi register yang diperlukan untuk menyiapkan modul PWM dan kemudian menetapkan frekuensi di mana PWM harus beroperasi, fungsi lain adalah fungsi PWM_Duty () yang akan mengatur kitaran tugas isyarat PWM di daftar yang diperlukan.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // Menetapkan formula PR2 menggunakan Lembar Data // Menjadikan PWM berfungsi dalam 5KHZ CCP1M3 = 1; CCP1M2 = 1; // Konfigurasikan modul CCP1 T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Konfigurasikan modul Pemasa TRISC2 = 0; // jadikan pin port pada C sebagai output}
Fungsi di atas adalah fungsi inisialisasi PWM, dalam fungsi ini Modul CCP1 diatur untuk menggunakan PWM dengan menjadikan bit CCP1M3 dan CCP1M2 setinggi.
Prescaler modul pemasa ditetapkan dengan menjadikan bit T2CKPS0 setinggi dan T2CKPS1 serendah bit TMR2ON ditetapkan untuk memulakan pemasa.
Sekarang, kita harus menetapkan Frekuensi isyarat PWM. Nilai kekerapan harus ditulis ke daftar PR2. Frekuensi yang diinginkan dapat ditetapkan dengan menggunakan formula di bawah
Tempoh PWM = * 4 * TOSC * (Nilai Prescale TMR2)
Menyusun semula formula ini untuk mendapatkan PR2 akan memberi
PR2 = (Tempoh / (4 * Tosc * TMR2 Prescale)) - 1
Kita tahu bahawa Tempoh = (1 / PWM_freq) dan Tosc = (1 / _XTAL_FREQ). Oleh itu…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
Setelah frekuensi ditetapkan fungsi ini tidak perlu dipanggil lagi kecuali dan sehingga kita perlu menukar frekuensi sekali lagi. Dalam tutorial kami, saya telah menetapkan PWM_freq = 5000; supaya kita dapat memperoleh frekuensi operasi 5 KHz untuk isyarat PWM kita.
Sekarang mari kita tetapkan kitaran tugas PWM dengan menggunakan fungsi di bawah
PWM_Duty (tugas tidak bertanda tangan) {if (duty <1023) {duty = ((float) duty / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // Mengurangkan // duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = tugas & 1; // Simpan 1 bit CCP1Y = tugas & 2; // Simpan bit ke-0 CCPR1L = tugas >> 2; // Simpan sisa 8 bit}}
Isyarat PWM kami mempunyai resolusi 10-bit maka nilai ini tidak dapat disimpan dalam satu daftar kerana PIC kami hanya mempunyai garis data 8-bit. Oleh itu, kita menggunakan dua bit CCP1CON <5: 4> yang lain (CCP1X dan CCP1Y) untuk menyimpan dua LSB terakhir dan kemudian menyimpan 8 bit yang tersisa dalam Daftar CCPR1L.
Masa kitaran tugas PWM dapat dikira dengan menggunakan formula di bawah:
Kitaran Tugas PWM = (CCPRIL: CCP1CON <5: 4>) * Tosc * (Nilai Prescale TMR2)
Menyusun semula formula ini untuk mendapatkan nilai CCPR1L dan CCP1CON akan memberikan:
CCPRIL: CCP1Con <5: 4> = PWM Duty Cycle / (Tosc * TMR2 Prescale Value)
Nilai ADC kita adalah 0-1024 yang kita perlukan agar berada dalam 0% -100% oleh itu, PWM Duty Cycle = duty / 1023. Lebih jauh untuk mengubah kitaran tugas ini menjadi jangka waktu kita harus mengalikannya dengan jangka masa (1 / PWM_freq)
Kami juga tahu bahawa Tosc = (1 / PWM_freq), oleh itu..
Duty = (((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 boleh menyemak program lengkap di bahagian Kod di bawah bersama dengan Video terperinci.
Skematik dan Ujian:
Seperti biasa mari kita mengesahkan output menggunakan simulasi Proteus. The Circuit Diagram ditunjukkan di bawah.
Sambungkan potensiometer ke pin ke- 7 untuk memasukkan voltan 0-5. Modul CCP1 ada dengan pin 17 (RC2), di sini PWM akan dihasilkan yang dapat disahkan menggunakan osiloskop Digital. Selanjutnya untuk mengubahnya menjadi voltan berubah-ubah, kami telah menggunakan penapis RC dan LED untuk mengesahkan output tanpa ruang lingkup.
Apakah Penapis RC?
An RC penapis atau penapis lulus rendah adalah litar mudah dengan dua elemen pasif iaitu perintang dan pemuat. Kedua komponen ini digunakan untuk menyaring frekuensi isyarat PWM kami dan menjadikannya voltan DC berubah.
Sekiranya kita memeriksa litar, apabila voltan berubah dikenakan pada input R, kapasitor C akan mula mengecas. Sekarang berdasarkan nilai kapasitor, kapasitor akan memerlukan sedikit masa untuk dicas sepenuhnya, setelah dicas, ia akan menyekat arus DC (Ingat kapasitor menyekat DC tetapi membenarkan AC) maka voltan DC input akan muncul di seluruh output. PWM frekuensi tinggi (isyarat AC) akan dibumikan melalui kapasitor. Oleh itu DC tulen diperoleh di seluruh kapasitor. Nilai 1000Ohm dan 1uf didapati sesuai untuk projek ini. Mengira nilai R dan C melibatkan analisis litar menggunakan fungsi pemindahan, yang berada di luar skop tutorial ini.
Keluaran program dapat disahkan menggunakan Osiloskop Digital seperti yang ditunjukkan di bawah, mengubah Potensiometer dan kitaran Tugas PWM harus berubah. Kita juga dapat melihat voltan keluaran litar RC menggunakan Voltmeter. Sekiranya semuanya berjalan seperti yang diharapkan, kita boleh meneruskan perkakasan kita. Selanjutnya periksa Video di akhir untuk proses penuh.
Mengusahakan Perkakasan:
Penyediaan perkakasan projek ini sangat mudah, kami akan menggunakan semula papan PIC Perf kami seperti di bawah.
Kami juga memerlukan potensiometer untuk menyertakan voltan analog, saya telah memasang beberapa wayar hujung wanita ke periuk saya (ditunjukkan di bawah) supaya kami dapat menghubungkannya terus ke papan PIC Perf.
Akhirnya untuk mengesahkan output kita memerlukan litar RC dan LED untuk melihat bagaimana isyarat PWM berfungsi, saya hanya menggunakan papan perf kecil dan menyolder litar RC dan LED (untuk mengawal kecerahan) padanya seperti yang ditunjukkan di bawah
Kita boleh menggunakan wayar penyambung wanita ke wanita yang sederhana dan menghubungkannya mengikut skema yang ditunjukkan di atas. Setelah sambungan selesai, muat naik program ke PIC menggunakan pickit3 kami dan anda seharusnya dapat memperoleh voltan berubah berdasarkan input potensiometer anda. Output pemboleh ubah digunakan untuk mengawal kecerahan LED di sini.
Saya menggunakan multimeter saya untuk mengukur output yang berubah-ubah, kita juga dapat melihat kecerahan LED yang berubah untuk tahap voltan yang berbeza.
Itu sahaja kami telah memprogram untuk membaca voltan Analog dari POT dan menukar menjadi isyarat PWM yang seterusnya telah diubah menjadi voltan boleh ubah menggunakan penapis RC dan hasilnya disahkan menggunakan perkakasan kami. Sekiranya anda mempunyai keraguan atau tersekat di suatu tempat, sila gunakan bahagian komen di bawah, kami dengan senang hati akan membantu anda. Kerja yang lengkap berfungsi dalam video.
Lihat juga Tutorial PWM kami yang lain mengenai pengawal mikro lain:
- Tutorial Raspberry Pi PWM
- PWM dengan Arduino Due
- Dimmer LED Berasaskan Arduino menggunakan PWM
- Power LED Dimmer menggunakan ATmega32 Microcontroller