Bu projede sıcaklığı ölçmek için bir devre tasarlayacağız. Bu devre, bir doğrusal voltaj sensörü olan " LM35 " kullanılarak geliştirilmiştir. Sıcaklık genellikle "Santigrat" veya "Faraheite" cinsinden ölçülür. "LM35" sensörü, santigrat ölçeğine göre çıktı sağlar.
LM35, üç pinli transistör benzeri bir cihazdır. VCC, GND ve OUTPUT'a sahiptir. Bu sensör, sıcaklığa bağlı olarak çıkışta değişken voltaj sağlar.
Yukarıdaki şekilde gösterildiği gibi, sıcaklıktaki her +1 santigrat artış için + 10mV daha yüksek çıktı olacaktır. Yani sıcaklık 0◦ santigrat ise sensör çıkışı 0V, sıcaklık 10◦ santigrat ise sensör çıkışı + 100mV, sıcaklık 25◦ santigrat ise sensör çıkışı + 250mV olacaktır.
Şimdilik LM35 ile değişken voltaj şeklinde sıcaklık elde ediyoruz. Bu sıcaklığa bağlı gerilim, ATMEGA32A'nın ADC'sine (Analogdan Dijitale Dönüştürücü) giriş olarak verilir. Elde edilen dönüşüm sonrası dijital değer 16x2 LCD'de sıcaklık olarak gösterilir.
Gerekli Bileşenler
Donanım: ATMEGA32 Mikrodenetleyici, güç kaynağı (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), 100uF kapasitör (iki adet), 100nF kapasitör, LM35 Sıcaklık Sensörü.
Yazılım: Atmel studio 6.1, progisp veya flash magic.
Devre Şeması ve Açıklama
Devrede ATMEGA32'nin PORTB'si LCD'nin veri portuna bağlanır. Burada, PORTC'yi normal bir iletişim portu olarak kullanmak istiyorsa, sigorta baytlarını değiştirerek PORTC ve ATMEGA'daki JTAG iletişimini devre dışı bırakmayı unutmamak gerekir. 16x2 LCD'de arka ışık varsa 16 pim vardır, arka ışık yoksa 14 pim olacaktır. Arka ışık pimlerine güç verebilir veya bırakabilirsiniz. Şimdi 14 pimde 8 veri pini (7-14 veya D0-D7), 2 güç kaynağı pini (1 ve 2 veya VSS ve VDD veya gnd ve + 5v), kontrast kontrolü için 3. pin (karakterlerin ne kadar kalın olması gerektiğini VEE kontrol eder) gösterilen), 3 kontrol pini (RS & RW & E).
Devrede, sadece iki kontrol pini aldığımı gözlemleyebilirsiniz, çünkü bu daha iyi anlama esnekliği sağlar. Kontrast biti ve READ / WRITE sık kullanılmadığından toprağa kısa devre yapılabilir. Bu, LCD'yi en yüksek kontrast ve okuma moduna getirir. Karakterleri ve verileri buna göre göndermek için sadece ENABLE ve RS pinlerini kontrol etmemiz gerekiyor.
LCD için yapılan bağlantılar aşağıda verilmiştir:
PIN1 veya VSS ------------------ zemin
PIN2 veya VDD veya VCC ------------ + 5v güç
PIN3 veya VEE --------------- zemin (yeni başlayanlar için en iyi maksimum kontrastı verir)
PIN4 veya RS (Kayıt Seçimi) --------------- uC'nin PD6'sı
PIN5 veya RW (Okuma / Yazma) ----------------- zemin (LCD'yi okuma moduna getirir, kullanıcı için iletişimi kolaylaştırır)
PIN6 veya E (Etkinleştir) ------------------- uC'nin PD5'i
PIN7 veya D0 ----------------------------- uC'nin PB0'ı
PIN8 veya D1 ----------------------------- uC'nin PB1'i
PIN9 veya D2 ----------------------------- uC'nin PB2'si
PIN10 veya D3 ----------------------------- uC'nin PB3'ü
PIN11 veya D4 ----------------------------- uC'nin PB4'ü
PIN12 veya D5 ----------------------------- uC'nin PB5'i
PIN13 veya D6 ----------------------------- PB6 uC
PIN14 veya D7 ----------------------------- uC'nin PB7'si
Devrede 8 bit iletişim (D0-D7) kullandığımızı görüyorsunuz ancak bu zorunlu değil, 4 bit iletişim (D4-D7) kullanabiliriz ancak 4 bit iletişim programı biraz karmaşık hale geldiğinden 8 biti seçtim iletişim.
Bu nedenle, yukarıdaki tablodan sadece gözlemden, 10 pini LCD'yi 8 pinin veri pini ve kontrol için 2 pini olan denetleyiciye bağlıyoruz. Sensör tarafından sağlanan voltaj çıkışı tamamen doğrusal değildir; gürültülü olacak. Gürültüyü filtrelemek için sensörün çıkışına şekilde gösterildiği gibi bir kapasitör yerleştirilmelidir.
İlerlemeden önce ATMEGA32A'nın ADC'si hakkında konuşmamız gerekiyor. ATMEGA32A'da, PORTA'nın sekiz kanalından herhangi birine Analog giriş verebiliriz, hepsi aynı olduğundan hangi kanalı seçtiğimiz önemli değil. PORTA'nın 0 veya PIN0 kanalını seçeceğiz. ATMEGA32A'da ADC 10 bit çözünürlüktedir, bu nedenle kontrolör minimum Vref / 2 ^ 10 değişimini algılayabilir, bu nedenle referans voltajı 5V ise her 5/2 ^ 10 = 5mV için bir dijital çıkış artışı elde ederiz.. Dolayısıyla, girişteki her 5mV artış için dijital çıkışta bir artış elde edeceğiz.
Şimdi ADC sicilini aşağıdaki şartlara göre ayarlamamız gerekiyor:
1. Öncelikle ADC'de ADC özelliğini etkinleştirmemiz gerekiyor.
2. Oda sıcaklığını ölçtüğümüz için, gerçekten yüz derecenin ötesinde değerlere ihtiyacımız yok (LM35'in 1000 mV çıkışı). Böylece ADC'nin maksimum değerini veya referansını 2.5V olarak ayarlayabiliriz.
3. Denetleyicinin bir tetikleme dönüştürme özelliği vardır, yani ADC dönüşümü yalnızca harici bir tetiklemeden sonra gerçekleşir, çünkü ADC'nin sürekli serbest çalışma modunda çalışması için yazmaçları ayarlamamıza gerek kalmaz.
4. Herhangi bir ADC için, dönüştürme frekansı (Analog değerden Dijital değere) ve dijital çıktının doğruluğu ters orantılıdır. Bu nedenle, dijital çıktının daha iyi doğruluğu için daha az frekans seçmemiz gerekir. Daha düşük ADC saati için ADC'nin ön satışını maksimum değere ayarlıyoruz (128). 1MHZ'nin dahili saatini kullandığımız için, ADC'nin saati (1000000/128) olacaktır.
Bunlar ADC'ye başlamak için bilmemiz gereken dört şey. Yukarıdaki dört özelliğin tümü iki kayıt tarafından belirlenir.
KIRMIZI (ADEN): Bu bit, ATMEGA'nın ADC özelliğini etkinleştirmek için ayarlanmalıdır.
MAVİ (REFS1, REFS0): Bu iki bit, referans voltajını (veya vereceğimiz maksimum giriş voltajını) ayarlamak için kullanılır. 2.56V referans gerilimine sahip olmak istediğimiz için, hem REFS0 hem de REFS1 tablo ile ayarlanmalıdır.
AÇIK YEŞİL (ADATE): Bu bit, ADC'nin sürekli çalışması için ayarlanmalıdır (serbest çalışma modu).
PINK (MUX0-MUX4): Bu beş bit, giriş kanalını söylemek içindir. ADC0 veya PIN0 kullanacağımız için, tablodaki gibi herhangi bir bit ayarlamamıza gerek yoktur.
BROWN (ADPS0-ADPS2): bu üç bit, ADC için ön skaler ayarlamak içindir. Diyelim ki 128'lik bir ön skalar kullandığımıza göre, üç biti de ayarlamamız gerekiyor.
KOYU YEŞİL (ADSC): bu bit, ADC'nin dönüşümü başlatması için ayarlanır. Dönüştürmeyi durdurmamız gerektiğinde bu bit programda devre dışı bırakılabilir.
Bu projeyi Arduino ile yapmak için bu eğiticiye bakın: Arduino kullanarak Dijital Termometre
Programlama Açıklaması
SICAKLIK ÖLÇÜMÜ'nün çalışması en iyi aşağıda verilen C kodu adım adım açıklanır:
Pinler üzerinde veri akışı denetimini etkinleştirmek için #include // başlığı
#define F_CPU 1000000 // denetleyiciye bağlı kristal frekansını anlatmak
#Dahil etmek
#define E 5 // LCD etkinleştirme pinine bağlı olduğu için PORTD'nin 5. pinine “enable” adını verin
#define RS 6 // 6 isim “registerselection” vererek inci LCD RS bacağına bağlı olduğu için, PORTD ait pimi
void send_a_command (işaretsiz karakter komutu);
void send_a_character (işaretsiz karakter karakteri);
void send_a_string (char * string_of_characters);
int main (void)
{
DDRB = 0xFF; // portB ve portD'yi çıkış pinleri olarak koymak
DDRD = 0xFF;
_delay_ms (50); // 50ms gecikme veriyor
DDRA = 0; // giriş olarak portA alınıyor.
ADMUX - = (1 <
ADCSRA - = (1 <0)
{
send_a_character (* string_of_characters ++);
}
}