ADC多通道逐次转换(不用DMA)

之前看到一篇文章【STM32F10x_ADC三通道逐次转换(单次、单通道软件触发)】原博主用的是规则组间断模式,但是我参考他的例程自己读取出来的结果每次都只有最后一通道的值,原因暂时不明。


因为我用的通道不多,就用了一个比较笨的方法。


ADC配置如下:

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  
  ADC_DeInit(ADC1);
    
  /* ADC1 configuration ----------*/
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel = 1;
  ADC_Init(ADC1, &ADC_InitStructure);
         
  ADC_Cmd(ADC1, ENABLE);

  ADC_ResetCalibration(ADC1);
  while(ADC_GetResetCalibrationStatus(ADC1));

  ADC_StartCalibration(ADC1);
  while(ADC_GetCalibrationStatus(ADC1)); 

切换并使能ADC通道的函数如下:

void ADC_Time(void)
{
  if(++AdcTime > 10)
  {
    AdcTime = 0;    
    Adc1Flag =~AdcFlag;
    
    if(Adc1Flag) 
    { 
      ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_41Cycles5);     
      ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    }
    else 
    { 
      ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_41Cycles5);
      ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    } 
  } 
}


读取数据在中断子程序中完成:

void ADC_Handler(void)
{
  if(ADC_GetITStatus(ADC1,ADC_IT_EOC) == SET)
  {
    ADC_ClearITPendingBit(ADC1,ADC_IT_EOC);
    
    if(Adc1Flag)
    {
      Value1=ADC_GetConversionValue(ADC1);    
      AdcOverFlag1 = 1;
    }
    else
    {
      Value2=ADC_GetConversionValue(ADC1);
      AdcOverFlag2 = 1;
    }           
  }
}





 
  
 
 

你可能感兴趣的:(STM32)