Merhaba arkadaşlar bu yazımda ATMEGA328 entegresi içinde dahili olarak bulunan sıcaklık sensörünün nasıl aktif edileceğini ve değerinin nasıl okunacağını anlatacağım.
İlk önce ATMEGA328 Datasheet indirip inceleyelim. İsterseniz indirmeden yüklediğim resimlerden de inceleyebilirsiniz.
Sayfa 238, Figure 24-1 Analog dijital çeviri blok şemasına baktığımızda ADC kanallarının ilk sırasında bir sıcaklık sensörünün olduğunu görüyoruz. Bu sensör ADC8 hattına bağlanmıştır.
Bu ADC8 kanalının açılması için bazı komutların çalıştırılması gerekmektedir Sayfa 247, bölüm 24.8. Sırayla bakacak olursak;
ADC voltaj referans kaynağı, dahili 1.1V voltaj referansı olarak seçilmelidir. Bu seçim ADMUX kaydedicisinin 6(REFS0) ve 7(REFS1) biti ayarlanarak yapılmaktadır.
1 |
ADMUX = (1 << REFS1) | (1 << REFS0); // 1.1V referans voltajı seçildi |
ADC8 kanalının seçilmesi için; MUX3-0 bitleri ayarlanmalıdır.
ADC8 kanalı için MUX3-0 bitlerinin ilk 4 biti 1000 olmalıdır. Default olarak 0 olduğu için sadece MUX3 bitini ‘1’ yapmamız yeterli.
1 |
ADMUX = (1 << MUX3); // MUX3 biti 1 yapıldı |
ADC birimini aktif yapmamız gerekiyor. Aktif etmek için ADCSRA kaydedicisinin 7(ADEN) bitini ‘1’ yapmamız lazım.
1 |
ADCSRA |= (1 << ADEN); // ADC aktif edildi |
ADC çevrimini başlatmak için yine ADCSRA kaydedicisinin 6(ADSC) bitini ‘1’ yapmamız lazım.
1 |
ADCSRA |= (1 << ADSC); // ADC çevrimini başlat |
ADC çevriminin bitmesini beklememiz gerekiyor. ADCSRA kaydedicisinin 4(ADIF) biti ‘1’ olduğu zaman çevrim bitmiş demektir. Bunun için ‘1’den farklı olduğu sürece bekle dememiz gerek.
1 |
while (!bit_is_set(ADCSRA,ADIF)); // ADIF '1' olana kadar sonsuz döngü |
Okunan değer ADC kaydedicisine aktarılır. Ve son olarak okunan değeri sıcaklık değerine çevirmemiz gerekiyor.
1 2 |
double temp; temp = (ADC - 324.31 ) / 1.22; // okunan ADC değerini sıcaklık değerine dönüştür |
** ADC formülü datasheet üzerinde verilmiştir.
Tüm komutlarımızı toparlayıp seri porttan sıcaklık değerini gönderen programı yazacak olursak;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
void setup() { Serial.begin(9600); Serial.println("Internal Temprature Sensor"); } void loop() { Serial.println(GetTemp()); delay(1000); } double GetTemp(void) { double temp; ADMUX = ((1 << REFS1) | (1 << REFS0) | (1 << MUX3)); // 1.1V referans ve ADC8 seçildi ADCSRA |= (1 << ADEN); // ADC birimi aktif delay(20); // voltajın stabil olması için bekle ADCSRA |= (1 << ADSC); // ADC çevrimini başlat while (!bit_is_set(ADCSRA,ADIF)); // çevrim bitene kadar bekle temp = (ADC - 324.31 ) / 1.22; // ADC değerini sıcaklık değerine dönüştür return (temp); } |
Güzel paylaşımlarda bulunuyorsunuz tebrikler