logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Bascom Oversampling Pomoc przy pisaniu programu

prawy 30 Sty 2011 19:56 4818 20
  • #1 9079802
    prawy
    Poziom 14  
    witam
    Próbuje napisać program który po wgraniu do atmegi będzie pokazywał napięcie i prąd.
    10 bitowa rozdzielczość przetwornika A/D jest dla mnie nie wystarczająca,
    Postanowiłem sięgnąć po technikę zwaną nad próbkowaniem (oversampling)
    Atmege programuje w bascomie znalazłem artykuł w nowym elektroniku z 2007 roku opisujący to zagadnienie.Przepisałem kod z gazety i próbuje go dopasować do mojej płytki testowej (atmega 32)
    Zmieniłem typ procesora i kompilator ma problem z "Adcsra.adate = 1"po zmianie na 16 kompilacja przechodzi bez problemu.Dopasowałem też preskaler przetwornika do częstotliwości kwarcu w oryginale
    był 8Mhz ja mam 16Mhz
    
    'wybór preskalera
    Adcsra.adps2 = 1
    'sykClk/64
    Adcsra.adps1 = 1
    'sysClk/64
    Adcsra.adps0 = 1
    'sysClk/64
    
    zmieniłem też wybór napięcia referencyjnego na wewnętrzne 2,56
    'Wybór napięcia referencyjnego
    Admux.refs1 = 1
    'napiecie referencyjne 2,56 wewnętrzne
    Admux.refs0 = 1
    'napiecie referencyjne 2,56 wewnętrzne
    
    Nie rozumiem też do którego wejścia analogowego mam się podpiąć
    w artykule autor celowo nie użył polecenia " Getadc(1) "
    
    To program w całośći
    'owersampling na podstawie "elektronik nowy "
    
    $regfile = "m32def.dat"                                     'Atmega 32
    
    $crystal = 16000000                                         'kwarc 16Mhz
    
    
    
    
    'zmienne globalne
    Dim Accumulator As Single
    'akumulator 10bit próbek
    Dim Samples As Word
    'licznik 10 bit próbek
    Dim Xadc As Word
    'wartosc 10bit przetwornika A/D
    Dim Lowbyte As Byte
    'mlodszy bajt adc
    Dim Type_sampling As Byte
    'typ samplingu
    Dim Max_sample As Word
    'ilosc próbek
    Dim Offset_error As Word
    'blad ofsetu przesuniecia pomiaru
    Dim Xfact As Byte
    'wartosc skalowania
    Dim Xfact_2 As Byte
    'wartosc zaokraglenia
    Dim Divder As Word
    'dielnik
    
    Dim Vin As Single
    'wartosc napiecia po przeliczeniu
    Dim Temp As Word
    'zmienna pomocnicza
    Dim Templong As Long
    'zmienna pomocnicza typu long
    
    
    'konfiguracja lcd
    Config Lcd = 16 * 2
     Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
      Cls
      'czysc ekran lcd
    
    
    'prototypy procedur
    Declare Sub Init_adc0
    'ustawienie parametrow pracy przetwornika A\D
    Declare Sub Sel_stype1
    'wybor oversamplingu 11 16 bit oraz przeliczanie wartosci
    Declare Sub Oversampled1
    'wlasciwa procedura nadpróbkowania
    
    
    On Adc Adcinterrupt
    'pryporzadkowanie wektorowi przerwania A/D
    Enable Interrupts
    'wylaczenie systemu przerwan
    Disable Adc
    'wylaczenie przerwan ADC
    
    '-------------------------------------------------------------------------------
    
    
    
    'zerowanie zmiennych i wybor typu samplowania
    Accumulator = 0
    Samples = 0
    Vin = 0
    Temp = 0
    Templong = 0
    Lowbyte = 0
    Type_sampling = 12
    'oversampling 12bit
    Call Sel_stype1
    
    '-------------------------------------------------------------------------------
    'pentla głowna
    '-------------------------------------------------------------------------------
    
    Call Init_adc0
    Do
    If Samples > Max_sample Then Call Oversampled1
    
    'moj program
    
     Lcd "A:" ; Vin
    
      Home
    
    Loop
    '-------------------------------------------------------------------------------
    'koniec pentli glownej
    '-------------------------------------------------------------------------------
    
    '-------------------------------------------------------------------------------
    'Podprogramy
    '-------------------------------------------------------------------------------
    'wlacza przetwornik A/D wlacza przerwania przetwornika A/D
    Sub Init_adc0
    Adcsra.aden = 1
    '1=wlacz adc
    Adcsra.adie = 1
    '1= wlacz przerwanie
    Adcsra.adsc = 1
    '1 = start przetwarzania
    Adcsra.adate = 1
    '1 = wlacz autowyzwalanie
    
    'wybor preskalera
    Adcsra.adps2 = 1
    'sykClk/64
    Adcsra.adps1 = 1
    'sysClk/64
    Adcsra.adps0 = 1
    'sysClk/64
    'Wybór napiecia referencyjnego
    Admux.refs1 = 1
    'napiecie referencyjne 2,56 wewnetrzne
    Admux.refs0 = 1
    'napiecie referencyjne 2,56 wewnetrzne
    Enable Adc
    'wlaczenie przerwania ADC
    End Sub Init_adc0
    
    
    'kompensacja bledow,skalowanie wynikow zaokraglanie
    Sub Oversampled1
    Disable Adc
    'wlaczenie przetwarzania ADC
    
    
    Accumulator = Accumulator + Offset_error
    'kompensacja bledu przesuniecia =(69*Max_sample)/64
    Accumulator = Accumulator * 0.9993
    'kompensacja bledu wzmocnienia wzmacniacza ADC
    
    Templong = Int(accumulator)
    'wartosc kontrolna zaokraglenia
    Temp = Templong Mod Xfact
    
    Accumulator = Accumulator / Xfact
    'skalowanie wyniku Akumulatora
    
    If Temp >= Xfact_2 Then
    Accumulator = Accumulator + 1
    'zaokraglenie
    End If
    
    Vin = Accumulator / Divder
    'obliczanie napiecia po przeliczeniu
    Type_sampling = 12
    Vin = Vin * 2.56
    'napiecie odniesienia 2,56
    Samples = 0
    Accumulator = 0
    Enable Adc
    'wlaczenie przerwania ADC
    End Sub
    
    '-------------------------------------------------------------------------------
    Sub Sel_stype1
    Select Case Type_sampling
    Case 11
    Xfact = 2
    Max_sample = 4
    Divder = 2048
    Case 12
    Xfact = 4
    Max_sample = 16
    Divder = 4096
    Case 13
    Xfact = 8
    Max_sample = 64
    Divder = 8192
    Case 14
    Xfact = 16
    Max_sample = 256
    Divder = 16384
    Case 15
    Xfact = 32
    Max_sample = 1024
    Divder = 32768
    Case 16
    Xfact = 64
    Max_sample = 4096
    Divder = 65535
    End Select
    
    Templong = 69 * Max_sample
    Templong = Templong / 64
    Offset_error = Templong
    'kompensacja wartosci bledu przesuniecia =(69*max_sample)/64
    Xfact_2 = Xfact / 2
    'ustaw wartosc zaokraglacza
    Decr Max_sample
    'ustaw ilosc probek zakres(0..ilosc probek-1)
    End Sub
    
    
    '-------------------------------------------------------------------------------
    'procedura przerwania ADC
    Adcinterrupt:
    Lowbyte = Adcl
    'najpiew odczytaj mlodsza czesc rejestru A/D do lowbyte
    Xadc = Adch
    'nastepnie odczytaj starsza czesc rejestru A/D do
    Shift Xadc , Left , 8
    'przesun wartosc xadc o 8 bitow
    Xadc = Xadc + Lowbyte
    'dodaj lowbyte do xadc
    Accumulator = Accumulator + Xadc
    'sumuj wartosc xadc
    Incr Samples
    'zwieksz wartosc licznika probek
    Return
    '-------------------------------------------------------------------------------
    End


    Dodałem znaczniki [code] - proszę o nich pamiętać w przyszłości.
    [zumek]
  • #2 9080578
    miszcz310
    Poziom 24  
    A nie prościej samemu napisać? Ten cały "oversampling" to tylko średnia arytmetyczna. Czyli robisz tablicę z N pomiarami wszystko sumujesz i wynik sumowania dzielisz przez N i otrzymujesz swój mega dokładny wynik. Dodatkowo można dzięki tym danym oszacować estymator błędu, licząc odchylenie standardowe.
  • Pomocny post
    #3 9080902
    -=Mario=-
    Poziom 12  
    Jak dobrze pamiętam to w Bascom jest błąd w definicji ADATE dla ATMEGA32.
    Jest on zdefiniowany jako ADFR (AD Free Running) mimo, że ten procesor nie ma takiej funkcji.

    Zamiast
    Adcsra.adate = 1
    wpisz lub
    Adcsra.adfr = 1
  • #4 9203968
    _Robak_
    Poziom 33  
    Oversampling jest jak najbardziej dobrą metodą ale do zmniejszenia wpływu szumu kwantyzacji do sygnału. Tak sam z siebie nie zwiększy Ci rozdzielczości.
  • Pomocny post
    #5 9205903
    Konto nie istnieje
    Konto nie istnieje  
  • #6 9207923
    _Robak_
    Poziom 33  
    A skąd wiesz co w sygnale jest szumem a co nie? Nie stosując filtra, adaptacyjnego czy też nie, nie wyeliminujesz szumu, ponieważ nie wiesz z góry co nim jest.
    Jest jeszcze metoda która nazywa się formowanie szumu. Generalnie chodzi o to aby uformować tak widmo szumu aby energia szumu była większa ale w f które na wstępie odcinamy przez filtr anty aliasingowy. Natomiast w interesujących nas częstotliwościach jest mała ona mniejsza.
  • Pomocny post
    #7 9208718
    Konto nie istnieje
    Konto nie istnieje  
  • #8 9209977
    _Robak_
    Poziom 33  
    Nie rozumiesz o co mi chodzi. Piszesz że oversampling usuwa szum, każdy. Czy w takim razie, usuniesz oversamplingiem szum np. pochodzący z sieci? Odpowiedź jest prosta, nie. Chyba że ja źle zrozumiałem twoją wypowiedź:)
  • #9 9210488
    Konto nie istnieje
    Konto nie istnieje  
  • #10 9210621
    _Robak_
    Poziom 33  
    Nie sięgając daleko, bo do źródeł podanych przez kolegę możemy wyczytać że technika ta tyczy się zakłóceń:
    Cytat:

    If these lowlevel
    signals are severely distorted by the quantization process,
    the usefulness of the system is greatly diminished.
    It is, in fact, possible to reduce the distortion, and also to
    improve the resolution below an LSB (least significant bit),
    by adding noise (dither) to the signal of interest.

    Jeśli uważasz, że tylko przy pomocy oversamplingu mogę uzyskać rzeczywistą większą rozdzielczość dowolnego sygnału, np. 16 bit z 10 bit, proszę podaj źródła. Na pewno skorzystam;) Póki co w mojej literaturze stoi, że oversampling poprawia SNR - "Discrite-Time signal Processing" A. Oppenheim, R. Schafer.
  • #11 9211715
    Konto nie istnieje
    Konto nie istnieje  
  • #12 9213461
    _Robak_
    Poziom 33  
    Cytat:

    Przepraszam z gory ze czujesz sie urazony - nie kwestionuje Twojej wiedzy

    W żadnym razie:)
    Domyślam się że autorowi chodziło o " po prostu" zwiększenie rozdzielczości i chciałem wyjaśnić że założenie jest złe
    Cytat:

    10 bitowa rozdzielczość przetwornika A/D jest dla mnie nie wystarczająca,
    Postanowiłem sięgnąć po technikę zwaną nad próbkowaniem (oversampling)
  • #13 9213572
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #14 9213950
    _Robak_
    Poziom 33  
    Nie twierdzę że oversampling nie daje takiej możliwości, daje ale pod pewnymi założeniami i z pewnymi ograniczeniami, których trzeba być świadomym. To nie jest tak, że mówisz sobie 10 bit to mało więc zrobię oversampling 256 razy i będzie fajnie.
    Prosty przykład, weźmy sygnał prostokątny 4.6V i 0V, nasza rozdzielczość to 1V. Nawet jak byś spróbował go tysiąc razy częściej niż należy i potem uśrednił to wyjdzie Ci i tak 5V (oczywiście też zależy od przetwornika). Dlatego szum kwantyzacji nie może być skorelowany z sygnałem, inaczej oversampling nam nic nie da. Dlatego najpierw trzeba się zastanowić nad tym co jest sygnałem, co chcemy uzyskać i potem implementować.
  • #15 9214467
    Konto nie istnieje
    Konto nie istnieje  
  • #16 9214654
    _Robak_
    Poziom 33  
    A czy w takim razie oversampling w takim przypadku się nada?
    Bascom Oversampling Pomoc przy pisaniu programu
    Czerowne to poziomy kwantyzacji.
    Wydaje mi się że również w tym wypadku nic nie zdziałasz. Choć mam nadzieję że się mylę:)
  • #17 9215230
    Konto nie istnieje
    Konto nie istnieje  
  • #18 9215586
    _Robak_
    Poziom 33  
    Oczywiście górna linia nie jest maksymalnym zakresem przetwornika. Wydaje mi się że 0.5LSB osiągniesz ale dokładnie oryginalnego przebiegu nie odtworzysz. Ok, chyba że oversampling dążyłby do nieskończoności i moglibyśmy wtedy dodawać do sygnału nieskończenie dużo próbek.
    Choć przyznam, że zaczynam widzieć w tym potencjał:)
  • #19 9215776
    Konto nie istnieje
    Konto nie istnieje  
  • #20 9218672
    _Robak_
    Poziom 33  
    Tyle że aby uzyskać wynik z ADC na poziomie x bit trzeba dysponować DAC na poziomie x bit aby ten szum wygenerować. O sygnałach audio tutaj nie mówię bo tutaj akurat można dodać szum o jakichś parametrach aby uzyskać wymagany efekt.
  • #21 9219662
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA