stm32之ADC

发布于:2025-05-08 ⋅ 阅读:(45) ⋅ 点赞:(0)

img

1.简介

ADC(Analog-Digital Converter)模拟-数字转换器

ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁

12位逐次逼近型ADC,1us转换时间

输入电压范围:03.3V,转换结果范围:04095

18个输入通道,可测量16个外部和2个内部信号源

规则组和注入组两个转换单元

模拟看门狗自动监测输入电压范围

STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道

2.逐次逼近型ADC

先来讲一下ADC0809:

img

这是一个独立的8位逐次逼近型ADC芯片,在以前单片机不是很先进,所以需要外挂一个ADC转换芯片。

  • IN0~IN7是8路输入通道,通过对地址锁存和译码的ADDA、B、C进行输入就可以选择对应的INx输入通道,再对ALE输入一个锁存信号,就能将INx的通道开关给打开。地址锁存和译码和通道选择开关就构成了一个输入通道选择器的功能。而在STM32中的ADC是有18路输入通道的,所以就有个18路输入的多路开关。

  • 选择好对应的输入通道后,怎么去知道其输入的电压对应的编码数据呢?? — 就得靠逐次逼近的方法去一一比较了。

    • 比较器可以去判断两个输入电压的大小关系,一个电压来自输入通道的待测电压,一个电压来自DAC数模转换器而来( 通过SAR给DAC一个数据,就能将其转换为对应模拟信号(比较电压))。
    • 那么怎么去知道待测电压对应的编码,这就需要SAR不断给DAC一个比较电压的编码,DAC转换为电压模拟信号和待测电压进行比较,类似二分查找的方法。第一次比较电压编码取中间值X,经过DAC转换为电压去和待测电压比较,如果大于待测电压,第二次比较电压编码值在0~X取中间值,经过DAC转换继续比较;如果大于待测电压,也是同理。
    • 说白了就是二分查找一直找到和待测电压等近的编码值就是了,所以才叫逐次逼近型DAC。
  • START是输入开始转换信号的

  • CLOCK是ADC时钟,因为ADC是一步一步进行判断的,是需要时钟来推动这个过程。

  • **VREF+VREF-**是DAC的参考电压,SAR给DAC的编码值对应多少V的电压,由这两个决定。通常是和Vcc和GND相连在一起的。


那么接下来可以看看stm32内部的ADC框图:

img

1. 模拟输入

  • ADCx_IN0 ~ ADCx_IN15:这是 16 个模拟输入通道,每个通道可以连接到不同的模拟信号源。每个通道可以配置为常规通道或注入通道。
  • 温度传感器:ADC 内部集成了温度传感器,可以检测芯片的温度。温度传感器的输出可以被 ADC 采样。
  • 基准电压(VREF+ 和 VREF-):用于提供 ADC 的参考电压,决定了 ADC 的采样范围。

2. 模拟多路开关

  • 模拟多路开关(Mux)用于选择 ADC 的输入信号。最多支持 4 个注入通道和 16 个常规通道,选择的通道会传递到 ADC 转换模块。

3. ADC 模块核心功能

  • 常规通道和注入通道:ADC 支持两种通道类型:

    • 常规通道用于定期采样,可用于普通信号的采集。
    • 注入通道用于非定期采样,可以通过外部触发信号或软件触发,适合需要特别关注的信号采样。
  • 数据寄存器

    • 注入通道数据寄存器:每个注入通道有一个 16 位寄存器用于存储采样结果。
    • 常规通道数据寄存器:常规通道的数据会保存在一个 16 位的寄存器中。只能保存最后一个通道的输入数据,一般得配合DMA进行使用,防止结果未送出去就被下一个通道的数据给覆盖

4. 转换时钟与采样控制

  • ADCCLK:这是来自分频器的时钟信号,控制 ADC 的采样速率。ADCCLK 频率可以通过预分频器设置,以满足不同的采样速率要求。貌似只能设置6和8分频,其输入不能超过14MHz

  • 转换控制

    • 常规通道和注入通道的转换可以通过硬件(外部触发)或软件触发启动。
    • 支持连续转换模式单次转换模式,允许灵活配置采样方式。

