Kararlı ADC için dijital filtre

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

Hattuşa

@ETE hocam kapanan sitenin veri tabanına ulaşıp bu algoritma oradan alınamaz mı? ben o kadar iyi değilim internet konusunda ama bu şekilde ulaşılıp bilgi alınabilir diye düşünüyorum.

bu arada bu filtre ile ilgili basit bir kod yazıp isis denemesini buraya ekleyeyim hocam konuyu anlama adına bunu yapmalıyım,

er-da


Burak

Alıntı yapılan: er-da - 29 Ocak 2015, 14:43:58
D.T. nin bir yazısı var burada acaba bu mu..
http://www.picbasic.co.uk/forum/showthread.php?t=17552

Burada daha çok median filtresinin analizinden bahsedilmiş ... DT_analog filtresinin üstünlüğünden bahsedilmiş hatta ama aradığımız şey burada değil sanırım ..

Burak
Ω Gens Una Sumus Ω

Hattuşa

#33
sanırım bu filtre güzel isis şema denemesi ve kod ektedir. filtrenin çalışmasını gözlemlemek için pot ile oynamak gerekiyor
tabi birde çalışma mantığını anlayabilirsek  ;D

Burak

Alıntı yapılan: pro-TR - 29 Ocak 2015, 15:34:18
sanırım bu filtre güzel isis şema denemesi ve kod ektedir. filtrenin çalışmasını gözlemlemek için pot ile oynamak gerekiyor

Aslında gerçek devrede denerseniz ne kadar stabil çalıştığını daha iyi gözlemleyecekseniz ....

Burak
Ω Gens Una Sumus Ω

Hattuşa

Alıntı yapılan: Burak GÜNAY - 29 Ocak 2015, 15:35:54
Aslında gerçek devrede denerseniz ne kadar stabil çalıştığını daha iyi gözlemleyecekseniz ....

Burak

inş. burak usta deneyeceğimden emin olabilirsiniz.
zira benim kullandığım filtre;

adc =adin0

sonuc =(sonuc *99) +adc /100

buna göre daha güzel olacağına inanıyorum

Burak

Evet ... Önemli bir şanstır ki , ADC için oluşturulmuş filtreler geçmiş durum hatalarının daha çok irdelenmesini gerektiren filtre sistemleri ve algoritmalarına göre daha basittir ... Çok tartışılan PID filtresi tek başına çok stabil olmazken kalman filtresi ve diğer temel filtrelerle güçlendirilerek gayet stabil otonom sistemler oluşturulmuştur .. Mesela darrel'ın bu filtresi karmaşıklık olarak üst düzey değil , ve hatta geliştirilmeye çok müsait ... Kodlar üzerinde biraz oynayın derim ... Farkındalığını hissedecek birşeyle uğraşmıyor olabilirsiniz ... Ama birgün hassasiyetin hat safhada bir öneme sahip olduğu uygulamalarda yeni arayışlara yelken açarsanız modifiye benim size tavsiyemdir ... Bu histeresiz kodu algoritması ile çalışan dijital elektrik sayaçları var dersem belki daha iyi anlaşılır dediklerim ... :)

Burak
Ω Gens Una Sumus Ω

er-da

bunun kullanım yeri tam olarak neresidir? mesela  dc ölçerken oluşan mesela sn de 3-5  sıçramalarım mı  filitreleyecek ripple filtre giibi ..?analog filtredeki karşılığı nedir(bp,all pas vs)..?

Burak

Ripple filter olarak çalışıyor ... Madem Ripple'dan söz açtın , Güç elektroniğinde yoğun olarak kulllanılmakta olan ripple factor hesapları bu filtre ile sadeleştirilir ...

Burak
Ω Gens Una Sumus Ω

er-da

Alıntı yapılan: Burak GÜNAY - 29 Ocak 2015, 16:48:24
Ripple filter olarak çalışıyor ... Madem Ripple'dan söz açtın , Güç elektroniğinde yoğun olarak kulllanılmakta olan ripple factor hesapları bu filtre ile sadeleştirilir ...

Burak

tam doğru  ölçüm için ripple factor hesapları da mı gerekli .? bilgim yok  bu konuda  güç elektroniği bana uzak bir konu  ama  adc ölçümlerde sıçramalar  hep sorun olmuştur..

Hattuşa

#40
@ete hocam
bahsettiğiniz filtre bumudur? ben sitenin arşivine girip bu kodu bulabildim. (bir arkadaşımın yardımı ile)

DEFINE OSC 20
INCLUDE "DT_Analog.pbp"     ; DT's 16-bit Analog Module

DEFINE ADC_BITS 10          ; Set-up ADC for fast 10-bit results
DEFINE ADC_CLOCK 2
DEFINE ADC_SAMPLEUS 5

;----[Change these to match your hardware]----------------------------------
DEFINE LCD_DREG    PORTB    ; LCD Data Port
DEFINE LCD_DBIT    0        ; Starting Data Bit
DEFINE LCD_RSREG   PORTB    ; Register Select Port
DEFINE LCD_RSBIT   4        ; Register Select Bit
DEFINE LCD_EREG    PORTB    ; Enable Port
DEFINE LCD_EBIT    5        ; Enable Bit
DEFINE LCD_BITS    4        ; Data Bus Size
DEFINE LCD_LINES   2        ; Number of Lines on LCD
DEFINE LCD_COMMANDUS  2000  ; Command Delay time in uS
DEFINE LCD_DATAUS  50       ; Data Delay time in uS

