İçindekiler:

AVR Mikrodenetleyici. Zamanlayıcıyı Kullanan LED'ler Flaşör. Zamanlayıcılar Kesintiler. Zamanlayıcı CTC Modu: 6 Adım
AVR Mikrodenetleyici. Zamanlayıcıyı Kullanan LED'ler Flaşör. Zamanlayıcılar Kesintiler. Zamanlayıcı CTC Modu: 6 Adım

Video: AVR Mikrodenetleyici. Zamanlayıcıyı Kullanan LED'ler Flaşör. Zamanlayıcılar Kesintiler. Zamanlayıcı CTC Modu: 6 Adım

Video: AVR Mikrodenetleyici. Zamanlayıcıyı Kullanan LED'ler Flaşör. Zamanlayıcılar Kesintiler. Zamanlayıcı CTC Modu: 6 Adım
Video: Transistör İle Basit Zamanlayıcı Yapımı / Kondansatör İle Led Yanış Süresini Ayarlamak 2024, Temmuz
Anonim
Image
Image

Herkese merhaba!

Zamanlayıcılar elektronik alanında önemli bir kavramdır. Her elektronik bileşen bir zaman temelinde çalışır. Bu zaman tabanı, tüm işlerin senkronize olmasına yardımcı olur. Tüm mikro denetleyiciler önceden tanımlanmış bir saat frekansında çalışır, hepsinin zamanlayıcıları ayarlamak için bir hükmü vardır. AVR, çok doğru, kesin ve güvenilir bir zamanlayıcıya sahip olmakla övünür. İçinde birçok özellik sunar, böylece onu geniş bir konu haline getirir. En iyi yanı, zamanlayıcının CPU'dan tamamen bağımsız olmasıdır. Böylece CPU'ya paralel çalışır ve CPU'nun müdahalesi yoktur, bu da zamanlayıcıyı oldukça doğru kılar. Bu bölümde AVR Zamanlayıcıların temel kavramlarını açıklıyorum. Zamanlayıcıları kullanarak LED flaşörü kontrol etmek için C kodunda basit bir program yazıyorum.

1. Adım: Açıklama

Problem Açıklama 1: İlk LED'i (yeşil) Her 50 Ms'de Bir Yanıp Sönelim
Problem Açıklama 1: İlk LED'i (yeşil) Her 50 Ms'de Bir Yanıp Sönelim

ATMega328'de üç tür zamanlayıcı vardır:

Zamanlayıcı/Sayaç0 (TC0) - iki bağımsız Çıkış Karşılaştırma Birimi ve PWM desteği ile genel amaçlı 8 bitlik bir Zamanlayıcı/Sayaç modülüdür;

Zamanlayıcı/Sayaç1 (TC1) - 16 bit Zamanlayıcı/Sayaç birimi, doğru program yürütme zamanlamasına (olay yönetimi), dalga üretimine ve sinyal zamanlama ölçümüne olanak tanır;

Zamanlayıcı/Sayaç2 (TC2) -PWM ve Asenkron Çalışma ile genel amaçlı, kanal, 8-bit Zamanlayıcı/Sayaç modülüdür;

Adım 2: Problem Açıklama 1: İlk LED'i (yeşil) Her 50 Ms'de Bir Yanıp Sönelim

Problem Açıklama 1: İlk LED'i (yeşil) Her 50 Ms'de Bir Yanıp Sönelim
Problem Açıklama 1: İlk LED'i (yeşil) Her 50 Ms'de Bir Yanıp Sönelim
Problem Açıklama 1: İlk LED'i (yeşil) Her 50 Ms'de Bir Yanıp Sönelim
Problem Açıklama 1: İlk LED'i (yeşil) Her 50 Ms'de Bir Yanıp Sönelim

Metodoloji:

- yüksek frekanslı bir elektrik sinyalini tamsayı bölümü ile daha düşük bir frekansa düşürmek için bir Timer0 ön ölçekleyici kullanmak;

- Timer0 her taştığında bir kesme kullanmak;

Timer0 (8 bit) 0'dan 255'e kadar sayar bundan sonra taşarlar, bu değer her saat darbesinde değişir.

F_CPU=16MHz: Saat zaman aralığı = 1000ms / 16000000Hz = 0.0000625ms

Zamanlayıcı sayısı = (Gerekli Gecikme / Saat Zaman Periyodu)-1 = (50ms / 0.0000625ms) = 799999

