cancel
Showing results for 
Search instead for 
Did you mean: 

stm32f338 ADC problem

ASSAAD.ASSAAD
Associate II
Posted on July 31, 2015 at 14:46

Hello

I have problem with ADC of stm32f3 ; it seems if I read multiple times ; some reading return zero or the old reading ; I read the ADC every 200uSec ; for example delay(200usec) read_adcwill return wrong result or zero but it delay(200usec) read_adc read_adc it gives right reading what I am misising please could you guide ? here is the code :

void ADC_Config(void) 
{ 
unsigned int i; 
ADC_InitTypeDef ADC_InitStructure; 
ADC_CommonInitTypeDef ADC_CommonInitStructure; 
GPIO_InitTypeDef GPIO_InitStructure; 
/* ADC Channel configuration */ 
/* Configure the ADC clock */ 
RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div2); 
/* Enable ADC1 clock */ 
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12, ENABLE); 
/* GPIOC Periph clock enable */ 
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); 
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); 
/* Configure ADC1 Channel2 as analog input */ 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ; 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; 
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; 
GPIO_Init(GPIOB, &GPIO_InitStructure); 
ADC_StructInit(&ADC_InitStructure); 
/* Calibration procedure */ 
ADC_VoltageRegulatorCmd(ADC1, ENABLE); 
/* Insert delay equal to 10 µs */ 
// Delay(10); 
for(i=0;i<0x00ffff;i++); 
ADC_SelectCalibrationMode(ADC1, ADC_CalibrationMode_Single); 
ADC_StartCalibration(ADC1); 
while(ADC_GetCalibrationStatus(ADC1) != RESET ); 
calibration_value = ADC_GetCalibrationValue(ADC1); 
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; 
ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode; 
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; 
ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_OneShot; 
ADC_CommonInitStructure.ADC_TwoSamplingDelay = 0; 
ADC_CommonInit(ADC1, &ADC_CommonInitStructure); 
ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Disable;//ADC_ContinuousConvMode_Enable; 
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; 
ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_0; 
ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_None; 
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; 
ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable; 
ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Disable; 
ADC_InitStructure.ADC_NbrOfRegChannel = 1; 
ADC_Init(ADC1, &ADC_InitStructure); 
/* ADC1 regular channel2 configuration */ 
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_7Cycles5); 
/* Enable ADC1 */ 
ADC_Cmd(ADC1, ENABLE); 
/* wait for ADRDY */ 
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY)); 
} 
//--- 
void ADC_Config_2(void) 
{ 
unsigned int i; 
ADC_InitTypeDef ADC_InitStructure; 
ADC_CommonInitTypeDef ADC_CommonInitStructure; 
GPIO_InitTypeDef GPIO_InitStructure; 
/* ADC Channel configuration */ 
/* Configure the ADC clock */ 
RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div2); 
/* Enable ADC1 clock */ 
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12, ENABLE); 
/* GPIOC Periph clock enable */ 
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); 
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); 
/* Configure ADC1 Channel2 as analog input */ 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 ; 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; 
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; 
GPIO_Init(GPIOA, &GPIO_InitStructure); 
ADC_StructInit(&ADC_InitStructure); 
/* Calibration procedure */ 
ADC_VoltageRegulatorCmd(ADC2, ENABLE); 
/* Insert delay equal to 10 µs */ 
// Delay(10); 
for(i=0;i<0x00ffff;i++); 
ADC_SelectCalibrationMode(ADC2, ADC_CalibrationMode_Single); 
ADC_StartCalibration(ADC2); 
while(ADC_GetCalibrationStatus(ADC2) != RESET ); 
calibration_value_2 = ADC_GetCalibrationValue(ADC2); 
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; 
ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode; 
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; 
ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_OneShot; 
ADC_CommonInitStructure.ADC_TwoSamplingDelay = 0; 
ADC_CommonInit(ADC1, &ADC_CommonInitStructure); 
ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Disable ;//ADC_ContinuousConvMode_Enable; 
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; 
ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_0; 
ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_None; 
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; 
ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable; 
ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Disable; 
ADC_InitStructure.ADC_NbrOfRegChannel = 1; 
ADC_Init(ADC2, &ADC_InitStructure); 
/* ADC2 regular channel2 configuration */ 
ADC_RegularChannelConfig(ADC2, ADC_Channel_2, 1, ADC_SampleTime_7Cycles5); 
/* Enable ADC1 */ 
ADC_Cmd(ADC2, ENABLE); 
/* wait for ADRDY */ 
while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_RDY)); 
} 
int main(void) 
{ 
uint8_t toggle = 0; 
double midvalue = 625; 
uint32_t i; 
float y; 
GPIO_InitTypeDef GPIO_InitStructure; 
/* SysTick end of count event each 1ms */ 
RCC_GetClocksFreq(&RCC_Clocks); 
SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000); 
// SysTick_Config(SystemCoreClock / 1000000); 
/* Allows temporization */ 
init_ports(); 
ADC_Config(); 
ADC_Config_2(); 
while(1) 
{ 
while (1) 
{ 

 delay(); // 200uSEC
/* Test EOC flag */ 
ADC_StartConversion(ADC1); 
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET) 
{ 
} 
/* Get ADC1 converted data */ 
ADC1ConvertedValue = ADC_GetConversionValue(ADC1); 
/* Compute the voltage */ 
ADC1ConvertedVoltage = (ADC1ConvertedValue *3300)/0xFFF; 
ADC_StartConversion(ADC2); 
while(ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC) == RESET) 
{ 
} 
/* Get ADC2 converted data */ 
ADC2ConvertedValue = ADC_GetConversionValue(ADC2); 
/* Compute the voltage */ 
ADC2ConvertedVoltage = (ADC2ConvertedValue *3300)/0xFFF; 
} 
} 
}

Thank you in advanced
0 REPLIES 0