欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32F1笔记(十一)ADC

程序员文章站 2022-04-01 21:49:41
...

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

STM32F1笔记(十一)ADC

STM32F1笔记(十一)ADC

 

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

 

STM32F1笔记(十一)ADC

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

 

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

举例,用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

STM32F1笔记(十一)ADC

 

STM32F1笔记(十一)ADC

 

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,所以STM32F1笔记(十一)ADC=4096。3.3V为参考电压值,注意不是VCC!

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

STM32F1笔记(十一)ADC

STM32F1笔记(十一)ADC

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

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

STM32F1笔记(十一)ADC

相关标签: STM32 ADC