Saat, yalnızca 50 ms'lik bir gecikme sağlamak için 799999 kez işaretledi!

Zamanlayıcı sayısını azaltmak için ön ölçekleme olarak adlandırılan frekans bölme tekniğini kullanabiliriz. AVR bize aşağıdaki ön ölçekleyici değerleri arasından seçim yapmamızı sağlar: 8, 64, 256 ve 1024. Tabloya bakın, farklı ön ölçekleyiciler kullanmanın sonuçlarını özetler.

Sayaç değeri her zaman bir tam sayı olmalıdır. Bir ön ölçekleyici 256 seçelim!

Çoğu mikrodenetleyicide Interrupt adı verilen bir şey vardır. Bu kesme, belirli koşullar karşılandığında başlatılabilir. Artık bir kesme başlatıldığında, AVR durur ve ana rutinin yürütülmesini kaydeder, kesme çağrısına katılır (Kesme Hizmeti Rutini, ISR olarak adlandırılan özel bir rutin yürüterek) ve onunla bittiğinde, geri döner. ana rutin ve onu yürütmeye devam ediyor.

Gerekli gecikme (50ms), olası maksimum gecikmeden daha büyük olduğundan: 4, 096ms = 1000ms / 62500Hz * 256, açıkçası zamanlayıcı taşacaktır. Ve zamanlayıcı ne zaman taşarsa, bir kesinti başlatılır.

Kesinti kaç kez başlatılmalıdır?

50ms / 4.096ms = 3125 / 256 = 12.207 Zamanlayıcı 12 kez taşmış olsaydı, 12 * 4.096ms = 49.152ms geçmiş olurdu. 13. yinelemede 50ms – 49.152ms = 0.848ms gecikmeye ihtiyacımız var.

62500Hz frekansında (ön ölçekleyici = 256), her onay 0,016 ms sürer. Böylece 0,848 ms'lik bir gecikme elde etmek için 0,848 ms / 0,016 ms = 53 onay işareti gerekir. Bu nedenle, 13. yinelemede, zamanlayıcının yalnızca 53'e kadar saymasına izin veriyoruz ve ardından sıfırlıyoruz.

Timer0/Counter'ı başlat (resme bakın):

TCCR0B |= (1 << CS02) // ön ölçekleyici ile zamanlayıcıyı ayarla = 256 TCNT0 = 0 // sayacı başlat TIMSK0 |= (1 << TOIE0) // taşma kesintisini etkinleştir sei() // global kesmeleri etkinleştir tot_overflow = 0 // taşma sayacı değişkenini başlat

Adım 3: Problem Açıklama 2: İkinci LED'i (mavi) Her 1 Saniyede Bir Yanıp Sönelim

Problem Açıklama 2: İkinci LED'i (mavi) Her 1 Saniyede Bir Yanıp Sönelim
Problem Açıklama 2: İkinci LED'i (mavi) Her 1 Saniyede Bir Yanıp Sönelim
Problem Açıklama 2: İkinci LED'i (mavi) Her 1 Saniyede Bir Yanıp Sönelim
Problem Açıklama 2: İkinci LED'i (mavi) Her 1 Saniyede Bir Yanıp Sönelim
Problem Açıklama 2: İkinci LED'i (mavi) Her 1 Saniyede Bir Yanıp Sönelim
Problem Açıklama 2: İkinci LED'i (mavi) Her 1 Saniyede Bir Yanıp Sönelim

Metodoloji:

- yüksek frekanslı bir elektrik sinyalini tamsayı bölümü ile daha düşük bir frekansa düşürmek için bir Timer1 ön ölçekleyici kullanmak;

- Karşılaştırma (CTC) Modunda Zamanlayıcıyı Temizle'yi kullanma;

- CTC Modu ile Kesintileri kullanma;

Timer1 (16 bit) 0'dan 65534'e kadar sayar, bundan sonra taşarlar. Bu değer her saat darbesinde değişir.

F_CPU=16MHz: Saat zaman periyodu = 1000ms / 16000000Hz = 0.0000625msZamanlayıcı sayısı = (Gerekli Gecikme / Saat Zaman Periyodu)-1 = (1000ms / 0.0000625ms) = 15999999

Saat zaten 1s'lik bir gecikme vermek için 15999999 kez işaretledi!

