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.

amtega32 - ADC,błąd pomiaru, powiązane napięcia na różnych kanałach

_pieczas 15 Sty 2014 19:42 1443 11
  • #1 15 Sty 2014 19:42
    _pieczas
    Poziom 12  

    Panowie
    Kombinuje z pomiarem napięcia na potencjometrach z wykorzystaniem atmego32. 4 potencjometry podpięte do 4 kanałów ADC.

    Połączenia nie mogę przedstawić ze względu na problem z wgrywaniem obrazków, lecz jest ono podręcznikowe.


    kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Problem w tym, ze gdy wszystkie potencjometry są skręcone na 0 to wszedzie są mierzone 0, a gdy wszystkie mają wartość VCC to jest 1023. Jednak gdy kręce tylko jednym, wówczas jego napięcie zmienia się istotnie, lecz nie w całym zakresie - ok od 0 do 950 bitów. Mało tego w na innych kanałach też rejestrowane jest napięcie. Przyjmują one wartości mniejsze i są to dość stabilne wartości.
    Czy orientuje się ktoś w czym może być problem? Nie sądze aby spadało napięcie źródła, bo na zasilaniu mam 2 kondensatory 2000uF, przez co po odłączeniu od napięcia atmega działa jeszcze kilka sekund.

    0 11
  • #2 15 Sty 2014 19:54
    as1200
    Poziom 12  

    Witam,

    Nie wiem czy moja informacja coś pomoże ale może sama sugestia nasunie Tobie jakieś przemyślenia co do błędnego działania ADC.

    Nie znam składni języka C gdyż programuje w Bascomie ale spotkałem się tam z takim opisem:

    Cytat:
    Uwaga! Z powodu zmian w kodzie bibliotecznym w wersji 1.11.7.2, funkcję GETADC() najlepiej wywołać dwukrotnie:

    W = Getadc(channel)
    W = Getadc(channel)

    gdyż za pierwszym razem funkcja może zwrócić wartość przetworzoną w kanale o numerze mniejszym o jeden.

    (c) Zbigniew Gibek, 2002-2005 (c) MCS Electronics, 1999-2005

    0
  • #3 15 Sty 2014 20:08
    _pieczas
    Poziom 12  

    No to mogłoby mieć cos wspolnego z problemem, gdyż najbardziej dzień widoczne zmiany są w kanale sąsiednim. Ale.. Gdy wszystkie potencjometry są skręcone na min lub max to pomiary na każdym kanale wynoszą 0 lub 1023. Gdy któryś jest w poizycji pośredniej to nie dochodzą do maksimum i minimum, aczkolwiek może to przez to, że pomiar idzie w petli . sprawdzę i dam znac , lecz jutro bo nie mam dostępu do układu.

    0
  • #4 15 Sty 2014 20:31
    Marek_Skalski
    Moderator Projektowanie

    Przeczytaj jeszcze raz w dokumentacji sekcję dotyczącą ADC i zastanów się co się dzieje, kiedy przełączasz kanał i natychmiast zaczynasz proces przetwarzania? Tak jest w Twoim programie.
    W prostych uC, przetwornik ma tylko jeden układ S/H i tylko jeden kondensator. A jak jest kondensator i jakaś rezystancja na wejściu, to potrzebny jest czas. To wszystko można dość dobrze policzyć w oparciu o dokumentację uC i to co do niego podłączasz.
    Sposobów rozwiązania Twojego problemu jest kilka.
    Zazwyczaj, kiedy nie ma dużych wymagań w zakresie częstotliwości i dokładności, preferuję rozpoczęcie konwersji synchronicznie z jakąś podstawą czasu (przerwanie od timera), a w obsłudze przerwania z ADC (po zakończeniu konwersji) zmiana kanału. Warunek, od zmiany kanału do rozpoczęcia konwersji musi minąć min. czas wyznaczony jako stała czasowa z parametrów układu. Inaczej mówiąc, zamieniam kolejność: Zamiast sekwencji: wybór kanału / przetwarzanie, stosuję sekwencję: przetwarzenie / wybór kanału.
    Jeżeli potrzebuję mierzyć sygnał szybko (>500kSPS), ale niezbyt dokładnie, to biorę uC z dwoma lub trzema ADC, które pracują synchronicznie, a do przesyłania danych wykorzystuję wsparcie sprzętowe (DMA). Takie rozwiązanie kosztuje trochę więcej.
    Jeżeli potrzebuję mierzyć dokładnie (>12 bit), to używam zewnętrznych przetworników. Częstotliwość nie ma wtedy większego znaczenia, ale to na pewno nie jest tania metoda z uwagi na dodatkowy sprzęt, dodatkowe programowanie i wymaga większej staranności w projektowaniu całego układu, np. płytki, ścieżki, zasilanie, ekranowanie.

    0
  • #5 15 Sty 2014 21:03
    _pieczas
    Poziom 12  

    Czy wstawienie _dely_ms(100) pomiędzy kolejne pomiary powinno rozwiązać problem? Pomiar wykonywany jest tylko na początku programu i jego czas nie ma większego znaczenia.

    0
  • #6 15 Sty 2014 21:09
    Marek_Skalski
    Moderator Projektowanie

    Brrrr... _delay_....
    Ogólnie powinno pomóc, ale nie stosuj tego w przyszłości. W taki właśnie sposób zabija się MIPSy i nawet CM4@180MHz "nie będzie się wyrabiał".
    Korzystaj ze sprzętu i swojej inteligencji, a nie czekaj biernie na to co los przyniesie.
    Taka metafora ;)

    0
  • #7 16 Sty 2014 09:43
    _pieczas
    Poziom 12  

    Dziękuje wszystkim za pomoc. Problem najwyraźniej leżał w zbyt szybkim pomiarze. Pomiędzy kolejnymi pomiarami dodałem opóźnienie i to pomogło. Rozwiązanie kolego Marek_Skalski jest z pewnością bardzo rzeczowe, lecz u mnie nie ma takiej konieczności, gdyż tylko na początku programu dokonuje jednorazowego pomiaru i nie zależy mi na szybkości.

    0
  • #8 16 Sty 2014 21:29
    Dar.El
    Poziom 40  

    Wystarczy wyłączyć ADC i zaraz włączyć, bez żadnych opóźnień. Po włączeniu dodaje trochę cykli zegarowych przed próbkowaniem i nie ma problemów.

    0
  • #9 18 Sty 2014 00:12
    Marek_Skalski
    Moderator Projektowanie

    Dar.El napisał:
    bez żadnych opóźnień

    Dar.El napisał:
    dodaje trochę cykli zegarowych przed próbkowaniem

    te kilka cykli to właśnie opóźnienie pozwalające na przeładowanie pojemności w obszarze Sample & Hold.
    A wyłączanie i włączanie ADC to jak dla mnie wyjątkowo dziwna konstrukcja. W jakim celu to robić? Czy gdzieś w dokumentacji jest opis, że przetwornik do prawidłowego działania wymaga "restartu"?
    Moje doświadczenie jest takie, że po zmianie konfiguracji (kanał, wzmocnienie) wystarczy zaczekać kilka lub kilkanaście us i wynik przetwarzania jest wiarygodny i nie jest obarczony istotnym wpływem wcześniej dołączonego kanału. Jeżeli źródło sygnału dla ADC ma względnie wysoką impedancję, wtedy konieczne jest dłuższe oczekiwania, ale lepszym rozwiązaniem jest zmiana konfiguracji sprzętowej i obniżenie impedancji źródła sygnału.

    0
  • #10 18 Sty 2014 00:31
    dondu
    Moderator Mikrokontrolery Projektowanie

    Na przykład w PIC18-ych Microchipa ten czas (opóźnienie przed pomiarem) jest wręcz jawnie regulowany w zależności od potrzeb projektanta:

    amtega32 - ADC,błąd pomiaru, powiązane napięcia na różnych kanałach amtega32 - ADC,błąd pomiaru, powiązane napięcia na różnych kanałach amtega32 - ADC,błąd pomiaru, powiązane napięcia na różnych kanałach

    0
  • #11 18 Sty 2014 00:44
    Marek_Skalski
    Moderator Projektowanie

    To samo dotyczy dsPIC33 i PIC24.
    Np. w dsPIC33EP... mogę dość swobodnie (zmienna 8 bitów) określić prędkość zegara dla ADC względem zegara systemu. A następnie mogę wybrać minimalny czas samplowania (zmienna 5 bitów), po którym rozpocznie się konwersja wyniku mimo ustawienia bitu rozpoczęcia konwersji. Takie drobne ułatwienie, która pozwala zminimalizować przesłuchy między kanałami.

    0
  • #12 18 Sty 2014 00:50
    dondu
    Moderator Mikrokontrolery Projektowanie

    No właśnie ... niestety w ATmega32 trzeba to zrobić programowo lub wykorzystać możliwości ADC Auto Trigger Source:

    amtega32 - ADC,błąd pomiaru, powiązane napięcia na różnych kanałach

    0
  Szukaj w 5mln produktów