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



Teraz jest 14 lis 2024, o 20:43


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 0 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