STM32F4-Discovery ile odyometri cihazı yapımı

Başlatan Deli_Nedym, 13 Ocak 2013, 03:11:08

Deli_Nedym

Odyometri cihazları, kalibre edilmiş saf ses üreten, konuşma ve çeşitli maskeleme sesleri çıkartan, bir uygulayıcı tarafından maniple edilen (mikrofonlu, kulaklıklı ve kemik yolu için vibratörlü), işitme duyarlığının ölçülmesi amacıyla kullanılan elektronik cihazlardır. Bu cihazlar sayesinde saf sese ve konuşma seslerine duyarlılık ölçülebilir.
İşitme kayıplarının belirlenmesinde kullanılan odyometri, deneğin kulağına takılan bir kulaklık vasıtası ile belirli frekanslarda, kademeli olarak değiştirilebilen ses basınç düzeyi uygulayan ve deneğin o frekansta duyabildiği en düşük ses düzeyini belirleyen bir cihazdır.
Sübjektif olarak teste tabi tutulan kişi sesi duyduğu anda elinde bulunan butonuna basarak operatörü uyarır. Test bu şekilde tüm frekanslarda, genellikle 125 Hz - 16 kHz arasındaki 1/1 oktav bant merkez frekanslarında ve her iki kulak için tekrarlanır. Sesin şiddeti ise 0 - 120 dB arasındadır.

Odyometri cihazını ve çalışma prensibini yazdığıma göre esas derdime geçeyim. Bu cihazı stm32f4-discovery kiti ile ve keil programı kullanarak yapmam gerekiyor. İşlemcinin kendi kulaklık çıkışından ses alamadım, forumda var biliyorum okudum dosya da paylaşmışlar indirdim fakat çok karmaşık, çözemedim. Direkt bir örnekle de karşılaşmadım ne yazık kı... O yüzden dac kullanarak ses çıkışı almayı düşünüyorum. Onun dışında elimde 20 hz - 20000hz arası 30 adet wav ses dosyası da mevcut ancak her biri yarım saniye bunu biraz fazla dinletmem lazım dinleyiciye yaklaşık iki üç saniye kadar.

En azından gidiş yolu olarak bir şeyler konuşup paylaşırsak bir hafta içinde bu projeyi bitirmeyi düşünüyorum. Mesela yarım saniyelik wav'ı nasıl daha uzun dinleteyim sesi direk keil'de çağırarak ve for'a sokarak bi kaç kez üst üste çağırıp olabilir mi ? Ondan sonra tabi dinleyici sesi duyuyorsa mavi butona basacak orda hangi frekansı duyduysa onu da ayrıca bir hafızada tutmam gerek. Böyle byle konuşup tartışırsak bir sonuç elde edebiliriz diye düşünüyorum. Dac'dan aldığım bir ses çıkışı vidyom var onu da paylaşayım ancak sadece gürültü olarak çıktı maalesef.  stm32f4 ses sorun

Deli_Nedym

#1
lm380 ile kurduğum amplifier devreden ses alamadım bende http://web.mit.edu/6.s28/www/schematics/lm386.htm adresindeki lm386'lı devreyi yaptım. Bu devreyle olan tek şey gürültümün daha fazla sesle çıkması :o Gürültüyü filtreleyemedik yani ?
Ne olur nolmaz diye kodu da buraya yazayım şuna bir çözüm bulalım artık hocalar kafayı yedirtti bana bu kit yahu. Acaba pa4 pinine mi zarar verdim artık ne yaparsam olmuyor onu düşünüyorum bende ama ? Ya da sizin başka bi fikriniz var mı ? Math işlemci sorununu bilen var mı ? target for option da hangi sekmede nereyi aktif etmek gerekiyor gibi ?
#include "STM32F4xx.h"
#include "Wav.c"
char Soyle;
int  Sayi, EndAdr, Bekle, Indx;
/*****************************************************************************************************
         CPU PLL ile 168Mhz de kosturulur
         AHB frekansy 168 Mhz
         APB1 frekansy 42 Mhz
         APB2 frekansy 84 Mhz
*****************************************************************************************************/

