Elektronik Devreler Projeler Elektronik ve biraz daha fazlası İletişim - Araçlar - Dikkat - Topluluk
Elektronik / Mikrodenetleyici Projeleri/

PIC12F675 ve LM35 Sensörlü Termometre Devresi

Sponsorlu Bağlantılar

Devrede ısı sensörü olarak LM35DZ kullanılmıştır. Bu sensör 0o ile 100o arası çıkış verebilmektedir. Mikrodenetleyici olarak 12F675 seçilmesinin sebebi hem jalv2 dilinde kullanımını göstermek hemde 12F675 gibi pin sayısı yetersiz olan bir denetleyici ile nasıl display kullanıldığını göstermektir.

Devre gerçekte yapılacağı zaman, sağ tarafta bulunan kırmızı çerçeve içerisindeki 3 adet direnç, Simülasyonun daha sağlıklı çalışmasını sağlamak için kullanıldığından dolayı kullanılmayacaktır.

devrede-isi-sensoru-olarak-lm35dz-mikrodenetleyici-olarak-12f675

Devrenin Çalışma Mantığı :

0 ile 99 derece arası ölçüm yapan devremizde display’ler tarama yöntemi ile kullanılmıştır. 12F675 gibi pin sayısı az olan işlemciler için Display kullanmak imkânsızdır.

Bu nedenle sadece 2 pin kullanarak 74HC164 ile port çoklama işlemi gerçekleştirilmiştir. 74HC164 entegresinin seçimindeki temel nokta işlemcinin 2 pinini kullanmasıdır. Bu sayede display seçmek için bize 2 adet pin geriye kalmıştır. Devre şemasında 3 adet display gözükmektedir. Ama 12F675 okunan dereceyi göstermek için sadece 2 display’i kullanmaktadır. En sondaki Display Sadece derece sembolünü göstermektedir.

Her Display’in çıkışında sadece 1 adet 330 ohm direnç kullanılmıştır. Eğer tarama yöntemi kullanmıyor olsaydık bu dirençler aşırı akım çekeceğinden dolayı ısınıp yanacaktı.

Tarama yöntemi sayesinde displayler saniyede yaklaşık olarak 230 Hz frekans ile yanıp sönmektedir. Bu sayede dirençlerde ısınma olmamaktadır.

Devrenin Çalışmasını Kısaca Açıklayacak olursak; 12F675 yaklaşık olarak her 1 sn aralıklarla ADC kanalını okumaktadır. Ve Sonucun daha stabil olması için 10 kez okuyup daha sonra ortalamasını almaktadır. Bu sayede salımlar minimuma indirilmiştir. Okunan ADC değerine karşılık gelen dereceyi hesaplamak programda derece_al alt programı kullanılmıştır.

1 procedure derece_al(byte out hane_10,byte out hane_1) is
2 var word temp_deger = 0
3 var byte basamaklar[] = {252,96,218,242,102,182,190,224,254,246}
4 for 10 loop
5 temp_deger = temp_deger + adc_read(0)
6 end loop
7 while (ADCON0_NDONE == 1) loop end loop
8 temp_deger = ((temp_deger/10) * 100)/204
9
10 if temp_deger > 99 then
11 hane_10 = 2 — “-”
12 hane_1 = 2 — “-”
13 else
14 hane_10 = basamaklar[(temp_deger / 10)]
15 hane_1 = basamaklar[(temp_deger % 10)]
16 end if
17 end procedure

Alt Programın Satır Satır İncelenmesi :

1.satır : Alt programın ismi ve 2 adet çıkış parametresi tanımlanmıştır.
2.satır : Geçici hesaplamalar için temp_deger isminde word tipinde değişken tanımlanmıştır.
3.satır : Ortak katot display’ler için her rakam dizi olarak tanımlanmıştır.
4.satır : 10 kez çalışacak for döngüsü oluşturulmuştur.
5.satır : Adc kanalı okunup geçici değişkenimize aktarılmıştır.

7.satır : While döngüsü ile ADCON0_NDONE == 1 Adc Çevrim Bayrağı 0 olana kadar bekleme yapılmıştır. Bu sayede olası adc çevrimi bitmeden formül işletilmeyecek ve daima doğru sonuç alınacaktır. Adc Çevrimi Başlatıldığında ADCON0_NDONE bayrağı, Çevrim Bitene Kadar 1 Olmaktadır. Bu sayede Çevrimin Bitip Bitmediği, bayrağın durumundan takip edilebilmektedir.

8.satır : Geçici değişkenine, okunan adc sayısının derece karşılığı aktarılmıştır.

10.satır : Eğer derece 99’dan fazla ise birler ve onlar hanesine “-“ sembolü aktarılmaktadır. Bu sayede sıcaklığın 99’dan büyük olduğu anlaşılmaktadır.