5. 触发控制

  • 外部触发选择

    • EXTSEL:用于选择常规通道的外部触发源(如 TIM1_CH1、TIM3_TRGO 等),控制常规通道转换的启动。
    • JEXTSEL:用于选择注入通道的外部触发源,控制注入通道转换的启动。
  • 触发控制使能位

    • EXTTRIG:用于启用常规通道的外部触发信号。
    • JEXTTRIG:用于启用注入通道的外部触发信号。

6. 模拟比较器和模拟看门狗

  • 比较器:用于将采样值与设定的阈值进行比较。ADC 支持高/低阈值比较,可以用来检测信号是否超出预定范围。
  • 模拟看门狗(AWD):当采样值超出设定的阈值范围时,触发 AWD 标志,并可通过 AWDIE 使能相应的中断,用于信号异常检测。

7. 中断与状态标志

  • 转换完成标志

    • EOC(End Of Conversion):常规通道转换完成标志。
    • JEOC(Injected End Of Conversion):注入通道转换完成标志。
    • AWD(Analog Watchdog):模拟看门狗触发标志。
  • 中断使能位

    • EOCIE:常规通道转换完成中断使能位。
    • JEOCIE:注入通道转换完成中断使能位。
    • AWDIE:模拟看门狗触发中断使能位。
  • 这些标志位可以通过配置中断传递给 NVIC,从而触发中断服务例程处理相应的事件。

8. DMA 数据传输

  • ADC 支持 DMA 数据流,可以在采样完成后自动将数据传输到内存中,而无需 CPU 干预,提高数据采集的效率。DMA 主要用于常规通道的数据传输。

描述了 ADC 模块的整体结构,包括信号输入、通道选择、触发控制、数据存储、状态监测和中断控制。通过多路开关选择输入信号,进行模数转换后,将采样数据存储到相应的寄存器中,并可通过中断和 DMA 机制实现数据采集和传输。

3.基本结构

img

以规则组,16个输入通道一次只能选一条进行AD转换然后输出到AD数据寄存器

4.输入通道

通道 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 内部参考电压

5.转换模式

单次转换,非扫描模式:

img

单次转换,非扫描模式下,ADC 只对一个通道执行一次转换并停止。这种模式适合采集单个信号源的数据,不需要多通道或连续采样。

工作流程

  • 配置单个通道:指定一个通道,例如通道 1。
  • 单次转换:启动后 ADC 对该通道进行一次转换。
  • 转换完成后停止:转换完成后,ADC 停止工作,不再自动开始新一轮转换。
  • 标志位:转换完成时,设置 EOC(End Of Conversion)标志,可以用于判断转换结束。

应用场景

  • 单次测量:适合偶尔需要测量一个传感器的数据,且不需要连续采集,例如温度传感器的单次读数。
  • 低功耗采样:在需要节省功耗的情况下,仅在必要时启动 ADC,获取一次采样值后停止。

连续转换,非扫描模式:

img

连续转换,非扫描模式下,ADC 会对一个通道进行持续不断的连续转换。它适用于需要实时监测单个信号源的场景。

工作流程

  • 配置单个通道:指定一个通道,例如通道 2。

  • 连续转换:启动后 ADC 会对该通道不断执行转换操作,不间断地采集数据。

  • 标志位和中断

    • 每次转换完成后会生成 EOC 标志,用于通知本次转换结束。
    • 如果开启了 EOC 中断,转换完成时可以触发中断。
  • 数据读取:在每次转换完成后,可以从数据寄存器中读取最新的转换值;如果不及时读取,新的值会覆盖上一个数据。

应用场景

  • 实时信号监控:适合实时监控单个传感器的数据,比如电压、电流等,保证数据连续更新。
  • 信号分析:适用于需要实时分析一个信号源的情况,例如单个通道上的波形信号监控。

单次转换,扫描模式:

img

