Isi kandungan:

Mikrokontroler AVR. LED Flasher Menggunakan Pemasa. Gangguan Pemasa. Mod CTC Pemasa: 6 Langkah
Mikrokontroler AVR. LED Flasher Menggunakan Pemasa. Gangguan Pemasa. Mod CTC Pemasa: 6 Langkah

Video: Mikrokontroler AVR. LED Flasher Menggunakan Pemasa. Gangguan Pemasa. Mod CTC Pemasa: 6 Langkah

Video: Mikrokontroler AVR. LED Flasher Menggunakan Pemasa. Gangguan Pemasa. Mod CTC Pemasa: 6 Langkah
Video: Zoom IoT 2021-03-15 2024, November
Anonim
Image
Image

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

Penyataan Masalah 1: Mari Flash Pertama LED (hijau) Setiap 50 Ms
Penyataan Masalah 1: Mari Flash Pertama LED (hijau) Setiap 50 Ms

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

Penyataan Masalah 1: Mari Flash Pertama LED (hijau) Setiap 50 Ms
Penyataan Masalah 1: Mari Flash Pertama LED (hijau) Setiap 50 Ms
Penyataan Masalah 1: Mari Flash Pertama LED (hijau) Setiap 50 Ms
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

Penyataan Masalah 2: Mari Flash Kedua LED (biru) Setiap 1s
Penyataan Masalah 2: Mari Flash Kedua LED (biru) Setiap 1s
Penyataan Masalah 2: Mari Flash Kedua LED (biru) Setiap 1s
Penyataan Masalah 2: Mari Flash Kedua LED (biru) Setiap 1s
Penyataan Masalah 2: Mari Flash Kedua LED (biru) Setiap 1s
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

Penyataan Masalah 3: Mari Flash Ketiga LED (merah) Setiap 16ms
Penyataan Masalah 3: Mari Flash Ketiga LED (merah) Setiap 16ms
Penyataan Masalah 3: Mari Flash Ketiga LED (merah) Setiap 16ms
Penyataan Masalah 3: Mari Flash Ketiga LED (merah) Setiap 16ms
Penyataan Masalah 3: Mari Flash Ketiga LED (merah) Setiap 16ms
Penyataan Masalah 3: Mari Flash Ketiga LED (merah) Setiap 16ms
Penyataan Masalah 3: Mari Flash Ketiga LED (merah) Setiap 16ms
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 Kod untuk Program di C. Memuat naik Fail HEX Ke dalam Memori Kilat Mikrokontroler
Menulis Kod untuk Program di C. Memuat naik Fail HEX Ke dalam Memori Kilat Mikrokontroler
Menulis Kod untuk Program di C. Memuat naik Fail HEX Ke dalam Memori Kilat Mikrokontroler
Menulis Kod untuk Program di C. Memuat naik Fail HEX Ke dalam 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

Membuat Litar Elektrik
Membuat Litar Elektrik
Membuat Litar Elektrik
Membuat Litar Elektrik
Membuat Litar Elektrik
Membuat Litar Elektrik

Sambungkan komponen mengikut gambarajah skematik.

Disyorkan: