我需要采集两路ADC分别在AIN5和AIN3,之前发帖说了采用单次扫描模式。但是在我的板子里AIN0----AIN2都作为IO口输出了。而我们的扫描模式是需要把从AIN0到AIN5进行扫描,然后把数据存储在BUFFER里。所以硬件决定了我们这里不可以这样做。 
 
之后采用单次模式,非扫描模式。这里需要在不同时间对ADC进行通道切换。  
 这里是初始化函数。 
    void ADC_Init(void) 
{ 
 
ADC1_Cmd(ENABLE); 
 
ADC1_DeInit(); 
     
/* Init ADC2 peripheral */ 
ADC1_Init(ADC1_CONVERSIONMODE_SINGLE, ADC1_CHANNEL_5, ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE); 
 
ADC1_DataBufferCmd(DISABLE); 
 
ADC1_Cmd(ENABLE); 
 
/* Enable EOC interrupt */ 
ADC1_ITConfig(ADC1_IT_EOCIE,ENABLE); 
     
} 
 
然后在主函数里开启 
 
main 
{ 
。。。。 
    ADC_Init(); 
    TIM4_INIT(); 
    enableInterrupts(); 
    ADC1_StartConversion(); 
 
while(1) 
{ 
。。。。 
} 
 
} 
 
这里的timer4是用于对ADC进行通道切换。 
我们来看tiemer4的初始化: 
    void TIM4_INIT(void) 
    { 
        TIM4_DeInit(); 
         
        TIM4_TimeBaseInit(TIM4_PRESCALER_1, 500); 
 
        TIM4_ITConfig(TIM4_IT_UPDATE,ENABLE); 
         
        TIM4_Cmd(ENABLE); 
        
    } 
 
这里是timer4的中断处理函数。 
@far @interrupt void TIM4_UPD_OVF_IRQHandler(void) 
#else /* _RAISONANCE_ */ 
void TIM4_UPD_OVF_IRQHandler(void) interrupt 23 
#endif /* _COSMIC_ */ 
{ 
    ADC1_Cmd(ENABLE);    
    TIM4_ClearFlag(TIM4_FLAG_UPDATE); 
} 
 
 
我这里的通道切换时在ADC1中断函数里进行的。 
 
@far @interrupt void ADC1_IRQHandler(void) 
#else /* _RAISONANCE_ */ 
void ADC1_IRQHandler(void) interrupt 22 
#endif /* _COSMIC_ */ 
{ 
 
    
ADC1_Cmd(DISABLE);                //关了ADC 
ADC1_ClearFlag(ADC1_FLAG_EOC);    //清理标记位 
 
channelcounter++; 
if(channel=5) 
Conversion_Val =  ADC1_GetConversionValue(); 
else 
XL_CURRETNT    =  ADC1_GetConversionValue();     
 
 
if(channelcounter >= 10) 
{ 
ADC1->CSR &= (uint8_t)(~ADC1_CSR_CH); 
ADC1->CSR |= (uint8_t)(ADC1_CHANNEL_5); 
channelcounter=0; 
channel=5; 
} 
else 
{ 
 
ADC1->CSR &= (uint8_t)(~ADC1_CSR_CH); 
ADC1->CSR |= (uint8_t)(ADC1_CHANNEL_3); 
channel=3; 
 
} 
 
ADC1_Cmd(ENABLE); 
 
  return; 
 
} 
 
我不知道有什么问题,还望大家帮忙看看。 
 
   |   
     
  
 |