Nasıl bir filtre kullanmalı?

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
22,073
Üzerinde çalıştığım power amfide yük akımını takip edip ekrandaki power meter'da gösteriyorum. 12 bit ADC ile saniyede 10 bin tane örnek okuyorum ve RMS hesabı yapıyorum. Asıl hardware gelmeden, ADC ye sinyal jeneratöründen uygun bir test sinyali veriyordum ve tertemiz hesabı yapıyordum. Ama şimdi asıl hardware geldi ve benim akım şöntleri üzerinde ölçtüğüm sinyal şöyle:

a.png


Spektruma bakınca baskın gürültü bileşeninin 400 kHz civarında olduğu görülüyor.

a.png
 
  • Beğen
Reactions: nt
Ses frekansı bölgesine bakarsak, sadece benim üretmekte olduğum 1 kHz ve harmoniklerini görüyoruz. Bu bölgede başka baskın bir gürültü bileşeni yok.

a.png
 
  • Beğen
Reactions: nt
Buradaki 400 kHz, amfi çıkışındaki power modüllerin anahtarlama frekansı olduğu belirtildi. Bir sonraki revizyonda ilave LC filtreleme yapılacağı da belirtildi. Ama ne kadar ilave filtreleme de olsa, bu gürültü önemli ölçüde var olmaya devam edecek.

Bu durumda bu sinyali benim yazılımda low pass filtrelemem lazım. Kesim frekansı birkaç kHz olması yeterli. Ama okunan değer üzerinden RMS hesabı yapılacağı için mümkün olduğunca "flat" bir filtre gerekiyor. Bir de hesabın tamamı bir kesme içerisinde yapıldığı için filtrenin çok hızlı bir şekilde hesap edilebilmesi gerekiyor. Ne tür filtre kullanmak lazım?
 
Osiloskopta "math" özelliğini kullanarak 3 kHz kesim frekanslı LPF tanımladım. Gürültünün neredeyse tamamını uzaklaştırıyor. Hatta değişik frekanslarla deneyince tam olarak aynı genlikte çıkış alıyorum. Bir şekilde aynı filtrelemeyi ARM'da yapmam lazım.

a.png
 
  • Beğen
Reactions: nt
Şu anda ADC nin okuduğu örneklere bakınca da gürültünün varlığı görülebiliyor. RMS hesaplama 100 örnek üzerinden yapılıyor ve hesaba başlamadan sıfır geçiş anını bulup oradan başlamakla uğraşmıyorum. Zaten sinyal jeneratörü ile ADC sinyalini verdiğim zaman çok stabil bir ölçüm yapabiliyordum, o yüzden bu sıfır geçişi olayının çok da kritik olmadığını düşünüyorum.

Bir IIR filtre tasarımı yapmaya çalışıyorum şu anda. Bu filtreler "flat" olmaları ile ünlü değildir, ama güç ölçümünün çok düşük bir hata ile yapılması da şart değil. Bakalım filtreyi hazırlayayım nasıl bir sonuç çıkacak.


 
ADC girisine 3KHz lik bir low pass eklemen gerekiyor. Bundan sonra yazilimsal ne filitre. Istiyorsan ekle. Ilk giriste anti alias filitre sart.
 
ADC girisine 3KHz lik bir low pass eklemen gerekiyor. Bundan sonra yazilimsal ne filitre. Istiyorsan ekle. Ilk giriste anti alias filitre sart.

Girişte bir RC filtre var zaten. Bu filtrelenmiş hali.
 
O zaman o gurultu olcum esnasinda saseleme vs gibi sebeplerle olusuyordur. Low pass cikisinda o kadar gurultu olmamasi lazim.
 
RC filtre doğrudan ADC girişinde değil, sorunun bir kaynağı da bu zaten. Doğrudan girişte olsa da gene filtrelenecek kadar gürültü olacak diye düşünüyorum. Neticede bu common mode noise, her yerden ulaşıyor sisteme. 1500 W SMPS güç kaynağı var ve ± 160 V çıkış üretiyor. Amfinin çıkış gücü de 1100 W. Şu anda test ederken ben 100 W altında test ediyorum. Maksimum güce yakın kullanımda gürültü daha da artacak.
 