单次转换,扫描模式下,ADC 会对多个通道依次进行一次转换,然后停止。这种模式适合采集多个通道的瞬时值,但不需要连续采样。

工作流程

  • 配置多通道:指定多个需要采样的通道(例如通道 1、通道 3 和通道 5)。
  • 扫描转换:启动后,ADC 会按照通道序列依次对每个通道进行一次采样。
  • 转换完成后停止:当所有通道都完成一次采样后,ADC 停止工作。
  • 数据存储:每个通道的采样数据依次存入对应的寄存器或 FIFO 中。
  • 标志位:完成所有通道转换后,设置 EOC 标志,表示本次多通道转换结束。

应用场景

  • 多通道采样:适用于需要同时采样多个传感器的瞬时值,例如多个传感器的电压、电流值。
  • 一次性数据获取:用于在某一特定时刻采集多路数据,而无需持续采集。

连续转换,扫描模式:

img

连续转换,扫描模式下,ADC 会对多个通道进行循环、连续的采样,适合需要持续监测多个通道的场景。

工作流程

  • 配置多通道:指定多个需要采样的通道(例如通道 1、通道 2 和通道 4)。

  • 连续扫描转换:启动后,ADC 按照通道序列依次对每个通道进行采样,每一轮扫描完成后自动开始下一轮。

  • 标志位和中断

    • 每次完成所有通道转换后,EOC 标志置位,表示本轮多通道采样结束。
    • 可配置 EOC 中断,告知 CPU 每轮转换完成。
  • 数据存储:每个通道的数据会依次存入 FIFO 或内存;结合 DMA 使用时,可将数据自动传输到内存。

应用场景

  • 多通道实时监控:适合需要实时更新多个信号通道数据的应用,例如多传感器系统中的多路数据采集。
  • 高效数据传输:可以结合 DMA 实现多通道数据自动存储,降低 CPU 负担,提高数据采集效率。

单次转换,非扫描模式:对一个通道采集一次数据,适合单次测量。

连续转换,非扫描模式:对一个通道连续采集,适合实时监控一个信号。

单次转换,扫描模式:对多个通道各采集一次数据,适合一次性采集多路数据。

连续转换,扫描模式:对多个通道进行循环采集,适合多通道的实时监控。

6.触发控制

img

7.数据对齐

img

需要注意的是模拟信号转换后的编码值要注意自己选择的是右对齐还是左对齐模式。如果是左对齐,其数据会比真实数据大16倍。

8.转换时间

AD转换是需要时间的,只不过这个时间是us级别,我们是感知不到。

AD转换的步骤:采样,保持量化,编码。前两个成一组,后两个成一组

  • 采样时间:用于对模拟信号采样的时间。在这段时间内,采样电容充电以获取精确的电压值。采样时间可以通过配置寄存器来设置,不同应用需要不同的采样时间。
  • 转换时间:也称为保持和转换时间。STM32 的 ADC 采用 12 位分辨率,每次 A/D 转换需要 12.5 个 ADC 时钟周期来完成量化和编码的过程。

STM32 ADC的总转换时间为: TCONV = 采样时间 + 12.5个ADC周期

例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期 TCONV = 1.5 + 12.5 = 14个ADC周期 = 1μs

转换时间影响因素 :

  • DCCLK 频率:ADCCLK 是 ADC 的工作时钟频率,通常是系统时钟(APB2)的分频。增大 ADC 时钟频率可以缩短转换时间,但可能会增加功耗和噪声。
  • 采样时间设置:采样时间可根据输入信号的特性进行调整,通常可以选择 1.5、7.5、13.5、28.5、41.5、55.5、71.5、239.5 个周期。对于高速信号,可以选择较短的采样时间,而对于低频信号或高阻抗信号,选择较长的采样时间有助于提高精度。

不同采样时间的应用:

  • 短采样时间:适合低阻抗的模拟信号和高速采样需求,可以提高采样速率。
  • 长采样时间:适合高阻抗的输入信号,或者对采样精度要求高的场景。

7.校准

