DSP:STM32F407 adc sonuçları....

Başlatan GreeN, 08 Ocak 2013, 11:47:24

GreeN

Formda DSP şeklinde bir ana başlık açılabilir mi ?
Bu tip konular forum aralarında kaybolup gidiyor .

Başka bir başlıkta stm32f407 adc'si eleştirilmiş . Karşılaştığım problem yüzünden bende stm32f4x adc'nin çok gürültülü olduğuna kanaat getirip discovery borda küstüm. Ama bir kenara atamadım.

Üzerine çalıştığım projenin çevre etkilerden çok fazla etkilendiğini farkettim. Manyetik kirlilik adc sonuçlarımı çok etkiliyor. (horon tepiyorlar)
örneğin 1024 adet adc sonucunu peşi sıra alıyorum ve bunlar üzerinde işlemler yapıyorum.

Bu gürültülerden nasıl kurtulurum? Sistemdeki gürültüyü izleme , çözüm üretme adına neler yapılabilir ?

Çözüm olarak low pass FİR filtre yapmaya çalıştım. Matlabtan H değerlerini hesapladım. vs...

//N ÖRNEK SAYISI , K FİLTRE H SAYISI
for ( j = 0; j < N; j++) {
float s = 0;
for ( i =0; i <= K; i++) {
s += ch[i] * x1[i+j]; // x[] = input
// c[] = filter coefficients
}
y1[j] = s; // y[] = output
}


Terörü Lanetliyoruz.

z

TI Stellaris'de de ADC nin kötü olduğuna karar vermişken sorunun yazılımımdan kaynaklandığını farkettim.

Belki sizde de aynı durum olabilir.

ADC yi kurarken, mesela;

1.ADC girişini ölç,
2.ADC girişini ölç,
3.ADC girişini ölç,
4.ADC girişini ölç ve INT üret.

şeklinde yapılandırıyorum.

Ölçümler yapıldıkça sonuçlar FIFO'ya atılıyor.

INT geldiğinde FIFIO'dan sonuçları sıra ile çekiyorum.

Ne oluyorsa oluyordu ve FIFO'da dizilim kayıyordu.

Bu durumda ADC girişine ait sonuç bazen diğer kanallara ait sonuç oluyordu. Bu da haliyle olağan ADC sonucundan farklı bir değerin okunması anlamına geliyordu.

Yani sanki gürültü varmış da ADC o an için sapıtık bir değer okuyormuş izlenimi veriyordu.

Böyle bir durumla karşılaşmadığınızdan emin olun.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

GreeN

Adc okumaları  tek porttan alıyorum (ama trible adc1 , adc2, adc3 senkronize olarak çalışıyor böylece 7.2MSPS hıza ulaşıyor) .
adc sonuçlarını dma ile alıyorum.
dma ile 512 veri aktarmanın ardından interrupt oluşturuyorum.
Adc sonuçları için uint32_t ADCValue[512]; şeklinde dizi tanımladım .
Adc'nin 16bitlik data registerlerinde sırayla ;

16bit   16bit
------    ------
adc1 , adc2
adc3 , adc1
adc2,  adc3
.....

sonuçları oluşuyor.
dma 2 adc çevriminde bir 32bitlik datayı rama aktaracak. (adc dma mode 2 kullanılarak yapıldı)
#define ADC_CDR_ADDRESS    ((uint32_t)0x40012308
adc sonuçları burada 32 bit olarak yer alıyor.
böylece
ADCValue[0] =adc1:adc2 değerini
ADCValue[1] =adc3:adc1 değerini alıyor.
....

daha sonra aşağıdaki kod ile 16 bitlik Input[1024] dizisine değerleri aktarıyorum.

for(i=0;i<1024;i++){
Input[2*i]= (ADCValue[i]&0xFFFF)*3.300F/0xFFF;
Input[2*i+1]=(ADCValue[i]>>16)*3.300F/0xFFF;
	}


Acaba bu kodda sizin de örneğini verdiğiniz gibi adc sonuçlarının sıralamasınımı karıştırdım. Yoksa kodda bir hata mı yaptım ? (suya dışarıdan giren kurbağa olun)
Sizin bahsettiğiniz gibi bir hata yapabileceğim bir iki yer var. Yukarıda anlatmaya çalıştım.


Terörü Lanetliyoruz.

berat23

örnekler ne için kllanılacak bilmiyorum ama 7.2msps ile örneklemek yerine düşük hızlarda daha az örnekle çalışsanız daha mantıklı değil mi?

aslında en mantıklı çözüm kalman filtresi kullanmanız.

GreeN

#4
CMSIS de sizin bahsettiğiniz MAC işlemlerine örnek olarak aşağıdaki fonksiyonu verebilirmiyiz?
Yani bu fonksiyonlardanmı bahsediyorsunuz ?



void arm_q31_to_float 	( 	
                q31_t *  	pSrc,         //giriş
		float32_t *  	pDst,//çıkış
		uint32_t  	blockSize 
	)


Mesela bu 32 bit integer diziyi floata çeviriyormuş.

örnek kullanımı ;

arm_q31_to_float(outputQ31, outputF32 + (i * BLOCKSIZE), BLOCKSIZE);


Bu fonksiyon için konuşursak MAC işlemleri kullandık diyebilirmiyiz ?