Zamanlayıcı sayısını azaltmak için ön ölçekleme olarak adlandırılan frekans bölme tekniğini kullanabiliriz. AVR bize aşağıdaki ön ölçekleyici değerleri arasından seçim yapmamızı sağlar: 8, 64, 256 ve 1024. Tabloya bakın, farklı ön ölçekleyiciler kullanmanın sonuçlarını özetler. Sayaç değeri her zaman bir tam sayı olmalıdır. Bir ön ölçekleyici 256 seçelim!

Karşılaştır(CTC) modundaki zamanlayıcıyı temizle modunda, sayaç çözünürlüğünü değiştirmek için OCR1A veya ICR1 kaydı kullanılır. CTC modunda, sayaç değeri (TCNT1) OCR1A veya ICR1 ile eşleştiğinde sayaç sıfırlanır. OCR1A veya ICR1, sayacın en üst değerini ve dolayısıyla çözünürlüğünü tanımlar. Bu mod, karşılaştırma eşleştirme çıkış frekansının daha iyi kontrol edilmesini sağlar. Ayrıca harici olayları sayma işlemini de basitleştirir. AVR'ye Zamanlayıcı1/Sayacı değeri 62500 değerine ulaşır ulaşmaz sıfırlamasını, böylece 1s'lik bir gecikme elde etmesini söylemeliyiz.

Timer1/Counter'ı başlat (resme bakın):

TCCR1B |= (1 << WGM12)|(1 << CS12) // ön ölçekleyici ile zamanlayıcıyı ayarla = 256 ve CTC modu TCNT1 = 0 // sayacı başlat TIMSK1 |= (1 << OCIE1A) // OCR1A karşılaştırmasını etkinleştir = 62500 // karşılaştırma değerini başlat

Adım 4: Sorun Açıklama 3: Üçüncü LED'i (kırmızı) Her 16ms'de Bir Yanıp Sönelim

Problem Açıklama 3: Üçüncü LED'i (kırmızı) Her 16ms'de Bir Yanıp Sönelim
Problem Açıklama 3: Üçüncü LED'i (kırmızı) Her 16ms'de Bir Yanıp Sönelim
Problem Açıklama 3: Üçüncü LED'i (kırmızı) Her 16ms'de Bir Yanıp Sönelim
Problem Açıklama 3: Üçüncü LED'i (kırmızı) Her 16ms'de Bir Yanıp Sönelim
Problem Açıklama 3: Üçüncü LED'i (kırmızı) Her 16ms'de Bir Yanıp Sönelim
Problem Açıklama 3: Üçüncü LED'i (kırmızı) Her 16ms'de Bir Yanıp Sönelim
Problem Açıklama 3: Üçüncü LED'i (kırmızı) Her 16ms'de Bir Yanıp Sönelim
Problem Açıklama 3: Üçüncü LED'i (kırmızı) Her 16ms'de Bir Yanıp Sönelim

Metodoloji:

- yüksek frekanslı bir elektrik sinyalini tamsayı bölümü ile daha düşük bir frekansa düşürmek için bir Timer2 ön ölçekleyici kullanmak;

- Karşılaştırma (CTC) Modunda Zamanlayıcıyı Temizle'yi kullanma;

- Kesintisiz Donanım CTC Modunun kullanılması;

Timer2 (8 bit) 0'dan 255'e kadar sayar, bundan sonra taşarlar. Bu değer her saat darbesinde değişir.

F_CPU=16MHz: Saat zaman aralığı = 1000ms / 16000000Hz = 0.0000625ms

Zamanlayıcı sayısı = (Gerekli Gecikme / Saat Zaman Periyodu)-1 = (16ms / 0.0000625ms) = 255999

Saat, 16 ms'lik bir gecikme sağlamak için şimdiden 255999 kez işaretledi!

Farklı ön ölçekleyicileri kullanmanın sonuçlarını özetleyen tabloya bakın. Sayaç değeri her zaman bir tam sayı olmalıdır. Bir ön ölçekleyici 1024 seçelim!

CTC modunda, sayaç değeri (TCNT2) OCR2A veya ICR2 ile eşleştiğinde sayaç sıfırlanır. Pin PB3 aynı zamanda TIMER2 - OC2A'nın Çıkış Karşılaştırma pinidir (şemaya bakın).