ADCON1 = %10001101          ; right justify, AN0 & AN1 analog
PAUSE 250 : LCDOUT $FE,1    ; Initialize LCD
PAUSE 100 : LCDOUT $FE,1    ;  not all LCDs need both lines

ADbits = 12                 ; set to 12-bit resolution
;---------------------------------------------------------------------------
Main:
  FOR ADchan = 0 to 1       ; Do both AN0 and AN1
    GOSUB GetADC            ; Get A/D value
    IF ADchan = 0 THEN
       LCDOUT $FE, $80      ; LCD line 1
    ELSE
       LCDOUT $FE, $C0      ; LCD line 2
    ENDIF
    LCDOUT "CH-",DEC1 ADchan," = ",DEC ADvalue,"   "
  NEXT ADchan
GOTO Main:



'****************************************************************
'*  Name    : DT_Analog.pbp                                     *
'*  Author  : Darrel Taylor                                     *
'*  Notice  : Copyright (c) 2009                                *
'*  Date    : 5/23/2009                                         *
'*  Version : 1.0                                               *
'*  Notes   : Up to 16 bit A/D with a 10-bit A/D converter      *
'*          : http://en.wikipedia.org/wiki/Oversampling         *
'****************************************************************
GOTO OverDTAnalog

ADchan       VAR BYTE        ; global - A/D channel to use
ADbits       VAR BYTE        ; global - # of bits in result
ADvalue      VAR WORD        ; global - the final A/D value
ADmax        VAR WORD        ; global - Max A/D value at this resolution
;--------------------
DTadCount    VAR WORD        ; local - sample count
DTadDivisor  VAR WORD        ; local - averaging divisor
DTadShiftR   VAR BYTE        ; local - bits to shift for UnderSampling
DTadAccum    VAR WORD[2]     ; local - 32-bit sample accumulator

;---------------------------------------------------------------------------
GetADC:
  IF (ADbits >= 10) THEN
    DTadShiftR = 0   ; 10 11 12 13  14   15   16
    LOOKUP2 ADbits-10,[ 1, 4,16,64,256,1024,4096],DTadCount
    LOOKUP  ADbits-10,[ 1, 2, 4, 8, 16,  32,  64],DTadDivisor
  ELSE
    DTadCount = 1
    DTadDivisor = 1
    DTadShiftR = 10 - ADbits
  ENDIF 
  LOOKUP2 ADbits,[0,1,3,7,15,31,63,127,255,511,1023, _
                  2046,4092,8184,16368,32736,65472],ADmax
 
  DTadAccum = 0 : DTadAccum[1] = 0     ; clear the accumulator
DTadLoop:
  ADCIN  ADchan, ADvalue               ; get 10-bit sample
  DTadAccum = DTadAccum + ADvalue      ; add it to the accumulator
  IF DTadAccum < ADvalue THEN          ; if low word overflowed
     DTadAccum[1] = DTadAccum[1] + 1   ;   increment the high word
  ENDIF
  DTadCount = DTadCount - 1            ; done with this sample
  IF DTadCount > 0 THEN DTadLoop       ; loop if not done with ALL samples
 
  R2 = DTadAccum                       ; put 32-bit accumulated value in PBP
  R0 = DTadAccum[1]                    ;   registers, prepare for DIV32
  ADvalue = DIV32 DTadDivisor          ; get the average value
  ADvalue = ADvalue >> DTadShiftR      ; Shift right if < 10-bit
RETURN
OverDTAnalog:

ete

Evet bu iki dosya yeterli. Birisi (ilk program) diğeri de INC dosyası.
INC dosyasını bende bulmuştum ve bir örnek hazırlayayım diyordum sen yetiştin.

Sağolasın.
Ete

Hattuşa

Ete hocam filtre hangi mantik uzerine kurulu ne tip bir filtredir, zira bunlar bir ilacsa belirli hastaliklarda kullanilmalidir

ete

Bu filtrenin mantığı, okunan 10 bitlik adc değerlerinden seçiminize bağlı olarak daha büyük bit değerine sahip adc değerleri elde ederek çözünürlüğü yazılımsal olarak artırıp ufak ripple değerlerini elimine etmeye dayanmaktadır.
Daha iyi anlamanız için şu örneği verebiliriz,
Ön seçim olarak bit saysını siz seçiyorsunuz. Diyelimki 12 bit seçtik.
Alt program gidilince,
Datacount=16 olarak hesaplanmaktadır. Bu bir seferinde 16 adc okuması yapılacağını gösteriyor.
Datadivisör=4 olarak hesaplanıyor. Bu okunan adcler toplamının sonunda 4 e bölüneceğini gösteriyor.
16 adet adc okuması yapılıyor ve üst üste toplanıyor. Toplam değer 16 biti aşınca 32 bit lik değer elde etmek için 32 bitin high tarafı bir artırılıyor.
Sonuçta elde edilen değerler PBP nun 32 bit hesaplama registerlerine yerleştirilip önce 32 bitlik değer datadivisör değerine bölünüyor. Elde edilen değer tekrar advalue değerine eşitlenerek geri dönülüyor. Dönen değer 10 bitlik 16 adet adc okumasının 12 bitlik ortalaması olarak düşünülebilir.
Ete

Burak

#44
Dün bende istek yapmıştım ana sayfada , anlık mesajlaşma panosunda , sağolsun birisi link atmış . Darrel'ın kodlarını geçici olarak bir sayfada paylaşıyorlar .. Darrel'ın diğer kodlarını incelemek isteyenler olursa diye aşağıda linki paylaşıyorum .

http://www.picbasic.co.uk/forum/showthread.php?t=19638

Burak
Ω Gens Una Sumus Ω

Powered by EzPortal