Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ATXmega128A3U - ADC i pomiar napięcia zasilania - bardzo zaniżone wartości

Kudzu 01 Sty 2017 17:22 978 14
  • #1 01 Sty 2017 17:22
    Kudzu
    Poziom 14  

    Próbuję wykonywać kontrolne pomiary napięcia zasilania w układzie zasilanym bateryjnie (ER14505). Zasilanie procesora prowadzone jest raczej prawidłowo: każda nóżka, która tego wymaga, ma doprowadzone zasilanie wraz z kondensatorem ceramicznym w bezpośrednim sąsiedztwie, dodatkowe układy (transceiver nRF24L01+ i czujnik AM2302) mają swoje dodatkowe elektrolity. Cały układ zasilany jest z baterii przez diodę schottky.
    Większość czasu układ jest uśpiony i wtedy pobiera ok. 17 uA; co minutę procesor jest wybudzany, wykonuje pomiary, wysyła dane radiem i zasypia - wtedy bierze pewnie ze 2 mA (za krótko, żeby dokładnie zmierzyć multimetrem).

    Co do kodu - przetwornik konfiguruję tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    A tak obrabiam dane:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Bateria ma napięcie 3,64 V, a za diodą w czasie uśpienia jest ponad 3,4 V. Niestety układ przesyła wartość w okolicach 184, czyli zgodnie z powyższym wyjaśnieniem, daje to napięcie 2,84V. Nie mam pojęcia, dlaczego takie niskie. Testowałem program również z ADC w trybie 8 bit i przesyłałem surową wartość rejestru - to samo.
    Myślałem, że może jednak po wybudzeniu napięcie drastycznie siada i dołożyłem elektrolit (supercapa) 100 mF, ale to też nic nie zmieniło.

    Gdzie może tkwić problem?

    0 14
  • #2 01 Sty 2017 17:38
    2675900
    Użytkownik usunął konto  
  • #3 01 Sty 2017 17:56
    Kudzu
    Poziom 14  

    Piotrus_999 napisał:
    A możesz cokolwiek zmierzyć poprawnie?

    A co proponujesz?
    Musiałbym mieć jakieś źródło napięcia poniżej 1 V (mogę korzystać jedynie z wewnętrznych napięć odniesienia) i podłączyć do wejścia ADC - na szczęście wyprowadziłem cały port A na goldpinach.
    Teraz wpadłem jeszcze na to, że mógłbym na czas testów wyłączyć usypianie, żeby nie powodować nagłych skoków poboru prądu, ale niestety nie uniknę usypiania AM2302 (robi to z automatu) i nie wpłynę na pobór prądu nRF24L01 w nadawaniu.

    0
  • #4 01 Sty 2017 18:15
    tmf
    Moderator Mikrokontrolery Projektowanie

    @Kudzu W tym procesorze max f dla ADC przy próbkowaniu sygnałów wewnętrznych to chyba 100 kHz, ty masz 125. Niesądzę aby to było problemem, ale... Kolejna sprawa - sprawdź pomiar bez usypiania procesora, nie pamiętam, czy w niektórych trybach nie jest też wyłączany bandgap. Jeśli tak, to wg noty potrzebuje ponad 2,5 us na stabilizację po ponownym włączeniu. Kolejna sprawa to wzór: supply = (((10 * ref_voltage * adc_data * 100) / 2048) - 100); - skąd to -100?
    Kolejna sprawa - spróbuj odrzucić pierwszy pomiar, jak wyglądają kolejne?
    Kolejna sprawa - jakim napięciem zasilasz procesor?

    0
  • #5 01 Sty 2017 18:21
    2675900
    Użytkownik usunął konto  
  • #6 01 Sty 2017 18:56
    Kudzu
    Poziom 14  

    tmf napisał:
    @Kudzu W tym procesorze max f dla ADC przy próbkowaniu sygnałów wewnętrznych to chyba 100 kHz, ty masz 125. Niesądzę aby to było problemem, ale...

    Cytat:
    "Maximum sampling speed of the internal inputs is 125KSPS."


    tmf napisał:
    Kolejna sprawa - sprawdź pomiar bez usypiania procesora, nie pamiętam, czy w niektórych trybach nie jest też wyłączany bandgap. Jeśli tak, to wg noty potrzebuje ponad 2,5 us na stabilizację po ponownym włączeniu.

    Jeżeli bandgap potrzebuje trochę czasu na stabilizację, to nie ma problemu - odczyt ADC wykonuję na końcu, a w między czasie odczytuję AM2302, co zajmuje co najmniej kilkaset us.
    tmf napisał:
    Kolejna sprawa to wzór: supply = (((10 * ref_voltage * adc_data * 100) / 2048) - 100); - skąd to -100?

    Obniżam wartość o 100 (1 V), żeby zmieścić się w zmiennej 8 bit - dzięki temu wartość np 3,3 V (czyli 330), mogę przesłać jako 230 (uint8_t).
    tmf napisał:
    Kolejna sprawa - spróbuj odrzucić pierwszy pomiar, jak wyglądają kolejne?

    Kolejnych w tym samym cyklu nie wykonuję. Natomiast wykonuję po jednym co minutę i wartość się waha między 183 a 184.
    tmf napisał:
    Kolejna sprawa - jakim napięciem zasilasz procesor?

    Opisałem dość szczegółowo na początku - bateria 3,6V przez diodę schottky'ego.

    Piotrus_999 napisał:
    Proponuję abyś podłączył coś o znanym napięciu - choćby i jakiś dzielnik na rezystorach i zmierzył napięcie multimetrem i ADC. Nawet zakładając kilkuprocentowy błąd multimetru, będzie to mniej niż to co masz. Przy okazji próbowałeś zrobić więcej pomiarów niż jeden? Jak nie to zmierz kilka, kilkadziesiąt razy i zobacz czy wynik nie zbliża się do założonego.

    Spróbuję zmierzyć jakieś napięcie zewnętrzne lub po prostu zrobię dzielnik bezpośrednio na baterii.

    Wymyśliłem jeszcze, że pominę schottky'ego i zasilę układ z zewnętrznego źródła 3,3 V.

    Piotrus_999 napisał:
    A korzystając z okazji spytam się dlaczego xmega?

    Jestem bardzo początkujący i jakoś tak naturalnie wyszło, że z ATmega przeszedłem na ATXmega. Nie mam za dużo czasu na hobby i mogę sobie pozwolić na rozpracowywanie wielu technologii na raz. Mam też dużo literatury na temat 8-bit Atmela.
    Co do ARMa (zdążyłem przeczytać;) ) - na razie wystarczy mi takowy w moim Orange Pi oraz poprzedni w Cubieboard - tu jednak rządzi Debian.

    0
  • #7 01 Sty 2017 19:02
    2675900
    Użytkownik usunął konto  
  • #8 01 Sty 2017 19:06
    Kudzu
    Poziom 14  

    Piotrus_999 napisał:
    Nie wiem jaki układ masz wejściu ADC ale po włączeniu ADC pierwszy pomiar może być obarczony dużym błędem.


    Nie zrozumiałem tego. Multiplekser ADC mam ustawiony na pomiar Vcc/10. Nie ma dodatkowych układów.

    0
  • #9 01 Sty 2017 19:54
    2675900
    Użytkownik usunął konto  
  • #10 01 Sty 2017 20:03
    Kudzu
    Poziom 14  

    Piotrus_999 napisał:
    Myślałem że mierzysz napięci baterii - a wtedy masz jakiś układ zewn (np dzielnik rezystorowy). Przy okazji signed czy unsigned mode

    Owszem, mierzę napięcie baterii, ale xmega ma możliwość ustawiania multipleksera na pomiar parametrów peryferiów: napięcia zasilania i temperatury. W przypadku pomiaru napięcia zasilania ADC mierzy Vcc/10, a źródło napięcia odniesienia wystarczy ustawić na wewnętrzne 1,0 V.
    ADC, zgodnie z opisem składni w pierwszym poście, skonfigurowałem na 12 bit signed, stąd w obliczeniach pojawia się wartość 2048 (11 bit).

    0
  • #11 01 Sty 2017 20:06
    2675900
    Użytkownik usunął konto  
  • #12 01 Sty 2017 20:13
    tmf
    Moderator Mikrokontrolery Projektowanie

    @Kudzu Spróbuj odrzucić pierwszy pomiar i sprwadź wartość kolejnego. Kolejna rzecz - jeśli ADC daje ci 184, to przy referencji 1V, daje to 0,0898 V, czyli 0,890V po uwzględnieniu dzielnika. Czyli zupełnie wynik z sufitu. Odpal ten kod w symulatorze i sprawdź, czy rejestry są prawidłowo poustawiane i masz konfigurację taką jaką oczekujesz.

    0
  • #13 01 Sty 2017 20:35
    Kudzu
    Poziom 14  

    Obaj sugerujecie wykonanie kilku pomiarów, więc, siłą rzeczy, będę musiał to zrobić.
    W pierwszej kolejności wyłączę jednak usypianie MCU i zobaczę, co wtedy.

    tmf napisał:
    Kolejna rzecz - jeśli ADC daje ci 184, to przy referencji 1V, daje to 0,0898 V, czyli 0,890V po uwzględnieniu dzielnika. Czyli zupełnie wynik z sufitu.

    Nie do końca, ale to moja wina, bo już trochę zamieszałem. Wartość 184 nie pochodzi z rejestru, a jest już wynikiem obliczeń, zatem 184 to 2,84 V.

    ***************************************************
    OK, zrobiłem kilka testów.

    Po pierwsze przełączyłem ADC w tryb 8-bit, zmniejszyłem częstotliwość próbkowania do 62,5 ksps i przesłałem wartość rejestru ADC bez przeliczania.
    1. Wyłączyłem usypianie MCU - wynik: 40. Dla referencji 1 V daje to 1,56 V.
    2. Włączyłem usypianie MCU, przełączyłem źródło odniesienia na Vcc/1,6 i mierzyłem bandgap - wynik 66. Czyli dla Vcc = 3,29 V zmierzone napięcie odniesienia to 0,53 V (zamiast 1,0 V!).
    3. Powróciłem do pomiaru Vcc/10 i Vref=1 V, ale wykonałem 20 powtórzeń za każdym razem i wyliczyłem średnią arytmetyczną - wynik: 40.

    Gdzieś popełniam gruby błąd albo nie uwzględniam istotnego szczegółu. Proszę o przeglądnięcie jeszcze raz konfiguracji z pierwszego postu - może tu coś jest nie tak?

    EDIT:
    W powyższych obliczeniach popełniłem głupi błąd, bo liczyłem dla 8 bitów zamiast 7 (signed). Z tego wynika, że kod w trybie ADC 8-bit działał prawidłowo. Rozwiązanie problemu poniżej.

    0
  • Pomocny post
    #14 02 Sty 2017 20:40
    ppc
    Poziom 15  

    Kod: c
    Zaloguj się, aby zobaczyć kod


    W swoich obliczeniach przepełniasz zmienną 16bitową.
    Sprawdź czy supply ma prawidłową wartość, jeżeli ręcznie liczycz powyższe równanie.

    Zmień typ adc_data na uint32_t, lub dodaj przyrostki UL do liczb. Ewentualnie zamiast mnożyć przez 1000 i dzielić przez 2048, podziel przez 2, tyle, że będzie dodatkowy, niewielki błąd. :P

    Tak poza tym to ten bandgap nie ma czasem 1.1V, a nie 1.0V?

    0
  • #15 02 Sty 2017 21:12
    Kudzu
    Poziom 14  

    ppc napisał:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    W swoich obliczeniach przepełniasz zmienną 16bitową.
    Sprawdź czy supply ma prawidłową wartość, jeżeli ręcznie liczycz powyższe równanie.

    Zmień typ adc_data na uint32_t, lub dodaj przyrostki UL do liczb. Ewentualnie zamiast mnożyć przez 1000 i dzielić przez 2048, podziel przez 2, tyle, że będzie dodatkowy, niewielki błąd. :P

    Spadłeś mi z nieba. Właśnie zabierałem się za napisanie w wątku, że jednak dla ADC 8-bit:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    pomiar jest prawidłowy - otrzymuję wynik 3,21V. W poście powyżej popełniłem chyba błąd w obliczeniach, bo liczyłem 8 bit zamiast 7 bit.

    Natomiast dla ADC 12-bit:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    otrzymuję błędną wartość ok. 2,61 V. Zastanawiało mnie dlaczego.

    Po zastosowaniu najprostszego, zaproponowanego przez Ciebie rozwiązania, czyli:
    ppc napisał:
    Ewentualnie zamiast mnożyć przez 1000 i dzielić przez 2048, podziel przez 2

    otrzymuję wynik 3,28 V, czyli bardzo zbliżony do prawidłowego.
    ppc napisał:
    lub dodaj przyrostki UL do liczb

    To też działa:)

    Dzięki serdeczne!

    ppc napisał:
    Tak poza tym to ten bandgap nie ma czasem 1.1V, a nie 1.0V?

    Owszem, ale jako referencja daje 10/11.

    Na dowód zrzut ekranu :D
    ATXmega128A3U - ADC i pomiar napięcia zasilania - bardzo zaniżone wartości

    0
  Szukaj w 5mln produktów