STM32 的 ADC 内置了一个自校准模式,用于提高 ADC 的转换精度。由于 ADC 内部电容器组的特性会随着温度、工艺差异等因素发生变化,这可能导致一定的准精度误差。校准可以有效地减小这些误差,提高转换结果的准确性。

自校准的过程

  1. 误差修正码计算:在校准过程中,ADC 会对内部电容器组的误差进行测量,并为每个电容器计算出一个误差修正码(数字值)。这个修正码会在之后的每次转换中自动用于补偿误差。
  2. 校准后的转换精度:通过修正码补偿,校准可以大幅度减小因电容器组变化引起的误差,使 ADC 在后续转换中的准确度更高。

校准的操作步骤

  1. ADC 断电:在启动校准之前,必须确保 ADC 处于关电状态(也就是关闭 ADC)。这通常是通过清除 ADC 控制寄存器(如 ADON 位)来实现。
  2. 等待两个 ADC 时钟周期:ADC 关闭后,需等待至少两个 ADC 时钟周期才能启动校准。这段延迟确保 ADC 内部状态稳定,准备好校准。
  3. 启动校准:在满足关电状态和延迟条件后,可以通过设置 CAL 位(通常在 ADC_CR2 控制寄存器中)来启动校准过程。启动校准后,ADC 会自动进行误差修正码的计算。
  4. 等待校准完成:校准过程需要一定时间。在此期间,可以通过检查 CAL 位的状态来判断校准是否完成。当 CAL 位清零时,表示校准已完成,ADC 可以开始正常的转换工作。

校准的建议

通常建议在每次上电后进行一次 ADC 校准,确保在不同环境条件下都能获得稳定的 ADC 准确性。校准只需在上电后执行一次,无需每次转换前都进行校准。

校准的注意事项

  • 上电后校准:在系统每次上电后执行一次校准是较好的做法,因为上电后电路状态可能与断电前不同,校准可确保 ADC 保持最佳状态。
  • 校准时间:校准过程耗时较短,但具体时间依赖于 ADC 时钟频率,通常只需几百微秒至数毫秒。
  • 低功耗应用:对于要求低功耗的应用,校准时的短暂断电可能会影响整体电流消耗,需根据实际需求选择是否在每次启动时执行校准。

10.ADC外围电路

img

第一个是电位器产生可调电压的电路;

第二个是传感器输出电压的电路;

第三个是简单的电压转换电路。

11.api和结构体

11.1 结构体

typedef struct
{
  uint32_t ADC_Mode;                      /*!< Configures the ADC to operate in independent or
                                               dual mode. 
                                               This parameter can be a value of @ref ADC_mode */

  FunctionalState ADC_ScanConvMode;       /*!< Specifies whether the conversion is performed in
                                               Scan (multichannels) or Single (one channel) mode.
                                               This parameter can be set to ENABLE or DISABLE */

  FunctionalState ADC_ContinuousConvMode; /*!< Specifies whether the conversion is performed in
                                               Continuous or Single mode.
                                               This parameter can be set to ENABLE or DISABLE. */

  uint32_t ADC_ExternalTrigConv;          /*!< Defines the external trigger used to start the analog
                                               to digital conversion of regular channels. This parameter
                                               can be a value of @ref ADC_external_trigger_sources_for_regular_channels_conversion */

  uint32_t ADC_DataAlign;                 /*!< Specifies whether the ADC data alignment is left or right.
                                               This parameter can be a value of @ref ADC_data_align */

  uint8_t ADC_NbrOfChannel;               /*!< Specifies the number of ADC channels that will be converted
                                               using the sequencer for regular channel group.
                                               This parameter must range from 1 to 16. */
}ADC_InitTypeDef;

\1. ADC_Mode

