<div dir="ltr">DD,<div>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).</div><div>Nize prikladam kod, jestli by si nekdo nevsiml kde je chyba.</div><div>(pozn: vsechny priklady pro single conversion od ST (pro std lib) ctou opakovane jen jeden vstup)<br></div><div>Dekuji, T.M.</div><div><br></div><div>//*** ADC initialisaion ****************</div><div><div>static void ADC_Config(void)</div><div>{</div><div>  ADC_InitTypeDef     ADC_InitStructure;</div><div>  GPIO_InitTypeDef    GPIO_InitStructure;</div><div><br></div><div>  /* GPIOC Periph clock enable */</div><div>  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);</div><div><br></div><div>  /* ADC1 Periph clock enable */</div><div>  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);</div><div><br></div><div>  /* Configure ADC Channels as analog input */</div><div>  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;</div><div>  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;</div><div>  GPIO_InitStructure.GPIO_Pin = SIGN_EA;  //PA3, GPIO_Pin_3, ADC_Channel_3</div><div>  GPIO_Init(SIGP_EA, &GPIO_InitStructure); </div><div>  /* Configure ADC Channels as analog input */</div><div>  GPIO_InitStructure.GPIO_Pin = SIGN_EB;  //PA2, GPIO_Pin_2, ADC_Channel_2</div><div>  GPIO_Init(SIGP_EB, &GPIO_InitStructure);</div><div>  /* Configure ADC Channels as analog input */</div><div>  GPIO_InitStructure.GPIO_Pin = SIGN_AI0;  //PB0, Nastavo jako AI, neni cteno</div><div>  GPIO_Init(SIGP_AI0, &GPIO_InitStructure);</div><div>  /* Configure ADC Channels as analog input */</div><div>  GPIO_InitStructure.GPIO_Pin = SIGN_AI1;  //PB1, Nastavo jako AI, neni cteno</div><div>  GPIO_Init(SIGP_AI1, &GPIO_InitStructure);</div><div><br></div><div>  /* ADCs DeInit */</div><div>  ADC_DeInit(ADC1);</div><div><br></div><div>  /* Initialize ADC structure */</div><div>  ADC_StructInit(&ADC_InitStructure);</div><div>  ADC_ClockModeConfig(ADC1,ADC_ClockMode_AsynClk);</div><div>  ADC_AutoPowerOffCmd(ADC1,DISABLE);</div><div>  /* Configure the ADC1 in continuous mode with a resolution equal to 12 bits  */</div><div>  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;</div><div>  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;</div><div>  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;</div><div>  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;</div><div>  ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;</div><div>  ADC_Init(ADC1, &ADC_InitStructure);</div><div><br></div><div>  /* ADC Calibration */</div><div>  ADC_GetCalibrationFactor(ADC1);</div><div><br></div><div>  /* Enable the ADC peripheral */</div><div>  ADC_Cmd(ADC1, ENABLE);</div><div><br></div><div>  /* Wait the ADRDY flag */</div><div>  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY));</div><div><br></div><div><br></div><div>  /* Enable VREF_INT & Temperature channel */</div><div>  ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor , ADC_SampleTime_55_5Cycles);</div><div>  ADC_TempSensorCmd(ENABLE);</div><div>  ADC_ChannelConfig(ADC1, ADC_Channel_Vrefint , ADC_SampleTime_55_5Cycles);</div><div>  ADC_VrefintCmd(ENABLE);</div><div>}<br></div></div><div><br></div><div>//*** read ADCinput <channel>  ***********</div><div><div>uint16_t adc_read(ADC_TypeDef* ADCx, uint32_t channel, uint32_t ADC_SampleTime) {<br></div><div><br></div><div> /* Configure Channel */</div><div> ADC_ChannelConfig(ADCx, channel, ADC_SampleTime);</div><div><br></div><div> /* check if conversion was started, if not start */</div><div> ADC_StartOfConversion(ADCx);</div><div><br></div><div> /* wait for end of conversion */</div><div> while((ADC_GetFlagStatus(ADCx, ADC_FLAG_EOC) == RESET));</div><div><br></div><div> return ADC_GetConversionValue(ADCx);</div><div><br></div><div>}</div></div><div><br></div><div><br></div><div>#define ADCSAMPLETIME ADC_SampleTime_28_5Cycles<br></div><div><br></div><div>//****** ....main loop:  ****************************<br></div><div>....</div><div><div>a = adc_read(ADC1, ADC_Channel_17, ADCSAMPLETIME); //vref voltage</div><div>b = adc_read(ADC1,ADC_Channel_16,ADCSAMPLETIME); //internal temperature</div><div>c = adc_read(ADC1,SIGA_EB,ADCSAMPLETIME); //analog in, ADC_Channel_2</div><div>d = adc_read(ADC1,SIGA_EA,ADCSAMPLETIME); //analog in, ADC_Channel_3</div></div><div>.....<br></div></div>