stm32笔记7 - ADC

Analog-to-Digital Converter

      • 一、stm32f4 ADC基本介绍
        • 1. stm32F4 ADC主要特性
        • 2. 单个ADC框图
        • 3. ADC通道和引脚对应关系
        • 4. ADC引脚
      • 二、stm32 ADC基本概念
        • 1. 通道组
        • 2. ADC时钟
        • 3. 采样时间
        • 4. 单次/连续转换模式
        • 5. 扫描模式
      • 三、ADC编程相关库函数
        • 1. 初始化结构体
      • 四、ADC编程流程

一、stm32f4 ADC基本介绍

1. stm32F4 ADC主要特性

可配置 12 位、10 位、8 位或 6 位分辨率
● 在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断
● 单次和连续转换模式
● 用于自动将通道 0 转换为通道“n”的扫描模式
● 数据对齐以保持内置数据一致性
● 可独立设置各通道采样时间
● 外部触发器选项,可为规则转换和注入转换配置极性
● 不连续采样模式
● 双重/三重模式(具有 2 个或更多 ADC 的器件提供)
● 双重/三重 ADC 模式下可配置的 DMA 数据存储
● 双重/三重交替模式下可配置的转换间延迟
● ADC 转换类型(参见数据手册)
● ADC 电源要求:全速运行时为 2.4 V 到 3.6 V,慢速运行时为 1.8 V
ADC 输入范围:VREF- ≤ VIN ≤ VREF+
● 规则通道转换期间可产生 DMA 请求
VREF- 如果可用(取决于封装),则必须将其连接到 VSSA

2. 单个ADC框图

stm32笔记7 - ADC_第1张图片

3. ADC通道和引脚对应关系

stm32笔记7 - ADC_第2张图片
  从上图可以看出,stm32F4系列有三个ADC控制器(ADC1 / ADC2 / ADC3),每个控制器最多能控制16个通道,三个控制器一共支持24个通道(ADC1和ADC2的16个通道相同,ADC3红色标记的8个通道,16+8=24).
其中144脚芯片因为带PF脚,所以多8个通道,为24个外部通道。小于144脚芯片只有16个外部通道。

4. ADC引脚

stm32笔记7 - ADC_第3张图片
  一般情况下,芯片VDD电压为3.3V,VSS接地,所以相对来说VDDA也为3.3V,VSSA也接地,模拟信号输入(ADCx_IN)不超过VDD3.3V.

二、stm32 ADC基本概念

1. 通道组

  16条复用通道将转换分为两组:规则转换和注入转换。每个组包含一个转换序列(RANK),
  该序列可按任意顺序在任意通道上完成。
规则通道组
  相当正常运行的程序。最多16个通道。
  规则通道和它的转换顺序在 ADC_SQRx 寄存器中选择,规则
组转换的总数应写入ADC_SQR1寄存器的L[3:0]中
注入通道组
  相当于中断。最多4个通道。
  注入组和它的转换顺序在 ADC_JSQR 寄存器中选择。注入组
里转化的总数应写入ADC_JSQR寄存器的L[1:0]中

stm32笔记7 - ADC_第4张图片

2. ADC时钟

stm32笔记7 - ADC_第5张图片
  一般常用第一种时钟方案,但ADC的采样频率不能设置太高,否则会不准,STM32F4 ADC时钟是设为最大32MHz 、STM32F1 最大为 14MHz。
  因此,F1如果按照默认设置PCLK2为72MHz,则ADC时钟应为6分频或者8分频,F4如果按照默认设置PCLK2为84MHz,则ADC时钟应起码为4分频。
  ADC时钟通过 时钟配置寄存器(RCC_CFGR) 配置。

3. 采样时间

stm32笔记7 - ADC_第6张图片

4. 单次/连续转换模式

stm32笔记7 - ADC_第7张图片

5. 扫描模式

stm32笔记7 - ADC_第8张图片

三、ADC编程相关库函数

1. 初始化结构体