14.satırda : hesaplanan derecenin onlar hanesi çıkış parametresine aktarılmıştır.
15.satırda : hesaplanan derecenin birler hanesi çıkış parametresine aktarılmıştır.

Okunan ADC değerine Karşılık gelen Derecenin Hesaplanması :

LM35DZ sensörü maksimum 100 derece ölçmektedir ve 100 derecede çıkışı 1 Volt olmaktadır. 1 Volt ise Dijital olarak ~204 sayısına denk gelmektedir.(1023/5 = 204,6) Formülümüz; 100 derecede 204 sayısı okunuyor ise okunan_adc değerinde X derecesi okunur, orantısından yola çıkarak ; Derece = (okunan_Adc*100)/204 Olmaktadır. Okunan_Adc değerimiz burada temp_deger değişkeninin 10’a bölünmüş sonucudur.

Sonuç olarak Formülümüz 8.satırdaki Halini almıştır. Formülün sonucu normalde word tipinde çıktığı için byte() fonksiyonu ile byte tipine dönüştürülmüştür.

12F675 Konfigürasyon :

1 include 12f675
2 pragma target clock 4_000_000
3 pragma target OSC INTOSC_NOCLKOUT
4 pragma target WDT disabled
5 pragma target MCLR INTERNAL
6 enable_digital_io()
7 pin_A0_direction = input
8 pin_A1_direction = output
9 pin_A2_direction = output
10 pin_A3_direction = output
11 pin_A4_direction = output
12 pin_A5_direction = output

Devrenin çalışması için 12F675 işlemcisine ait adreslerin programa dahil edilmesi gerekmektedir. Bu adresleri tek tek yazılıma dahil etmek zor olacağından kütüphaneleri kullanarak bu adresleri dahil edebiliriz.

Bunun için 1. satırda olduğu gibi include 12f675 komutu kullanılmaktadır.

Gerekli adresler programa dâhil edildikten sonra sigorta ayarlarının da belirtilmesi gerekmektedir. İlgili sigorta ayarları dâhil edilen kütüphane dosyasında yer almaktadır. Bizim devremiz için gerekli sigorta ayarları aşağıdaki gibidir.

2.Satırda İşlemcinin Clock Frekansı 4Mhz olarak belirtilmiştir.

3.Satırda Clock Kaynağı olarak işlemcinin dahili kristali kullanılacağı belirtilmiştir.

4.Satırda WatchDog Timer’ın kapalı olduğu belirtilmiştir.

5.Satırda MCLR pininin kullanılmayacağı belirtilmiştir.

6.satırda ise tüm pinlerin dijital giriş çıkış olacağı hakkında işlemciye bilgi verilmiştir.

Diğer Satırlarda ise işlemcinin pinlerinin giriş veya çıkış olup olmayacağı ayarlanmıştır.
Programda sonsuz döngü oluşturularak yaklaşık olarak 1 sn’de bir kez derece hesaplanıp display’lerde saniyede 230 kez gösterilmektedir. Bu sayede gözümüz sürekli olarak ekranlarda rakamları görmektedir.

Malzeme Listesi:

elektronik-malzeme-listesi

7 Segmentli Display pinleri :

ortak-katot-display-baglanti-semasi

Devrenin Gerçekleştirilmiş Baskı Devresi

termometre-baski-devre-pcb-ust

termometre-baski-devre-pcb-alt

Gerçekleştirilen Devrenin Başka Bir Termometre ile Çekilmiş Fotoğrafı ve Çalışma Görüntüleri

gerceklestirilen-devrenin-baska-bir-termometre-ile-cekilmis-fotografi-ve-calisma-goruntuleri

Jalv2 Kaynak Kodu :


---------------------------------------------------------------
-- Programın Adı : 1' hassasiyetli LM35 Termometre Devresi
--                 (0..99) arası Ölçüm
-- Yazan         : Sercan TEK  -  Turkey/Tekirdağ
-- Tarih         : 19.12.2011
-- chip          : 12F675 ve 74hc164
-- Derleyici     : jal 2.4p-alpha
---------------------------------------------------------------
-- ------------------------------------------------------------
include 12f675
pragma target clock 4_000_000        -- kristal 4 Mhz
pragma target OSC  INTOSC_NOCLKOUT   -- dahili OSC
pragma target WDT  disabled          -- watchdog Kapalı
pragma target MCLR INTERNAL          -- mclr kullanılmıyor

enable_digital_io()

pin_A0_direction =  input
pin_A1_direction =  output
pin_A2_direction =  output
pin_A3_direction =  output
pin_A4_direction =  output
pin_A5_direction =  output

alias birler is pin_a5                   -- birler hanesi pin_a5
alias onlar  is pin_a4                   -- onlar  hanesi pin_a4

