STM32 ADC

STM32标准库学习笔记-STM32 ADC

ADC简介

  • ADC(Analog-Digital Converter)模拟-数字转换器
  • ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁
  • 12位逐次逼近型ADC,1us转换时间
  • 输入电压范围:0-3.3V,转换结果范围:0-4095
  • 18个输入通道,可测量16个外部和2个内部信号源
  • 规则组和注入组两个转换单元
  • 模拟看门狗自动监测输入电压范围
  • STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道

通道 ADC1 ADC2 ADC3
通道0 PA0 PA0 PA0
通道1 PA1 PA1 PA1
通道2 PA2 PA2 PA2
通道3 PA3 PA3 PA3
通道4 PA4 PA4 PF6
通道5 PA5 PA5 PF7
通道6 PA6 PA6 PF8
通道7 PA7 PA7 PF9
通道8 PB0 PB0 PF10
通道9 PB1 PB1
通道10 PC0 PC0 PC0
通道11 PC1 PC1 PC1
通道12 PC2 PC2 PC2
通道13 PC3 PC3 PC3
通道14 PC4 PC4
通道15 PC5 PC5
通道16 温度传感器
通道17 内部参考电压

转换模式

单次转换,非扫描模式

单次转换,非扫描模式

连续转换,非扫描模式

连续转换,非扫描模式

数据对齐

触发控制

  • AD转换的步骤:采样,保持,量化,编码
  • STM32 ADC的总转换时间为: $$ T_{CONV} = T_{sampling} + 12.5T_{ADC} $$
  • 例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期 $$ T_{CONV} = (1.5 + 12.5)T_{ADC} = 14T_{ADC} = 1μs $$

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//配置时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);

//GPIO配置
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

//ADC配置
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
  
//ADC使能
ADC_Cmd(ADC1, ENABLE);
  
//ADC校准
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1) == SET);
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1) == SET);

//获取值
uint16_t AD_GetValue(uint8_t ADC_Channel)
{
    ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
    return ADC_GetConversionValue(ADC1);
}
  • RCC_ADCCLKConfig函数用于配置ADC时钟分频(ADC最高支持14M时钟)
  • GPIO_InitTypeDef为ADC配置结构体
    • ADC_Mode为ADC模式
    • ADC_DataAlign为数据对齐模式
    • ADC_ExternalTrigConv为外部触发模式
    • ADC_ContinuousConvMode为连续转换使能
    • ADC_ScanConvMode为扫描模式使能
    • ADC_NbrOfChannel为ADC通道数
  • ADC_ResetCalibration函数用于复位ADC校准寄存器
  • ADC_GetResetCalibrationStatus函数用于检查ADC校准寄存器状态
  • ADC_StartCalibration函数用于校准ADC
  • ADC_GetCalibrationStatus函数用于检查ADC校准
  • ADC_RegularChannelConfig函数用于配置规则组通道
    • ADC_Channel为ADC通道:ADC_Channel_x
    • ADC_SampleTime为采样时间
  • ADC_GetFlagStatus函数用于获取ADC标志位
  • ADC_GetConversionValue函数用于获取规则组结果
  • ADC_SoftwareStartConvCmd函数用于软件触发ADC
RCC_PCLK2 描述
RCC_PCLK2_Div2 ((uint32_t)0x00000000) 二分频
RCC_PCLK2_Div4 ((uint32_t)0x00004000) 四分频
RCC_PCLK2_Div6 ((uint32_t)0x00008000) 六分频
RCC_PCLK2_Div8 ((uint32_t)0x0000C000) 八分频
ADC_Mode 描述
ADC_Mode_Independent ((uint32_t)0x00000000) 独立模式
ADC_Mode_RegInjecSimult ((uint32_t)0x00010000) 混合的同步规则+注入同步模式
ADC_Mode_RegSimult_AlterTrig ((uint32_t)0x00020000) 混合的同步规则+交替触发模式
ADC_Mode_InjecSimult_FastInterl ((uint32_t)0x00030000) 混合同步注入+快速交叉模式
ADC_Mode_InjecSimult_SlowInterl ((uint32_t)0x00040000) 混合同步注入+慢速交叉模式
ADC_Mode_InjecSimult ((uint32_t)0x00050000) 注入同步模式
ADC_Mode_RegSimult ((uint32_t)0x00060000) 规则同步模式
ADC_Mode_FastInterl ((uint32_t)0x00070000) 快速交叉模式
ADC_Mode_SlowInterl ((uint32_t)0x00080000) 慢速交叉模式
ADC_Mode_AlterTrig ((uint32_t)0x00090000) 交替触发模式

更多ADC_Mode的相关内容:STM32F10xxx参考手册(中文).pdf 页码163/手册11.9

ADC_DataAlign 描述
ADC_DataAlign_Right ((uint32_t)0x00000000) 右对齐
ADC_DataAlign_Left ((uint32_t)0x00000800) 左对齐
ADC_ExternalTrigConv 描述
ADC_ExternalTrigConv_T1_CC1 ((uint32_t)0x00000000) 内部信号
ADC_ExternalTrigConv_T1_CC2 ((uint32_t)0x00020000) 内部信号
ADC_ExternalTrigConv_T2_CC2 ((uint32_t)0x00060000) 内部信号
ADC_ExternalTrigConv_T3_TRGO ((uint32_t)0x00080000) 内部信号
ADC_ExternalTrigConv_T4_CC4 ((uint32_t)0x000A0000) 内部信号
ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO ((uint32_t)0x000C0000) 外部引脚/内部信号
ADC_ExternalTrigConv_T1_CC3 ((uint32_t)0x00040000) 内部信号
ADC_ExternalTrigConv_None ((uint32_t)0x000E0000) 软件触发
ADC_ExternalTrigConv_T3_CC1 ((uint32_t)0x00000000) 内部信号
ADC_ExternalTrigConv_T2_CC3 ((uint32_t)0x00020000) 内部信号
ADC_ExternalTrigConv_T8_CC1 ((uint32_t)0x00060000) 内部信号
ADC_ExternalTrigConv_T8_TRGO ((uint32_t)0x00080000) 内部信号
ADC_ExternalTrigConv_T5_CC1 ((uint32_t)0x000A0000) 内部信号
ADC_ExternalTrigConv_T5_CC3 ((uint32_t)0x000C0000) 内部信号

前六个与后六个分别对应ADC12和ADC3,第七、八个可用于ADC123 更多外部触发相关内容:STM32F10xxx参考手册(中文).pdf 页码162/手册11.7

ADC_SampleTime 描述
ADC_SampleTime_1Cycles5 ((uint8_t)0x00) Sample time equal to 1.5 cycles
ADC_SampleTime_7Cycles5 ((uint8_t)0x01) Sample time equal to 7.5 cycles
ADC_SampleTime_13Cycles5 ((uint8_t)0x02) Sample time equal to 13.5 cycles
ADC_SampleTime_28Cycles5 ((uint8_t)0x03) Sample time equal to 28.5 cycles
ADC_SampleTime_41Cycles5 ((uint8_t)0x04) Sample time equal to 41.5 cycles
ADC_SampleTime_55Cycles5 ((uint8_t)0x05) Sample time equal to 55.5 cycles
ADC_SampleTime_71Cycles5 ((uint8_t)0x06) Sample time equal to 71.5 cycles
ADC_SampleTime_239Cycles5 ((uint8_t)0x07) Sample time equal to 239.5 cycles
Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计