uint32_t ADC_Mode;
  • 作用:指定 ADC 的工作模式(独立模式或双 ADC 模式)。

  • 可选值

    • ADC_Mode_Independent: 独立模式(每个 ADC 独立工作,单独进行转换)。
    • ADC_Mode_RegInjecSimult: 规则组和注入组同时转换模式。
    • ADC_Mode_RegSimult_AlterTrig: 规则组同时转换 + 交替触发模式。
    • ADC_Mode_InjecSimult_FastInterl: 注入组同时转换 + 快速交错模式。
    • ADC_Mode_InjecSimult_SlowInterl: 注入组同时转换 + 慢速交错模式。
    • ADC_Mode_FastInterl: 快速交错模式。
    • ADC_Mode_SlowInterl: 慢速交错模式。
    • ADC_Mode_AlterTrig: 交替触发模式。
  • 使用场景:配置单 ADC 工作模式或双 ADC 同步模式(如交错采样、同时采样等)。

  • 示例

ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

\2. ADC_ScanConvMode

FunctionalState ADC_ScanConvMode;
  • 作用:设置是否启用扫描模式。

    • 扫描模式用于多通道采样(规则组),通过自动依次转换配置的多个通道。
  • 可选值

    • ENABLE: 启用扫描模式(用于多通道)。
    • DISABLE: 禁用扫描模式(仅单通道转换)。
  • 使用场景:当规则组中包含多个通道时,需启用扫描模式。

  • 示例

ADC_InitStructure.ADC_ScanConvMode = ENABLE;

\3. ADC_ContinuousConvMode

FunctionalState ADC_ContinuousConvMode;
  • 作用:设置是否启用连续转换模式。

    • 启用后,ADC 在完成一次转换后会自动开始下一次转换,直到手动停止。
  • 可选值

    • ENABLE: 启用连续转换模式。
    • DISABLE: 禁用连续转换模式(单次转换模式)。
  • 使用场景:当需要连续采集信号时(如数据流监测)。

  • 示例

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

\4. ADC_ExternalTrigConv

uint32_t ADC_ExternalTrigConv;
  • 作用:定义启动规则组转换的外部触发源。

  • 可选值(外部触发信号来源):

    • ADC_ExternalTrigConv_T1_CC1: TIM1 捕获比较 1。
    • ADC_ExternalTrigConv_T1_CC2: TIM1 捕获比较 2。
    • ADC_ExternalTrigConv_T1_CC3: TIM1 捕获比较 3。
    • ADC_ExternalTrigConv_T2_CC2: TIM2 捕获比较 2。
    • ADC_ExternalTrigConv_T3_TRGO: TIM3 更新事件。
    • ADC_ExternalTrigConv_T4_CC4: TIM4 捕获比较 4。
    • ADC_ExternalTrigConv_Ext_IT11: 外部中断线 11。
    • ADC_ExternalTrigConv_None: 禁用外部触发(软件触发)。
  • 使用场景:当需要通过外部事件(如定时器或外部信号)触发 ADC 转换时。

  • 示例

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;

\5. ADC_DataAlign

uint32_t ADC_DataAlign;
  • 作用:指定 ADC 转换数据的对齐方式(左对齐或右对齐)。

  • 可选值

    • ADC_DataAlign_Right: 数据右对齐。
    • ADC_DataAlign_Left: 数据左对齐。
  • 说明

    • ADC 输出为 12 位数据,左对齐时,数据存储在高 12 位;右对齐时,数据存储在低 12 位。
  • 使用场景:根据数据处理需求选择对齐方式(如方便移位操作时可用左对齐)。

  • 示例

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

\6. ADC_NbrOfChannel

uint8_t ADC_NbrOfChannel;
  • 作用:指定规则组需要转换的通道数。

  • 取值范围:1 到 16(最多支持 16 个通道)。

  • 说明

    • 必须与规则组中配置的实际通道数量一致,否则会出现不可预测的行为。
    • 通道的具体配置需通过函数 ADC_RegularChannelConfig() 逐一完成。
  • 使用场景:规则组需要采集多个通道的数据时。

  • 示例

ADC_InitStructure.ADC_NbrOfChannel = 4; // 规则组包含 4 个通道

结构体初始化与使用示例

  1. 定义并初始化结构体
ADC_InitTypeDef ADC_InitStructure;
  1. 设置初始化参数
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;               // 独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE;                     // 扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;               // 连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;           // 数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 3;                          // 规则组 3 个通道
  1. 调用初始化函数
