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

Pomiar napięć 0-10V przez Xmega

30 Kwi 2015 07:51 2586 41
  • Poziom 16  
    Witam,

    Chciałem zrobić układ pomiarowy z prockiem Xmega, który mierzyłby napięcia z zakresu 0-10V w miarę dokładnie. Chodzi mi o warstwę fizyczną, jak podłączyć dzielnik, by uniknąć offsetu 0,5V? Chodzi o pomiar w całym zakresie 0-4095ADC.

    Na podstawie informacji z netu, narysowałem taki koncepcyjny schemat, tylko nie wiem, czy dobrze?
  • Banner Multimetr Fluke 87VBanner Multimetr Fluke 87V
  • Poziom 28  
    1. Zewnętrzne VREF (np 2.048 V) + filtr AVCC + przepisanie ADCx_CALL i ADCx_CALH obowiązkowo jeśli chcesz mierzyć dokładnie
    2. Dla "Single Ended" możesz wykonać procedurę kalibracyjną i przy zwartym do masy wejściu ADC odczytać offset, który będziesz potem odejmował od realnych pomiarów
    3. Dla "Differential" możesz mierzyć względem GND ale tracisz 1 bit przeznaczony na znak.
  • Poziom 16  
    Oczywiście, że wybór Xmega podyktowany był innymi względami niż ADC, ale ten też jest tu potrzebny.

    Użyłem trybu Differential i chyba się udało, gdyż mogę regulować napięcie od ok. zera. Ujemny biegun wejścia podpiąłem pod potencjometr i kręcąc nim regulowałem offset, tak więc rozwiązanie ze schematu powyżej ma szanse zadziałać z trybem różnicowym i stratą jednego bitu.
  • Banner Multimetr Fluke 87VBanner Multimetr Fluke 87V
  • Użytkownik usunął konto  
  • Poziom 16  
    Hmm, nie wiem od czego zacząć w odpowiedzi.

    Ja także ubolewam, że Atmel spieprzył ten ADC w Xmega robiąc użytkownikom takie schody w ADC w stosunku do zwykłych Atmeg. Dlatego wybrałem Xmegi, bo są 2x szybsze od Atmeg i mają DAC, a do tej pory pałowałem się z PWMami jako DAC. Nie mówiąc juz o innych peryferiach. Zasilanie symetryczne i tak będę miał w układzie, przewidziane do innych rzeczy. To samo wzmacniacz operacyjny na wejściu, ma sumować kilka wejść z zakresu 0-10V, czy TL081, czy TL082 i tak SO8, więc żaden wielki dodatek.

    Mi nie chodzi tylko o samo podłączenia ADC w Xmega i miłą zabawę :)
  • Użytkownik usunął konto  
  • Poziom 16  
    A co pogorszy?
  • Specjalista - Mikrokontrolery
    Czyli: do pomiaru napięć 0..10V wybrałeś prawdopodobnie jedyny mikrokontroler, który nie radzi sobie dobrze z tym prostym zadaniem i teraz wymyślasz, co by tu dołożyć, żeby jakoś zadziałało, zamiast wziąć DOWOLNY inny mikrokontroler, który to wszystko ma zrobione dobrze.
  • Poziom 16  
    Problem rozwiązałem inaczej: użyję zewnętrznego ADCa ADC121S021CIMF. Prosta aplikacja i 12 bit rozdzielczości. Transfer po ISP wykonam na DMA.
    Głównym zadaniem tego procka będzie generowanie przebiegów o częstotliwości zależnej od napięcia wejściowego 0-10V, a ADC to przy okazji.

    Inna sprawa, że na Xmegach robią całkiem fajne kombajny pomiarowe, i dają radę. Inne procki 32-bitowe? W przyszłości na pewno.
  • Specjalista - Mikrokontrolery
    Ten przetwornik jest tylko trochę droższy od przyzwoitego mikrokontrolera z dobrym ADC i DAC i rdzeniem Cortex-M0. No, ale warto podwoić koszty, byleby tylko było na XMega. ;)
  • Poziom 16  
    Bo oczywiście na Cortexy wszystko jest darmowe, zwłaszcza programator sprzętowy, który musiałbym zakupić, bo AVR ISP MKII, który posiadam nie obsłuży tego "cuda", tym bardziej STK200 :P, a Xmega leży w szufladzie, więc szkoda jej nie wykorzystać. Inna sprawa to poświęcony czas na rozgryzanie całej nowej rodziny mikrokontrolerów.
  • Poziom 1  
  • Moderator Mikrokontrolery Projektowanie
    mas24 napisał:
    Hmm, nie wiem od czego zacząć w odpowiedzi.

    Ja także ubolewam, że Atmel spieprzył ten ADC w Xmega robiąc użytkownikom takie schody w ADC w stosunku do zwykłych Atmeg. Dlatego wybrałem Xmegi, bo są 2x szybsze od Atmeg i mają DAC, a do tej pory pałowałem się z PWMami jako DAC. Nie mówiąc juz o innych peryferiach. Zasilanie symetryczne i tak będę miał w układzie, przewidziane do innych rzeczy. To samo wzmacniacz operacyjny na wejściu, ma sumować kilka wejść z zakresu 0-10V, czy TL081, czy TL082 i tak SO8, więc żaden wielki dodatek.

    Mi nie chodzi tylko o samo podłączenia ADC w Xmega i miłą zabawę :)


    Wszystko zależy od punktu widzenia. Dzięki temu "spieprzeniu" ADC ma możliwość detekcji przejścia przez zero. Ponieważ wprowadzony ofset odpowiada wartości ADC ok. 160-180, co stanowi ok. 5% przedziału wartości mierzonych ma to marginalny wpływ na rozdzielczość ADC. Tak jak już pisano, wystarczy ten ofset odjąć od wyniku, a zmierzyć go można co najmniej na kilka sposobów, nie zmieniając hardware. Wystarczy przełączyć przy pomocy multipleksera ADC dane wejście na masę (wewnętrzną lub zewnętrzną), zmierzyć ofset i ponownie przełączyć na pin IO. To jeden z kilku sposobów.
    Jak pisał kol. albertb ten wzmacniacz operacyjny niczemu nie służy. Sam dzielnik da taki sam, a nawet lepszy efekt.
  • Poziom 16  
    No dobra, nie będę się kłócił o ten wzmacniacz, wywalę go i tyle, ale dyskusja co lepsze i tańsze: Xmegi czy Cortexy jest moim zdaniem bezcelowa. Chcę po prostu spróbować wszystkiego po trochu, po Xmegach chcę poznać AVR32, nie koniecznie wnikliwie, a i na cortexy przyjdzie czas, lecz wszystko po kolei.

    Dobrze, ze Twórcy Xmegi wyposażyli ja w możliwość detekcji przejścia przez zero, ale w większości przypadków nie ma to zastosowania. Żeby podporządkować całe peryferium pod jedno tylko zastosowanie, to moim zdaniem nieporozumienie. Tutaj Koledzy niestety maja rację: przetwornik "dziwnie" skonstruowany. Ten offset powinien być wyłączany i wprowadzany w zależności od potrzeb, a tak niepotrzebnie wszystko komplikuje poprzez dodanie go na twardo.
  • Moderator Mikrokontrolery Projektowanie
    Marek_Skalski napisał:
    Przecież offset możesz odjąć sprzętowo i/lub programowo. Problem jest sztuczny, chociaż wynika z przekombinowanego ADC, który jest po prostu słaby. Obcięty zakres od dołu (offset), obcięty zakres od góry (Vdd - 0.6V). Dla mnie to nieporozumienie.


    Marku, nie jest obcięty, lecz przesunięty o offset równy 5% Vref. To istotna różnica. Coś dzięki temu zyskujemy, coś tracimy, jak zawsze. IMHO strata jaką jest 5% zakresu wartości ADC, przy zysku jakim jest możliwość pomiaru napięć poniżej GND jest uzasadniona, chociaż można się z tym nie zgadzać. Dlatego mamy tryb różnicowy w którym ofset nie występuje (ale zakres mamy 11 bitów + znak). Od góry też nic nie jest obcięte - po prostu max Vref to Vcc-0,6V. Żaden to problem, po prostu należy dobierając dzielnik wejściowy przeliczyć go tak, aby max napięcie nie przekraczało Vcc-0,6V (przy takiej referencji). A jeśli chcemy mierzyc napięcia z zakresu 0..Vcc bez zewnętrznego dzielnika to mamy w XMEGA wbudowany skaler napięcia wejściowego o wartości 1/2.
    W efekcie mamy normalny, 12-bitowy ADC, z czterema potokami (XMEGA A1), na czym więc polega jego słabość?
  • Poziom 16  
    Tomku, czy mógłbyś przybliżyć sprawę wykonania "normalnego 12-bitowego ADC" na Xmega? Jak wykonać warstwę fizyczną, a jak logiczną? Ja za "normalny 12-bitowy ADC" rozumiem możliwość mierzenia napięć od 0 do vref (jaki by nie był ten VREF) z rozdzielczością 12 bit.
  • Moderator Mikrokontrolery Projektowanie
    mas24 napisał:
    Dobrze, ze Twórcy Xmegi wyposażyli ja w możliwość detekcji przejścia przez zero, ale w większości przypadków nie ma to zastosowania. Żeby podporządkować całe peryferium pod jedno tylko zastosowanie, to moim zdaniem nieporozumienie. Tutaj Koledzy niestety maja rację: przetwornik "dziwnie" skonstruowany. Ten offset powinien być wyłączany i wprowadzany w zależności od potrzeb, a tak niepotrzebnie wszystko komplikuje poprzez dodanie go na twardo.


    Ofset jest wyłączany - tyle, że wtedy masz "tylko" 11 bitowy ADC. Jeśli wprowadzisz korektę poprzez odjęcie ofsetu to masz praktycznie 12 bitów. Oczywiście jednym się to podoba innym nie. Widać projektanci uznali, że tak jest lepiej, co niekoniecznie powoduje, że mieli rację. A co powiesz na kwiatki w niektórych ARMach, gdzie masz ADC, ale nie jest wyprowadzone napięcie referencyjne? Jak widać, tak też można zaprojektować ADC. Czy jest to złe? Zależy co kto robi i ile chce mu się przeliczać uzyskany wynik.
  • Użytkownik usunął konto  
  • Moderator Mikrokontrolery Projektowanie
    mas24 napisał:
    Tomku, czy mógłbyś przybliżyć sprawę wykonania "normalnego 12-bitowego ADC" na Xmega? Jak wykonać warstwę fizyczną, a jak logiczną? Ja za "normalny 12-bitowy ADC" rozumiem możliwość mierzenia napięć od 0 do vref (jaki by nie był ten VREF) z rozdzielczością 12 bit.


    Co rozumiesz, przez wykonanie warstwy logicznej i fizycznej? Projekt PCB? Czy mówimy ciągle o eliminacji tego ofsetu? Jeśli to ostatnie, to najprościej ściągnij darmowe przykłady do "AVR. Układy peryferyjne", w katalogu ADC masz przykłady ilustrujące usunięcie offsetu. Obetnie ci to 5% zakresu ADC, czyli rozdzielczość nieznacznie ci się obniży, będzie 11,94 bita :) Jeśli utrata 0,06 bita rozdzielczości jest problemem to niestety w XMEGA nadrobić to można tylko zyskując dodatkowy bit przez oversampling (w XMEGA E5 można go zrealizować sprzętowo).
  • Poziom 1  
  • Moderator Mikrokontrolery Projektowanie
    albertb napisał:
    tmf napisał:
    Dzięki temu "spieprzeniu" ADC ma możliwość detekcji przejścia przez zero.

    A tak trochę offtopic. Nie krytykuję rozwiązania Atmela, nawet nie zamierzam wnikać w szczegóły.
    Ale powiedz mi, naprawdę z ciekawości, jaki jest sens używania ADC do detekcji przejścia przez zero.
    Na chwilę obecną wydaje mi się to najbardziej przekombinowanym rozwiązaniem.

    Albert


    Albert, nie potrafię czytać w myślach inżynierów Atmela :) Moja hipoteza jest taka - w XMEGA masz rejestr compare, umożliwiający zrobienie na ADC dyskryminatora. Czyli możesz sobie samplować (i to nawet szybko bo masz 2 Msps), a info o konwersji ADC jest przekazywane tylko wtedy, gdy uzyskana wartość jest powyżej lub poniżej określonego progu. Czyli robisz z ADC komparator analogowy, przy czym jedno z wejść może byc programowo precyzyjnie sterowane. Być może zrobili tak, żeby uniknąć jakiś zniekształceń, gdy Vin jest w okolicach GND? Może coś to daje jeśli mierzymy prądy płynące przez mostek H sterujący silnikami? Może da się to jakoś wykorzystać przy komutacji BLDC?
    Żeby nie było - nie bronię tego, też wydaje mi się to przekombinowane, ale nie demonizuję problemu. Ot, taki folklor :) Jak znajdę inne rozsądne zastosowanie dla tego trybu to dam znać :)

    Dodano po 10 [minuty]:

    Marek_Skalski napisał:
    Pomiar <Vss to 5% z 2.7V, czyli całe 135mV. Zazwyczaj jak ktoś potrzebuje detektor zera to ten detektor będzie traktowany napięciem +/- (symetrycznym). Tutaj mam -135mV/+2565mV w idealnym przypadku. Jak podam +/-2V, to układ tego raczej nie przeżyje...

    Marku, dlaczego nie przeżyje? Kwestia impedancji wyjścia źródła. Jeśli jest odpowiednio wysoka (szeregowy rezystor), to to co jest poniżej -0,6V zostanie obcięte. A więc zero wykryję i nic mi się nie sfajczy.

    Marek_Skalski napisał:
    Mogę wprowadzić kolejny offset, ale wtedy nie wykryję przejścia przez zero. A przecież gdybym wprowadził offset 50%, to przejście przez zero mogę wykryć na drodze porównania wartości z ciągłej konwersji. Naprawdę ten 5% offset jest jak kwiatek do kożucha.
    Inna opcja: Używam trybu różnicowego i mam przetwornik 11-bitowy. Czy to dlatego Xmega jest wyjątkowa, że mając 12-bitowy ADC daje tylko 11-bitowy wynik?


    Oczywiście masz rację, ponieważ nigdy tej funkcji nie użyłem, myślę, tak jak ty. Tylko jedna uwaga - "Czy to dlatego Xmega jest wyjątkowa" - no właśnie, w tej i innych dyskusjach mam wrażenie, że wychodzisz z założenia (nie tylko Ty), że próbuję (ktoś próbuje) udowodnić, że XMEGA jest wyjątkowa i lepsza niż nie daj Boże ARM. Otóż nikt tak nie pisze i nikt niczego nie udowadnia.

    Marek_Skalski napisał:
    Inna opcja: Doprowadzam Vref 2.7V, używam dzielnika 1:2 i wykorzystuję jedynie 61% zakresu. To ma być ulepszenie? No chyba, że w systemie jest 5V i tylko uC chodzi na 3.3V. Ale to też jest dziwaczne, bo Xmega nie toleruje na wejściach napięć >3.6V, więc taki układ jest z założenia bezsensowny.


    Ale dlaczego chcąc mierzyć napięcie max 3,3V używasz Vref 2,7V? Opisany przez ciebie problem jest niezależny od ADC - w ogólności - jeśli masz źle dobrane napięcie referencyjne i dzielnik, to tracisz część zakresu.
  • Poziom 16  
    Tomku, gdzie można pobrać te przykłady? Chętnie je przećwiczę. Pomiar z potencjometrów może być i 11 bit, i 11,95 bit, bo całe życie radziłem sobie na 10 bitach w zwykłych AVR, ale gdy muszę rozróżnić 83mV i jego wielokrotności, przydałby się w miarę precyzyjny ADC.

    Za warstwę fizyczną rozumiem jakiś kawałek schematu, jak to popodłączać do procka, a za logiczną to jakiś kawałek programu, jak skonfigurować ADC, żeby mieć nawet te 11,95 bita.
  • Moderator Mikrokontrolery Projektowanie
    Jak klikniesz w link z mojej stopki to na stronie Helionu masz zakładkę "Szczegóły" a w niej link do przykładów. Są one tu:
    http://helion.pl/przyklady/avrukp.zip
    Zawsze aktualne przykłady możesz pobrać z mojego profilu na Atmel Spaces:
    http://spaces.atmel.com/gf/user/tmf/?action=Projects
  • Poziom 16  
    Sporo tych przykładów, dzięki :)
    A książkę zamierzam kupić już w tym miechu, właśnie układy peryferyjne.
  • Poziom 1  
  • Poziom 16  
    Nie za bardzo wiem, o co Ci chodzi?
    Zakres 0-10V dzieli się na 10 podzakresów po 1V, i każde 1V dzieli się na 12 części (1/12=0.08333...). Każdemu konkretnemu napięciu odpowiada konkretna częstotliwość. Chciałem to zrobić na procku, czyli odczytywać te napięcia i z tablicy pobierać wartości kroku, które odpowiadałyby częstotliwości.
    To 0-10V nie będzie z potencjometru. Potencjometry zapięte na ADC procka, i będą służyć do innych celów, tutaj napięcia mogą zmieniać się dowolnie, niezbyt szybko, powiedzmy do 500Hz i to te napięcia chcę rozróżniać co 83.3mV.
  • Moderator Mikrokontrolery Projektowanie
    @mas24 - jeśli dobrze liczę, to 12 części na wolt razy 10 woltów daje nam 120 stanów do odróżnienia - niecałe 7 bitów rozdzielczości...
  • Poziom 16  
    Teoretycznie tak.
    Próbowałem wykonać układ na Xmega, dający takie napięcia na uśrednionym PWM. Muszę mieć jakiś generator napięć wzorcowych, by testować potem ADC. PER ustawiłem na 12 bitów i nie zawsze udało się utrafić z konkretną wartością napięcia. A dodać do tego niedokładność użytego woltomierza, to sprawa zaczyna się komplikować.
  • Poziom 16  
    Jeszcze na temat tego offsetu. Pokombinowałem i wyszły mi dość ciekawe wyniki.

    Warstwa fizyczna: dwa potencjometry podpięte suwakami do pinów ADC Xmegi, na "dodatnim" odczepie rezystor 64.9k, by z 3,3V było 2V przy max. wychyleniu potencjometru.

    Warstwa logiczna: ustawiłem ADC w differential mode, jako pin "dodatni" ustawiłem jeden potencjometr, jako pin "ujemny" ustawiłem drugi.
    Wyjście było trochę przekombinowane, ale zrobione na szybko na płytce z DAC.
    Na DAC podawałem przebieg liniowy narastający, a wartość TOP była właśnie rejestrem ADC. Mogłem więc obserwować na oscyloskopie amplitudę tej piły, która była zależna od ADC.

    I teraz: przy odpowiednim ustawieniu potencjometru "ujemnego", mogłem uzyskać zerową amplitudę, czyli można mniemać, że offset wynosił zero. Przy czym dla "dodatniego" potencjometru mogłem ustawić maksymalny zakres.

    Czy w ten sposób pozbyłem się offsetu? Czy tylko tak mi się wydawało?
  • Moderator Mikrokontrolery Projektowanie
    W trybie różnicowym ADC nie ma offest, a dokładniej nie ma celowo wprowadzonego ofsetu, jest tylko ofset samego przetwornika, na poziomie kilku mV. Wartość ADC wynosi w tym trybie Vin(+)-Vin(-). Jeśli oba napięcia są równe to teoretycznie ADC powinien dać 0.