Pomiar napięcia z uśrednianiem - dwa problemy.

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Awatar użytkownika
matrix
Użytkownik
Posty: 1803
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Pomiar napięcia z uśrednianiem - dwa problemy.

Post autor: matrix » 15 kwie 2015, 19:07

Korzystając z programu napisanego Przez Mirka na jego blogu przerobiłem program z C na Bascom. Niestety uśrednianie mi nie działa. Kiedyś zrobiłem to prawidłowo ale teraz nie chce działać.

Korzystając z tak napisanej procedury jak -> W TYM LINKU <- przepisałem to na bascoma i niby wszystko było by ok ale występują dwa problemy.
1. Jako że jest to dzielnik 1/3 z racji użycia dzielnika rezystorowego to mnożę wynik przez trzy i dopiero poddaję obróbce i wyświetlam wynik docelowy i zamiast napięcia 5V mam napięcie 4.06V
2. Mimo że średnia jest ładnie dociągana to występuję kłopot że po kilku chwlach ponawia się dociąganie i tym razem 0.76V a po kilku chwilach spada do 0V

-> TUTAJ FILMIK PREZENTUJĄCY BŁĄD <-

A kod wygląda jak niżej. Możecie mi powiedzieć co jest nie tak ? Zauważyłem że im mniejsza ilość próbek (zmienna Dt mniejsza) tym wynik bliższy prawdy, ale nie powinno tak być.

Kod: Zaznacz cały

Dim Dt as Word
Dt = 1                    'ilość próbek
Dim Wynik as Word
Dim Srednia as Word
Srednia = 0


Do
Gosub Pomiar   'skok do podprogramu pomiar

'Waitms 50

Home
Lcd "U=" ; V ; "V   "        'wyswietlanie wartości obliczonego napięcia
Lowerline

Lcd "ADC=" ; Srednia ; "    "       'wyświetlanie wartości ADC

Loop



Pomiar:
Wynik = Getadc(0)

Srednia = Srednia * Dt                 'obliczana jest średnia wyniku i mnożona przez ilość próbek

Srednia = Srednia + Wynik          'do średniej dodawany jest wynik ADC
  Dt = Dt + 1                                 
Srednia = Srednia / Dt                  'tu mamy końcową wartość średniej

'*******************************************************
'*** typowe obliczanie napięcie z wejścia ADC ***
'*** z tym że do obliczeń brana jest średnia ******
'*******************************************************

Wartosc_wyniku = Srednia
Wartosc_wyniku = Wartosc_wyniku / 204
Wartosc_wyniku = Wartosc_wyniku * 3
V = Fusing(wartosc_wyniku , "#.$$" )
Return

Awatar użytkownika
Artyliusz
Użytkownik
Posty: 306
Rejestracja: 06 sty 2013, 14:10
Lokalizacja: Z Polski
Kontakt:

Post autor: Artyliusz » 16 kwie 2015, 0:29

Sama procedura wydaje się dobrze napisana.
Trzeba się przyjrzeć podłączeniu. Co najważniejsze to napięcie referencyjne i jego stabilność. Jakiego używasz? Po drugie dobra filtracja układu.
I czy źródło zasilania, które mierzysz ma Twoje równe 5V i czy napięcie mierzone wychodzące z dzielnika ma dokładnie tyle ile się spodziewałeś? Niedokładność napięcia referencyjnego, inna wartość napięcia źródła i tolerancja rezystorów plus zakłócenia mogą właśnie dawać inny wynik niż się spodziewałeś. Zmierz to miernikiem dla czystego sumienia. :P

Swoją drogą nawet nie podałeś jaki to procek.
Faktycznie zanik napięcia na samym końcu (lub jego spadek w trakcie) wydaje się dość dziwny. Najpierw trzeba by było wykonać pomiary miernikiem. Ale może przez małe próbkowanie wkrada się zjawisko aliasingu przez nie spełnienie twierdzenia Shanona chociaż nie wiem czy to na taką skalę ma wpływ. :P

Pokaż też samą inicjalizację ADC.
Spróbuj zobaczyć pomiar jaki będzie bez uśredniania.

Awatar użytkownika
matrix
Użytkownik
Posty: 1803
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 16 kwie 2015, 6:59

Płytka to EVB AVR04 z Propoxu (nie reklamuję, było pytanie więc padła odpowiedź)

Obrazek

Także o stabilizację nie mam się co martwić. Napięcie referencyjne to napięcie 5V czyli inicjalizacja ADC wygląda tak:

Kod: Zaznacz cały

Config ADC = Single, Prescaler = Auto, Reference = AVCC
Zmiana wejścia pomiarowego na inny kanał ADC niczego nie zmienia (tak sprawdzałem w razie gdyby pin procka okazał się uwalony). Procesor to Atmega8.

Pomiary miernikiem wskazują jak najbardziej prawidłowe wyniki.

Zapomniałem napisać że sam problem leży gdzieś w procedurze uśredniania wyniku ponieważ bez uśredniania działa prawidłowo i wskazania są prawidłowe nawet przy podziale 1/3 za pomocą dzielnika rezystorowego i mnożeniu wyniku *3

Znalazłem swój post na innym forum i znalazłem jaki kod dzialał z uśrednianiem. Poniżej kod.

Kod: Zaznacz cały

Srednia = Srednia * dt
Srednia = Srednia + Wynik
Temp = Dt + 1
Srednia = Srednia / Temp
Dodanie zmiennej Temp ustabilizowało działanie. Jeśli wpisałem:

Kod: Zaznacz cały

Dt = Dt + 1
To nie chciało to działać. Dopiero dodanie zmiennej Temp i wpisywanie do niej nowej wartości nie powoduje restartu uśredniania.

Niestety to rozwiązanie też nie jest pozbawione wad. Im więcej próbek czyli im większe Dt tym większy błąd pomiarowy. Do przyjęcia jest jeszcze Dt=4 bo błąd wynosi zaledwie 0.06V względem mojego miernika UNI-T M890C.

Natomiast jeszcze jedna kwestia jest taka że biorąc pod uwagę wyniki z mojego wyżej wspomnianego miernika i przy Dt=4 przy pewnych napięciach badanych na akumulatorze samochodowym odchyłka zmenijsza się do 0.01V a nawet wskazuje jednakowy wynik z miernikiem.

Z napięciami większymi niż 14V też nie jest dobrze ponieważ powyżej wspomnianych 14V przekłamuje prawie o 2V.

ODPOWIEDZ