- AVR Mikrodenetleyici Atmega16'daki PWM Pimleri
- PWM Sinyali nedir?
- Gerekli Bileşenler
- Devre şeması
- PWM için Atmega16'nın Programlanması
Darbe Genişlik Modülasyonu (PWM), frekansın sabit tutularak darbenin genişliğinin değiştirildiği güçlü bir tekniktir. Teknik bugün birçok kontrol sisteminde kullanılmaktadır. PWM uygulaması sınırlı değildir ve motor hız kontrolü, ölçüm, güç kontrolü ve iletişim gibi çok çeşitli uygulamalarda kullanılır. PWM tekniğinde dijital sinyaller kullanılarak analog çıkış sinyali kolaylıkla üretilebilir. Bu eğitim, PWM'yi, terminolojilerini ve onu bir mikro denetleyici kullanarak nasıl uygulayabileceğimizi anlamanıza yardımcı olacaktır. Bu eğitimde, bir LED'in yoğunluğunu değiştirerek AVR Atmega16 Microcontroller ile PWM'yi göstereceğiz.
PWM'nin temellerini ayrıntılı olarak anlamak için lütfen çeşitli mikrodenetleyicilerle PWM ile ilgili önceki eğitimlerimize gidin:
- ARM7-LPC2148 PWM Eğitimi: LED'in Parlaklığını Kontrol Etme
- MSP430G2 kullanarak Darbe Genişliği Modülasyonu (PWM): LED'in Parlaklığını Kontrol Etme
- MPLAB ve XC8 ile PIC Mikrodenetleyiciyi kullanarak PWM oluşturma
- STM32F103C8'de Darbe Genişliği Modülasyonu (PWM): DC Fan Hızını Kontrol Etme
- PIC Mikrodenetleyicinin GPIO pinlerinde PWM sinyalleri oluşturma
- Raspberry Pi PWM Eğitimi
AVR Mikrodenetleyici Atmega16'daki PWM Pimleri
Atmega16'nın dört özel PWM pini vardır. Bu pinler PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Ayrıca Atmega16'da iki adet 8 bitlik zamanlayıcı ve bir adet 16 bit zamanlayıcı bulunur. Timer0 ve Timer2, 8 bitlik zamanlayıcılardır, Timer1 ise 16 bitlik zamanlayıcıdır. PWM oluşturmak için zamanlayıcılar kullanıldığından, PWM oluşturmak için zamanlayıcılara genel bir bakışa sahip olmamız gerekir. Bildiğimiz gibi, frekans, zamanlayıcının çalıştığı saniyedeki döngü sayısıdır. Yani daha yüksek frekans bize daha hızlı bir zamanlayıcı verecektir. PWM oluştururken, daha hızlı bir PWM frekansı, yeni PWM görev çevrimlerine daha hızlı yanıt verebildiğinden çıkış üzerinde daha iyi kontrol sağlar.
Bu Atmega16 PWM eğitiminde Timer2'yi kullanacağız. Herhangi bir görev döngüsünü seçebilirsiniz. PWM'de görev döngüsünün ne olduğunu bilmiyorsanız, kısaca tartışalım.
PWM Sinyali nedir?
Darbe Genişlik Modülasyonu (PWM), en yaygın olarak kontrol devrelerinde kullanılan dijital bir sinyaldir. Sinyalin yüksek kaldığı süreye "açık kalma süresi" ve sinyalin düşük kaldığı süre "kapalı kalma süresi" olarak adlandırılır. Aşağıda tartışıldığı gibi bir PWM için iki önemli parametre vardır:
PWM'nin görev döngüsü
PWM sinyalinin YÜKSEK (açık kalma süresi) kaldığı sürenin yüzdesi görev döngüsü olarak adlandırılır.
100ms darbe sinyalinde olduğu gibi, sinyal 50 ms için YÜKSEK ve 50 ms için DÜŞÜK ise, bu, darbenin yarı zamanlı YÜKSEK ve yarı DÜŞÜK olduğu anlamına gelir. Yani görev döngüsünün% 50 olduğunu söyleyebiliriz. Benzer şekilde, darbe 25 ms YÜKSEK durumdaysa ve 100 ms'nin dışında 75 ms DÜŞÜK durumda ise, görev döngüsü% 25 olacaktır. Yalnızca YÜKSEK durumunun süresini hesapladığımıza dikkat edin. Görsel anlayış için aşağıdaki resimden yararlanabilirsiniz. Görev döngüsü formülü şu şekildedir:
Görev Döngüsü (%) = Açma Zamanı / (Açma Zamanı + Kapama Zamanı)
Bu nedenle, görev döngüsünü değiştirerek PWM'nin genişliğini değiştirebiliriz, böylece LED parlaklığının değişmesine neden olabiliriz. LED'in parlaklığını kontrol etmede farklı görev döngüsü kullanma demosuna sahip olacağız. Bu eğitimin sonundaki demo videosunu kontrol edin.
Görev döngüsünü seçtikten sonra, bir sonraki adım PWM modunu seçmek olacaktır. PWM Modu, PWM'nin nasıl çalışmasını istediğinizi belirtir. Esas olarak 3 tür PWM modu vardır. Bunlar aşağıdaki gibidir:
- Hızlı PWM
- Faz Doğru PWM
- Faz ve Frekans Doğru PWM
Hızlı PWM, faz değişiminin önemli olmadığı durumlarda kullanılır. Hızlı PWM kullanarak, PWM değerlerini hızlı bir şekilde çıkarabiliriz. Hızlı PWM, faz değişiminin motor kontrolü gibi işlemi etkilediği durumlarda kullanılamaz, bu nedenle bu tür uygulamalarda diğer PWM Modları kullanılır. Faz değişiminin fazla etkilemeyeceği yerlerde LED'in Parlaklığını kontrol edeceğimiz için Hızlı PWM modunu kullanacağız.
Şimdi PWM'yi oluşturmak için dahili zamanlayıcıyı saymak üzere kontrol edeceğiz ve sonra belirli bir sayımda sıfıra geri ayarlayacağız, böylece zamanlayıcı sayacak ve sonra tekrar tekrar sıfıra ayarlanacaktır. Bu, dönemi belirler. Artık bir darbeyi kontrol etme, zamanlayıcı yükselirken belirli bir sayıdaki bir darbeyi AÇIK duruma getirme seçeneğimiz var. Sayaç 0'a geri döndüğünde, darbeyi kapatın. Bununla ilgili çok fazla esneklik vardır çünkü zamanlayıcının sayısına her zaman erişebilir ve tek bir zamanlayıcıyla farklı darbeler sağlayabilirsiniz. Birden fazla LED'i aynı anda kontrol etmek istediğinizde bu harikadır. Şimdi PWM için Atmega16 ile bir LED arayüzünü oluşturmaya başlayalım.
PWM ile ilgili tüm projeleri buradan kontrol edin.
Gerekli Bileşenler
- Atmega16 AVR Mikrodenetleyici IC
- 16Mhz Kristal Osilatör
- İki adet 100nF Kapasitör
- İki adet 22pF Kapasitör
- Butona basınız
- Atlama Telleri
- Breadboard
- USBASP v2.0
- 2 Led (Herhangi Renk)
Devre şeması
PWM, yani Pin21 (PD7) için OC2 kullanıyoruz. Bu yüzden Atmega16'nın PD7 pinine bir LED bağlayın.
PWM için Atmega16'nın Programlanması
Programın tamamı aşağıda verilmiştir. JTAG ve Atmel stüdyosunu kullanarak programı Atmega16'da yazın ve LED üzerindeki PWM etkisini görün. Değişen PWM görev döngüsü nedeniyle parlaklığı yavaş yavaş artacak ve azalacaktır. Sonunda verilen videoyu kontrol edin.
Timer2 Register'ı kurarak Atmega16'yı programlamaya başlayın. Timer2 kayıt bitleri aşağıdaki gibidir ve buna göre bitleri ayarlayabilir veya sıfırlayabiliriz.
Şimdi Timer2'nin tüm bitlerini tartışacağız, böylece yazılı programı kullanarak istenen PWM'yi elde edebiliriz.
Timer2 kaydında başlıca dört bölüm vardır:
FOC2 (Timer2 için Çıktı Karşılaştırmaya Zorla): FOC2 biti, WGM bitleri PWM dışı bir Modu belirttiğinde ayarlanır.
WGM2 (Timer2 için Dalga Oluşturma Modu): Bu bitler, sayacın sayma sırasını, maksimum (TOP) sayaç değeri için kaynağı ve hangi tür dalga formu üretiminin kullanılacağını kontrol eder.
COM2 (Zamanlayıcı2 için Çıkış Modunu Karşılaştır): Bu bitler çıkış davranışını kontrol eder. Tam bit açıklaması aşağıda açıklanmıştır.
TCCR2 - = (1 <
PWM Hızlı Modu etkinleştirmek için WGM20 ve WGM21 bitlerini HIGH olarak ayarlayın. WGM, Dalga Biçimi Oluşturma Modu anlamına gelir. Seçim bitleri aşağıdaki gibidir.
WGM00 |
WGM01 |
Timer2 Modu İşlemi |
0 |
0 |
Normal Mod |
0 |
1 |
CTC (Karşılaştırmada Zamanlayıcıyı Temizle) |
1 |
0 |
PWM, Faz Doğru |
1 |
1 |
Hızlı PWM Modu |
Dalga Biçimi Oluşturma Modu hakkında daha fazla ayrıntı için, Atmega16'nın resmi veri sayfasına bakabilirsiniz.
TCCR2 - = (1 <
Ayrıca herhangi bir ön ölçeklendirme kullanmadık, bu yüzden Clock kaynak kaydını '001' olarak ayarladık.
Saat seçim bitleri aşağıdaki gibidir:
CS22 |
CS21 |
CS20 |
Açıklama |
0 |
0 |
0 |
Saat kaynağı yok (Zamanlayıcı / Sayaç durdu) |
0 |
0 |
1 |
clk T2S / (Ön Ölçeklendirme Yok) |
0 |
1 |
0 |
Clk T2S / 8 (Ön Ölçeklendiriciden) |
0 |
1 |
1 |
Clk T2S / 32 (Ön Ölçeklendiriciden) |
1 |
0 |
0 |
Clk T2S / 64 (Ön Ölçeklendiriciden) |
1 |
0 |
1 |
Clk T2S / 128 (Ön Ölçeklendiriciden) |
1 |
1 |
0 |
Clk T2S / 256 (Ön Ölçeklendiriciden) |
1 |
1 |
1 |
Clk T2S / 1024 (Ön Ölçeklendiriciden) |
Ayrıca, COM21 bitini '1' ve COM20'yi '0' olarak ayarlayarak karşılaştırma eşleşmesinde OC2 temizlenir.
Hızlı PWM Modu için Çıkış Modu Karşılaştır (COM) seçim seçenekleri aşağıda verilmiştir:
COM21 |
COM21 |
Açıklama |
0 |
0 |
Normal bağlantı noktası çalışması, OC2 bağlantısı kesildi. |
0 |
1 |
Ayrılmış |
1 |
0 |
Karşılaştırma eşleşmesinde OC2'yi temizle, OC2'yi TOP'a ayarla |
1 |
1 |
Karşılaştırma maçında OC2'yi ayarlayın, ÜST'te OC2'yi temizleyin |
Görev döngüsünü% 0'dan% 100'e yükseltin, böylece parlaklık zamanla artacaktır. 0-255 arası değer alın ve OCR2 pinine gönderin.
için (görev = 0; görev <255; görev ++) // 0'dan maksimum görev döngüsüne { OCR2 = görev; // LED parlaklığını yavaşça artırın _delay_ms (10); }
LED parlaklığını kademeli olarak azaltmak için benzer şekilde görev döngüsünü% 100'den% 0'a düşürün.
için (görev = 0; görev> 255; görev--) // maks. 0 görev döngüsü { OCR2 = görev; // LED parlaklığını yavaşça azaltın _delay_ms (10); }
Bu , Atmega16 / 32'de PWM Kullanımı Eğitimimizi bitirir.