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?