Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

LM35 ile Sıcaklık Ölçme 16f877

Başlatan kostebek, 18 Mart 2008, 14:19:53

kostebek

Alıntı Yap
#include <16f877.h>

#device ADC=10  // 10 bitlik ADC kullanılacağı belirtiliyor.

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use fast_io(a) //Port yönlendirme komutları A portu için geçerli

#define use_portb_lcd TRUE   // LCD B portuna bağlı

#include <lcd.c>   // lcd.c dosyası tanıtılıyor

unsigned long int bilgi; // İşaretsiz 16 bitlik tam sayı tipinde değişken tanımlanıyor
float voltaj,sicaklik;   // ondalıklı tipte değişkenler tanıtılıyor

//********** ANA PROGRAM FONKSİYONU*******

void main ( )
{
  setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
  setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
  setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
  setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
  setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
  setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

  set_tris_a(0x01);  // RA5 Giriş olarak yönlendiriliyor

  setup_adc(adc_clock_div_32);   // ADC clock frekansı fosc/32
  setup_adc_ports(AN0); //RA0/AN0 girişi analog

  lcd_init();   // LCD hazır hale getiriliyor

  set_adc_channel(0);   // RA0/AN0 ucundaki sinyal A/D işlemine tabi tutulacak
  delay_us(20);         // Kanal seçiminde sonra bu bekleme süresi verilmelidir

  printf(lcd_putc,"\fSicaklik="); // LCD'ye yazı yazdırılıyor
  while(1)   // sonsuz döngü
  {
     bilgi=read_adc();  // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor

     voltaj=(0.0048828125*bilgi)*1000;   // Dijitale çevirme işlemine uğrayan sinyalin mV olarak gerilimi hesaplanıyor
     sicaklik=(voltaj/10)+2;    // Her 10mV'ta 1 derece artma

     lcd_gotoxy(10,1); // İmleç 1. satır 10.sütunda
     printf(lcd_putc,"%5.1f'C",sicaklik); // LCD'ye sıcaklık değeri yazdırılıyor
     // Gösterilecek ondalıklı değerin toplam basamak sayısı 5 olacak.
     // Gösterilecek değerin ondalıklı kısmı ise 1 basamak olacak. %5.1f
     // komutu ile bu işlemler yaptırılmıştır.
     delay_ms(100); // 100 msn gecikme
  }
}



arkadaşlar bu örnek programla sıcaklık ölçmeye çalıştım ama bir problem var sanırım sıcaklık sürekli değişiklik gösteriyor mesela LCD ekranda sürekli 23-27-24-22-20-28 derece gibi şeyler peşpeşe yazıyor. Bunların ortalamasını felan mı almak gerekiyor. Nasıl birşey yapabilirim.

Klein

ortalama alabilirsin veya dijital filtre yapabilirsin

float adcval
float filterval

filterval=(0.9*filterval)+(0.1*adcval)

böyle bir filtre işinize yarayabilir.  0.9 değerini artırıp 0.1 değerini düşürerek en iyi değeri yakalayabilirsiniz. Dikkat etmeniz gereken şey iki filtre değerin toplamının 1 olmasıdır.

kostebek

Alıntı yapılan: "Klein"ortalama alabilirsin veya dijital filtre yapabilirsin

float adcval
float filterval

filterval=(0.9*filterval)+(0.1*adcval)

böyle bir filtre işinize yarayabilir.  0.9 değerini artırıp 0.1 değerini düşürerek en iyi değeri yakalayabilirsiniz. Dikkat etmeniz gereken şey iki filtre değerin toplamının 1 olmasıdır.

ilginiz için teşekkür ederim Klein; ancak tam olarak kullanımını anlayamadım. Hangi kısmına ekleyeceiz filtreyi ?

Birde ortalama alma kısmında açıkcası tıkandım.

For döngüsü içerisinde 10 kez ölçüp mü sonucu dışarı vermem gerekiyor sizce

kostebek

Alıntı yapılan: "kostebek"
Alıntı yapılan: "Klein"ortalama alabilirsin veya dijital filtre yapabilirsin

float adcval
float filterval

filterval=(0.9*filterval)+(0.1*adcval)

böyle bir filtre işinize yarayabilir.  0.9 değerini artırıp 0.1 değerini düşürerek en iyi değeri yakalayabilirsiniz. Dikkat etmeniz gereken şey iki filtre değerin toplamının 1 olmasıdır.

ilginiz için teşekkür ederim Klein; ancak tam olarak kullanımını anlayamadım. Hangi kısmına ekleyeceiz filtreyi ?

Birde ortalama alma kısmında açıkcası tıkandım.

For döngüsü içerisinde 10 kez ölçüp mü sonucu dışarı vermem gerekiyor sizce

edit:  dediğiniz şekilde kodu şu şekilde düzenledim. Dalgalanma biraz daha azaldı.

  while(1)   // sonsuz döngü
   {
   delay_ms(50);
   bilgi=read_adc();  // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyo
   voltaj=(0.0048828125*bilgi)*1000;   // Dijitale çevirme işlemine uğrayan sinyalin mV olarak gerilimi hesaplanıyor
   sicaklik=(voltaj/10)+2;    // Her 10mV'ta 1 derece artma
   delay_ms(500);
   //filtre kısmı//   
   filterval=(0.9*filterval)+(0.1*sicaklik);
   printf(lcd_putc,"Sicaklık=\f%2.2f'C",filterval);
   }

Klein

delay(500) kısmını kaldırıp ,   filtre değerlerini 0.99 ve 0.01 yapın dalgalanma daha da azalacaktır. hatta eğer hızınız yetiyorsa 0.999 ve 0.001 yaparsanız hepten azalır.