ARM – Not5: STM32F407VG ile Ultrasonik Mesafe Ölçümü.

Yayınlandı: 15 Ocak 2014 / ARM STM32F4DISCOVERY Programlama...
Etiketler:, , , , , , , , , ,

AdsızUltrasonik sensörler ilk defa ikinci dünya savaşında İngilizlerin, Alman uçaklarını ve denizaltılarını tesbit edebilmesi amacıyla geliştirilmişler ve günümüze kadar pek çok alanda kullanılagelmişlerdir. Çalışma prensipleri bir ultrasonik (insan kulağının duyamayacağı büyüklükte frekanslara sahip ses dalgaları) hoparlörden çıkan ses sinyalinin, bir cisme çarpıp geri dönmesi ve bu geri dönen sinyalin bir ultrasonik mikrofon tarafından algılanması arasında geçen sürenin ölçülerek mesafenin hesaplanması ilkesine dayanır.  Sesin atmosferdeki hızı 340m/sn’dir.  Yani bir kaynaktan çıkan ses 340 metre uzaklıktaki bir cisme 1 saniye sonra ulaşır ve bu cisimden yansıyıp geri dönmesi de 1 saniye alır.

Bizim bu projemizde kullanacağımız sensör HC-SR04 ismindeki ultrasonik alıcı verici çifti barındıran kullanıma hazır bir sensördür. Bu sensörde 4 adet pin bulunmaktadır. Bunlar VCC (+ besleme), GND (şase), Trigger (tetikleme) ve Echo (yankı) pinleridir. Vcc ucuna +5V verilir. Trig ucunan 10us boyunca logic-high sinyal uygulanır ve Echo pininden logic high sinyal gelmesi beklenir. Echo pini high olduğunda süre tutulmaya başlanır. Echo pini low olduğunda süre tutma işlemi sonlandırılır. Tutulan süre ses sinyalinin gönderilip, geri geldiği süredir. Biz bu süre ile sesin atmosferdeki hızını çarparsak (tabiki birimlerin aynı olması gerekmekte us-us, sn,sn) aradaki mesafeyi bulmuş oluruz.  Sensörle ilgili daha detaylı mevcut burada…

hc-sr04-1

Büyük halini görmek için tıklayın…

Projemizde 1us’lik bir timer kesmesi oluşturacağız ve birimlerin tamamı us cinsinden hesaplanacak. Bu sebeple 340m/sn değerini us cinsinden hesaplamamız gerekir.  Buradan hız 34/1000 = 0,034 cm/us bulunur. Sesin yansımasından dolayı mesafe iki katına çıkacağından mesafenin hesaplanması şöyle olmalıdır;

Adsız

Yani asıl hesabımız “mesafe= (süre x 34/1000)/2;” kod satırıyla hesaplanabilir.  Projemizde Trigger pini işlemcimizin B0 pinine, Echo pini ise B1 pinine bağlanmıştır. Hesaplanan mesafe USB üzerinden PC’ye aktaımış ve derleyicideki tools sekmesi altında bulunan HID terminal üzerinden gözlemlenmiştir. Timer hesaplaması için mikroelektronikanın “Timer calculator” isimli programı kullanılmıştır.

Kodlarımız aşağıdadır;


int sayac=0,uzaklik=0;
char readbuff[64];
char writebuff[64];
char yuzler,onlar,birler;

void InitTimer7(){// Timer kurulumu...(1us)
RCC_APB1ENR.TIM7EN = 1;
TIM7_CR1.CEN = 0;
TIM7_PSC = 0;
TIM7_ARR = 83;
NVIC_IntEnable(IVT_INT_TIM7);
TIM7_DIER.UIE = 1;
}

void Timer7_interrupt() iv IVT_INT_TIM7 { // her 1us'de sayac değişkeni 1 arttırılıyor.
TIM7_SR.UIF = 0;
sayac++;
}

void main() {
InitTimer7();
HID_Enable(&readbuff,&writebuff);
GPIO_Digital_Output(&GPIOB_BASE, _GPIO_PINMASK_0);
GPIO_Digital_Input(&GPIOB_BASE, _GPIO_PINMASK_1);
while(1)
{
GPIOB_ODR.B0=1; // tetikleme veriliyor.
delay_us(10);
GPIOB_ODR.B0=0;// tetikleme kesiliyor.
while(GPIOB_IDR.B1==0);// Echo pininden 1 gelmesi bekleniyor.
TIM7_CR1.CEN = 1;// Timer başlatılıyor.
while(GPIOB_IDR.B1);// Echo pininden 0 gelmesi bekleniyor.
TIM7_CR1.CEN=0;// timer durduruluyor.
TIM7_CNT=0;// timerın sayıcı registerı sıfırlanıyor.
uzaklik=((long)sayac*34/1000)/2; // msafe hesaplanıyor
sayac=0; // sayac sıfırlanıyor
yuzler=(uzaklik/100)+48; // USB'den göndermek için mesafenin basamak değerlerinin ASCII dönüşümleri yapılıyor
onlar=((uzaklik/10)%10)+48;
birler=(uzaklik%10)+48;
delay_ms(500);
writebuff[0]=yuzler;
writebuff[1]=onlar;
writebuff[2]=birler;
writebuff[3]=' ';
writebuff[4]='c';
writebuff[5]='m';
writebuff[6]='.';
writebuff[7]='\r';
writebuff[8]='\n';
HID_Write(&writebuff,64); // veri usbden gönderiliyor.
}
}

void usb_kesme() iv IVT_INT_OTG_FS ics ICS_AUTO {
USB_Interrupt_Proc();
}

Yazıyla ilgili dosyalara buradan ulaşabilirsiniz.

May the force be with you…

yorum
  1. Onur dedi ki:

    Güzel anlatım, 8 bit denetleyicilerde de bu denli hassas ölçüm yapılabilirmi?

  2. özkan dedi ki:

    hocam Allah razı olsun

  3. efe dedi ki:

    hocam merhaba ; stm32 ultrasonik sensor ile mesafe ölçümü uygulmasını yapmak istiyorumda.hoca keil dili ile yapmamızı istiyor vediğiniz kodlar keıl a uygunmu..

  4. efe dedi ki:

    STM32F407VG kartını ve HC-SR04 sensörünü nerden temin edebilirim..?

  5. Zeynel Abidin Delikan dedi ki:

    Hocam,

    Uzun zamandır Fez Panda II modülü ile .Net Micro Framework kullanarak toprak nem sensörü geliştirmeye uğraşıyordum. Ama malesef toprak direnci ölçümünde ns seviyesinde süre ölçümü yapamadığım için STM32F429ZI Discovery kartına geçiş yapmak zorunda kaldım.

    Bu kartlada çok yabancı olduğum C ye siteniz sayesinde ısınmaya başladım ama tabi hala timer kullanımı ve 1 ila 6 ns seviyesinde sinyalin süresinin ölçümüne hala çok uzağım.

    Bu konuda bana bir tavsiyeniz olabilirmi ?

    Stm32F429 ile bu sürelerde sinyali nasıl ölçümlendirebilirim ?

  6. Mevlut Bulduk dedi ki:

    iyi gunler hocam demo limit hatası verıyor ayrıca hıd termınal inde ölçüm görülmüyor

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