ADC中有两个初始化函数需要到初始化结构体,分别为

  • void ADC_CommonInit(ADC_CommonInitTypeDef ADC_CommonInitStruct)*
    这些参数用来配置ADC_CCR寄存器的相关参数
  • void ADC_Init(ADC_TypeDef ADCx, ADC_InitTypeDef ADC_InitStruct)**
 typedef struct 
{
  uint32_t ADC_Mode;                      /*!< 多重ADC模式选择 ADC_Mode_Independent @ref ADC_Common_mode */                                              
  uint32_t ADC_Prescaler;                 /*!< ADC预分频(分频系数) ADC_Prescaler_Div4 @ref ADC_Prescaler */
  uint32_t ADC_DMAAccessMode;             /*!<  DMA访问模式(是否使用DMA) ADC_DMAAccessMode_Disabled @ref ADC_Direct_memory_access_mode_for_multi_mode */
  uint32_t ADC_TwoSamplingDelay;          /*!< 采样周期 (两个采样阶段之间延时)ADC_TwoSamplingDelay_5Cycles 
                                               @ref ADC_delay_between_2_sampling_phases */
}ADC_CommonInitTypeDef;
 typedef struct
{
  uint32_t ADC_Resolution;                /*!< 分辨率 ADC_Resolution_12b @ref ADC_resolution */                                   
  FunctionalState ADC_ScanConvMode;       /*!< 选择单通道还是多通道 set to ENABLE or DISABLE 是否使用扫描模式,对应ADC_CR1位8:SCAN位 */ 
  FunctionalState ADC_ContinuousConvMode; /*!< 选择是否连续转换 set to ENABLE or DISABLE.单次转换OR连续转换,对应ADC_CR2的位1:CONT */
  uint32_t ADC_ExternalTrigConvEdge;      /*!< 选择外部触发方式 ,对应ADC_CR2的位29:28,EXTEN,ADC_ExternalTrigConvEdge_None 
                                               @ref ADC_external_trigger_edge_for_regular_channels_conversion */
  uint32_t ADC_ExternalTrigConv;          /*!< 选择触发事件 ,对应ADC_CR2的位[19:17] :EXTSEL[2:0],ADC_ExternalTrigConv_T1_CC1 
                                               @ref ADC_extrenal_trigger_sources_for_regular_channels_conversion */
  uint32_t ADC_DataAlign;                 /*!< 数据对齐方式 (左对齐/右对齐),对应ADC_CR2的位11:ALIGN,ADC_DataAlign_Right @ref ADC_data_align */
  uint8_t  ADC_NbrOfConversion;           /*!< 规则通道序列长度,对应ADC_SQR1的位[23:20]: L[3:0]
                                               This parameter must range from 1 to 16. */
}ADC_InitTypeDef;

四、ADC编程流程

以ADC1的通道5为例(PA5)

// 1. 开启PA口时钟和ADC1时钟,设置PA1为模拟输入。
	RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  
	GPIO_Init(...);      
     
// 2. 复位ADC1,同时设置ADC1分频因子。
     ADC_DeInit();
     
// 3. 初始化ADC_CCR寄存器。
     ADC_CommonInit(...);
    
// 4. 初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息。
     ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
     
// 5. 使能ADC
     ADC_Cmd(ADC1, ENABLE);
     	
// 6. 配置规则通道参数,提高采样时间可以提高精确度
     ADC_RegularChannelConfig();
     
// 7. 使能指定的ADC1的软件转换启动功能
     ADC_SoftwareStartConv(ADC1);

// 8. 等待转换完成,读取ADC值。
     ADC_GetConversionValue(ADC1);

  • ADC_DeInit() 等效于RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC, ENABLE) ;
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC, DISABLE);
    可参考固件库函数。
  • 步骤的前5步是ADC初始化(准备阶段),步骤6-8为ADC的实现(工作阶段)
  • 如下为采集一次的例程:
/* 
* 获得ADC值
* ch: @ref ADC_channels 
* 通道值 0~16取值范围为:ADC_Channel_0~ADC_Channel_16
* 返回值:转换结果
*/
u16 Get_ADC_Value(u8 ch)   
{
	/* 设置指定ADC的规则组通道,一个序列,采样时间 */
	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles );	//ADC1,ADC通道,480个周期,提高采样时间可以提高精确度
	ADC_SoftwareStartConv(ADC1);		            //使能指定的ADC1的软件转换启动功能 
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )); //等待转换结束
	return ADC_GetConversionValue(ADC1);	        //返回最近一次ADC1规则组的转换结果
}

你可能感兴趣的:(自习笔记)