- Pin PWM pada Mikrokontroler AVR Atmega16
- Apa itu Sinyal PWM?
- Komponen Diperlukan
- Diagram Sirkuit
- Pemrograman Atmega16 untuk PWM
Pulse Width Modulation (PWM) adalah teknik yang ampuh di mana lebar pulsa diubah dengan menjaga frekuensi konstan. Teknik ini digunakan di banyak sistem kontrol saat ini. Aplikasi PWM tidak terbatas dan digunakan dalam berbagai aplikasi seperti kontrol kecepatan motor, pengukuran, kontrol daya dan komunikasi dll. Dalam teknik PWM, seseorang dapat dengan mudah menghasilkan sinyal keluaran analog dengan menggunakan sinyal digital. Tutorial ini akan membantu Anda dalam memahami PWM, terminologinya dan bagaimana kita dapat menerapkannya menggunakan mikrokontroler. Dalam tutorial ini kita akan mendemonstrasikan PWM dengan Mikrokontroler AVR Atmega16 dengan memvariasikan intensitas sebuah LED.
Untuk memahami dasar-dasar PWM secara detail, silakan buka tutorial kami sebelumnya tentang PWM dengan berbagai mikrokontroler:
- Tutorial PWM ARM7-LPC2148: Mengontrol Kecerahan LED
- Pulse width Modulation (PWM) menggunakan MSP430G2: Mengontrol Kecerahan LED
- Pembangkit PWM menggunakan Mikrokontroler PIC dengan MPLAB dan XC8
- Modulasi Lebar Pulsa (PWM) di STM32F103C8: Mengontrol Kecepatan Kipas DC
- Membangkitkan sinyal PWM pada pin GPIO Mikrokontroler PIC
- Tutorial PWM Raspberry Pi
Pin PWM pada Mikrokontroler AVR Atmega16
Atmega16 memiliki empat pin PWM khusus. Pin ini adalah PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Atmega16 juga memiliki dua timer 8-bit dan satu timer 16 bit. Timer0 dan Timer2 adalah timer 8-bit sedangkan Timer1 adalah timer 16-bit. Untuk menghasilkan PWM kita harus memiliki gambaran umum tentang timer karena timer digunakan untuk menghasilkan PWM. Seperti yang kita ketahui bahwa frekuensi adalah jumlah siklus per detik di mana pengatur waktu berjalan. Jadi frekuensi yang lebih tinggi akan memberi kita pengatur waktu yang lebih cepat. Dalam menghasilkan PWM, frekuensi PWM yang lebih cepat akan memberikan kontrol yang lebih baik atas output karena dapat merespons lebih cepat siklus tugas PWM yang baru.
Dalam tutorial Atmega16 PWM ini kita akan menggunakan Timer2. Anda dapat memilih siklus tugas apa pun. Jika Anda belum mengetahui apa itu duty cycle pada PWM maka mari kita bahas secara singkat.
Apa itu Sinyal PWM?
Pulse Width Modulation (PWM) adalah sinyal digital yang paling umum digunakan dalam rangkaian kontrol. 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.
Seperti pada sinyal pulsa 100ms, jika sinyal TINGGI untuk 50ms dan RENDAH untuk 50ms, itu berarti pulsa setengah TINGGI dan setengah waktu RENDAH. Jadi dapat dikatakan bahwa duty cycle adalah 50%. Demikian pula jika pulsa dalam kondisi TINGGI 25ms dan 75ms dalam status RENDAH dari 100ms, maka duty cycle akan menjadi 25%. Perhatikan bahwa kami hanya menghitung durasi status TINGGI. Anda dapat mengambil referensi gambar di bawah ini untuk pemahaman visual. Rumus duty cycle kemudian adalah,
Siklus Kerja (%) = Waktu Nyala / (Waktu Nyala + Waktu Mati)
Jadi, dengan mengubah duty cycle kita bisa mengubah lebar PWM sehingga mengakibatkan perubahan kecerahan LED. Kami akan memiliki demo menggunakan siklus tugas yang berbeda dalam mengontrol kecerahan LED. Lihat Video demo di akhir tutorial ini.
Setelah memilih duty cycle, langkah selanjutnya adalah memilih mode PWM. Mode PWM menentukan cara kerja PWM yang Anda inginkan. Terutama ada 3 jenis mode PWM. Ini adalah sebagai berikut:
- PWM cepat
- Fase Benar PWM
- Fase dan Frekuensi Benar PWM
PWM cepat digunakan di mana perubahan fasa tidak menjadi masalah. Dengan menggunakan Fast PWM, kita dapat mengeluarkan nilai PWM dengan cepat. PWM cepat tidak dapat digunakan di mana perubahan fasa mempengaruhi operasi seperti kontrol motor, sehingga dalam aplikasi tersebut Mode PWM lain digunakan. Karena kami akan mengontrol Brightness of LED di mana perubahan fasa tidak akan berpengaruh banyak, jadi kami akan menggunakan mode Fast PWM.
Sekarang untuk menghasilkan PWM kita akan mengontrol timer internal untuk menghitung dan kemudian mengatur kembali ke nol pada hitungan tertentu, jadi timer akan menghitung dan kemudian mengatur kembali ke nol berulang kali. Ini menentukan periode. Kami sekarang memiliki opsi untuk mengontrol pulsa, menyalakan pulsa pada hitungan tertentu di pengatur waktu saat naik. Saat penghitung kembali ke 0, maka matikan pulsa. Ada banyak fleksibilitas dengan ini karena Anda selalu dapat mengakses hitungan pengatur waktu dan memberikan pulsa yang berbeda dengan satu pengatur waktu. Ini bagus ketika Anda ingin mengontrol beberapa LED sekaligus. Sekarang mari kita mulai menghubungkan satu LED dengan Atmega16 untuk PWM.
Periksa semua proyek terkait PWM di sini.
Komponen Diperlukan
- IC Mikrokontroler AVR Atmega16
- Osilator Kristal 16Mhz
- Dua Kapasitor 100nF
- Dua Kapasitor 22pF
- Tekan tombol
- Kabel Jumper
- Papan tempat memotong roti
- USBASP v2.0
- 2 Led (Warna Apa Pun)
Diagram Sirkuit
Kami menggunakan OC2 untuk PWM yaitu Pin21 (PD7). Jadi hubungkan satu LED pada pin PD7 dari Atmega16.
Pemrograman Atmega16 untuk PWM
Program lengkap diberikan di bawah ini. Rekam program di Atmega16 menggunakan JTAG dan Atmel studio dan lihat efek PWM pada LED. Kecerahannya akan meningkat dan menurun secara perlahan karena siklus kerja PWM yang bervariasi. Periksa Video yang diberikan di akhir.
Mulai pemrograman Atmega16 dengan mengatur Timer2 Register. Bit register Timer2 adalah sebagai berikut dan kita dapat mengatur atau mengatur ulang bit yang sesuai.
Sekarang kita akan membahas tentang semua bit Timer2 sehingga kita bisa mendapatkan PWM yang diinginkan menggunakan program tertulis.
Terutama ada empat bagian dalam register Timer2:
FOC2 (Perbandingan Output Paksa untuk Timer2): Bit FOC2 diset ketika bit WGM menentukan Mode non-PWM.
WGM2 (Mode Penghasil Gelombang untuk Timer2): Bit-bit ini mengontrol urutan penghitungan penghitung, sumber untuk nilai pencacah maksimum (TOP), dan jenis pembangkitan gelombang apa yang akan digunakan.
COM2 (Bandingkan Mode Output untuk Timer2): Bit ini mengontrol perilaku output. Deskripsi bit lengkap dijelaskan di bawah ini.
TCCR2 - = (1 <
Atur bit WGM20 dan WGM21 sebagai TINGGI untuk mengaktifkan Mode Cepat PWM. WGM Singkatan dari Mode Generasi Gelombang. Bit pilihannya adalah seperti di bawah ini.
WGM00 |
WGM01 |
Pengoperasian Mode Timer2 |
0 |
0 |
Mode normal |
0 |
1 |
CTC (Hapus Timer Saat Pertandingan Bandingkan) |
1 |
0 |
PWM, Fase Benar |
1 |
1 |
Mode PWM Cepat |
Untuk detail lebih lanjut tentang Mode Generasi Gelombang, Anda dapat merujuk lembar data resmi Atmega16.
TCCR2 - = (1 <
Juga kami belum menggunakan pra-skala jadi kami telah menyetel register sumber Jam sebagai '001'.
Bit pemilihan Jam adalah sebagai berikut:
CS22 |
CS21 |
CS20 |
Deskripsi |
0 |
0 |
0 |
Tidak ada sumber jam (Timer / Penghitung 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 dihapus pada pertandingan perbandingan dengan mengatur bit COM21 sebagai '1' dan COM20 sebagai '0'.
Pilihan pilihan Bandingkan Mode Output (COM) untuk Mode PWM Cepat diberikan di bawah ini:
COM21 |
COM21 |
Deskripsi |
0 |
0 |
Operasi port normal, OC2 terputus. |
0 |
1 |
Pendiam |
1 |
0 |
Hapus OC2 pada pertandingan Bandingkan, Atur OC2 di TOP |
1 |
1 |
Setel OC2 pada pertandingan perbandingan, bersihkan OC2 di TOP |
Tingkatkan siklus kerja dari 0% menjadi 100% sehingga kecerahan akan meningkat seiring waktu. Ambil nilai 0-255 dan kirimkan ke pin OCR2.
untuk (duty = 0; duty <255; duty ++) // 0 hingga max duty cycle { OCR2 = duty; // perlahan-lahan tingkatkan kecerahan LED _delay_ms (10); }
Demikian pula, kurangi siklus kerja dari 100% menjadi 0% untuk secara bertahap mengurangi kecerahan LED.
untuk (duty = 0; duty> 255; duty--) // max hingga 0 duty cycle { OCR2 = duty; // perlahan-lahan kurangi kecerahan LED _delay_ms (10); }
Ini menyelesaikan Tutorial kami tentang Menggunakan PWM di Atmega16 / 32.