ADC_Init(ADC1, &ADC_InitStructure);
  1. 配置通道顺序和采样时间
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_28Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_28Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_28Cycles5);
  1. 启动 ADC
ADC_Cmd(ADC1, ENABLE); // 启用 ADC
ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 开始转换

11.2 api

具体的用法还是建议去参考库函数参考手册

1. ADC_DeInit

void ADC_DeInit(ADC_TypeDef* ADCx);
  • 作用:将指定的 ADC 外设寄存器重置为默认值。

  • 参数

    • ADCx: 指定要重置的 ADC 外设(ADC1ADC2)。
  • 使用场景

    • 在重新初始化 ADC 配置之前调用,确保寄存器处于初始状态。
  • 使用方法

ADC_DeInit(ADC1); // 将 ADC1 寄存器复位到默认值

2. ADC_Init

void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
  • 作用:初始化 ADC 的常规功能配置。

  • 参数

    • ADCx: 要初始化的 ADC 外设。
    • ADC_InitStruct: 指向包含 ADC 配置参数的结构体。
  • 使用场景

    • 配置 ADC 模式、数据对齐方式、扫描模式、触发源等。
  • 结构体说明
    ADC_InitTypeDef 包括以下成员:

    • ADC_Mode: 模式选择(如单 ADC、双 ADC)。
    • ADC_ScanConvMode: 是否启用扫描模式。
    • ADC_ContinuousConvMode: 是否启用连续转换模式。
    • ADC_ExternalTrigConv: 外部触发选择。
    • ADC_DataAlign: 数据对齐(左对齐或右对齐)。
    • ADC_NbrOfChannel: 常规转换通道数。
  • 使用方法

ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure); // 初始化 ADC1

3. ADC_StructInit

void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);
  • 作用:初始化 ADC_InitTypeDef 结构体的默认值。

  • 参数

    • ADC_InitStruct: 要初始化的结构体指针。
  • 使用场景

    • 在用户手动配置之前调用,确保参数有合理的初始值。
  • 使用方法

ADC_InitTypeDef ADC_InitStructure;
ADC_StructInit(&ADC_InitStructure); // 初始化结构体为默认值

4. ADC_Cmd

void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
  • 作用:使能或禁用指定的 ADC 外设。

  • 参数

    • ADCx: 要控制的 ADC 外设。
    • NewState: 设置为 ENABLE(使能)或 DISABLE(禁用)。
  • 使用方法

ADC_Cmd(ADC1, ENABLE); // 使能 ADC1

5. ADC_DMACmd

void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);
  • 作用:使能或禁用 ADC 的 DMA 功能。

  • 参数

    • ADCx: 要配置的 ADC 外设。
    • NewState: 设置为 ENABLE 或 DISABLE。
  • 使用方法

ADC_DMACmd(ADC1, ENABLE); // 使能 ADC1 的 DMA 功能

6. ADC_ITConfig

void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);
  • 作用:配置 ADC 的中断。

  • 参数

    • ADCx: 要配置的 ADC 外设。
    • ADC_IT: 指定中断类型(如 ADC_IT_EOCADC_IT_AWD)。
    • NewState: ENABLE 或 DISABLE。
  • 使用方法

ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE); // 启用 ADC1 的转换结束中断

7. ADC_ResetCalibration

void ADC_ResetCalibration(ADC_TypeDef* ADCx);
  • 作用:重置 ADC 的校准。

  • 参数

    • ADCx: 要重置校准的 ADC 外设。
  • 使用方法

ADC_ResetCalibration(ADC1); // 重置 ADC1 的校准

8. ADC_GetResetCalibrationStatus

FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);
  • 作用:检查校准复位是否完成。

  • 参数

    • ADCx: 要检查的 ADC 外设。
  • 返回值

    • SET: 校准复位尚未完成。
    • RESET: 校准复位已完成。
  • 使用方法

while (ADC_GetResetCalibrationStatus(ADC1) == SET); // 等待复位完成

9. ADC_StartCalibration