MATLAB ile gelen DSP System Toolbox kullanarak aşağıdaki özelliklerde bir low pass filtre tasarladım:

Kod:
 dsp.LowpassFilter with properties:

               FilterType: 'IIR'
    DesignForMinimumOrder: true
        PassbandFrequency: 3000
        StopbandFrequency: 4000
           PassbandRipple: 1
      StopbandAttenuation: 40
      NormalizedFrequency: false
               SampleRate: 10000

Filtre tepkisi de şöyle çıktı, fena değil. Dördüncü dereceden bir filtre.

1695065415457.png

Toolbox ile gelen cost diye bir fonksiyon var. Filtre için fonksiyonu çağırınca, her örnek için 10 çarpma, 8 toplama lazım diyor.

Kod:
>> cost(flt)

ans =

  struct with fields:

                  NumCoefficients: 10
                        NumStates: 8
    MultiplicationsPerInputSample: 10
          AdditionsPerInputSample: 8
 
Timur abi gecikme çok önemli değil ise neden 4 orderlı bir filtre tercih ediyorsun sonuçta yazılımsal 10-15 olmaz mı?
 
Şimdi kesme zamanlarını ölçtüm. Kesme toplamda 89 μs sürüyor. İki kesme arasındaki zaman da 10 ms. Aslında zaman var, ama kesmeleri olabildiğince kısa tutmak lazım, yoksa ana kodda başka şeyler etkileniyor. O yüzden mesela floating point da kullanmayacağım, filtreyi fixed point olarak çalıştıracağım. Aradaki performans farkını da göreceğiz bakalım.
 
kullandigin mcu ne bilmiyorum ama cok hasas olcumlerde stm32f4 un adc referans kaynaginin da cok duzgun olmadigini gordum, gurultunun sifir gecislerini yakalarsan sadece ortalama almak bile baya bir duzelme saglar.
 
Donanımsal filtreden sonra bile bu kadar gürültü olması normal değil.

ddd.png

Eğer imkan varsa;
Yukarıdaki gibi diferansiyel ADC(stm32f30x vb. serilerinde var) ve diferansiyel low-pass filtreli bir devre kurun. Ayrıca LM4128 gibi bir gerilim referans entegresi ile ADC Vref girişine 2.5V ref. gerilimi uygulayın. Sistemi 2.5V referans gerilimine göre yeniden kurgulayın. Son olarak ADC Vss pinini diferansiyel filtenin GND'si üzerinden ana GND hattına bağlayın. Böylece common-mode gürültü büyük oranda bastırılmış olunur.

Eğer imkan yoksa, yani donanımsal müdahele çok sınırlı ise;
ADC girişine 1V bias uygulayın. Gerilim bölücü dirençleri öyle bir ayarlayın ki, ADC giriş gerilimi 0-2V arasında salınsın(evet çözünürlük düşecek). 3V üstünü ve 1V altını ya yazılımla ya da donanımla kırpın. Böylece o aradaki zıplamalar baştan elimine edilecek. Hesap daha tutarlı olur.

Yazılım tarafında ise CMSIS-DSP kütüphanesinin FIR Filter fonksiyonunu kullanabilirsiniz. Kütüphane hem float hem de 16bit ve 32bit fix-point veri tipleriyle kullanılabiliyor. Assembly tabanlı olduğu için hızlı da çalışıyor.
https://www.keil.com/pack/doc/CMSIS/DSP/html/group__FIR.html

Ben daha önce bu kütüphanenin bazı fonksiyonlarını denemiştim. Eğer mikro denetleyici FPU barındırmıyorsa float ile fixed-point arasında çok fazla hız farkı oluyor. Hatta kemdi çapımda bir benchmark yapmıştım. Ama sonuçları ne yaptım hatırlamıyorum. Onun haricinde FPU modülüne sahip mikro denetleyicilerde çok bir şey fark etmiyor.
 
Yazılım tarafında ise CMSIS-DSP kütüphanesinin FIR Filter fonksiyonunu kullanabilirsiniz. Kütüphane hem float hem de 16bit ve 32bit fix-point veri tipleriyle kullanılabiliyor. Assembly tabanlı olduğu için hızlı da çalışıyor.

Bunu daha önce hiç kullanmamıştım, inceleyeceğim. Dediğim gibi filtreleme var zaten, ama audio frekans sınırını kabul ederek RC filtre konmuş. Bu filtreler de kesim frekansından sonra çok yayvan düşer. Bir sonraki revizyonda LC koyabiliriz dediler, ama çok da istekli değiller. Beklenti yazılım tarafında halledilmesi. Zaten çok hassas, doğru bir ölçüm de gerekmiyor. Amfinin önünde bulunan ekrandaki bir power meter bu. Skala logaritmik, yüksek güçlerde net bir güç rakamı okuyamıyorsun. Amaç daha çok görsellik.

IMG_20230919_155728.jpg
 
kullandigin mcu ne bilmiyorum ama cok hasas olcumlerde stm32f4 un adc referans kaynaginin da cok duzgun olmadigini gordum, gurultunun sifir gecislerini yakalarsan sadece ortalama almak bile baya bir duzelme saglar.

Bu bana güzel bir fikir verdi, ama işin matematiği konusunda biraz kafa yormam lazım. Gelen örneklerin ortalamasını hesaplamam çok kolay, ama ürün özelliklerini belirlerken RMS güç gösterilsin dendi. Bir sorayım bakalım, ortalama güç göstersek olur mu diye. Eğer olursa iş kolaylaşır, filtreye gerek kalmaz.

İşin matematiğine gelince: Her zaman pozitifte kalan ve saf sinüslerin toplamı olan bir sinyal düşünelim. Yani örneğin 1 kHz ve 2 kHz sinüsleri topladık, ve her zaman pozitifte kalacak şekilde DC offset ekledik. Bu sinyalin ben ortalama değerini biliyorsam (hesaplamak çok kolay) buradan RMS değerini hesaplayabilir miyim?
 
rms hesaplaman neyi degistirecek anlamadim, zaten yine gurultu olmayacak mi, anladigim kadariyla offseti referans alip sadece gurultuyle islem yapmak niyetindesin.
 
rms hesaplaman neyi degistirecek anlamadim, zaten yine gurultu olmayacak mi, anladigim kadariyla offseti referans alip sadece gurultuyle islem yapmak niyetindesin.

RMS karelerin toplamı olduğu için daha pahalı bir işlem, ortalama neredeyse anında yapılabilecek bir işlem. kesmeler arası 10 ms, ama iki tane ADC kanalı var ve bunların kesmeleri peş peşe geliyor. O yüzden her kesmeyi mümkün olduğunca kısa tutmam lazım. Eğer doğrudan ortalama uygun olursa sorun çözülmüş olacak.
 
@taydin aslinda bu olcum zor olmamalı, smps lerin feedback comparator girisleri de bu tip gurultuye maruz kaliyor aslinda, onlar basit sekilde kompanse edebiliyorken senin filtre kullanarak daha iyi sonuc alman gerekirdi.
 
@taydin aslinda bu olcum zor olmamalı, smps lerin feedback comparator girisleri de bu tip gurultuye maruz kaliyor aslinda, onlar basit sekilde kompanse edebiliyorken senin filtre kullanarak daha iyi sonuc alman gerekirdi.

Yani osiloskop görüntüleri görünen bir sinyal varken ADC ile sorunsuz RMS ölçümü yapabilmem gerekir, bu çok kolay mı diyorsun? O zaman nedir bu kolay yöntem anlamadım :bilmem3:
 

Çevrimiçi personel

Çevrimiçi üyeler

Forum istatistikleri

Konular
5,989
Mesajlar
102,192
Üyeler
2,517
Son üye
Dzenit

Son kaynaklar

Son profil mesajları

deneyci wrote on hakan8470's profile.
Sibonge uNkulunkulu ngokuhlukahluka asinike kona.

Bu hangi dil? :)
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
Back
Top