Kararlı ADC için dijital filtre

Başlatan Analogic, 13 Aralık 2011, 22:44:02

karbal656

Ete  hocam Allah razı olsun. Bubble sort yöntemini birkaç kere C dilinde görmüştüm ama anlıyamamıştım. Sayenizde anladım çok çok sağolun.

Başarılar.

hako83

ETE Hocam hakkınızda övgüye yönelik söylenecek çok şey var ne desem az sizin için açıklamalarınızla bizleri mest ediyorsunuz, laf kalabalığına yer vermeden işin türkçesini açıkca anlatıyorsunuz. Allah yolunuzu açık etsin mert adamsın vesselam.

Hattuşa

s.a.
ete hocam bişey dikkatimi çekti aslında bir sorun benim için,
7 kanal ADC okuması yapıyorum ve her kanalda buble short uygulaması var, işelmcinin adcon registerleri doğru kuruldu ama sorun şu bazen adc değerleri saçma sapan geliyor ekrana analog yapıda bir sorun olduğunu düşünmüyorum zira saçmaladığı zaman o kanalın adc girişinden voltajı ölçüyorum gayet normal, işlemcinin azizliği bu soru biraz falcı işine benziyor ama bunu neler etkileyebilir. yani benzer tecrübeler yaşadınız mı? zira ben kodu defalarca inceledim, analog yapıyı defalarca ölçtüm ama heyhat, belki benzer bir sorun yaşamış olabilirsiniz diye bir umut yazıyorum usta

ete

Ortak kullandığın registerler var ise birinden diğerine geçerken değerini sıfırlamalısın. aksi halde sonuç abuk subuk çıkabilir.
Birde ortalama işlemlerinde  30 okuma yapıp 29'a bölme yapıldığı zaman sonuç farklı çıkabilir. Rakamlara dikkat etmek gerekiyor.

Ete

Hattuşa

Alıntı YapOrtak kullandığın registerler var ise birinden diğerine geçerken değerini sıfırlamalısın

hocam bin yaşayın, ALLAH sağlık sıhhat versin size, evet ortak kullandığım çok register var, akşama kontrol edeyim, çok fazla kod yazdım ve işlemcide yer kaplamaması için öntanımlamaların çoğu ortak kullanımda ve özellikle adc okuma kısmında, akşama kontrol edeyim, inanın hiç aklıma gelmedi, bazen insanın kafası duruyor ve siz her zamanki gibi yine haklısınız  :D

uzeyir

ccs için de yazacak olan arkadaş var mı acaba? teşekkürler.

M.A.A

Merhaba Arkadaşlar
Konuyu ve kodları inceledim baya işime yaradı teşekkür ederim.
Bir yer kafama takıldı:

OKUNAN[X]=HAM+1     deki +1 neden var ?

Burada artı bir olunca sonucun bir fazla çıkması normal değil mi ?

ete

