Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 18 kwi 2025, o 14:50


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 2 ] 
    Autor Wiadomość
     Tytuł: Xmega128A3U
    PostNapisane: 6 lis 2013, o 19:13 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 29 cze 2012
    Posty: 95
    Lokalizacja: Nowa Sól
    Pomógł: 1

    Witajcie,
    bardzo Was proszę o pomoc. Mam problem z ADC w mikrokontrolerze Xmega. Muszę co 5ms dokonać pomiaru wszystkich 16 wejść. Niestety nie ogarniam jeszcze Xmeg, ale jakoś cały program sobie napisałem, poza właśnie ADC. Z tego co udało mi się zrozumieć, to chcę użyć trybu single ended. Jednak mam problem z inicjalizacją. O to co udało mi się stworzyć:
    Kod:
    ADCA.CTRLB=ADC_RESOLUTION_8BIT_gc; //tryb 8 bit
    (analogicznie dla ADCB)
    Kod:
    ADCA.REFCTRL=ADC_REFSEL_VCC_gc;   //napięcie odniesienia to VCC/1,6

    Kod:
    ADCA.PRESCALER=ADC_PRESCALER_DIV256_gc;   //prescaler 256
    co przy taktowaniu 32MHz powinno mi dać 125kHz

    Niestety nie wiem co dalej...

    ------------------------ [ Dodano po: 32 minutach ]

    Udało mi się na podstawie zebranych informacji napisać taką funkcję inicjalizacyjną:
    Kod:
    void ADC_init(void)
    {
       ADCA.CTRLB = ADC_RESOLUTION_8BIT_gc;   //tryb 8 bit
       ADCA.REFCTRL = ADC_REFSEL_VCC_gc | 0x02;   /* Internal VCC / 1.6 */   //| 0x02;
       ADCA.PRESCALER = ADC_PRESCALER_DIV256_gc;   //prescaler 256, f=125kHz
       ADCA.CTRLA |= ADC_ENABLE_bm;   //enable ADC
       
       ADCB.CTRLB = ADC_RESOLUTION_8BIT_gc;   //tryb 8 bit
       ADCB.REFCTRL = ADC_REFSEL_VCC_gc | 0x02;   /* Internal VCC / 1.6 */   //| 0x02;
       ADCB.PRESCALER = ADC_PRESCALER_DIV256_gc;   //prescaler 256, f=125kHz
       ADCB.CTRLA |= ADC_ENABLE_bm;   //enable ADC
    }


    Oraz taką funkcję odczytu(trzeba będzie zrobić drugą identyczną, tylko, że dla pinów 4-7 oraz 12-15):
    Kod:
    void ADC_odczyt1(void)
    {
       ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;    // single ended
       ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN0_gc;    // PORTA:0
       
       ADCA.CH1.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;
       ADCA.CH1.MUXCTRL = ADC_CH_MUXPOS_PIN1_gc;
       
       ADCA.CH2.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;
       ADCA.CH2.MUXCTRL = ADC_CH_MUXPOS_PIN2_gc;
       
       ADCA.CH3.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;
       ADCA.CH3.MUXCTRL = ADC_CH_MUXPOS_PIN3_gc;   
       
       ADCA.CH0.CTRL |= ADC_CH_START_bm; // start conversion on channel 0
       ADCA.CH1.CTRL |= ADC_CH_START_bm;
       ADCA.CH2.CTRL |= ADC_CH_START_bm;
       ADCA.CH3.CTRL |= ADC_CH_START_bm;
       
       
       ADCB.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;    // single ended
       ADCB.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN8_gc;    // PORTA:0
       
       ADCB.CH1.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;
       ADCB.CH1.MUXCTRL = ADC_CH_MUXPOS_PIN9_gc;
       
       ADCB.CH2.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;
       ADCB.CH2.MUXCTRL = ADC_CH_MUXPOS_PIN10_gc;
       
       ADCB.CH3.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;
       ADCB.CH3.MUXCTRL = ADC_CH_MUXPOS_PIN11_gc;
       
       ADCB.CH0.CTRL |= ADC_CH_START_bm; // start conversion on channel 0
       ADCB.CH1.CTRL |= ADC_CH_START_bm;
       ADCB.CH2.CTRL |= ADC_CH_START_bm;
       ADCB.CH3.CTRL |= ADC_CH_START_bm;
       
       while((!ADCA.CH0.INTFLAGS) && (!ADCA.CH1.INTFLAGS) && (!ADCA.CH2.INTFLAGS) && (!ADCA.CH3.INTFLAGS));
       while((!ADCB.CH0.INTFLAGS) && (!ADCB.CH1.INTFLAGS) && (!ADCB.CH2.INTFLAGS) && (!ADCB.CH3.INTFLAGS));

    //odczytanie wartości: Result = ADCA.CH0RES; i analogicznie dla kanału 1,2 i 3 oraz z ADCB
       
    }

    Bardzo proszę o sprawdzenie kodu, przez kogoś kto już maił styczność z Xmegami. Czy dobrze rozumiem, że mogę jednocześnie dokonywać pomiaru na 4 kanałach ADCA i 4 kanałach ADCB?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
     Tytuł: Re: Xmega128A3U
    PostNapisane: 7 lis 2013, o 10:30 
    Offline
    Nowy

    Dołączył(a): 17 gru 2012
    Posty: 17
    Pomógł: 1

    Kodu dokładnie nie sprawdzałem, ale w Xmegach trzeba załadować wartość "kalibracyjną" przed startem ADC. Tego w kodzie nie widzę.
    Jest to opisane w dokumencie AVR1300.

    Pozdrawiam


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 2 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO