关于STM32 在进行ADC采样时,ADCCLK时钟频率的确定

 

一、ADC时钟配置

1、ADC的时钟频率由系统时钟经过PCLK2经过分频后得到:

PCLK2:2分频后得到

            4分频后得到

            6分频后得到

            8分频后得到

2、ADC选择通道x的采样时间

最小为1.5周期,最大为239.5周期

其次还有:7.5周期

              13.5周期

     28.5周期

     41.5周期

        55.5周期

              71.5周期

3、ADC采样总的转换时间Tconver

Tconver=采样时间+12.5个周期

例如:
       当ADCCLK=14MHz和1.5周期的采样时间

      Tconver=(1.5+12.5)*1/14=1us;其中14为ADCCLK

4、例程(采样频率主要由采样点间隔时间决定的)

例如:我们对50Hz的输入信号进行采集。

对此有两种方案:

方案1:

      50Hz信号的周期为20ms,如果在一个周期内采集2500个数据点(注:一周期最少采集20个数据点),每2个采样点间隔为20ms/2500=8us。

如果采用71.5周期的采样时间,则ADC采样周期一周期大小为8/71.5us,则ADC的时钟频率为ADCCLK=1/(8/71.5)=9MHz.

方案2:

  50Hz信号的周期为20ms,如果在一个周期内采集1000个数据点(注:一周期最少采集20个数据点),每2个采样点间隔为20ms/1000=20us。

如果采用239.5周期的采样时间,则ADC采样周期一周期大小为20/239.5us,则ADC的时钟频率为ADCCLK=1/(20/239.5)=12MHz.

5、对于50Hz信号采集程序(DMA模式)如下:

void ADC1_GPIO_Config(void)

{  

  GPIO_InitTypeDef GPIO_InitStructure;    

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1 , ENABLE );  

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE );    

  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;  

  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;  

  GPIO_Init(GPIOC,&GPIO_InitStructure);

}

void ADC1_Mode_Config(void)

{      

  ADC_InitTypeDef ADC_InitStructure;  

  DMA_InitTypeDef DMA_InitStructure;    

  DMA_DeInit(DMA1_Channel1);  

  DMA_InitStructure.DMA_PeripheralBaseAddr=DMA_DIR_PeripheralDST;

  DMA_InitStructure.DMA_PeripheralBaseAddr=  ADC1_DIR_Address;  

  DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&ADC_ConvertedValue;  

  DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;  

  DMA_InitStructure.DMA_BufferSize=1;

   DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;  

  DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Disable;  

  DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;  

  DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;  

  DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;  

  DMA_InitStructure.DMA_Priority=DMA_Priority_High;  

  DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;  

  DMA_Init(DMA1_Channel1,&DMA_InitStructure);    

  ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;

   ADC_InitStructure.ADC_ScanConvMode=DISABLE;

  ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;

  ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;  

  ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;  

  ADC_InitStructure.ADC_NbrOfChannel=1;  

  ADC_Init(ADC1,&ADC_InitStructure);

  RCC_ADCCLKConfig(RCC_PCLK2_Div6);//72MHz/8=9MHz

  ADC_RegularChannelConfig(ADC1,ADC_Channel_11, 1, ADC_SampleTime_239Cycles5 ); 

  ADC_DMACmd(ADC1,ENABLE);

  ADC_Cmd(ADC1,ENABLE);  

  ADC_ResetCalibration(ADC1); 

  while(ADC_GetResetCalibrationStatus(ADC1));

  ADC_StartCalibration(ADC1); 

  while(ADC_GetCalibrationStatus(ADC1)); 

   ADC_SoftwareStartConvCmd(ADC1, ENABLE); 

}

void ADC1_Init(void)

{

   ADC1_GPIO_Config();

   ADC1_Mode_Config();

}

posted @ 2017-05-09 15:26  OliverLL  阅读(4552)  评论(0)    收藏  举报