ADC Bug
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2013-05-20 3:17 AM
Posted on May 20, 2013 at 12:17
Hi guys, i use am stm32f0 microcontroller.
I've a problem about the ADC channel 13 (PC3 pin) and PA3 pin.when i connect something to PA3 pin seems that the ADC PC3 pin reads the PA3 pin value.this is my ADC configuration code:void ADC1_Config(void){ ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; /* Abilita Periph clock GPIOC */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); /* Abilita ADC1 Periph clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* Abilita TIM3 Periph clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* Configura ADC Channel11 come ingresso analogico */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN ; GPIO_Init(GPIOC, &GPIO_InitStructure); /* Configurazione TIM3 *******************************************************/ TIM_DeInit(TIM3); TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_OCStructInit(&TIM_OCInitStructure); /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 0xFF; TIM_TimeBaseStructure.TIM_Prescaler = 0x0; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /* Seleziona TIM3 TRGO */ TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update); /* Configurazione ADC1 *******************************************************/ /* Reset ADC */ ADC_DeInit(ADC1); /* Configura l' ADC1 in continous mode con una risoluzione di 12 bit*/ ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T3_TRGO; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward; ADC_Init(ADC1, &ADC_InitStructure); /* Converte l'ADC1 Channel 11 con sampling time pari a 239.5 cicli */ ADC_ChannelConfig(ADC1, ADC_Channel_11 , ADC_SampleTime_28_5Cycles ); ADC_ChannelConfig(ADC1, ADC_Channel_13 , ADC_SampleTime_28_5Cycles); /* Calibrazione ADC */ ADC_GetCalibrationFactor(ADC1); ADC_WaitModeCmd(ADC1, ENABLE); ADC_AutoPowerOffCmd(ADC1, ENABLE); /* Abilita l'ADC */ ADC_Cmd(ADC1, ENABLE); /* Attesa per il flag ADCEN */ while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN)); /* Abilita counter TIM2 */ TIM_Cmd(TIM3, ENABLE); /* Avvia conversione software regolare dell' ADC1 */ ADC_StartOfConversion(ADC1);}every x seconds starts a timer routine that calls the adc reading functionthese reading function is:void LeggiADC(void){ static short value=0;//indica quale variabile deve essere salvata dall'ADC /* Acquisizione dati convertiti dll'ADC1 */ ADC1ConvertedValue = ADC_GetConversionValue(ADC1); value++; /* Calcolo della tensione del sensore di luminosit� */ if (value==1){ mVLux = ((ADC1ConvertedValue * mV_VDDA_ref)/0xFFF); }else if (value==2){ /* Calcolo della tensione del sensore di temperatura */ mVTemp = ((ADC1ConvertedValue * mV_VDDA_ref)/0xFFF); value=0; } if(( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6))==SET){ NewSP=mVDAC; KTaratura= (float)(LUX)/2; EE_WriteVariable(0x6011, KTaratura); } }if i connect pin PA3 to 3V, the mVTemp value is 3V... why? #adc-problem
Labels:
- Labels:
-
ADC
This discussion is locked. Please start a new topic to ask your question.
2 REPLIES 2
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2013-05-20 5:20 AM
Posted on May 20, 2013 at 14:20 ciao ;) is your ADC pin left floating? if yes, it is normal to have random reading influenced by external ambient. you should connect the pin with a pull-down or a pull-up. Once you have connected your sensors, these pull-up/pull-down normally can be eliminated, but you should look at your sensor's datasheet.
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2013-05-25 10:57 AM
Posted on May 25, 2013 at 19:57
Try something LIKE this way:
short value=0;//indica quale variabile deve essere salvata dall'ADC void LeggiADC(void) { /* Acquisizione dati convertiti dll'ADC1 */ ADC1ConvertedValue = ADC_GetConversionValue(ADC1); value++; /* Calcolo della tensione del sensore di luminosità */ if (value==1){ mVLux = ((ADC1ConvertedValue * mV_VDDA_ref)/0xFFF); }else if (value==2){ /* Calcolo della tensione del sensore di temperatura */ mVTemp = ((ADC1ConvertedValue * mV_VDDA_ref)/0xFFF); value=0; } if(( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6))==SET){ NewSP=mVDAC; KTaratura= (float)(LUX)/2; EE_WriteVariable(0x6011, KTaratura); } }