STM32f4 DMA ile I2S üzerinden ses verisi yollamak.

isoment01

Üye
Katılım
26 Haz 2016
Mesajlar
197
Puanları
1
Yaş
32
Arkadaşlar sizlerden kafamdaki bir proje ile alakalı yardım almak istiyorum. Elimde 0'dan 100'e çıkan bir yarış arabasının .wav uzantılı ses dosyası var ben bunu 16bitlik bir source file a çevirdim. Bu sesi i2s ile amplifier üzerinden bir hoparlöre vermek istedim.
Oyun konsolumun pedalına bastıkça da bu ses üzerinde oynama yapacağım. Dma ile kullanmak mantıklı gelmiyor. Dma ile sesi yürüttüğümde giden veri üzerinde oynama yapamıyorum yani sesi pedal bilgisi ile kordineli vermek istiyorum. Bu nokta da nasıl bir yol izlemeliyim ?
 
Kod:
void EngineSoundPlayer(void)
{
    for(int k=indeks;k<(indeks+SHIFT);k++)
        {
        sound_pack[k-indeks]=engine_sound_sample[k];
        }
        if(direction==FRONT)
        {
                indeks=indeks+SHIFT;

                if(indeks>=450000)
                {
                    direction=REAR;
                    indeks=indeks-(SHIFT*2);
                }
        }
        else
        {
            indeks=indeks-SHIFT;
                if(indeks<0)
                {
                    direction=FRONT;
                    indeks=indeks+(SHIFT*2);
                }
        }
            HAL_I2S_Transmit_DMA(&hi2s3, sound_pack, SHIFT);
}
Üstte şöyle bişeyler yapmaya çalıştım büyük ses datamın olduğu bir array var butona bastıkça herseferinde 10 bin adet dizi elemanını çaldırıyorum . Ses datam 0-200 arası hızlanan bir araç sesi. Butona bastıkça 0km den her seferinde ses datasının 10binlik kısımlarını çaldırarak sesi artırıyorum. Bu geçişleri daha soft yapmak istiyorum. Önerisi olan var mı ?
 
Merhabalar
sound_pack içine engine_sound_sample nin içindeki verileri indeks değeri kadar dizinden başlayıp alıyorsun. DMA an ise sound_pack dizisini yolluyorsun ama ses verilerin değişsede DMA ile yollayacağın paket sayısını hep sabit tutmuşsun. DMA dan yolladığın veri adedini SHIFT ile sabit tutmuşsun, SHIFT içeriği adededi değişmemiş. indeks in değeri ile ilgili işlemler yapmışsın ada SHIFT hep sabit örneğin 10.000 veri almışsın ama
SHIFT in değeri belki 15.000 belki 10.000 veriyi 15.000 olarak yolladın arada boş veri paketlerin olmuş olabilir yada tam tersi gibi....

burada indeks+SHIFT kadar veri aldın
Kod:
for(int k=indeks;k<(indeks+SHIFT);k++)
        {
        sound_pack[k-indeks]=engine_sound_sample[k];
        }

ama aldığın veri indeks içi değişip indeks+SHIFT olmasına rağmen SHIFT kadar paket yolluyorsun.
Kod:
HAL_I2S_Transmit_DMA(&hi2s3, sound_pack, SHIFT);
 
HOCAM selamlar aslında şöyle düşündüm bu elimdeki sample lineere yakın bir araç hızlanma sesi bende başlangıç olması bakımından 130 bin adetlik ses dizimi 10 biner adetlere böldüm her seferinde 0-10bin,10bin-20bin, 20bin-30bin,.. gibi parçalarını gönderdim ve onları da hız parçalarım gibi düşündüm. Bu shift değeri daha sonra daha da düşecek daha ayrıntılı daha küçük dizinler göndericem her hız için fakat hızlar arasındaki o geçişi nasıl smooth yapıcam orada takıldım.
 
Hızı nasıl algılatıyorsun bir gaz pedali varmı. Var ise ve analog ise 130k/10k=13 tip paketin olur. bunu tablolaya bilirsin.
uint8_t dizi[14]={0,10000,20000,30000.....120000}; gibi
Pot değerine göre verilerini yollarsın. Zaman aralığını ona göre ayarlaman lazım. i2s ve ses olayını hiç kullanmadım. MikroC arm da yazıyordum yeni yeni stmCubeide ye geçiş yapıyorum.
 
şimdilik sadece buton ile yapıyorum butona bastıkça smoth bir geçiş elde etmeye çalışıyorum. Araya delay vererek göndermek doğru çözüm değil gibi geliyr.
 
şimdilik sadece buton ile yapıyorum butona bastıkça smoth bir geçiş elde etmeye çalışıyorum. Araya delay vererek göndermek doğru çözüm değil gibi geliyr.
Delay koymak değil; timer tetiklemeli yapmak, zaman aralığı demek istediğim.
 
Delay koymak değil; timer tetiklemeli yapmak, zaman aralığı demek istediğim.
hocam size bir soru soracağım 450 binlik dizimden her seferinde 10 bin parça alıp dma dan çaldırmak istiyorum önce 0-10k sonra 10k-20k sonra... gibi fakat sanki önce 0-10k calıyor sonra 0-10k ve 10-20k yı calıyor kümülatif ilerliyor gibi. Circular buffer olayı dma da nasıl işliyor hocam ?
 
Acaba ayarlar ile mi ilgili yosa memory daki buffer demi kalıyorki öyle olmamalı aslında. DMA da transfer işlemi bitti kesmesini kullanarak DMA yı sonraki işleme kadar kapat istersen. yeni paket ile birlikte tekrar açıp bu işlemini tekrarla. Birde böyle dene.
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…