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

[AVR xmega128at][Bas] Jak działa to całe ADC? Jak się je ustawia?

jacynka84 18 Gru 2011 19:43 3033 27
  • #1 10276380
    jacynka84
    Poziom 26  
    Witam. Otóż niedawno uruchomiłem ATXmega128A1 i bawię się ADC - i już mi się słabo robi bo nie mogę dojść jak ustawić to wszystko aby pobierać wartości z pinów, mam na PortA.2 baterię, dzielnikiem 1/10, jest tam ok 0,69V, na A0 i A1 mam potki, też nie mogę czytać.
    1 po co jest coś takiego jak mux, i jeszcze w bascom trzeba dać numer i jeszcze mux też ma własny numer?
    2 Po co do tego 4x ADC_CHxRES ?
    3 I jak to jest że czytam wartość np z pinu A2 (Bat = Getadc(adca , nr pinu)), i mam nonstop 0 czy coś inszego, ale jakieś wartości w CHANEL 0,1 i 2 i wszystkie takie same?
    4 Po co jest "Sweep"?
    5 Czy DMA jest niezbędne by odczytywać wartości z maksymalną prędkością np 2msps albo i więcej jeśli użyję tylko 8bit adc?

    Bardziej namieszać nie mogli?
    Czy możecie mi to wytłumaczyć, i dać przykładowy kod ustawień adc w Bascom do czytania wartości z konkretnych pinów, na single ended i differential?

    Kod: text
    Zaloguj się, aby zobaczyć kod

    Ten kod daje w wynikach:
    Bat pot1 i pot2 lekko skaczące 15-18
    CH0RES = ok 16
    CH1RES = ok 12
    CH2RES = 50-78
    CH3RES = 0
    I nie reaguje nic na poruszanie potencjometrami na A1 i A0.
    Czytałem nieco DS, ale tak namieszali że nic nie kumam.
    Proszę odpowiedzcie , przyda się to nie tylko mi.
  • Pomocny post
    #2 10278170
    kchpl
    Poziom 15  
    Witam
    Nie za bardzo znam się na bascomie ale nie wiem czy nie trzeba (w C trzeba) wystartować konwersję dla danego kanału lub kilku na raz
    ad1. Mux jest po to żeby do danego kanału (ch0,ch1,ch2,ch3) podpiąć wewnętrznie dowolny pin (patrz datasheet)
    ad2. kanałów w ADCA jest 4 i każdy ma swój niezależny rejestr z wynikiem ADC_CHxRES
    ad3. wydaje mi się ze w Getadc podajesz numer kanału a nie pinu ale nie znam się na Bascomie
    Polecam notę Atmela avr1300 i ewentualnie (tylko że dla C):
    http://blog.frankvh.com/2010/09/09/followup-to-atmel-xmega-adc-problems/
    http://blog.frankvh.com/2010/01/03/atmel-xmega-adc-problems-solutions/
  • #3 10278347
    Jaca
    Poziom 31  
    Musisz zrobić tak:

    Kod: text
    Zaloguj się, aby zobaczyć kod

    gdzie jako XXXX podstawiasz zapisany binarnie nr pinu portu A. Kolejne kanały dopisujesz powielając ostatnią linijkę zamieniając Ch0 na Ch1 oraz Mux0 na Mux1, itd.

    Odczyt:

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #4 10279110
    jacynka84
    Poziom 26  
    Ok, czyli to jest tak że każdy z 4 kanałów ma własny 4szt Mux, i do tego każdy mux może czytać z pinu 1-8?
    Niestety nadal po waszych poprawkach i mieszaniu w pinach i kanałach nie widzę zbieżności danych które się jednak pojawiają i poruszaniu potencjometrami. Znaczy nie reaguje na nie.
    np utrzymuje stałe 798 przy Intvcc.
    W każdym razie dzięki za odpowiedzi.
  • #5 10279178
    Jaca
    Poziom 31  
    Masz 4 kanały na każdy port (A i B). MUX (multiplekser) mapuje fizyczny pin 0..7 do odpowiedniego kanału. Aby odczytać wartość napięcia z PinA.2 musisz napisać:

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #6 10279329
    jacynka84
    Poziom 26  
    Tak wygląda obecny kod który daje na Pot2 i CH0RES ~177:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Nadal brak reakcji na potencjometr żaden, a wiem ze w miare kręcenia woltaż zmienia się od 0-1V.
    I doszedł bardzo dziwny objaw... jak mam Ch_inp i mux na 0 to...zawartość ekranu znika :| , i nawet nie wiem wtedy czy cały uP pada czy tylko z LCD coś się dzieje.
    Podłączenia sprawdzałem kilka razy i jest ok, jest zasilanie na Avcc i w ogóle.
    Edit:
    To jednak chyba wina tego że użyłem trybu Free a nie Single, ale to też nie wyjaśnia tego objawu.
  • Pomocny post
    #7 10279506
    Jaca
    Poziom 31  
    1. Config Adca daj po Config Graphlcd a nie w pętli Do-Loop
    2. Overclocking zostaw sobie na później jak wszystko ruszy. Daj mu standardowe 32MHz :)
  • #8 10279699
    jacynka84
    Poziom 26  
    Mam wrażenie że wszystko jest ok, tylko z jakiejś zasmarkanej przyczyny nie reaguje na potki, a działają ok, wychodzi z nich od 0 do 1.07V, więc przy max i int1v powinno być albo albo 255, czy tam 4095, a jest 860 i nie reaguje.
    Może z jakiejś przyczyny ciągle czyta mi jakiś badziew z wewnątrz uK?

    Dodano po 1 [minuty]:

    Zmieniłem jest 32Mhz i Config adca poza Do Loop

    Dodano po 16 [minuty]:

    Jeszcze cos
    Cytat:
    MUX (multiplekser) mapuje fizyczny pin 0..7 do odpowiedniego kanału

    Ale sam mux ma też numer np Mux1,2,3, i dalej pin co to za numery przy mux???
    Przecież mówisz że jest 1 mux dla kan A nie 4...nie czaję.

    Dodano po 28 [minuty]:

    Mam już, popełniłeś błąd chyba kolego Jaca: mianowicie gdy usunąłem podkreślniki w Mux1 = &B00001000 to zadziałało, tak mi się wydaje że to to.
    Ten kod daje odczyt z potka na portA1:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Ale jak dokładam drugie Config by i z drugiego czytał to sie coś miesza, znaczy wyniki w CHxRES są ok, ale 2 zmienne np otrzymują tą samą daną...
    Ale to już chyba nie będzie problemem.
    Jeszcze tylko jakoś lepiej zniwelować szum i już.
  • #9 10279983
    Jaca
    Poziom 31  
    jacynka84 napisał:
    Jeszcze cos
    Cytat:
    MUX (multiplekser) mapuje fizyczny pin 0..7 do odpowiedniego kanału

    Ale sam mux ma też numer np Mux1,2,3, i dalej pin co to za numery przy mux???
    Przecież mówisz że jest 1 mux dla kan A nie 4...nie czaję.


    Multiplekser jest jeden (na port A, B) z czterema kanałami. Piny[0..7] z portu A, B wchodzą do MUX a z MUX wychodzą 4 kanały[0..3]. Który pin jest podpięty pod który kanał ustawiasz za pomocą MUXY, gdzie Y to numer kanału.

    Zerknij na 290 stronę Atmel AVR XMEGA A Manual Preliminary. Opis MUXCTRL masz na 310 stronie ww dokumentacji.

    Edit:

    1. To nie błąd tylko możliwość BASCOM'a. Jaką masz wersję ? Pewnie starą ?
    2. Nie dodajesz drugiego Config'a tylko powielasz ostatnią linijkę (tak jak pisałem wcześniej) i dajesz pomiędzy nimi przecinek :)
    3. Niech zgadnę, ustawiasz 0V a masz wartość ok. 200 ? Do poczytania strona 7 z noty AVR1300: Using the Atmel AVR XMEGA ADC. :)
  • #10 10280207
    jacynka84
    Poziom 26  
    Tak to możliwość Baskupy. Mieszam w kanałach i mux jak tylko a Zmienna pot1 i 2 ciągle otrzymują te same dane z CH0RES np oba pokazują 100,
    wahania niskie o 1pkt przy 8bit.
    To ten kod ostatni z tym efektem:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Mam 9.8 ,a co ciekawe demo 2.0 najnowsza zdaje się mi nie działa, znaczy kompiluje się ale nie śmiga nic :/

    Tak powielałem linijkę ale nadal ten sam efekt...

    Pozdrawiam.
  • #11 10280237
    Jaca
    Poziom 31  
    Hehehe, ma być tak:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Podkreślenie na końcu linii (_) służy mi jako przeniesienie aby nie pisać jednej, długiej linii. Jeśli nie działa u Ciebie składnia typu &B0000_0000 to pewnie nie masz też możliwości rozbijania jednej komendy na kilka linii tekstu.

    Edit:

    Dopiero zobaczyłem, że próbowałeś już wpisać 2 kanały w jednej linii ale spróbuj dane kanałów umieścić na końcu, tak jak podałem wyżej. Masz tak starą wersję, że nie wiadomo co Ci jeszcze wywinie. :)
  • #12 10280325
    jacynka84
    Poziom 26  
    Więc co jest nie tak że mi kod z 2.0.7 nie działczy?
    A i zauważyłem że mi działa przeniesienie linię niżej.
  • #13 10280385
    Jaca
    Poziom 31  
    Pokaż jak teraz wygląda kod. Zobaczymy czemu nie działa w 2.0.7.x
  • #14 10280513
    jacynka84
    Poziom 26  
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #15 10280681
    Jaca
    Poziom 31  
    1. Znów Config Adca dałeś w pętli :)
    2. W którym miejscu program się zatrzymuje ? (wstaw znaczniki w program i wyświetlaj je na wyświetlaczu)
    3. Jeśli w ogóle nie chce działać to przejdź na RC 32MHz albo skopiuj ustawienia PLL z SAMPLES\XMEGA
  • #16 10281187
    jacynka84
    Poziom 26  
    Program z wersji 2.0.7 nie startuje w ogóle pomimo że z sampli użyłem wewn 32Mhz jak kazali.
    Ma znaczenie że mam XP?? Programuję klonem AVR isp mkII pod AVRstudio4 .
    To jest tak że jak wgram z wersji 98 to działa, potem wgrywam z nowej wersji i po chwili od wgrania się rozsypuje.
    Po resecie xmegi pusty ekran.
    Obejrzałem hexy z 98 i 20 i widać w nich różnice, właściwie to są zupełnie różne.
    Może to zostawmy, spróbujmy rozdzielić te wyniki, w CHxRES sa ok a po przypisaniu już lipa, jedna zmienna przejmuje wszystkie wyniki jakby.

    Dodano po 1 [minuty]:

    Nie ma znaczenia czy jest w pętli - lipa tak samo :|
  • #17 10283996
    jacynka84
    Poziom 26  
    Inaczej, będzie tylko z ADCA 4 piny, ale nie będą mieszać po prostu zmienna = getadc > zmienna = ADCA_CHxRES.
    Ot i już. Mam nadzieję że to nie stworzy inszych problemów.
  • #18 14636039
    sackoizo
    Poziom 13  
    Mam ten sam problem Adca_ch0_res pokazuje to samo co Adca_ch1_res konfiguracja robiona na wszystkie sposoby. Przykład:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #19 14636231
    jacynka84
    Poziom 26  
    Kod: text
    Zaloguj się, aby zobaczyć kod
    Ten ma dawać ten sam wynik w 4 rejestrach z jednego pinu, uzyskujesz wtedy maksymalną prędkość adc, ale jej nie umiem za bardzo zmierzyć, ale jest to na oko 2MSPS na 8 bit.
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Ten powinien dać różne wyniki z A0-3.
  • #20 14636359
    sackoizo
    Poziom 13  
    Super! a możesz jeszcze podać jak czytasz adc? i czy korzystasz z przerwania?
    Twój kod wkleiłem w bascomowy sampel:"xm128A1_measure_adc_VALUE_unsigned_mode_pina0_FREE.bas" i wartosci sa 0.
    PS: Moja kulpa ;) nie zmieniłem sobie adc 12bit i int1v.
    Działa. Wielkie dzięki.
    Ps2: Szkoda że nie wiesz jak mierzyć ten szybki kod bo potrzeba mi szybkie wyniki w 12bitach.
  • #21 14636487
    jacynka84
    Poziom 26  
    Mogę wiedzieć do czego ci to? Po prostu zmień w kodzie 8bit na 12bit. A odczytuję wprost bez czekania bo i tak jakoś działa: Segx(cx) = Adca_ch0res
    Cx to licznik tablicy.
    A tablica z najszybszą możliwą prędkością
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #22 14636752
    sackoizo
    Poziom 13  
    Nie no jest ok wszystko dziala. odczytuje tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    czy DMA jeszcze przyśpeszy odczyt? tak tylko z ciekawości pytam. Apotrzeba mi do takiego małego projektu rejestratora trzasków (nie pytaj dalej). ;)
  • #23 14636788
    jacynka84
    Poziom 26  
    Set Adca_ch0_intflags.0 jest wg mnie bez sensu. Wystawiasz mu flagę, a to on ma tobie wystawiać ją gdy ma gotowy wynik. Ale w bascom to chyba zbędne. Czytam wprost 200 wyników inkrementując zmienną numeru tablicy i wszystko zdaje się być super. Spowalniasz jedynie w ten sposób na dodatek.
    Co do DMA to musiałbym potestować. Ale niewykluczone że nic nie da, lub da niewiele.
  • #24 14649625
    sackoizo
    Poziom 13  
    A może ktoś wie jak zrobić 10bitowy adc? bo 12 to dla mnie za dużo a 8 za mało.
  • #25 14649694
    jacynka84
    Poziom 26  
    Po zebraniu do tablicy możesz przesunąć każdy wynik w prawo o 2.
  • #26 14649695
    sackoizo
    Poziom 13  
    w takim razie co z ADCL i ADCH? Do czego sie stosuje taki odczyt?
  • #27 14650234
    jacynka84
    Poziom 26  
    To kontroler 8bit...jak chcesz mieć wynik 12 bit jak nie przez składanie 2 bajtów? Znasz się minimalnie czy jesteś początkujący?
    Zresztą w bascom możesz normalnie całe 2 bajty czyli word odczytać jak np przez adca_chaXres, czyli zmienna_typu_word = adca_chaXres, po czym Shift zmienna_typu_word , right , 2
  • #28 14652677
    sackoizo
    Poziom 13  
    Ok dzięki za informacje. Średnio zaawansowany ale wszystkiego nie wiem nawet jeśli to podstawy. Myślę, że temat bedzie bardzo pomocny wszystkim zaczynającym z xmega w bascomie.
REKLAMA