mesaj birleştirme:: 08 Ocak 2013, 18:44:49

Süreleri ölçüp yazarım :)
Terörü Lanetliyoruz.

GreeN

Alıntı yapılan: berat23 - 08 Ocak 2013, 14:50:31
örnekler ne için kllanılacak bilmiyorum ama 7.2msps ile örneklemek yerine düşük hızlarda daha az örnekle çalışsanız daha mantıklı değil mi?

aslında en mantıklı çözüm kalman filtresi kullanmanız.

Kalman filtre hakkında bilginiz var mı?
Terörü Lanetliyoruz.

berat23


pisayisi

Burda gürültü bilinmeyen pek çok değişkene bağlı kaotik bir durum, adc den gürültüsüz ölçüm alıcam diye kallman filtresi ile uğraşmak akla ziyan zamanına yazık olur. Adc girişine uyguladığın sinyali gözden geçir, ya da basitce ortalama değer al...
Murat

berat23

adc nin kendi gürültüsü kaotik değil,rastsal ve az çok bilinen(gauss) bir gürültü. kalman filtresi,gürültünün varyansını bildiğinde böyle gürültülü süreçleri gürültüsüz hale getirir. uğraşılır mı uğraşılmaz mı tercih meselesi fakat ortalama almaktan daha keskin sonuçlar çıkaracağı aşikardır.

pisayisi

Burda ele alınan gürültü dış etkilerden dolayı ortaya çıkan bilinmeyen pekçok işaretin oluşturduğu modellenemeyen bir gürültüdür dolayısı ile kaotiktir. Eğer adc nin donanım özelliklerinden kaynaklanan örnekleme sebebi ile ortaya çıkan gürültüyü kastediyorsan ancak onun varyansını hesaplayabilirsin. Dış etkilerin kararlı bir varyansını hesaplayabiliyorsan yaz çiz görelim öğrenelim...
Murat

muhittin_kaplan

Alıntı yapılan: berat23 - 11 Ocak 2013, 20:02:58
adc nin kendi gürültüsü kaotik değil,rastsal ve az çok bilinen(gauss) bir gürültü. kalman filtresi,gürültünün varyansını bildiğinde böyle gürültülü süreçleri gürültüsüz hale getirir. uğraşılır mı uğraşılmaz mı tercih meselesi fakat ortalama almaktan daha keskin sonuçlar çıkaracağı aşikardır.
Konuyu biraz açıp anlatbilirmisiniz
Kalman filtresini Lowpass olarak kullanıyorum ama iş  extended kalman filter sine gelince algım ve kaabiliyetlerim yetmiyor.

berat23

@pisayisi

aslında aynı şeyi söyleyip,anlaşamıyoruz. burada bahsedilen durumda muhtemelen en büyük gürültü adcnin kendi gürültüsü.diğer gürültüler kolaylıkla engellenebilir ya da etkisi çok az. yani gidipte baz istasyonunun üzerinde çalışmadıkça gsm için oluşan girişim, adcnin kendi gürültüsünden çok daha az olacaktır. bu arada aynı etkiyi verebilir fakat kaotik ile rastsal arasında fark var;
http://www.math.tamu.edu/~mpilant/math614/chaos_vs_random.pdf

@muhittin_kaplan

hocam benimde extended hakkında bilgilerim çok yüzeysel,formülsel. aslında bir başlık altında normal kalmandan başlayarak insan dilinde konuşup anlaşabiliriz. ama şunu söyleyebilirim,sistem ve gürültü iyi modellenirse lineer kalman filtresi bizim buarada bahsettiğimiz gibi sistemlerde (adc veya akselerometre üzerindeki gürültü) çok iyi sonuçlar veriyor.

GreeN

Belki yukarıda çevresel etkilerden çok etkileniyor dedim. Araştırılması lazım gelen bir konu. Ama şunu söyleyebilirim adc boşta akurken bile o gürültü var. Bir video hazırlayacam bunun üzerinden konuşalım .

Kalman filtre uygulanmalımı uygulanmalımı konusunda ise şunu söylemek istiyorum , amaç öğrenmek , bu problemi başka bir teknikle aşabiliriz , ama ya hakikaten kalman filtresi gereken bir proje ile karşılarşırsak diyorum . Zaman öldürmek değilde en azından işin içine girip filtrenin ne kadar zor , ne kadar uygulanabilir olduğunu görmekte birrşey. Mesela yukarıdaki yorumlarınız bile birşeyler öğretiyor bana.
Sonuçta Türkçe kaynak bulmak zor , ingilizce kaynaktan ne kadar anlarım ki.
Terörü Lanetliyoruz.

berat23

boşta okumaktan kastın girişi boş bırakmaksa gürültü olması normal. eğer girişte bildiğin sabit bir gerilim varken gürültü olması anormal olanı.

GreeN

Alıntı yapılan: berat23 - 12 Ocak 2013, 12:29:10
boşta okumaktan kastın girişi boş bırakmaksa gürültü olması normal. eğer girişte bildiğin sabit bir gerilim varken gürültü olması anormal olanı.

+3.3 ve gnd yi ölçtüğümde problem yok. ADC ölçüm ucu boşta iken bozulma var ve sensör bağlı iken...
Terörü Lanetliyoruz.