Vícekanálově čtení ADC

Ahoj, píšu program na STM32F0, kde obsluhuji dva senzory (konkrétně na plyny CO a CO2), tudíž potřebuji dva kanály ADC. Vybral jsem si kanál 1 a 4. V mainu mám pouze volání dvou funkcí v nekonečné smyčce:

while(1){
  ZmerCO();
  ZmerCO2();		
}	

void ZmerCO()
	{double ADC1ConvertedValue;
		ADC1->CHSELR |= ADC_CHSELR_CHSEL1;
//AD převod a posílání hodnoty na usart
}

void ZmerCO2()
{double ADC1ConvertedValue;
		ADC1->CHSELR |= ADC_CHSELR_CHSEL4;
//AD převod a posílání hodnoty na usart
}

Vždy na začátku funkce změním kanál pomocí ADC1->CHSELR |= ADC_CHSELR_CHSELx; a pak hodnotu z ADC1 pošlu na USART a na hyperterminal.
Když zakomentuju jednu z těchto dvou funkcí, program normálně běží (v pokojových podmínkách CO hází hodnotu okolo 800 a CO2 okolo 1000 a tyto hodnoty jsou konstatní pokud do senzoru nefouknu nebo něco…).
Ovšem když nechám obě funkce nezakomentované a měřím oba plyny najednou, hyperterminal začne vypisovat nejpodivnější čísla. Například hodnota CO je v jednom měření 700 a hned v dalším 2500 a pak zase třeba 1400. To samé platí pro CO2.

Vím, že toto řešení je primitivní, že bych to měl dělat přes přerušení nebo DMA, ale když už to mám takle, nevíte někdo v čem by mohl být problém? Podle mě procesor nějak nezvládá přepínat kanály, ale proč?

Díky předem za případné odpovědi

Ještě pro doplnění, ADC1 konfigurace:

[code]void ADC1_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure;

/* ADC1 DeInit */
ADC_DeInit(ADC1);

/* ADC1 Periph clock enable */
RCC->APB2ENR |= (1<<9);

/* Initialize ADC structure */
ADC_StructInit(&ADC_InitStructure);

/* Configure the ADC1 in continous mode withe a resolutuion equal to 12 bits */
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
ADC_Init(ADC1, &ADC_InitStructure);

/* ADC Calibration */
ADC_GetCalibrationFactor(ADC1);

/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);

/* Wait the ADCEN falg */
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));

/* ADC1 regular Software Start Conv */
ADC_StartOfConversion(ADC1);
}[/code]

Řekl bych, že je to proto, že :

[code]while(1){
ZmerCO(); // Nastavíš kanál 1 a měříš
ZmerCO2(); // Nastavíš kanál 5 a měříš.
// Od této chvíle už měříš trvale na kanálu 5 …
}

void ZmerCO()
{double ADC1ConvertedValue;
ADC1->CHSELR |= ADC_CHSELR_CHSEL1;
//AD převod a posílání hodnoty na usart
}

void ZmerCO2()
{double ADC1ConvertedValue;
ADC1->CHSELR |= ADC_CHSELR_CHSEL4;
//AD převod a posílání hodnoty na usart
}
[/code]