ADC模数转换基本原理

一.参考资料

  • 正点原子探索者STM32F4开发板

     《STM32F4开发指南-库函数版本》-第23章 ADC实验
  • STM32F4xx官方资料:
    《STM32F4中文参考手册》-第11章 模数转换(ADC)

二.ADC

Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。

典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。

1.STM32F4x ADC特点

STM32F4x  ADC特点

2.STM32F40x大容量芯片带3个ADC控制器

STM32F40x大容量芯片带3个ADC控制器

其中144脚芯片因为带PF脚,所以多8个通道,为24个外部通道。
小于144脚芯片只有16个外部通道。

3.STM32F40x系列ADC外部通道和引脚对应关系

通道号ADC1ADC2ADC3
通道0PA0PA0PA0
通道1PA1PA1PA1
通道2PA2PA2PA2
通道3PA3PA3PA3
通道4PA4PA4PF6
通道5PA5PA5PF7
通道6PA6PA6PF8
通道7PA7PA7PF9
通道8PB0PB0PF10
通道9PB1PB1PF3
通道10PC0PC0PC0
通道11PC1PC1PC1
通道12PC2PC2PC2
通道13PC13PC13PC13
通道14PC4PC4PF4
通道15PC5PC5PF5

4.ADC引脚

ADC引脚

5.ADC框图

ADC框图

ADC框图(2)

6.STM32通道组

  1. 规则通道组:相当正常运行的程序。最多16个通道。
    规则通道和它的转换顺序在ADC_SQRx寄存器中选择,规则组转换的总数应写入ADC_SQR1寄存器的L[3:0]中
  2. 注入通道组:相当于中断。最多4个通道。
    注入组和它的转换顺序在ADC_JSQR寄存器中选择。注入组里转化的总数应写入ADC_JSQR寄存器的L[1:0]中

通道组

STM32F4的ADC的各通道可以单次,连续,扫描或者间断模式执行。

7.单次转化 VS 连续转换

单次转化

连续转换

8.扫描模式

扫描模式

9.ADC_CR1控制寄存器1

ADC_CR1控制寄存器1

10.ADC中断

ADC中断

11.ADC时钟配置

ADC时钟配置

不要让ADC时钟超过36MHz,否则可能不准。

12.ADC_CCR通用控制寄存器

ADC_CCR通用控制寄存器

13.ADC_CR1寄存器

ADC_CR1寄存器

14.ADC_CR2寄存器

ADC_CR2寄存器(1)

ADC_CR2寄存器(2)

ADC_CR2寄存器(3)

ADC_CR2寄存器(4)

15.数据对齐方式

数据对齐方式

16.ADC_SMPR1寄存器

ADC_SMPR1寄存器

17.ADC_SMPR2寄存器

ADC_SMPR2寄存器

18.ADC的采样时间

ADC的采样时间

最小采样时间0.42us(ADC时钟=36MHz,采样周期为3周期下得到)

19.ADC_SQR1/SQR2/SQR3规则序列寄存器

ADC_SQR1/SQR2/SQR3规则序列寄存器

20.ADC_JSQR注入系列寄存器

ADC_JSQR注入系列寄存器

21.ADC_DR规则通道数据寄存器

ADC_DR规则通道数据寄存器

22.ADC_JDR注入通道数据寄存器

ADC_JDR注入通道数据寄存器

23.ADC_SR状态寄存器

ADC_SR状态寄存器

24.常用库函数

void ADC_CommonInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct);
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
void ADC_DeInit(ADC_TypeDef* ADCx)
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);

25.ADC通用初始化函数ADC_CommonInit

void ADC_CommonInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct);

typedef struct 
{
  uint32_t ADC_Mode;//多重ADC模式选择
 uint32_t ADC_Prescaler;  //ADC预分频                              
  uint32_t ADC_DMAAccessMode;   //DMA访问模式        
  uint32_t ADC_TwoSamplingDelay; //2个采样阶段之间的延迟       
}ADC_CommonInitTypeDef;

这些参数用来配置ADC_CCR寄存器的相关参数

void ADC_CommonInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct)

ADC_CommonInitTypeDef ADC_CommonInitStructure;

ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
 ADC_CommonInitStructure.ADC_TwoSamplingDelay 
                            = ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间的延迟5个时钟
 ADC_CommonInitStructure.ADC_DMAAccessMode 
                            = ADC_DMAAccessMode_Disabled; //DMA失能
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
ADC_CommonInit(&ADC_CommonInitStructure);

26.ADC初始化函数ADC_Init

void ADC_Init(ADC_TypeDef ADCx, ADC_InitTypeDef ADC_InitStruct);

typedef struct
{
 uint32_t ADC_Resolution;//ADC分辨率
  FunctionalState ADC_ScanConvMode; //是否使用扫描模式。ADC_CR1位8:SCAN位 
  FunctionalState ADC_ContinuousConvMode; //单次转换OR连续转换:ADC_CR2的位1:CONT
 uint32_t ADC_ExternalTrigConvEdge; //外部触发使能方式:ADC_CR2的位29:28,EXTEN
 uint32_t ADC_ExternalTrigConv;  //触发方式:ADC_CR2的位[19:17] :EXTSEL[2:0]                
  uint32_t ADC_DataAlign;   //对齐方式:左对齐还是右对齐:ADC_CR2的位11:ALIGN         
  uint8_t ADC_NbrOfChannel;//规则通道序列长度:ADC_SQR1的位[23:20]: L[3:0]       
}ADC_InitTypeDef;

void ADC_Init(ADC_TypeDef ADCx, ADC_InitTypeDef ADC_InitStruct);

ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式    
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐    
ADC_InitStructure.ADC_NbrOfConversion = 1;//1个转换在规则序列中 
ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化

27.ADC使能函数 ADC_Cmd();

void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);

ADC_Cmd(ADC1, ENABLE);    //使能指定的ADC1

28.ADC使能软件转换函数 ADC_SoftwareStartConvCmd

void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx,FunctionalState NewState)

ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能ADC1的软件转换启动

29.ADC 规则通道配置函数ADC_RegularChannelConfig

void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1,ADC_SampleTime_480Cycles);

30.ADC 获取转换结果函数ADC_GetConversionValue

uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);

ADC_GetConversionValue(ADC1);//获取ADC1转换结果

三.实验

实验目的: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(ADC1);
  3. 初始化ADC_CCR寄存器。
    ADC_CommonInit();
  4. 初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息。
    void ADC_Init(ADC_TypeDef ADCx, ADC_InitTypeDef ADC_InitStruct);
  5. 使能ADC。

    ADC_Cmd(ADC1, ENABLE);
  6. 配置规则通道参数:
    ADC_RegularChannelConfig();
  7. 开启软件转换:ADC_SoftwareStartConvCmd(ADC1);
  8. 等待转换完成,读取ADC值。

      ADC_GetConversionValue(ADC1);
最后修改:2020 年 02 月 28 日 03 : 50 PM
如果觉得我的文章对你有用,请随意赞赏