Zamanlayıcı/Sayaç2 Kontrol Kaydı A – TCCR2A Bit 7:6 – COM2A1:0 – Karşılaştırma Birimi A için Karşılaştır Çıkış Modu. LED'i değiştirmemiz gerektiğinden, şu seçeneği seçiyoruz: Karşılaştırma Eşleştirmesinde OC2A'yı Değiştir Bir karşılaştırma eşleşmesi gerçekleştiğinde, OC2A pini otomatik olarak değiştirilir. Herhangi bir bayrak bitini kontrol etmeye gerek yok, herhangi bir kesintiye katılmaya gerek yok.

Zamanlayıcı2/Sayacı Başlat

TCCR2A |= (1 << COM2A0)|(1 << WGM21) // geçiş modunda ve CTC modunda zamanlayıcı OC2A pinini ayarlayın TCCR2B |= (1 << CS22)|(1 << CS21)|(1 << CS20) // ön ölçekleyici ile zamanlayıcıyı ayarla = 1024 TCNT2 = 0 // sayacı başlat OCR2A = 250 // karşılaştırma değerini başlat

Adım 5: C'de Bir Program İçin Kod Yazma. HEX Dosyasını Mikrodenetleyici Flash Belleğine Yükleme

C'de Bir Program İçin Kod Yazma. Mikrodenetleyici Flash Belleğine HEX Dosyasını Yükleme
C'de Bir Program İçin Kod Yazma. Mikrodenetleyici Flash Belleğine HEX Dosyasını Yükleme
C'de Bir Program İçin Kod Yazma. Mikrodenetleyici Flash Belleğine HEX Dosyasını Yükleme
C'de Bir Program İçin Kod Yazma. Mikrodenetleyici Flash Belleğine HEX Dosyasını Yükleme

Entegre Geliştirme Platformu - Atmel Studio'yu kullanarak AVR mikrodenetleyici uygulamasının C Kodunda yazılması ve oluşturulması.

F_CPU, Hertz cinsinden saat frekansını tanımlar ve avr-libc kitaplığını kullanan programlarda yaygındır. Bu durumda gecikme rutinleri tarafından zaman gecikmelerinin nasıl hesaplanacağını belirlemek için kullanılır.

#ifndef F_CPU

#define F_CPU 16000000UL // denetleyici kristal frekansını söylüyor (16 MHz AVR ATMega328P) #endif

#include // pinler üzerinde veri akışı kontrolünü etkinleştirmek için üstbilgi. Pinleri, portları vb. tanımlar.

İlk içerme dosyası avr-libc'nin bir parçasıdır ve üzerinde çalıştığınız hemen hemen tüm AVR projelerinde kullanılacaktır. io.h, kullandığınız CPU'yu belirleyecektir (bu nedenle, derlerken parçayı belirtirsiniz) ve sırayla, kullandığımız çip için uygun IO tanım başlığını içerir. Tüm pinleriniz, portlarınız, özel kayıtlarınız vb. için sabitleri tanımlar.

#include // kesmeyi etkinleştirmek için üstbilgi

uçucu uint8_t tot_overflow; // taşma sayısını saymak için global değişken

Problem Açıklama Metodolojisi: Her 50 ms'de bir Önce Flaş (Yeşil) LED

- yüksek frekanslı bir elektrik sinyalini tamsayı bölümü ile daha düşük bir frekansa düşürmek için bir Timer0 ön ölçekleyici kullanmak;

- Timer0 her taştığında bir kesme kullanmak;

void timer0_init() // timer0, interrupt ve değişkeni başlat