void SystemInit()
{
//sistem bilgileri
 
//   DAC1 kullanacagiz
     GPIOA->MODER=0xA8000200;        // GPIOA4 Analog inp yapildi
     RCC->APB1ENR|=1<<29;            // Artislik olsun (0x20000000 ile OR yap demek)
     DAC->CR=0x00000003;             // DAC1 ve Bufferi aktif edelim
//   Timer 7 ile calisalim
     RCC->APB1ENR|=0x00000020;       // Timer7 CLK'u aktif edelim (84 Mhz)
     TIM7->CR1=0x0080;               // Otomatik Reload
     TIM7->PSC =0;                   // Prescaler cikis frekansimiz 84Mhz
     TIM7->ARR =84000000/8000;       // Counter, Decimal 1 olunca basa donsun. 8Khz
     TIM7->DIER=0x0001;              // Update Int enable
     NVIC->ISER[1] = 0X00800000;     // NVIC de Timer 7 interrupta izin verelim
} 
 
void TIM7_IRQHandler()
{
 
    TIM7->SR=0;                       // Timer Int Flagini silelim
    if (Soyle)
      {
        DAC->DHR12R1=Wav[Indx]<<4;
        Indx++;
        if(Indx>EndAdr) Soyle=0;
      }
    else if(Bekle) Bekle--;
    GPIOD->ODR^=0xF000;
} 
 
void NefesAl()
{
    Bekle=2000;
}


void Sound(short N)
{
    while(Soyle|Bekle);
    switch(N) 
      {
        case    0:{ Indx=0    ; EndAdr=4619;  break;}
        case    1:{ Indx=4620 ; EndAdr=7279;  break;}
        case    2:{ Indx=7280 ; EndAdr=10599; break;}
        case    3:{ Indx=11120; EndAdr=14999; break;}
        case    4:{ Indx=15000; EndAdr=18119; break;}
        case    5:{ Indx=18120; EndAdr=24419; break;}
        case    6:{ Indx=24420; EndAdr=28399; break;}
        case    7:{ Indx=28400; EndAdr=32039; break;}
        case    8:{ Indx=32040; EndAdr=36619; break;}
        case    9:{ Indx=36620; EndAdr=40659; break;}
        case   10:{ Indx=40660; EndAdr=42579; break;}
        case   20:{ Indx=42580; EndAdr=45999; break;}
        case   30:{ Indx=46000; EndAdr=49539; break;}
        case   40:{ Indx=49600; EndAdr=52739; break;}
        case   50:{ Indx=52740; EndAdr=56699; break;}
        case   60:{ Indx=56700; EndAdr=61639; break;}
        case   70:{ Indx=61640; EndAdr=67299; break;}
        case   80:{ Indx=67300; EndAdr=72959; break;}
        case   90:{ Indx=72960; EndAdr=77199; break;}
        case  100:{ Indx=77200; EndAdr=79999; break;}
        case 1000:{ Indx=80000; EndAdr=82999; break;}
      }        
    Soyle=1;   
}

void Konus(int Sayi)
{
char Rakam;

     if (Sayi&0xF00000)
       {
         Rakam=(Sayi>>20)&0x0F;
         if(Rakam>1) Sound(Rakam);
         Sound(100);
       }

     if (Sayi&0x0F0000)
       {
         Rakam=(Sayi>>16)&0x0F;
         if (Rakam>0) Sound(Rakam*10);
       }

     if (Sayi&0x00F000)
       {
         Rakam=(Sayi>>12)&0x0F;
         if ((Rakam>1) || (Rakam&0xFF0000)) Sound(Rakam);
       }

     if (Sayi&0xFFF000) Sound(1000);

     if (Sayi&0x000F00)
       {
         Rakam=(Sayi>>8)&0x0F;
         if(Rakam>1) Sound(Rakam);
         Sound(100);
       }

     if (Sayi&0x0000F0)
       {
         Rakam=(Sayi>>4)&0x0F;
         if (Rakam>0) Sound(Rakam*10);
       }

     Rakam=Sayi&0x0F;
     if ((Rakam>0)|(!Sayi)) Sound(Rakam);
       NefesAl();

}

