STM32F1笔记(十一)ADC

查看《STM32中文参考手册》里ADC的介绍和特性

STM32F1笔记(十一)ADC_第1张图片

STM32F1笔记(十一)ADC_第2张图片

 

STM32的ADC最大转换速率为1Mhz,即1us,在ADCCLK=14M,采样周期为1.5个ADC时钟下得到。当ADC的时钟超过14M时,将导致结果准确度下降。

 

STM32F1笔记(十一)ADC_第3张图片

规则通道相当于正常运行的程序。注入通道就相当于中断。因此注入通道的转换可以打断规则通道的转换,在注入通道被转换完成之后,规则通道才得以继续转换。

 

单次、连续、扫描模式的理解

举例,用ADC1规则通道的顺序为CH0,CH1,CH2,CH3。

1、非扫描模式

        在单次转换模式下,启动ADC1,则①开始转换CH0,转换完成后停止,等待ADC的下一次启动,继续从第①步开始转换。

        在连续转换模式下,启动ADC1,则①开始转换CH0,转换完成后回到第①步。

2、扫描模式

        在单次转换模式下,启动ADC1,则

        ①开始转换CH0;

        ②转换完成后自动开始转换CH1;

        ③转换完成后自动开始转换CH2;

        ④转换完成后自动开始转换CH3;

        ⑤转换完成停止,等待ADC的下一次启动下一次ADC启动后从第①步开始转换。

 

        在连续转换模式下,启动ADC1,则

        ①开始转换CH0;

        ②转换完成后自动开始转换CH1;

        ③转换完成后自动开始转换CH2;

        ④转换完成后自动开始转换CH3;

        ⑤转换完成后返回第一步。

 

下面以规则通道的单次转换为例。

STM32F1笔记(十一)ADC_第4张图片

 

STM32F1笔记(十一)ADC_第5张图片

 

ADC初始化配置示例:

void Adc_Init(void)
{ 	
    ADC_InitTypeDef ADC_InitStructure; 
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE );	  
 
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);
                       
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);	

    ADC_DeInit(ADC1);

    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    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值示例:

u16 Get_Adc(u8 ch)   
{

    ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);		    
  
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
	 
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));

    return ADC_GetConversionValue(ADC1);
}

 

通常我们不会直接使用单次采集得到的ADC,而是多采集几次,可以求算术平均值,也可以去掉一个最高值和一个最低值再求算术平均值。这样处理后得到的ADC值更可靠。

代码示例:

u16 Get_Adc_Average(u8 ch, u8 times)
{
    u32 temp_val = 0;
    u8 t;
    for(t = 0; t < times; t++)
    {
        temp_val += Get_Adc(ch);
        delay_ms(5);
    }
    return (temp_val / times);
}

 

获取电压值是ADC常见的应用,计算公式为:U = adc_value * (3.3 / 4096)。 STM32 ADC的分辨率为12,所以2^{12}=4096。3.3V为参考电压值,注意不是VCC!

正点原子战舰开发板ADC参考电压电路如下

STM32F1笔记(十一)ADC_第6张图片

STM32F1笔记(十一)ADC_第7张图片

可以简单理解为VDDA就是ADC的参考电压值,即3.3V。

《STM32中文参考手册》里ADC引脚的定义

STM32F1笔记(十一)ADC_第8张图片

你可能感兴趣的:(STM32F1)