Ultrasonik Mesafe Sensörü Uygulaması -2

Ultrasonik sensörle mesafe ölçümü uygulamasının, INT kesmesiyle gerçekleştirilmiş uygulamasıdır.

Sensörle ilgili ayrıntılı bilgi;

https://elektrokod.wordpress.com/2014/01/17/ultrasonik-mesafe-sensoru-uygulamasi/

linkinden edinilebilir. Hatırlanacağı gibi sensörle ölçüm yapmak için TRIGGER pininden 10us lik pals gönderiliyordu. Sensör 8 adet ses dalgayı 40KHzde gönderiyor ve ECHO pinini “1” yapıyordu. Yansıyan dalga tekrar alıcı sensöre geldiğinde ECHO “0” oluyordu.

Bu uygulamada mesafe ölçülmek istendiğinde TRIGGER tetiklemesi yapılıyor. ECHO kontrolü ise INT kesmesi tarafından gerçekleştiriliyor.


#define ECHO PORTB.B0
#define TRIGGER PORTB.B7

// LCD module connections
sbit LCD_RS at RA6_bit;
sbit LCD_EN at RA7_bit;
sbit LCD_D4 at RA0_bit;
sbit LCD_D5 at RA1_bit;
sbit LCD_D6 at RA2_bit;
sbit LCD_D7 at RA3_bit;

sbit LCD_RS_Direction at TRISA6_bit;
sbit LCD_EN_Direction at TRISA7_bit;
sbit LCD_D4_Direction at TRISA0_bit;
sbit LCD_D5_Direction at TRISA1_bit;
sbit LCD_D6_Direction at TRISA2_bit;
sbit LCD_D7_Direction at TRISA3_bit;
// End LCD module connections

bit OlcumOK;
unsigned int sayac_TMR1=0;
char txt[7];
unsigned int toplamSure=0,mesafe_mm=0;
//----------------------------
void InitTimer1()
{
 T1CON = 0;
 TMR1H = 0;
 TMR1L = 0;
}
//-------------
void Kurulum()
{
 CMCON=7;
 TRISA=0;
 TRISB=1;
 PORTB=0;
 InitTimer1();
 INTCON.INTE=1;
 INTCON.INTF=0;
 OPTION_REG.INTEDG=1;
 INTCON.GIE=1;
 Lcd_Init();
 Lcd_Cmd(_LCD_CURSOR_OFF);
}
//---------------------
void interrupt()
{
 if(INTCON.INTF)
 {
   if(ECHO)
   {
     T1CON.TMR1ON=1;
     sayac_TMR1=0;
     OPTION_REG.INTEDG=0;
   }
   else
   {
     T1CON.TMR1ON=0;
     sayac_TMR1=TMR1H;
     sayac_TMR1=(sayac_TMR1<<8)+TMR1L;
     TMR1H = 0;
     TMR1L = 0;
     OPTION_REG.INTEDG=1;
     OlcumOK=1;
   }
   INTCON.INTF=0;
  }
}
//------------------------------------------------------
void main()
{
 Kurulum();
 Lcd_Out(1,3,"Mesafe Olcer");
 Lcd_Out(2,1,"elektrokod.wordp");
 Delay_ms(2000);
 Lcd_Cmd(_LCD_CLEAR);
 Lcd_Out(1,3,"Mesafe Olcer");
 while(1)
 {
   TRIGGER=1;
   Delay_us(10);
   TRIGGER=0;
   if(OlcumOK)
   {
     mesafe_mm=((long)sayac_TMR1*34)/200;
     WordToStr(mesafe_mm,txt);
     Lcd_Out(2,1,txt);
     Lcd_Out_CP(" mm");
     OlcumOK=0;
   }
   Delay_ms(100);
 }
}

Not: Proje için PCB ve Sensör temin edilir. İstekleriniz için mail atınız.

Reklamlar

4 thoughts on “Ultrasonik Mesafe Sensörü Uygulaması -2

  1. Hocam uygulamalar için teşekkürler.Aklıma geldi de bildiğiniz gibi işlemcide CCP modülleri var bunlar yükselen ve düşen kenarları yakalayıp timer1 ile hesaplayabiliyordu.INT kesmesi değilde RC2 Capture ile daha hassas ve daha sağlıklı olmazmıydı uygulama ?Deneyebildiniz mi CCP ile acaba ?

    Teşekkürler..

    • Soru için teşekkürler. Güzel bir soru.

      CCP modülü ile capture içi her periyotta yakalama yapılıyor. Burada ise sadece artı alternans (Lojik “H”) ta hesaplama yapılıyor.
      Belki uygun değişiklikler yapılarak sağlanabilir. tam olarak test etmedim.
      Kolay gelsin…

  2. Ayrıca mesafe_mm değişkeninde neden long veri türüne dönüştürme yaptınız ? zaten mevcut uygulamadaki sensör bildiğim kadarıyla ölçümü 3 basamağı bile geçmiyor.Bu konuda da aydınlatırsanız sevinirim.

    • (long)sayac_TMR1*34 bu formülde sayac_TMR1 değişkeni int tipinde dolayısı ile max değer 65535 eder. 34 ile çarpımda =2228190 eder. Dolayısı ile long tipine dönüştürmemiz gerekir.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s