关于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();
}

浙公网安备 33010602011771号