{ TCCR0B |= (1 << CS02); // ön ölçekleyici ile zamanlayıcıyı ayarla = 256 TCNT0 = 0; // sayacı başlat TIMSK0 |= (1 << TOIE0); // taşma kesmeyi etkinleştir sei(); // global kesmeleri etkinleştir tot_overflow = 0; // taşma sayacı değişkenini başlat }

Problem Açıklama Metodolojisi: Her 1 saniyede bir İkinci LED (mavi) yanıp söner

- yüksek frekanslı bir elektrik sinyalini tamsayı bölümü ile daha düşük bir frekansa düşürmek için bir Timer1 ön ölçekleyici kullanmak;

- Karşılaştırma (CTC) Modunda Zamanlayıcıyı Temizle'yi kullanma;

- CTC Modu ile Kesintileri kullanma;

void timer1_init() // timer1, interrupt ve değişkeni başlat{ TCCR1B |= (1 << WGM12)|(1 << CS12); // ön ölçekleyici = 256 ve CTC modu TCNT1 = 0 ile zamanlayıcıyı ayarlayın; // sayacı başlat OCR1A = 62500; // karşılaştırma değerini başlat TIMSK1 |= (1 << OCIE1A); // karşılaştırma kesmesini etkinleştir}

Problem Bildiriminin Metodolojisi: Her 16 ms'de bir üçüncü LED (kırmızı) yanıp söner

- yüksek frekanslı bir elektrik sinyalini tamsayı bölümü ile daha düşük bir frekansa düşürmek için bir Timer2 ön ölçekleyici kullanmak;

- Karşılaştırma (CTC) Modunda Zamanlayıcıyı Temizle'yi kullanma;

- Kesintisiz Donanım CTC Modunun kullanılması;

void timer2_init() // timer2'yi başlat{ TCCR2A |= (1 << COM2A0)|(1 << WGM21); // geçiş modunda ve CTC modunda zamanlayıcı OC2A pinini ayarlayın TCCR2B |= (1 << CS22)|(1 << CS21)|(1 << CS20); // ön ölçekleyici ile zamanlayıcıyı ayarla = 1024 TCNT2 = 0; // sayacı başlat OCR2A = 250; // karşılaştırma değerini başlat }

TCNT0 taşması olduğunda TIMER0 taşma kesintisi hizmet yordamı çağrılır:

ISR(TIMER0_OVF_vect)

{ tot_overflow++; // taşma sayısının kaydını tut }

Bu ISR, bir eşleşme gerçekleştiğinde tetiklenir, bu nedenle, geçiş burada led'i açar:

ISR (TIMER1_COMPA_vect){ PORTC ^= (1 << 1); // led'i burada değiştir}

int ana(boşluk)

{ DDRB |= (1 << 0); // 1 (yeşil) led'i PB0 DDRC pinine bağlayın |= (1 << 1); // 2 (mavi) led'i PC1 DDRB pinine bağlayın |= (1 << 3); // 3 (kırmızı) led'i PB3 (OC2A) pinine bağlayın timer0_init(); // timer0 timer1_init()'i başlat; // timer1 timer2_init()'i başlat; // timer2'yi başlat (1) // sonsuza kadar döngü {

Timer0 12 kez taşmış olsaydı, 12 * 4.096ms = 49.152ms geçmiş olurdu. 13. yinelemede 50ms – 49.152ms = 0.848ms gecikmeye ihtiyacımız var. Bu nedenle, 13. yinelemede, zamanlayıcının yalnızca 53'e kadar saymasına izin veriyoruz ve ardından sıfırlıyoruz.

if (tot_overflow >= 12) // hayır olup olmadığını kontrol edin. taşma sayısı = 12 NOT: '>=' kullanılır

{ if (TCNT0 >= 53) // zamanlayıcı sayısının 53'e ulaşıp ulaşmadığını kontrol edin { PORTB ^= (1 << 0); // led TCNT0 = 0 arasında geçiş yapar; // sayacı sıfırla tot_overflow = 0; // taşma sayacını sıfırla } } } }

HEX dosyasını mikrodenetleyici flash belleğine yükleme:

DOS komut penceresine şu komutu yazın:

avrdude –c [programcının adı] –p m328p –u –U flash:w:[hex dosyanızın adı]Benim durumumda: avrdude –c ISPProgv1 –p m328p –u –U flash:w:Timers.hex

Bu komut, hex dosyasını mikrodenetleyicinin belleğine yazar. Mikrodenetleyici flash bellek yazma işleminin ayrıntılı bir açıklamasıyla videoyu izleyin:

Mikrodenetleyici flash bellek yakma…

Tamam! Artık mikrodenetleyici programımızın talimatlarına göre çalışmaktadır. Hadi kontrol edelim!

Adım 6: Elektrik Devresinin Yapılması

Elektrik Devresinin Yapılması
Elektrik Devresinin Yapılması
Elektrik Devresinin Yapılması
Elektrik Devresinin Yapılması
Elektrik Devresinin Yapılması
Elektrik Devresinin Yapılması

Bileşenleri şematik diyagrama göre bağlayın.

Önerilen: