1. 程式人生 > >ADC多通道逐次轉換(不用DMA)

ADC多通道逐次轉換(不用DMA)

之前看到一篇文章【】原博主用的是規則組間斷模式,但是我參考他的例程自己讀取出來的結果每次都只有最後一通道的值,原因暫時不明。

因為我用的通道不多,就用了一個比較笨的方法。

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;
    }           
  }
}