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

Konfiguracja ADC - tryb różnicowy bez wzmocnienia - XMEGA

Zuberekk 30 Maj 2019 13:54 474 2
REKLAMA
  • #1 17988321
    Zuberekk
    Poziom 9  
    Posty: 6
    Ocena: 1
    Dzień dobry.

    Mam problem z konfiguracją ADC w XMEGA256A3BU na płytce testowej xplained. Chcę uruchomić ADC w trybie różnicowym bez wzmocnienia i dokonywać pomiaru na pinie nr 4 względem masy. Napięcia na pinie jest regulowane z pomocą potencjometru.
    Gdy kompiluję ten program w AtmelStudio7 nie otrzymuję żadnych błędów. Gdy wgram program do uC nic się nie dzieje. Diody nie mrugają w ogóle. Analizując linijka po linijce doszedłem do wniosku, że program blokuje się w momencie pętli:

    Cytat:
    while(!(ADCA_CH0_INTFLAGS & ADC_CH_CHIF_bm)); //czekanie na koniec pomiaru


    Nie wiem czy to dlatego, że może pomiar w ogóle nie startuje?Gdyby ktoś zauważył jakieś nieprawidłowości w programie lub błędy bardzo prosiłbym o wskazanie ich lub pomoc.

    Kod w języku C:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Schemat:
    Konfiguracja ADC - tryb różnicowy bez wzmocnienia - XMEGA
  • REKLAMA
  • #2 17988335
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    Problemem jest :
    ADCA_CTRLA = ADC_CH0START_bm; //start pomiaru
    które zeruje bit enable w tym rejestrze, w efekcie blokujesz ADC, więc pomiar nie może się zakończyć. Zapewne chciałeś dać |=.
  • #3 17988352
    Zuberekk
    Poziom 9  
    Posty: 6
    Ocena: 1
    Dziękuję za szybką odpowiedź. Zastosowanie:
    tmf napisał:
    Zapewne chciałeś dać |=.

    nie pomogło.

    Teraz jest tak:
    ADCA_CTRLA |= ADC_CH0START_bm; //start pomiaru
    i ADC nadal nie działa.

    Zastawiam się czy może sama konfiguracja w ADC_init() nie jest błędnie wykonana. Zastanawia mnie szczególnie:

    ADCA_CH0_MUXCTRL= ADC_CH_MUXNEG_GND_MODE3_gc; //ustawienie GND na wejscie odwracające

    Do wyboru miałem GND_MODE3 i GND_MODE4. Nie wiem czym to się różni i może gdzieś tutaj popełniłem błąd.
    ______________________________________________________

    W pętli głównej main() zabrakło funkcji ADC_Init(). Po dodaniu jej, dioda na PIN0 zaczyna mrugać. Domyślam się, że w takim przypadku inicjalizacja jak i pomiar przechodzi. Niestety regulacja potencjometrem nie sprawia, że układ zachowuje się tak jakbym chciał- ciągle miga dioda0. Wynika z tego, że inicjalizacja jak i pomiar działa, ale wynik zawsze jest mniejszy niż 1000. Może ja nie rozumiem w jakich przedziałach znajduje się wynik, ale jest to chyba 0-2048 dla 0-1.65V, tak?

    Dodano po 10 [godziny] 49 [minuty]:

    Celem wyeliminowania potencjalnych błędów przetestowałem analogiczny program tyle, że dla komparatora. Porównuję nim napięcie na PIN4 względem napięcia wewnętrznego 1V. Program działa.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jeżeli ktoś ma pomysł co mogę źle robić w programie z przetwornikiem ADC, to prosiłbym o wskazówkę.

    Łukasz.

    Dodano po 1 [godziny] 35 [minuty]:

    Postanowiłem spróbować skonfigurować ADC jeszcze raz. Tym razem skonfigurowałem go w trybie signed single-ended. Funkcję ADC_wynik skopiowałem z książki "Układy Peryferyjne" T. Francuza.
    Kod działa, więc wklejam go dla potomnych. Schemat jak w pierwszym poście.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Gdyby ktoś mimo to znalazł w czym leżał problem prosiłbym o wiadomość.
REKLAMA