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

Niestabilne wyniki pomiaru napięcia 12-bitowego w ATXMEGA32E5 - co sprawdzić?

Marek_Gorecki 27 Maj 2016 17:14 1881 24
  • #1 15702864
    Marek_Gorecki
    Poziom 16  
    Witam,

    Próbuje poznać Xmegi, konkretnie chodzi o ATXMEGA32E5.
    Zapodałem sobie dziś temat pomiar napięcia 12 bitówy.
    Napisałem program, trochę przy użyciu dr Googla.
    Niby program działa, ale wyniki są mało satysfakcjonujące.
    otrzymuje w termianalu dla stabilnego napięcia ze żródła referencyjnego wskazania od 1614 - 1627.
    Chyba ten zakres jest zbyt duży.
    Co może być przyczyną takiego rozrzutu?

    Używam następującego kodu:

    Funkcja odczytu napięcia:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Inicjacja przetwornika:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Funckcja main:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Procesor ma wybrany zegar 2MHz.
    Pomiar napięcia chciałem aby się odbywał z pinu PD7, czyli z kanału 15.
  • #2 15702871
    grko
    Poziom 33  
    Sformatuj kod tak aby dało się to czytać. Ctrl+A oraz Ctrl+I w Eclipse albo skorzystaj z formatera online.
  • #3 15702887
    Marek_Gorecki
    Poziom 16  
    Uzywam Codevision.
    Ale spróbowałem zrobić Ctrl A, Ctrl I.
    Nie wiem czy jest czytelniej, coś chyba się poprawiło.
  • #4 15702898
    grko
    Poziom 33  
    Nie jest czytelniej. Ale pomijając już to, to ten rozrzut jest na poziomie:
    13 / 4096 ~= 0,3%

    Aż tak źle ? ;)
  • #5 15702910
    Marek_Gorecki
    Poziom 16  
    No to jaki jest sens używania przetwornika 12 bitowego, skoro na 10 bitowym ADC w starej Atmedze miałem stabilne wskazania +-1, czyli 2/1024 a więc 0,2%

    Dodano po 52 [minuty]:

    Jeśli zrobię kilka pomiarów ,np 32 i policzę średnią arytmetyczną to wyniki są w miare stabilne.
    Wtedy mam w terminalu wskazania np od 3051 do 3057 w czasie minuty.
    Czy to jest w porzadku, czy tak ma być?
    Na wejściu mam kondensator z rezystorem, czyli układ filtra dolnoprzepustowego.
    AVcc jest zasilony przez dławik.
    Czy można poprawić jeszcze te rozrzuty?
  • #6 15703109
    Konto nie istnieje
    Konto nie istnieje  
  • #7 15703184
    Marek_Gorecki
    Poziom 16  
    Całośc jest na płytce.
    Myślałem o usypianiu procesora, ale nie znalazłem nigdzie informacji jak to zrobić dla Xmegi.
    Nawet nie znalazłem tego w książkach Pana Tomka Francuza.
  • #9 15703666
    Marek_Gorecki
    Poziom 16  
    Mam pytanie - czy ten mój kod jest prawidłowy?
    Wiem że są metody do poprawy jeszcze dokładnosci pomiaru, ale musze miec gwarancję, że sam pomiar jest dobry.
  • #10 15703688
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #11 15703723
    2rs232
    Poziom 18  
    Wyłączyłeś funkcje cyfrowe wejścia ADC w PINnCTRL - Pin n Control Register (Input/sense Configuration - INTPUT_DISABLE - Digital input buffer disabled)?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #12 15703725
    jnk0le
    Poziom 18  
    Zazwyczaj największym problemem jest filtracja zasilania/sygnału.
    Możesz też spróbować wejść w tryb uśpienia na czas pomiaru.
  • #13 15708766
    Marek_Gorecki
    Poziom 16  
    Mam jeszcze jedno pytanie.
    W pdfie od ATXMEGA32E5 na stronie 76 znajduje się tabela 36-7.
    W niej jest podane że Input resistance wynosi MAX 4.5K Ohma.
    Czy dobrze rozumiem, że impedancja wyjściowa , która podpinam pod wejście ADC tego przetwornika musi mnieć mniej niż 4.5K ?
    Czy jeśli stosuje na wejściu dzielnik z rezystorami rzędu kilkudziesieciu kiloohm to jest to złe rozwiązanie?
  • #14 15708771
    Konto nie istnieje
    Konto nie istnieje  
  • #15 15708802
    Marek_Gorecki
    Poziom 16  
    Ale mi zależy na bardzo uśrednionym wyniku. Mierzę temperaturę średnią w odcinku 5 minut.
    Nie zależy mi na szybko zmiennych odczytach.
    Dodatkowo na wejściu dałem duży kondensator 2.2u ( nie elektrolit).
  • Pomocny post
    #16 15708816
    Konto nie istnieje
    Konto nie istnieje  
  • #17 15708818
    Marek_Gorecki
    Poziom 16  
    Dzięki, a możesz mi wytłumaczyć co to znaczy ta impedancja?
    Czy jest to impedancja wejściowa ADC?
    Jeśli tak to bardzo mała.
  • #18 15708847
    Konto nie istnieje
    Konto nie istnieje  
  • #19 15709185
    Marek_Gorecki
    Poziom 16  
    Nie chcę tu uruchamiać znów kłótni Cortex vs reszta świata.
    Jeśli chodzi o mnie powód jest prozaiczny.
    Po pierwsze mój kompilator obsługuje AVRy i ATXmegi.
    Po drugie mam książki Tomka Francuza i na nich bazuje.
    Po trzecie Atmel mnie nigdy nie zawiódł.
    Po czwarte - lenistwo , nie mam siły aby ruszać w tym momencie Army.
    Ale nie ukrywam że kto wie, może podejmę ten krok wkrótce.
  • #20 15709190
    jnk0le
    Poziom 18  
    Piotrus_999 napisał:

    A tak przy okazji - idąc w kierunku bardziej wyrafinowanych uC - co Cie skierowało do tej jak by nie patrzeć ślepej odnogi, a nie do Cortex-ów. Pytam z ciekawości. XMegi ani rewelacyjne, ani tanie (dodam że w prostych układać wykorzystuje AVR-y)


    xmega256d vs atmega2560
    Są nawet tańsze od odpowiadających im "zwykłych" avr'ów.
  • #21 15710789
    gadula88
    Poziom 15  
    Marek_Gorecki napisał:
    Ale mi zależy na bardzo uśrednionym wyniku. Mierzę temperaturę średnią w odcinku 5 minut.
    Nie zależy mi na szybko zmiennych odczytach.

    Od siebie tylko dodam, że w tej Xmedze ADC posiada funkcję uśredniania wyników. Wystarczy wybrać liczbę pomiarów i przesunięcie bitowe wyniku.
  • #22 15710804
    Marek_Gorecki
    Poziom 16  
    gadula88 napisał:
    Marek_Gorecki napisał:
    Ale mi zależy na bardzo uśrednionym wyniku. Mierzę temperaturę średnią w odcinku 5 minut.
    Nie zależy mi na szybko zmiennych odczytach.

    Od siebie tylko dodam, że w tej Xmedze ADC posiada funkcję uśredniania wyników. Wystarczy wybrać liczbę pomiarów i przesunięcie bitowe wyniku.


    Robię to programowo, jeśli jest to zaimplikowane sprzętowo to byłoby super.
    Możesz dać przykład jak to zrobić?
  • Pomocny post
    #23 15712291
    gadula88
    Poziom 15  
    Jest to opisane na stronie 358 i 378 manuala.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #24 15712319
    Kwarcu
    Poziom 13  
    U mnie w XMEGA32E5 odczyty z ADC (tryb różnicowy) przy wejściu zwartym do masy wahały się o ±2LSB. Zrobiłem na niej kiedyś projekt który m.in. mierzył wartość RMS napięcia sieci z rozdzielczością 0.1V ( z nadpróbkowaniem 12 -> 13bit) i wszystko pracowało jak należy. Ważne jest odpowiednio odfiltrowane zasilanie i projekt PCB. Ponadto najlepsze rezultaty z ADC uzyskałem w trybie różnicowym.

    Jeśli chodzi o sprzętowe uśrednianie to musisz dodatkowo w swojej konfiguracji ustawić te rejestry:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #25 15714847
    Marek_Gorecki
    Poziom 16  
    Dziękuję za wszystkie sugestie.
    Mam w tej chwili taki kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Procedura do odczytu wyglada tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Czy wszystko jest OK?
    Z wyników wyglada że jest dobrze.
    Owszem pływa +-2 lsb, ale przyczyną tego może nie być bardzo stabilne napięcie pomiarowe.
REKLAMA