stm32f0, adc, basic single conversion, multiple channel - problem

Jan Waclawek konfera na efton.sk
Čtvrtek Prosinec 8 07:48:55 CET 2016


Aka je hodnota ADC_CHSELR?

wek

----- Original Message ---------------
>DD,
>mam potize ze zprovoznenim ADC na STM32f042. Postupne ctu 4 vstupy
>(2*Externi vstup, 2*Interni). Zrejme je nejaka potiz v casovani nebo
>kontroluji spatne bity pro konec konverze(?) nebot pri cteni kanaly
>vzajemne obcas "preskakuji" (tj. co mam na jednom vstupu ctu najednou na
>jinem).
>Nize prikladam kod, jestli by si nekdo nevsiml kde je chyba.
>(pozn: vsechny priklady pro single conversion od ST (pro std lib) ctou
>opakovane jen jeden vstup)
>Dekuji, T.M.
>
>//*** ADC initialisaion ****************
>static void ADC_Config(void)
>{
>  ADC_InitTypeDef     ADC_InitStructure;
>  GPIO_InitTypeDef    GPIO_InitStructure;
>
>  /* GPIOC Periph clock enable */
>  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
>
>  /* ADC1 Periph clock enable */
>  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
>
>  /* Configure ADC Channels as analog input */
>  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
>  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
>  GPIO_InitStructure.GPIO_Pin = SIGN_EA;  //PA3, GPIO_Pin_3, ADC_Channel_3
>  GPIO_Init(SIGP_EA, &GPIO_InitStructure);
>  /* Configure ADC Channels as analog input */
>  GPIO_InitStructure.GPIO_Pin = SIGN_EB;  //PA2, GPIO_Pin_2, ADC_Channel_2
>  GPIO_Init(SIGP_EB, &GPIO_InitStructure);
>  /* Configure ADC Channels as analog input */
>  GPIO_InitStructure.GPIO_Pin = SIGN_AI0;  //PB0, Nastavo jako AI, neni
>cteno
>  GPIO_Init(SIGP_AI0, &GPIO_InitStructure);
>  /* Configure ADC Channels as analog input */
>  GPIO_InitStructure.GPIO_Pin = SIGN_AI1;  //PB1, Nastavo jako AI, neni
>cteno
>  GPIO_Init(SIGP_AI1, &GPIO_InitStructure);
>
>  /* ADCs DeInit */
>  ADC_DeInit(ADC1);
>
>  /* Initialize ADC structure */
>  ADC_StructInit(&ADC_InitStructure);
>  ADC_ClockModeConfig(ADC1,ADC_ClockMode_AsynClk);
>  ADC_AutoPowerOffCmd(ADC1,DISABLE);
>  /* Configure the ADC1 in continuous mode with a resolution equal to 12
>bits  */
>  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
>  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
>  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 the ADC peripheral */
>  ADC_Cmd(ADC1, ENABLE);
>
>  /* Wait the ADRDY flag */
>  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY));
>
>
>  /* Enable VREF_INT & Temperature channel */
>  ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor ,
>ADC_SampleTime_55_5Cycles);
>  ADC_TempSensorCmd(ENABLE);
>  ADC_ChannelConfig(ADC1, ADC_Channel_Vrefint , ADC_SampleTime_55_5Cycles);
>  ADC_VrefintCmd(ENABLE);
>}
>
>//*** read ADCinput <channel>  ***********
>uint16_t adc_read(ADC_TypeDef* ADCx, uint32_t channel, uint32_t
>ADC_SampleTime) {
>
> /* Configure Channel */
> ADC_ChannelConfig(ADCx, channel, ADC_SampleTime);
>
> /* check if conversion was started, if not start */
> ADC_StartOfConversion(ADCx);
>
> /* wait for end of conversion */
> while((ADC_GetFlagStatus(ADCx, ADC_FLAG_EOC) == RESET));
>
> return ADC_GetConversionValue(ADCx);
>
>}
>
>
>#define ADCSAMPLETIME ADC_SampleTime_28_5Cycles
>
>//****** ....main loop:  ****************************
>....
>a = adc_read(ADC1, ADC_Channel_17, ADCSAMPLETIME); //vref voltage
>b = adc_read(ADC1,ADC_Channel_16,ADCSAMPLETIME); //internal temperature
>c = adc_read(ADC1,SIGA_EB,ADCSAMPLETIME); //analog in, ADC_Channel_2
>d = adc_read(ADC1,SIGA_EA,ADCSAMPLETIME); //analog in, ADC_Channel_3
>.....



Další informace o konferenci Hw-list