Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

ADC - pomiar napięcia w Xmega

Marek_Gorecki 27 May 2016 17:14 1809 24
  • #1
    Marek_Gorecki
    Level 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:

    Code: c
    Log in, to see the code


    Inicjacja przetwornika:

    Code: c
    Log in, to see the code



    Funckcja main:
    Code: c
    Log in, to see the code


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

    Aż tak źle ? ;)
  • #5
    Marek_Gorecki
    Level 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
    User removed account
    User removed account  
  • #7
    Marek_Gorecki
    Level 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
    Marek_Gorecki
    Level 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
    User removed account
    User removed account  
  • Helpful post
    #11
    2rs232
    Level 18  
    Wyłączyłeś funkcje cyfrowe wejścia ADC w PINnCTRL - Pin n Control Register (Input/sense Configuration - INTPUT_DISABLE - Digital input buffer disabled)?
    Code: c
    Log in, to see the code
  • Helpful post
    #12
    jnk0le
    Level 18  
    Zazwyczaj największym problemem jest filtracja zasilania/sygnału.
    Możesz też spróbować wejść w tryb uśpienia na czas pomiaru.
  • #13
    Marek_Gorecki
    Level 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
    User removed account
    User removed account  
  • #15
    Marek_Gorecki
    Level 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).
  • Helpful post
    #16
    User removed account
    User removed account  
  • #17
    Marek_Gorecki
    Level 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
    User removed account
    User removed account  
  • #19
    Marek_Gorecki
    Level 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
    jnk0le
    Level 18  
    Piotrus_999 wrote:

    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
    gadula88
    Level 15  
    Marek_Gorecki wrote:
    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
    Marek_Gorecki
    Level 16  
    gadula88 wrote:
    Marek_Gorecki wrote:
    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ć?
  • Helpful post
    #23
    gadula88
    Level 15  
    Jest to opisane na stronie 358 i 378 manuala.

    Code: c
    Log in, to see the code
  • Helpful post
    #24
    Kwarcu
    Level 12  
    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:
    Code: c
    Log in, to see the code
  • #25
    Marek_Gorecki
    Level 16  
    Dziękuję za wszystkie sugestie.
    Mam w tej chwili taki kod:
    Code: c
    Log in, to see the code


    Procedura do odczytu wyglada tak:
    Code: c
    Log in, to see the code


    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.