----------------------------- ADC İşlemleri ---------------------------
const byte ADC_NVREF = ADC_NO_EXT_VREF   -- Harici Referans Yok
const ADC_HIGH_RESOLUTION = true         -- Çözünürlük 10 bit
include adc                              -- adc kütüphanesi Dahil
adc_init()                               -- adc hazırlanıyor

const  byte  ADC_CHANNEL = 0             -- 1 adet kanal kullanılacak (AN0)
set_analog_pin(ADC_CHANNEL)              -- AN0 analog pin yap


-------------------- 74HC164 için pin tanımlamaları -------------------
var volatile bit clock_pin    is pin_a1
var volatile bit data_pin     is pin_a2

procedure display_yolla(byte in giris_bilgi) is
  var bit veri_biti at giris_bilgi : 0
			for 8 loop
				data_pin = veri_biti
				giris_bilgi = giris_bilgi >> 1
				clock_pin = high
				clock_pin = low
			end loop
end procedure
-----------------------------------------------------------------------

procedure derece_al(byte out hane_10,byte out hane_1) is
 var word temp_deger = 0
 var byte basamaklar[] = {252,96,218,242,102,182,190,224,254,246}
  for 10 loop
   temp_deger = temp_deger + adc_read(0)
  end loop
    while (ADCON0_NDONE == 1) loop end loop
  temp_deger = ((temp_deger/10) * 100)/204

  if temp_deger > 99 then
     hane_10 = 2 --    "-"
     hane_1  = 2 --    "-"
  else
     hane_10 = basamaklar[(temp_deger / 10)]
     hane_1  = basamaklar[(temp_deger % 10)]
  end if
end procedure

var byte onlar_hanesi,birler_hanesi
forever loop

 derece_al(onlar_hanesi,birler_hanesi)

for 5 loop
  for 50 loop
    onlar = false birler = false
      display_yolla(onlar_hanesi)
     onlar = true
        _usec_delay(2000)
  onlar = false
     display_yolla(birler_hanesi)
     birler = true
        _usec_delay(2000)
  end loop
end loop

end loop

Termometre Devresine ait kaynak Jalv2 kodları proteus isis simülasyon ve ares pcb dosyaları: pic12f675-ve-lm35-sensorlu-termometre-devresi.rar

PIC12F675 ve LM35 Sensörlü Termometre Devresi V2

Yenilikler :

  • Transistörler BC547 yerine BC337 olarak değiştirildi.
  • 330 Ohm dirençler transistörün emiteri yerine kollektörüne seri olarak bağlantı.
  • Yukarıdaki nedenlerden dolayı baskı devresi yeniden düzenlendi.
  • ilk Çalıştırmada Dİsplaylere animasyon eklendi.
  • Hazır adc kütüphanesi yerine adc rutine yeniden yazıldı.Bu sayede harici kütüphane ihtiyacı, sadece adreslerin tanımlı olduğu
    12F675.jal oldu.

NOT : Daha önce devreyi yapan arkadaşlar İsteğe Bağlı yeni yazılımı yükleyip kullanabilirler. Donanımsal olarakta sadece BC547 yerine BC337 takabilirler. Transistör Değiştirmedeki amaç ise Olası parlaklık sorununu engellemektir. Ayrıca BC337’nin yüksek güçlü olmasıdır.

Proteus 7.8 SP2 kullanılmıştır. Dosyalar 7 versiyonu ile uyumlu olarak kaydedilmiştir.