void ADC_StartCalibration(ADC_TypeDef* ADCx);
  • 作用:启动 ADC 的校准。

  • 参数

    • ADCx: 要启动校准的 ADC 外设。
  • 使用方法

ADC_StartCalibration(ADC1); // 启动 ADC1 的校准

10. ADC_GetCalibrationStatus

FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);
  • 作用:检查校准是否完成。

  • 返回值

    • SET: 校准尚未完成。
    • RESET: 校准已完成。
  • 使用方法

while (ADC_GetCalibrationStatus(ADC1) == SET); // 等待校准完成

11. ADC_SoftwareStartConvCmd

void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
  • 作用:启动 ADC 的软件触发转换。

  • 参数

    • ADCx: 要触发转换的 ADC 外设。
    • NewState: ENABLE 或 DISABLE。
  • 使用方法

ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 软件触发 ADC1 的转换

12. ADC_GetConversionValue

uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
  • 作用:获取 ADC 转换后的值。

  • 返回值

    • 转换后的 12 位数字值。
  • 使用方法

uint16_t adc_value = ADC_GetConversionValue(ADC1); // 获取 ADC1 的转换值

13. ADC_AnalogWatchdogCmd

void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);
  • 作用:启用或禁用 ADC 模拟看门狗。

  • 参数

    • ADCx: 要配置的 ADC 外设。
    • ADC_AnalogWatchdog: 配置看门狗的模式。
  • 使用方法

ADC_AnalogWatchdogCmd(ADC1, ADC_AnalogWatchdog_SingleRegEnable);

以下是对所有列出的 ADC 函数的详细说明,涵盖作用、参数、返回值及用法,帮助您全面理解每个函数如何工作以及它们在 STM32F101xx 上的使用方式。


14. ADC_GetDualModeConversionValue

uint32_t ADC_GetDualModeConversionValue(void);
  • 作用:用于获取双 ADC 模式下的转换结果。

  • 返回值:返回一个 32 位值,其中:

    • 高 16 位是 ADC2 的转换结果。
    • 低 16 位是 ADC1 的转换结果。
  • 使用场景

    • 双模式采集数据时,使用该函数读取两路数据。
  • 使用方法

uint32_t dual_value = ADC_GetDualModeConversionValue();
uint16_t adc1_value = (uint16_t)(dual_value & 0xFFFF);
uint16_t adc2_value = (uint16_t)(dual_value >> 16);

15. ADC_AutoInjectedConvCmd

void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
  • 作用:启用或禁用自动注入转换模式。

  • 参数

    • ADCx: 指定的 ADC 外设。
    • NewState: 设置为 ENABLE 或 DISABLE。
  • 说明

    • 当启用时,常规组转换完成后,会立即触发注入组的转换。
  • 使用方法

ADC_AutoInjectedConvCmd(ADC1, ENABLE); // 启用 ADC1 的自动注入模式

16. ADC_InjectedDiscModeCmd

void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
  • 作用:启用或禁用注入组的不连续模式。

  • 参数

    • ADCx: 指定的 ADC 外设。
    • NewState: 设置为 ENABLE 或 DISABLE。
  • 说明

    • 当启用时,注入组的通道转换不连续进行。
  • 使用方法

ADC_InjectedDiscModeCmd(ADC1, ENABLE); // 启用注入组不连续模式

17. ADC_ExternalTrigInjectedConvConfig

void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv);
  • 作用:配置注入组的外部触发源。

  • 参数

    • ADCx: 指定的 ADC 外设。
    • ADC_ExternalTrigInjecConv: 外部触发源(如 ADC_ExternalTrigInjecConv_T1_TRGO)。
  • 使用方法

ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_T1_TRGO);

18. ADC_ExternalTrigInjectedConvCmd

void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
  • 作用:启用或禁用注入组的外部触发功能。

  • 参数

    • ADCx: 指定的 ADC 外设。
    • NewState: 设置为 ENABLE 或 DISABLE。
  • 使用方法

ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE); // 启用注入组外部触发

19. ADC_SoftwareStartInjectedConvCmd