ADC okumalarında genelde okunan değerin bir başka gösterim birimine çevrilmesi gerekir.
Çevrilme işlemlerinin tam olabilmesi için ben ADC okuma kademesinin 1024 olduğunu kabul ederim (sıfır dahil 1023'e kadar.)
bu nedenle okunan değer 1 ekleyerek onu 1024 seviyesine getiririm. İsteyen ilave etmez ben yalnızca işin yolunu öğretmeye çalıştım burada ve +1 de benim alışkanlığımdan geliyor. Dediğim gibi gerekirse eklenmez.

Ete

Hattuşa

slm arkadaşlar,
bu ADC okuma sonrası okuduğumuz sinyal bazen kararsız olmakta ve bunu daha stabil hale getirmek gerekmektedir. elbette ki dijital filtreler tek başına bir işe yaramıyor, analog olarak yapılan filtreler çok daha güzel olabiliyor ancak bazı sinyaller var ki analog yapıya müdahale ettirmiyor, böylesi durumlarda yazılımsal filtrelere de ihtiyaç duyulmaktadır. benim uygulama yaptığım filtre çeşidi 2-3 tane var ve acaba başka tip filtrelerde varsa ve paylaşmak isteyen arkadaşlar olursa herkes için iyi olur.
uyguladığım filtreler

1. ortalama almak

2. buble short

3. unutulan geçmiş filtresi

bunlarla ilgili örnek kodları müsait olduğum zamanda ekleyeceğim. başka tip filtre bilen arkadaşlar varsa lütfen yardımcı olsunlar

Burak

Alıntı yapılan: pro-TR - 27 Ocak 2015, 23:44:33
slm arkadaşlar,
bu ADC okuma sonrası okuduğumuz sinyal bazen kararsız olmakta ve bunu daha stabil hale getirmek gerekmektedir. elbette ki dijital filtreler tek başına bir işe yaramıyor, analog olarak yapılan filtreler çok daha güzel olabiliyor ancak bazı sinyaller var ki analog yapıya müdahale ettirmiyor, böylesi durumlarda yazılımsal filtrelere de ihtiyaç duyulmaktadır. benim uygulama yaptığım filtre çeşidi 2-3 tane var ve acaba başka tip filtrelerde varsa ve paylaşmak isteyen arkadaşlar olursa herkes için iyi olur.
uyguladığım filtreler

1. ortalama almak

2. buble short

3. unutulan geçmiş filtresi

bunlarla ilgili örnek kodları müsait olduğum zamanda ekleyeceğim. başka tip filtre bilen arkadaşlar varsa lütfen yardımcı olsunlar

Rahmetli Darrel Taylor'un kullandığı histeresiz methodu var ... Bir inceleyin ... Bunu inc dosyası olarak dahil ederek kullanabilirsiniz ...



'****************************************************************
'*  Name    : Average_Hyst.pbp                                  *
'*  Author  : Darrel Taylor                                     *
'*  Date    : 7/19/2005                                         *
'*  Version : 3.0                                               *
'*  Notes   : Modified to use Hysteresis                        *
'*          : Use as an INCLUDE file                            *
'****************************************************************
' This routine will keep a "Running Average" of 10-bit Analog Values
' Instead of adding a bunch of values together and then dividing by the number
' of samples, it averages each sample into the final result immediately.
' This eliminates the need for 32 bit math.
' To allow it to "Catch up" to large changes, set the FAspread to an
' acceptable range.
' Simply place the new number in VALUE and GoSub Average
' The Average (with Hysterisis) will be returned into the same variable VALUE

'---- [ User Options ] ---------------------------------------------------------
HystLevel   CON  7      ' 7 = .7 of the Least Significant Digit
                        '    Valid HystLevel is from 6 to 13
AvgCount    CON  16     ' = Number of samples to average. For best response
                        '    times, keep AvgCount as small as you can
FAspread    CON  50     ' = Fast Average threshold +/-
                        '  FAspread should be larger than the worst possible
                        '  noise in the A/D conversion.
'-------------------------------------------------------------------------------

AVGchanged  VAR  BIT    ' 1 indicates that the Average Value has changed
                        ' you have to clear this bit after using it
ADavg       VAR  WORD   ' Stores the current Average
ADhyst      VAR  WORD   ' Stores the current Value for Hysterisis
Value       VAR  WORD   ' Input / Output variable to be averaged
spread      CON  FAspread * 10  ' adjust spread *10 for Hyst.

GOTO OverAverage
' -=-=-=-=-=-=  Average Analog values -=-=-=-=-=-=-=-=-=-=
Average:
    Value = Value * 10                      ' Scale value up for hysterisis
    IF Value = ADavg Then NoChange          ' if they're the same, nothing to do
    IF ABS (Value - ADavg) > spread OR Value < AvgCount Then FastAvg
    IF ABS (Value - ADavg) < AvgCount Then RealClose
    ADavg = ADavg - (ADavg/AvgCount)         ' Subtract 1 samples worth
    ADavg = ADavg + (Value/AvgCount)         ' Add in the new sample portion
    GoTo AVGok
  FastAvg:                                   ' Catch up to the changing value
    ADavg = Value                            ' Set Average to the current value
    GoTo AVGok
  RealClose:                                 ' Reduce the sample size when
    ADavg = ADavg - (ADavg/(AvgCount/4))     ' the average and the sample are
    ADavg = ADavg + (Value/(AvgCount/4))     ' "Real Close"
  AVGok:
    IF ABS (ADavg - ADhyst) > HystLevel then ' If it changed > HystLevel +/-
        ADhyst = ((ADavg + 5) / 10) * 10     ' Round ADavg to get new Value
        AVGchanged = 1                       ' Indicate that Average changed
    ENDIF   
  NoChange:
    Value = ADhyst / 10                      ' Scale the result down
Return

OverAverage:
'---------------------------------------------------------------



Burak
Ω Gens Una Sumus Ω

Hattuşa

burak ustam kod ve bilgiler için tşk ederim. sizden ricam bu filtrenin çalışma mantığı nedir?mesela buble short burada anlatıldı ve işe yarayan bir teknik ama farklı teknikleri de bilmek lazım diye düşünüyorum

ete

Darrel Taylorun bu konuda yaptığı bir başka çalışma var idi. Normalde 10 bit okuma yapılan sistemde yazılımla bit sayısını artırarak çıkışta stabil bir sonuç alıyor idi. Bu dosyaları şu anda bulamıyorum.
DT_Analog.pbp şeklinde bir ana dosyası var idi. Bu amaçla açılmış olan http://www.darreltaylor.com/DT_Analog/ sitesi şu anda aktif değil. DT öldükten sonra destek ortadan kalkmış gözüküyor. Söz konusu dosyaları elinde bulunduran var ise buraya koyarsa sevinirim. Bende indirmiştim ama ne hikmetse şu anda bulamıyorum.

Ete

Burak

#27
Bu alt rutinde çalışan program öbeğinin asıl amacı durmadan değişen ve bir türlü stabilize edilemeyen en az anlamlı ADC okuma bitinin stabilize edilmesidir

Klasik olarak lüzumsuzca yaptığımız örneğin 50 adc ölçümünün toplamının ortalamasının alınması hem 32 bit matematiksel işlem gerektirmekte hemde arada spike kabul edilen afaki okuma sonuçlarının bu toplama katılmasına da sebep olmakta ... Kısaca ; Bu algoritmadada anahtar işlem: kullanıcı tanımlı eşik seviyesini(FAspread) maksimum olası adc okuma gürültüsünden biraz daha yüksek seçmek ve ardından basit bir şekilde okuma sonucunu value değerinin içine gönderip gosub average ile alt döngüye dallanmak ... Bunun sayesinde spike'lar elimine edilmiş olunuyor ... Örnekleme sayısı 16 olarak verilmiş programda sabit olarak bunu ihtiyaca göre değiştirebilirsin ...

Burak
Ω Gens Una Sumus Ω

Burak

Alıntı yapılan: ete - 29 Ocak 2015, 09:31:19
Darrel Taylorun bu konuda yaptığı bir başka çalışma var idi. Normalde 10 bit okuma yapılan sistemde yazılımla bit sayısını artırarak çıkışta stabil bir sonuç alıyor idi. Bu dosyaları şu anda bulamıyorum.
DT_Analog.pbp şeklinde bir ana dosyası var idi. Bu amaçla açılmış olan http://www.darreltaylor.com/DT_Analog/ sitesi şu anda aktif değil. DT öldükten sonra destek ortadan kalkmış gözüküyor. Söz konusu dosyaları elinde bulunduran var ise buraya koyarsa sevinirim. Bende indirmiştim ama ne hikmetse şu anda bulamıyorum.

Ete

Evet hocam bende bulamıyorum , sanırım 10 bit yetersizliğinden yola çıkılarak oluşturulmuş bir algoritmaydı ... Darrel'ın paylaşımlarını yaptığı sitede bir ricada bulunsak belki bu programa sahip olanlardan elde edebiliriz ...

Burak
Ω Gens Una Sumus Ω

ete

Ben bir istek yaptım bakalım birisi yeniden verir belki. Bende kesin olması gerek hatta bir defasında kullanmıştım. Sonuç çok iyi idi. Evde (Ankarada) bir PC daha var onda olması kuvvetle muhtemel. Şu anda İstanbulda yım ve 15 - 20 gün daha buralardayım artık dönünce bakacağım.

Bu arada,  Hysterisiz metodunun kullanım şeklini açıklamakta yarar var. ADC den okunan değeri,
Value=ADC_HAM şeklinde Value isimli değişkene yerleştirip  GoSub Average  şeklinde ortalama almaya yönlendirmek yeterli olacaktır. Avarage alt programından dönüşte Value isimli değişken değeri Ortalaması histerisiz ile birlikte alınarak yine aynı isimle geri dönecektir. Sizde ADC_HAM=Value yazarak tekrar kendi değişkeninize çevirip program içinde kullanabilirsiniz.

Ete

Powered by EzPortal