Dosyalar: pic12f675-ve-lm35-sensorlu-termometre-devresi-V2.zip

  • Sercan TEK

    @Sinan

    İsis çoğu şeyi varsaydığı için bazı elemanları şemaya koymak gereksizdir. temel gerekli olan elemanlar zaten şemada vardır. Dosyaları indirip Ares dosyasını açarsanız baskı devre üzerinden net olarak eleman listesini çıkartabilirsiniz.

  • Fatih

    sercan ben bu devreyi proje olarak yapıyorum jalv2 kodlamalarıyla ilgili aklıma bir kaç şey takıldı ben daha bu sene mplab ideprogramını kullanıyorum şimdi biz bu picler’e programı yüklerken ayrıca indirmemiz gereken bir program varmı yoksa mplab programına göre kodlar varmı bilgi verirsen sevinirim…

  • Sercan TEK

    @fatih

    hex kodunu vermiştim. herhangi bir PIC programlayıcı ile entegreye yükleyebilirsin. Ama jalv2 ile derlemek istiyorsan. o zaman Jaledit ve Jalv2 Compiler indirmelisin. birde tabi Jallib kütüphanelerini.

  • Fatih

    kardeşim ben 12f675` verdiğin hex dosyasını yüklemesi için arkadaşa verdim fakat arkadaşın yüklemek istediği yazılımda 12f675 yokmuş oda 579`a yükledim hata vermedi dedi devrenin çalışmasında bir sorun olurmu sence ?

  • Sercan TEK

    @Fatih

    12F675 ten başka olmaz. 12F675 alın ve ona yükleyin.

  • Fatih

    hayır anlamadın galiba pic’in modelini seçiyon ya bilgisayardaki program üzerinden orda 12f657 yoktu bende 579u seçip hex dosyasını ona yükledim oldu dedi yani devrede ben 12f675i kullanacağım..

  • Sercan TEK

    @Fatih

    sanırım 12F519 demek istedin zira 12F579 diye mikrodenetleyici yok. 12F675 için derlenmiş hex dosyasını vermiştim zaten. sigorta ayarları yazılımın içinde olduğu için harici yapmayın. yazılımı derlemeye filan gerek yok. düzenleme yapacaksanız derlersiniz.

    Jallib içerisinde 12F675.jal var onu kullanın. Ama isis programı için diyorsanız 12F675 muhakkak var vardır. olmadı yeniden yükleyin.

  • Fatih

    arkadaş bana sadece 579 vardı onu yükledim dedi oda oldu zaten .hex dosyasını yüklemiş içine ama sadece 12F675 yoktu onun yerine 579’u seçip onu yükledim dedi yani hex dosyasının yüklenmesinde bir sorun yok sadece dediğim gibi pic e hex dosyasını atmadan önce sornuş 675 olmadığı için 579 u yüklemiş ve bu devrenin çalışmasını etkilermi tek sorun bu…

  • Fatih

    Kardeşim ben sana olayı tekrardan anlatayım benim devrede kullandığım pıc,12F675 bu pıce yazılımı yüklemeden önce bu pıc’e yazılım atmak için kullandığımız devrenin bilgisayardaki yazılımında soruyormuş ve ordada bizim devrede kullandığımız 12675 olmadığından 579 u seçip öyle yüklemiş hex dosyasını ve yükleme başarılı olmuş benim tek merak ettiğim bu şekilde devrenin çalışmasında bir sorun olurmu başka bir sorun yok devreyi teslim etmemede az kaldı

  • Sercan TEK

    Denemeden cevap veremem. Deneyin ve sonucu paylaşın.

  • Selim

    Selam Sercan kardeş Baskı devreyi PDF formatında yapılmış dosyayı direkt Bakır plakete aktarılacak mı yada ters çevirecek mi? Şimdiden teşekkürler.

  • cevat

    merhaba devrede donanımsal(fiziksel) değişiklik yapmadan sadece yazılımı değiştirerek -9 ile 99 arası sıcaklık görebilirmiyiz böyle bir imkanımız varsa yardımcı olurmusunuz??

  • Sercan TEK

    @cevat maalesef mümkün değildir.

  • barış

    merhaba sercan. devrede 30 45 arası ölçüm yapmak istiyorum. yazılım ve donanım olarak ne gibi değişiklikler yapmam gerekir? yardımcı olursan sevinirim. şimdiden teşekkürler.

  • Onur

    devredeki kullanılmayacak alanı anlayamadım biraz acıklayabilir misiniz?

  • onur

    arkadaşım bir sorum olcaktı malzemelere yazmamışsın baskı devrede var tristör galiba onun kodunu(yani ürün adı) yazar mısınız?

  • etem

    teşekkür ederim devre sorunsuz çalışıyor performan ödevi olarak yaptım 100 aldım elinize sağlık..

  • aidyn

    chok teshekur…. Bulgaristandan…. elinize saglik.

  • cemil

    serkan kardeş projeyi ödev projesi olarak aldım. Fakat baskı devreyi pdf formatındaki şeklinde mi bakır plaket basılacak yoksa ters olarak mı basılacak. Yardımınız teşekkürler.

  • cemil

    sercan kardeş projeyi ödev projesi olarak aldım. Fakat baskı devreyi pdf
    formatındaki şeklinde mi bakır plaket basılacak yoksa ters olarak mı
    basılacak. Yardımınız teşekkürler.

  • hakan

    Merhaba PIC12F675 ve LM35 Sensörlü Termometre Devresi Versiyon2 yaptım. Fakat devreye enerji +5v verdim. Fakat Displaylerde yanma olmadı ve pic düzgün bir şekilde programlandı ve besleme gerilimi ölçüldü +5 volt olduğu gözlemlendi. Ama devrede 7 segmentli displaylerde yanma olmadı ve Transistör olarak devre BC547 mont edildi. Yardımız için teşekkürler.

    • djtur

      Anahtar arızalıdır.Anahtar kullanmadan yap öyle dene bence.

  • selim aslan 2326

    Yukarıdaki baskı devre doğrumu son halimi

  • djtur

    Devreyi ikinci defa yaptım.Gayet güzel ama 2. yaptığım devrede sıcaklık değerleri örneğin 21-35-22-21-22-19 gibi sürekli değişiyor.Ne yapmalıyım?