void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
  • 作用:启动注入组的软件触发转换。

  • 参数

    • ADCx: 指定的 ADC 外设。
    • NewState: 设置为 ENABLE 或 DISABLE。
  • 使用方法

ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE); // 软件触发注入组转换

20. ADC_GetSoftwareStartInjectedConvCmdStatus

FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx);
  • 作用:检查注入组的软件触发转换是否完成。

  • 返回值

    • SET: 转换正在进行。
    • RESET: 转换已完成。
  • 使用方法

while (ADC_GetSoftwareStartInjectedConvCmdStatus(ADC1) == SET); // 等待注入组转换完成

21. ADC_InjectedChannelConfig

void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
  • 作用:配置注入组的指定通道。

  • 参数

    • ADCx: 指定的 ADC 外设。
    • ADC_Channel: 通道编号。
    • Rank: 通道在注入组中的顺序。
    • ADC_SampleTime: 采样时间。
  • 使用方法

ADC_InjectedChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_7Cycles5);

22. ADC_InjectedSequencerLengthConfig

void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length);
  • 作用:配置注入组的通道序列长度。

  • 参数

    • ADCx: 指定的 ADC 外设。
    • Length: 通道序列的长度(1 到 4)。
  • 使用方法

ADC_InjectedSequencerLengthConfig(ADC1, 2); // 设置注入组长度为 2

23. ADC_SetInjectedOffset

void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset);
  • 作用:设置注入组指定通道的偏移值。

  • 参数

    • ADCx: 指定的 ADC 外设。
    • ADC_InjectedChannel: 注入组通道编号。
    • Offset: 偏移值。
  • 使用方法

ADC_SetInjectedOffset(ADC1, 1, 0x100); // 为注入通道 1 设置偏移值

24. ADC_GetInjectedConversionValue

uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel);
  • 作用:获取注入组指定通道的转换结果。
  • 返回值:注入组通道的 12 位数字值。
  • 使用方法
uint16_t value = ADC_GetInjectedConversionValue(ADC1, 1); // 获取注入通道 1 的值

25. ADC_AnalogWatchdogCmd

void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);
  • 作用:启用或禁用模拟看门狗。

  • 参数

    • ADCx: 指定的 ADC 外设。
    • ADC_AnalogWatchdog: 看门狗模式。
  • 使用方法

ADC_AnalogWatchdogCmd(ADC1, ADC_AnalogWatchdog_SingleRegEnable);

26. ADC_AnalogWatchdogThresholdsConfig

void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold);
  • 作用:配置看门狗的高、低阈值。

  • 参数

    • HighThreshold: 高阈值。
    • LowThreshold: 低阈值。
  • 使用方法

ADC_AnalogWatchdogThresholdsConfig(ADC1, 3000, 1000);

27. ADC_AnalogWatchdogSingleChannelConfig

void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel);
  • 作用:为模拟看门狗指定监控通道。
  • 使用方法
ADC_AnalogWatchdogSingleChannelConfig(ADC1, ADC_Channel_1);

28. ADC_TempSensorVrefintCmd

void ADC_TempSensorVrefintCmd(FunctionalState NewState);
  • 作用:启用或禁用温度传感器和内部参考电压测量。
  • 使用方法
ADC_TempSensorVrefintCmd(ENABLE); // 启用温度传感器和内部参考

29. ADC_GetFlagStatus

FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
  • 作用:检查指定的ADC 标志状态。
  • 返回值SETRESET
  • 使用方法
if (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == SET) {
    // 转换完成
}

30. ADC_ClearFlag

void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
  • 作用:清除指定的 ADC 标志。
  • 使用方法
ADC_ClearFlag(ADC1, ADC_FLAG_EOC); // 清除转换完成标志

12.实验

注意

注意一定要配置ADC的时钟:RCC_ADCCLKConfig函数,ADC的时钟好像最大不能超过14MHz

12.1 AD单通道

📎7-1 AD单通道.zip

img

User:

Hardware:

12.2 AD多通道

📎7-2 AD多通道.zip

img

User:

Hardware: