Isi kandungan:
- Langkah 1: Penerangan
- Langkah 2: Penyataan Masalah 1: Mari Flash Pertama LED (hijau) Setiap 50 Ms
- Langkah 3: Penyataan Masalah 2: Mari Flash Kedua LED (biru) Setiap 1s
- Langkah 4: Penyataan Masalah 3: Mari Flash Ketiga LED (merah) Setiap 16ms
- Langkah 5: Menulis Kod untuk Program di C. Memuat naik Fail HEX Ke Memori Kilat Mikrokontroler
- Langkah 6: Membuat Litar Elektrik
Video: Mikrokontroler AVR. LED Flasher Menggunakan Pemasa. Gangguan Pemasa. Mod CTC Pemasa: 6 Langkah
2024 Pengarang: John Day | [email protected]. Diubah suai terakhir: 2024-01-30 11:10
Hai semua!
Pemasa adalah konsep penting dalam bidang elektronik. Setiap komponen elektronik berfungsi berdasarkan jangka masa. Pangkalan masa ini membantu memastikan semua kerja disegerakkan. Semua pengawal mikro berfungsi pada frekuensi jam yang telah ditentukan, mereka semua mempunyai peruntukan untuk mengatur pemasa. AVR mempunyai pemasa yang tepat, tepat dan boleh dipercayai. Ia menawarkan banyak ciri di dalamnya, sehingga menjadikannya topik yang luas. Bahagian yang terbaik adalah bahawa pemasa benar-benar bebas dari CPU. Oleh itu, ia berjalan selari dengan CPU dan tidak ada campur tangan CPU, yang menjadikan pemasa cukup tepat. Dalam bahagian ini saya menerangkan konsep asas Pemasa AVR. Saya menulis program sederhana dalam kod C untuk mengawal flasher LED, menggunakan pemasa.
Langkah 1: Penerangan
Di ATMega328 terdapat tiga jenis pemasa:
Timer / Counter0 (TC0) - adalah modul Timer / Counter 8-bit tujuan umum, dengan dua Unit OutputCompare bebas, dan sokongan PWM;
Timer / Counter1 (TC1) - Unit Timer / Counter 16-bit membolehkan masa pelaksanaan program yang tepat (pengurusan peristiwa), penghasilan gelombang, dan pengukuran masa isyarat;
Timer / Counter2 (TC2) -adalah tujuan umum, saluran, modul 8-bit Timer / Counter dengan PWM dan Operasi Asinkron;
Langkah 2: Penyataan Masalah 1: Mari Flash Pertama LED (hijau) Setiap 50 Ms
Kaedah:
- menggunakan prescaler Timer0 untuk mengurangkan isyarat elektrik frekuensi tinggi ke frekuensi yang lebih rendah oleh pembahagian integer;
- menggunakan gangguan setiap kali Timer0 meluap;
Timer0 (8 bit) ia dikira dari 0 hingga 255 setelah itu, mereka meluap, nilai ini berubah pada setiap denyutan jam.
F_CPU = 16MHz: Tempoh waktu jam = 1000ms / 16000000Hz = 0.0000625ms
Kiraan pemasa = (Tempoh Masa Kelewatan / Jam yang diperlukan) -1 = (50ms / 0.0000625ms) = 799999
Jam sudah berdetik 799999 kali untuk memberikan kelewatan hanya 50 ms!
Kita dapat menggunakan teknik pembahagian frekuensi yang disebut prescaling untuk menurunkan jumlah pemasa. AVR menawarkan nilai-nilai prescaler berikut untuk dipilih: 8, 64, 256 dan 1024. Lihat jadual yang merangkum hasil penggunaan prescaler yang berbeza.
Nilai pembilang harus selalu berupa bilangan bulat. Mari pilih prescaler 256!
Di kebanyakan mikrokontroler, ada sesuatu yang disebut Interrupt. Gangguan ini dapat ditembak setiap kali syarat tertentu dipenuhi. Sekarang setiap kali gangguan diaktifkan, AVR berhenti dan menyimpan pelaksanaan rutin utama, melakukan panggilan interupsi (dengan menjalankan rutin khas, yang disebut Rutin Perkhidmatan Interrupt, ISR) dan setelah selesai, kembali ke rutin utama dan terus melaksanakannya.
Oleh kerana kelewatan yang diperlukan (50 ms) lebih besar daripada penundaan maksimum yang mungkin: 4, 096 ms = 1000 ms / 62500Hz * 256, jelas pemasa akan meluap. Dan setiap kali pemasa meluap, gangguan disala.
Berapa kali gangguan itu mesti dipecat?
50ms / 4.096ms = 3125/256 = 12.207 Sekiranya pemasa telah meluap 12 kali, 12 * 4.096ms = 49.152ms akan berlalu. Pada lelaran ke-13, kita memerlukan kelewatan 50ms - 49.152ms = 0.848ms.
Pada frekuensi 62500Hz (prescaler = 256), setiap tanda memerlukan 0.016ms. Oleh itu untuk mencapai kelewatan 0.848ms, ia memerlukan 0.848ms / 0.016ms = 53 kutu. Oleh itu, pada lelaran ke-13, kita hanya membenarkan pemasa mengira hingga 53, dan kemudian menetapkannya semula.
Memulakan Timer0 / Counter (lihat gambar):
TCCR0B | = (1 << CS02) // tetapkan pemasa dengan prescaler = 256 TCNT0 = 0 // inisialisasi pembilang TIMSK0 | = (1 << TOIE0) // aktifkan gangguan luaran sei () // aktifkan gangguan global tot_overflow = 0 // memulakan pemboleh ubah pembilang limpahan
Langkah 3: Penyataan Masalah 2: Mari Flash Kedua LED (biru) Setiap 1s
Kaedah:
- menggunakan prescaler Timer1 untuk mengurangkan isyarat elektrik frekuensi tinggi ke frekuensi yang lebih rendah oleh pembahagian integer;
- menggunakan Mod Pemasa Bersih pada Perbandingan (CTC);
- menggunakan gangguan dengan mod CTC;
Pemasa1 (16 bit) ia dikira dari 0 hingga 65534 selepas itu, mereka melimpah. Nilai ini berubah pada setiap nadi jam.
F_CPU = 16MHz: Tempoh waktu jam = 1000ms / 16000000Hz = 0.0000625ms Kiraan waktu = (Kelewatan yang diperlukan / Tempoh waktu jam) -1 = (1000ms / 0.0000625ms) = 15999999
Jam sudah berdetik 15999999 kali untuk memberikan kelewatan 1s!
Kita dapat menggunakan teknik pembahagian frekuensi yang disebut prescaling untuk menurunkan jumlah pemasa. AVR menawarkan nilai-nilai prescaler berikut untuk dipilih: 8, 64, 256 dan 1024. Lihat jadual yang merangkum hasil penggunaan prescaler yang berbeza. Nilai pembilang harus selalu berupa bilangan bulat. Mari pilih prescaler 256!
Dalam mod Clear timer on Bandingkan (CTC), register OCR1A atau ICR1 digunakan untuk memanipulasi resolusi pembilang. Dalam mod CTC, pembilang dibersihkan ke sifar apabila nilai pembilang (TCNT1) sepadan dengan OCR1A atau ICR1. OCR1A atau ICR1 menentukan nilai tertinggi untuk kaunter, dan juga penyelesaiannya. Mod ini membolehkan kawalan yang lebih besar terhadap frekuensi output pertandingan yang dibandingkan. Ia juga memudahkan operasi mengira peristiwa luaran. Kita mesti memberitahu AVR untuk menetapkan semula Timer1 / Counter sebaik sahaja nilainya mencapai nilai 62500, sehingga mencapai kelewatan 1s.
Memulakan Pemasa1 / Kaunter (lihat gambar):
TCCR1B | = (1 << WGM12) | (1 << CS12) // tetapkan pemasa dengan prescaler = 256 dan mod CTC TCNT1 = 0 // mulakan pembilang TIMSK1 | = (1 << OCIE1A) // aktifkan membandingkan OCR1A gangguan = 62500 // memulakan nilai perbandingan
Langkah 4: Penyataan Masalah 3: Mari Flash Ketiga LED (merah) Setiap 16ms
Kaedah:
- menggunakan prescaler Timer2 untuk mengurangkan isyarat elektrik frekuensi tinggi ke frekuensi yang lebih rendah oleh pembahagian integer;
- menggunakan Mod Pemasa Bersih pada Perbandingan (CTC);
- menggunakan Mod CTC Perkakasan tanpa gangguan;
Timer2 (8 bit) ia dikira dari 0 hingga 255 selepas itu, mereka melimpah. Nilai ini berubah pada setiap nadi jam.
F_CPU = 16MHz: Tempoh waktu jam = 1000ms / 16000000Hz = 0.0000625ms
Kiraan pemasa = (Tempoh Masa Kelewatan / Jam yang diperlukan) -1 = (16ms / 0.0000625ms) = 255999
Jam sudah berdetik 255999 kali untuk memberikan kelewatan 16ms!
Lihat jadual yang merangkum hasil penggunaan preskalator yang berbeza. Nilai pembilang harus selalu berupa bilangan bulat. Mari pilih prescaler 1024!
Dalam mod CTC, pembilang dibersihkan ke sifar apabila nilai pembilang (TCNT2) sepadan dengan OCR2A atau ICR2. Pin PB3 juga merupakan pin Output Bandingkan TIMER2 - OC2A (lihat rajah).
Timer / Counter2 Control Register A - TCCR2A Bit 7: 6 - COM2A1: 0 - Bandingkan Mode Output untuk Membandingkan Unit A. Oleh kerana kita perlu menukar LED, kita memilih pilihan: Toggle OC2A on Bandingkan Match Setiap kali perlawanan perbandingan berlaku, Pin OC2A ditukar secara automatik. Tidak perlu memeriksa sedikit bendera, tidak perlu mengganggu gangguan.
Memulakan Pemasa2 / Kaunter
TCCR2A | = (1 << COM2A0) | (1 << WGM21) // siapkan pin pemasa OC2A dalam mod togol dan mod CTC TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20) // tetapkan pemasa dengan prescaler = 1024 TCNT2 = 0 // inisialisasi pembilang OCR2A = 250 // mulakan nilai perbandingan
Langkah 5: Menulis Kod untuk Program di C. Memuat naik Fail HEX Ke Memori Kilat Mikrokontroler
Menulis dan membangun aplikasi mikrokontroler AVR dalam C Code menggunakan Integrated Development Platform - Atmel Studio.
F_CPU menentukan frekuensi jam dalam Hertz dan biasa dalam program yang menggunakan perpustakaan avr-libc. Dalam kes ini digunakan oleh rutin penundaan untuk menentukan cara mengira kelewatan waktu.
#ifndef F_CPU
#define F_CPU 16000000UL // memberitahu frekuensi kristal pengawal (16 MHz AVR ATMega328P) #endif
#include // header untuk membolehkan kawalan aliran data ke atas pin. Mentakrifkan pin, port, dll.
Fail termasuk yang pertama adalah sebahagian daripada avr-libc dan akan digunakan dalam hampir semua projek AVR yang anda jalankan. io.h akan menentukan CPU yang anda gunakan (sebab itulah anda menentukan bahagian ketika menyusun) dan seterusnya memasukkan tajuk definisi IO yang sesuai untuk cip yang kami gunakan. Ini hanya menentukan pemalar untuk semua pin, port, daftar khas, dll.
#include // header untuk membolehkan gangguan
uint8_t tot_overflow tidak menentu; // pemboleh ubah global untuk mengira jumlah limpahan
Metodologi Penyataan Masalah: Lampu kilat Pertama (Hijau) setiap 50 ms
- menggunakan prescaler Timer0 untuk mengurangkan isyarat elektrik frekuensi tinggi ke frekuensi yang lebih rendah oleh pembahagian integer;
- menggunakan gangguan setiap kali Timer0 meluap;
void timer0_init () // memulakan pemasa0, mengganggu dan berubah
{TCCR0B | = (1 << CS02); // tetapkan pemasa dengan prescaler = 256 TCNT0 = 0; // memulakan kaunter TIMSK0 | = (1 << TOIE0); // aktifkan overflow nterrupt sei (); // aktifkan gangguan global tot_overflow = 0; // memulakan pemboleh ubah pembilang limpahan}
Metodologi Penyataan Masalah: Lampu kilat LED Kedua (biru) setiap 1s
- menggunakan prescaler Timer1 untuk mengurangkan isyarat elektrik frekuensi tinggi ke frekuensi yang lebih rendah oleh pembahagian integer;
- menggunakan Mod Pemasa Bersih pada Perbandingan (CTC);
- menggunakan gangguan dengan mod CTC;
void timer1_init () // inisialisasi timer1, interrupt dan variabel {TCCR1B | = (1 << WGM12) | (1 << CS12); // tetapkan pemasa dengan prescaler = 256 dan mod CTC TCNT1 = 0; // memulakan kaunter OCR1A = 62500; // memulakan nilai perbandingan TIMSK1 | = (1 << OCIE1A); // aktifkan membandingkan gangguan}
Metodologi Penyataan Masalah: Flash ketiga LED (merah) setiap 16ms
- menggunakan prescaler Timer2 untuk mengurangkan isyarat elektrik frekuensi tinggi ke frekuensi yang lebih rendah oleh pembahagian integer;
- menggunakan Mod Pemasa Bersih pada Perbandingan (CTC);
- menggunakan Mod CTC Perkakasan tanpa gangguan;
void timer2_init () // memulakan pemasa2 {TCCR2A | = (1 << COM2A0) | (1 << WGM21); // sediakan pin OC2A pemasa dalam mod togol dan mod CTC TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20); // tetapkan pemasa dengan prescaler = 1024 TCNT2 = 0; // memulakan kaunter OCR2A = 250; // mulakan nilai perbandingan}
Rutin perkhidmatan gangguan limpahan TIMER0 dipanggil setiap kali limpahan TCNT0:
ISR (TIMER0_OVF_vect)
{tot_overflow ++; // ikuti jumlah limpahan}
ISR ini dilancarkan setiap kali perlawanan berlaku, beralih ke arah ini sendiri:
ISR (TIMER1_COMPA_vect) {PORTC ^ = (1 << 1); // togol dipimpin di sini}
int utama (tidak sah)
{DDRB | = (1 << 0); // sambungkan 1 (hijau) menuju ke pin PB0 DDRC | = (1 << 1); // sambungkan 2 (biru) menuju ke pin PC1 DDRB | = (1 << 3); // sambungkan 3 (merah) menuju pin PB3 (OC2A) timer0_init (); // inisialisasi timer0 timer1_init (); // inisialisasi timer1 timer2_init (); // inisialisasi pemasa2 sementara (1) // gelung selamanya {
Sekiranya Pemasa0 meluap 12 kali, 12 * 4.096ms = 49.152ms akan berlalu. Pada lelaran ke-13, kita memerlukan kelewatan 50ms - 49.152ms = 0.848ms. Oleh itu, pada lelaran ke-13, kita hanya membenarkan pemasa mengira hingga 53, dan kemudian menetapkannya semula.
if (tot_overflow> = 12) // periksa jika tidak. limpahan = 12 CATATAN: '> =' digunakan
{if (TCNT0> = 53) // periksa sama ada jumlah pemasa mencapai 53 {PORTB ^ = (1 << 0); // menukar TCNT0 yang dipimpin = 0; // tetapkan semula kaunter tot_overflow = 0; // tetapkan semula kaunter limpahan}}}}
Memuat naik fail HEX ke dalam memori flash mikrokontroler:
taip tetingkap prompt DOS arahan:
avrdude –c [nama programmer] –p m328p –u –U flash: w: [nama fail hex anda] Dalam kes saya ialah: avrdude –c ISPProgv1 –p m328p –u –U flash: w: Timers.hex
Perintah ini menulis fail hex ke memori mikrokontroler. Tonton video dengan penerangan terperinci mengenai memori kilat mikrokontroler terbakar:
Pembakaran memori kilat mikrokontroler…
Okey! Kini, mikrokontroler berfungsi mengikut arahan program kami. Mari kita periksa!
Langkah 6: Membuat Litar Elektrik
Sambungkan komponen mengikut gambarajah skematik.
Disyorkan:
Cara Membuat Drone Menggunakan Arduino UNO - Buat Quadcopter Menggunakan Mikrokontroler: 8 Langkah (dengan Gambar)
Cara Membuat Drone Menggunakan Arduino UNO | Buat Quadcopter Menggunakan Mikrokontroler: Pendahuluan Lawati Saluran Youtube SayaA Drone adalah alat (produk) yang sangat mahal untuk dibeli. Dalam posting ini saya akan membincangkan, bagaimana saya membuatnya dengan harga murah ?? Dan Bagaimana anda boleh membuat sendiri seperti ini dengan harga yang murah … Baik di India semua bahan (motor, ESC
Mikrokontroler AVR. Togol LED Menggunakan Suis Tombol Tekan. Menolak Butang Tekan: 4 Langkah
Mikrokontroler AVR. Togol LED Menggunakan Suis Tombol Tekan. Menolak Butang Tekan: Di bahagian ini, kita akan belajar Cara membuat kod program C untuk ATMega328PU untuk menukar status ketiga LED mengikut input dari tombol suis. Kami juga telah mencari jalan keluar untuk masalah ini ialah 'Switch Bounce'. Seperti biasa, kami
Menggunakan Penglihatan Sonar, Lidar, dan Komputer pada Mikrokontroler untuk Membantu Orang-orang yang Gangguan Penglihatan: 16 Langkah
Menggunakan Sonar, Lidar, dan Penglihatan Komputer pada Pengawal Mikro untuk Membantu Orang-orang yang Bermasalah Penglihatan: Saya ingin membuat ‘tongkat’ pintar yang dapat membantu orang-orang dengan masalah penglihatan jauh lebih banyak daripada penyelesaian yang ada. Tebu akan dapat memberitahu pengguna objek di depan atau di sisi dengan membuat bunyi di headphon jenis bunyi sekeliling
MENGGUNAKAN EXtreme Burner untuk Pengaturcaraan Mikrokontroler AVR: 8 Langkah
MENGGUNAKAN EXtreme Burner untuk Pengaturcaraan Mikrokontroler AVR: Semua persaudaraan pengguna AVR anda di luar sana, dan mereka yang baru memasuki aliran, Sebilangan daripada anda memulakan dengan mikrokontroler PIC dan ada yang bermula dengan AVR ATMEL, ini ditulis untuk anda! Oleh itu, anda membeli USBASP kerana murah dan berkesan untuk
Konfigurasi Fuse Bits Mikrokontroler AVR. Membuat dan Memuat naik dalam Memory Flash Mikrokontroler Program Berkelip LED: 5 Langkah
Konfigurasi Fuse Bits Mikrokontroler AVR. Membuat dan Memuat Naik dalam Memori Flash Mikrokontroler Program Berkelip LED: Dalam kes ini, kita akan membuat program sederhana dalam kod C dan membakarnya ke dalam memori mikrokontroler. Kami akan menulis program kami sendiri dan menyusun fail hex, menggunakan Atmel Studio sebagai platform pembangunan bersepadu. Kami akan mengkonfigurasi fius bi