- PWM Pin dalam AVR Microcontroller Atmega16
- Apakah Isyarat PWM?
- Komponen Diperlukan
- Rajah Litar
- Pengaturcaraan Atmega16 untuk PWM
Pulse Width Modulation (PWM) adalah teknik yang kuat di mana lebar nadi diubah dengan menjaga frekuensi tetap. Teknik ini digunakan dalam banyak sistem kawalan hari ini. Aplikasi PWM tidak terhad dan digunakan dalam pelbagai aplikasi seperti kawalan kelajuan motor, pengukuran, kawalan daya dan komunikasi dll. Dalam teknik PWM, seseorang dapat menghasilkan isyarat output analog dengan mudah menggunakan isyarat digital. Tutorial ini akan membantu anda dalam memahami PWM, terminologinya dan bagaimana kita dapat melaksanakannya menggunakan mikrokontroler. Dalam tutorial ini kita akan menunjukkan PWM dengan AVR Atmega16 Microcontroller dengan mengubah intensiti LED.
Untuk memahami asas PWM secara terperinci, sila pergi ke tutorial PWM kami sebelumnya dengan pelbagai mikrokontroler:
- Tutorial ARM7-LPC2148 PWM: Mengawal Kecerahan LED
- Modulasi lebar nadi (PWM) menggunakan MSP430G2: Mengawal Kecerahan LED
- Menjana PWM menggunakan PIC Microcontroller dengan MPLAB dan XC8
- Modulasi lebar nadi (PWM) dalam STM32F103C8: Mengawal Kelajuan Kipas DC
- Menghasilkan isyarat PWM pada pin GPIO MIC Microcontroller
- Tutorial Raspberry Pi PWM
PWM Pin dalam AVR Microcontroller Atmega16
Atmega16 mempunyai empat pin PWM khusus. Pin ini ialah PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Atmega16 juga mempunyai dua pemasa 8-bit dan satu pemasa 16 bit. Timer0 dan Timer2 adalah pemasa 8-bit sedangkan Timer1 adalah pemasa 16-bit. Untuk menghasilkan PWM kita mesti mempunyai gambaran keseluruhan pemasa kerana pemasa digunakan untuk menghasilkan PWM. Seperti yang kita ketahui bahawa frekuensi adalah bilangan kitaran sesaat pada masa pemasa berjalan. Jadi frekuensi yang lebih tinggi akan memberi kita pemasa yang lebih pantas. Dalam menjana PWM, frekuensi PWM yang lebih cepat akan memberikan kawalan yang lebih baik terhadap output kerana dapat bertindak balas dengan lebih cepat kepada kitaran tugas PWM baru.
Dalam tutorial Atmega16 PWM ini kita akan menggunakan Timer2. Anda boleh memilih mana-mana kitaran tugas. Sekiranya anda tidak tahu apa itu kitaran tugas di PWM maka mari kita bincangkan secara ringkas.
Apakah Isyarat PWM?
Pulse Width Modulation (PWM) adalah isyarat digital yang paling biasa digunakan dalam litar kawalan. 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.
Seperti dalam isyarat denyut 100ms, jika isyaratnya TINGGI selama 50ms dan RENDAH selama 50 ms, ini bermaksud nadi adalah separuh masa TINGGI dan separuh masa RENDAH. Oleh itu, kita boleh mengatakan bahawa kitaran tugas adalah 50%. Begitu juga jika nadi berada dalam keadaan TINGGI 25 ms dan 75 m di keadaan RENDAH dari 100 ms, maka kitar tugas akan menjadi 25%. Perhatikan bahawa kita hanya mengira tempoh keadaan TINGGI. Anda boleh merujuk gambar di bawah untuk pemahaman visual. Formula untuk kitaran tugas adalah,
Duty Cycle (%) = Pada Masa / (Waktu Tepat + Waktu Mati)
Jadi, dengan mengubah kitaran tugas kita dapat mengubah lebar PWM sehingga mengakibatkan perubahan kecerahan LED. Kami akan mempunyai demo menggunakan kitaran tugas yang berbeza dalam mengawal kecerahan LED. Lihat Video demo di akhir tutorial ini.
Setelah memilih kitaran tugas, langkah seterusnya adalah memilih mod PWM. Mod PWM menentukan bahawa bagaimana anda mahu PWM berfungsi. Terdapat terutamanya 3 jenis mod PWM. Ini adalah seperti berikut:
- PWM pantas
- Fasa PWM yang Betul
- Fasa dan Frekuensi PWM yang Betul
PWM pantas digunakan di mana perubahan fasa tidak menjadi masalah. Dengan menggunakan PWM Cepat, kita dapat mengeluarkan nilai PWM dengan cepat. PWM cepat tidak dapat digunakan di mana perubahan fasa mempengaruhi operasi seperti kawalan motor, jadi dalam aplikasi tersebut Mod PWM lain digunakan. Oleh kerana kita akan mengawal Kecerahan LED di mana perubahan fasa tidak akan banyak mempengaruhi, jadi kita akan menggunakan mod PWM Cepat.
Sekarang untuk menghasilkan PWM kita akan mengawal pemasa dalaman untuk mengira dan kemudian kembali ke sifar pada kiraan tertentu, sehingga pemasa akan mengira dan kemudian kembali ke sifar berulang-ulang. Ini menetapkan tempoh. Kami sekarang mempunyai pilihan untuk mengendalikan denyut nadi, menghidupkan denyut nadi pada kiraan tertentu dalam pemasa semasa naik. Apabila kaunter kembali ke 0, kemudian matikan nadi. Terdapat banyak fleksibiliti dengan ini kerana anda selalu dapat mengakses kiraan pemasa dan memberikan denyutan yang berbeza dengan satu pemasa. Ini bagus apabila anda ingin mengawal banyak LED sekaligus. Sekarang mari kita mulakan antara satu LED dengan Atmega16 untuk PWM.
Lihat semua projek berkaitan PWM di sini.
Komponen Diperlukan
- IC mikrokontroler Atmega16
- Pengayun Kristal 16Mhz
- Dua Kapasitor 100nF
- Dua Kapasitor 22pF
- Tekan butang
- Wayar Pelompat
- Papan roti
- USBASP v2.0
- 2 Led (Sebarang Warna)
Rajah Litar
Kami menggunakan OC2 untuk PWM iaitu Pin21 (PD7). Oleh itu, sambungkan satu LED pada pin PD7 Atmega16.
Pengaturcaraan Atmega16 untuk PWM
Program lengkap diberikan di bawah. Bakar program di Atmega16 menggunakan JTAG dan Atmel studio dan lihat kesan PWM pada LED. Kecerahannya akan meningkat dan menurun secara perlahan kerana kitaran tugas PWM yang berbeza-beza. Lihat Video yang diberikan di akhir.
Mulakan pengaturcaraan Atmega16 dengan menyediakan Timer2 Register. Bit register Timer2 adalah seperti berikut dan kami dapat menetapkan atau menetapkan semula bit dengan sewajarnya.
Sekarang kita akan membincangkan mengenai semua bit Timer2 sehingga kita dapat memperoleh PWM yang diinginkan menggunakan program bertulis.
Terdapat terutamanya empat bahagian dalam Timer2 register:
FOC2 (Force Output Bandingkan untuk Timer2): Bit FOC2 ditetapkan apabila bit WGM menentukan Mod bukan PWM.
WGM2 (Mod Penjanaan Gelombang untuk Pemasa2): Bit ini mengawal urutan penghitung pembilang, sumber untuk nilai kaunter maksimum (TOP), dan jenis penjanaan bentuk gelombang yang akan digunakan.
COM2 (Bandingkan Mod Output untuk Pemasa2): Bit ini mengawal tingkah laku output. Penerangan bit lengkap dijelaskan di bawah.
TCCR2 - = (1 <
Tetapkan bit WGM20 dan WGM21 sebagai TINGGI untuk mengaktifkan Mod PWM Cepat. WGM bermaksud Mod Penjanaan Bentuk Gelombang. Bit pilihan adalah seperti di bawah.
WGM00 |
WGM01 |
Operasi Mod Pemasa2 |
0 |
0 |
Mod biasa |
0 |
1 |
CTC (Clear Timer On Bandingkan Padanan) |
1 |
0 |
PWM, Fasa Betul |
1 |
1 |
Mod PWM Pantas |
Untuk keterangan lebih lanjut mengenai Mod Generasi Gelombang, anda boleh merujuk lembaran data rasmi Atmega16.
TCCR2 - = (1 <
Kami juga belum menggunakan pra-penskalaan sehingga kami telah menetapkan daftar sumber Jam sebagai '001'.
Bit pilihan Jam adalah seperti berikut:
CS22 |
CS21 |
CS20 |
Penerangan |
0 |
0 |
0 |
Tiada sumber jam (Pemasa / Kaunter dihentikan) |
0 |
0 |
1 |
clk T2S / (Tanpa Prescaling) |
0 |
1 |
0 |
Clk T2S / 8 (Dari Prescaler) |
0 |
1 |
1 |
Clk T2S / 32 (Dari Prescaler) |
1 |
0 |
0 |
Clk T2S / 64 (Dari Prescaler) |
1 |
0 |
1 |
Clk T2S / 128 (Dari Prescaler) |
1 |
1 |
0 |
Clk T2S / 256 (Dari Prescaler) |
1 |
1 |
1 |
Clk T2S / 1024 (Dari Prescaler) |
Juga OC2 dibersihkan pada perbandingan pertandingan dengan menetapkan COM21 bit sebagai '1' dan COM20 sebagai '0'.
Pilihan pilihan Bandingkan Output Mode (COM) untuk Mod PWM Cepat diberikan di bawah:
COM21 |
COM21 |
Penerangan |
0 |
0 |
Operasi port biasa, OC2 terputus. |
0 |
1 |
Terpelihara |
1 |
0 |
Kosongkan OC2 pada pertandingan Bandingkan, Tetapkan OC2 pada TOP |
1 |
1 |
Tetapkan OC2 pada pertandingan perbandingan, kosongkan OC2 di TOP |
Tingkatkan kitaran tugas dari 0% hingga 100% sehingga kecerahan akan meningkat dari masa ke masa. Ambil nilai dari 0-255 dan hantarkan ke pin OCR2.
untuk (tugas = 0; tugas <255; tugas ++) // 0 untuk kitaran tugas maksimum { OCR2 = tugas; // perlahan-lahan meningkatkan kecerahan LED _delay_ms (10); }
Begitu juga menurunkan kitaran tugas dari 100% menjadi 0% untuk mengurangkan kecerahan LED secara beransur-ansur.
untuk (tugas = 0; tugas> 255; tugas--) // maksimum hingga 0 kitaran tugas { OCR2 = tugas; // perlahan-lahan mengurangkan kecerahan LED _delay_ms (10); }
Ini menyelesaikan Tutorial kami Menggunakan PWM di Atmega16 / 32.