int main()
{    
      Soyle=0;
     Indx=0;
     EndAdr=0;
     Bekle=0; 
	
 if (GPIOA->IDR & 0x000000001)  
	 
  {
     TIM7->CR1|=0x0001;              // Timer Enable
		
     Konus(0x0);                     // BCD Formatta seslendirilecek sayi 
     Konus(0x12);                    // BCD Formatta seslendirilecek sayi 
     Konus(0x456);                   // BCD Formatta seslendirilecek sayi       
     Konus(0x1230);                   // BCD Formatta seslendirilecek sayi  
     Konus(0x5691);                  // BCD Formatta seslendirilecek sayi 
     Konus(0x74519);                 // BCD Formatta seslendirilecek sayi 
     Konus(0x368278);                // BCD Formatta seslendirilecek sayi 
     Konus(0x2012);                  // YILINIZ KUTLU OLSUN 
     Konus(0x2012);                  // YILINIZ KUTLU OLSUN 
     Konus(0x2012);                  // YILINIZ KUTLU OLSUN 
 }
   
   while(1);
}


mesaj birleştirme:: 16 Ocak 2013, 16:11:45

Bu da lm386 ile kurduğum devreye pa4 pinine 1uf bağlayıp giriş yapınca duyduğum ses
MOV00520

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Deli_Nedym

Eyvallah hocam şimdi oldu  :)
Ben Waw.c olarak içerdeki kodu dişarı almıştım ondan mı kabul etmedi ki ? Dışarda c dosyası olarak onu kaydetmiştim ve #include  wav.c ile  programa dahil etmiştim

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Deli_Nedym

Çalıştı hocam çalıştı Allah razı olsun valla :)
Şimdi bu kodun üzerinden değişiklik yaparak odyometri cihazı yapımına başlayabilirim ses çıkışı alabildiğimize göre. Artık iş kodlamaya kalıyor. Çok sağolun hocam büyük bi sorunu aşmamı sağladınız teşekkürler  ::)

Deli_Nedym

Yeni bir sorunla tekrar karşınızdayım sevgili picproje sakinleri :)
wav dosyamı c'ye çevirip wav.c olarak kaydettikten sonra proje klasörüme attım ve onu dinlemeye çalışıyorum adc kullanarak. Aslında belli bir wav dosyamı dinleyebildim yaklaşık 3 saniye süren. Ancak bir tek o wav dosyasını dinleyebiliyorum. Başka dosyaları da c'ye çevirdim klasöre koyup denedim ama yok onları duyamıyorum ses çıkmıyor. Onlar da 3 saniye kadar çok uzun değiller. Yalnızca tek bir wav dosyası için gerçekleştirebildim bunu. Onun dışında beş tane daha wav dosyası denedim fakat hiç birinden ses çıkışı alamadım. Devrelerde ve kodlarda bir sıkıntı yok değiştirdiğim  tek şey waw dosyası ama nedenini bulamadım çalışmamasının. Fikri olan arkadaşlar yardım ederse sevinirim. Kola gelsin, iyi çalışmalar herkese... 

pisayisi

Saf sinus frekans elde etmek istiyorsan ses dosyaları ile uğraşmaktansa, dac biriminin fonksiyon üretebilme özeliklerini kullanarak da gerçekleştirebilirsin. Bu durumda frekansı yazılımla belirlersin, ses çıkış gücünü de çıkışa koyacağın lineer ayarlı bir ses kuvvetlendiricisi ile ayarlarsın. Çıkışa aktardığım ses gücünü de elektriksek olarak bir  hoparlore seri bağlayacağın ufak değerli bir geribesleme direnci üzerinde işlemcinin adc sine girersin . Bu güç değerini de bir lcd ye yazdırıp denemeler yaparak kullanıcıya göre kalibre edebilirsin...
Murat

Deli_Nedym

Teşekkürler @pisayisi hocam.
Keil programına hakim değilim  o yüzden ses dosyalarıyla uğraşmak durumunda kalıyorum...
Bu iki günde yapabildiğim kadar yapıp en azından hocadan ek süre istemeye çalışıyorum bakalım ne kadar olacaksa...
Okulda da görmeden tamamen kendi çabamla bi şeyler yapmaya çalıştım ama okul dersleri de olduğundan fazla ilgilenemedim yine de bi şeyler olacak gibi bakalım hayırlısı artık. Önerileriniz için tekrar teşekkürler ek süre alabilirsem uygulamaya çalışacağım