stm32之ADC

[复制链接]
发表于 2025-9-17 19:07:29 | 显示全部楼层 |阅读模式

1.简介

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

先来讲一下ADC0809:

这是一个独立的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框图:

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.根本布局


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

通道ADC1ADC2ADC3通道0PA0PA0PA0通道1PA1PA1PA1通道2PA2PA2PA2通道3PA3PA3PA3通道4PA4PA4PF6通道5PA5PA5PF7通道6PA6PA6PF8通道7PA7PA7PF9通道8PB0PB0PF10通道9PB1PB1通道10PC0PC0PC0通道11PC1PC1PC1通道12PC2PC2PC2通道13PC3PC3PC3通道14PC4PC4通道15PC5PC5通道16温度传感器通道17内部参考电压5.转换模式

单次转换,非扫描模式:

单次转换,非扫描模式下,ADC 只对一个通道实行一次转换并制止。这种模式得当收罗单个信号源的数据,不必要多通道或一连采样。
工作流程


  • 设置单个通道:指定一个通道,比方通道 1。
  • 单次转换:启动后 ADC 对该通道举行一次转换。
  • 转换完成后制止:转换完成后,ADC 制止工作,不再主动开始新一轮转换。
  • 标记位:转换完成时,设置 EOC(End Of Conversion)标记,可以用于判定转换竣事。
应用场景


  • 单次丈量:得当偶尔必要丈量一个传感器的数据,且不必要一连收罗,比方温度传感器的单次读数。
  • 低功耗采样:在必要节流功耗的情况下,仅在必要时启动 ADC,获取一次采样值后制止。

一连转换,非扫描模式:

一连转换,非扫描模式下,ADC 会对一个通道举行一连不停的一连转换。它实用于必要实时监测单个信号源的场景。
工作流程


  • 设置单个通道:指定一个通道,比方通道 2。
  • 一连转换:启动后 ADC 会对该通道不停实行转换操纵,不间断地收罗数据。
  • 标记位和停止


    • 每次转换完成后会天生 EOC 标记,用于关照本次转换竣事。
    • 假如开启了 EOC 停止,转换完成时可以触发停止。

  • 数据读取:在每次转换完成后,可以从数据寄存器中读取最新的转换值;假如不实时读取,新的值会覆盖上一个数据。
应用场景


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

单次转换,扫描模式:

单次转换,扫描模式下,ADC 会对多个通道依次举行一次转换,然后制止。这种模式得当收罗多个通道的瞬时值,但不必要一连采样。
工作流程


  • 设置多通道:指定多个必要采样的通道(比方通道 1、通道 3 和通道 5)。
  • 扫描转换:启动后,ADC 会按照通道序列依次对每个通道举行一次采样。
  • 转换完成后制止:当全部通道都完成一次采样后,ADC 制止工作。
  • 数据存储:每个通道的采样数据依次存入对应的寄存器或 FIFO 中。
  • 标记位:完成全部通道转换后,设置 EOC 标记,体现本次多通道转换竣事。
应用场景


  • 多通道采样:实用于必要同时采样多个传感器的瞬时值,比方多个传感器的电压、电流值。
  • 一次性数据获取:用于在某一特定时候收罗多路数据,而无需一连收罗。

一连转换,扫描模式:

一连转换,扫描模式下,ADC 会对多个通道举行循环、一连的采样,得当必要一连监测多个通道的场景。
工作流程


  • 设置多通道:指定多个必要采样的通道(比方通道 1、通道 2 和通道 4)。
  • 一连扫描转换:启动后,ADC 按照通道序列依次对每个通道举行采样,每一轮扫描完成后主动开始下一轮。
  • 标记位和停止


    • 每次完成全部通道转换后,EOC 标记置位,体现本轮多通道采样竣事。
    • 可设置 EOC 停止,告知 CPU 每轮转换完成。

  • 数据存储:每个通道的数据会依次存入 FIFO 或内存;结合 DMA 使用时,可将数据主动传输到内存。
应用场景


  • 多通道实时监控:得当必要实时更新多个信号通道数据的应用,比方多传感器体系中的多路数据收罗。
  • 高效数据传输:可以结合 DMA 实现多通道数据主动存储,低落 CPU 负担,进步数据收罗服从。

单次转换,非扫描模式:对一个通道收罗一次数据,得当单次丈量。
一连转换,非扫描模式:对一个通道一连收罗,得当实时监控一个信号。
单次转换,扫描模式:对多个通道各收罗一次数据,得当一次性收罗多路数据。
一连转换,扫描模式:对多个通道举行循环收罗,得当多通道的实时监控。
6.触发控制


7.数据对齐


必要留意的是模拟信号转换后的编码值要留意自己选择的是右对齐照旧左对齐模式。假如是左对齐,其数据会比真实数据大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 内部电容器组的特性会随着温度、工艺差异等因素发生厘革,这大概导致肯定的准精度弊端。校准可以有效地减小这些弊端,进步转换结果的正确性。
自校准的过程

  • 弊端修正码盘算:在校准过程中,ADC 会对内部电容器组的弊端举行丈量,并为每个电容器盘算出一个弊端修正码(数字值)。这个修正码会在之后的每次转换中主动用于赔偿弊端。
  • 校准后的转换精度:通过修正码赔偿,校准可以大幅度减小因电容器组厘革引起的弊端,使 ADC 在后续转换中的正确度更高。
校准的操纵步骤

  • ADC 断电:在启动校准之前,必须确保 ADC 处于关电状态(也就是关闭 ADC)。这通常是通过扫除 ADC 控制寄存器(如 ADON 位)来实现。
  • 等待两个 ADC 时钟周期:ADC 关闭后,需等待至少两个 ADC 时钟周期才华启动校准。这段延长确保 ADC 内部状态稳固,预备好校准。
  • 启动校准:在满足关电状态和延长条件后,可以通过设置 CAL 位(通常在 ADC_CR2 控制寄存器中)来启动校准过程。启动校准后,ADC 会主动举行弊端修正码的盘算。
  • 等待校准完成:校准过程必要肯定时间。在此期间,可以通过查抄 CAL 位的状态来判定校准是否完成。当 CAL 位清零时,体现校准已完成,ADC 可以开始正常的转换工作。
校准的发起
通常发起在每次上电后举行一次 ADC 校准,确保在差别情况条件下都能得到稳固的 ADC 正确性。校准只需在上电后实行一次,无需每次转换前都举行校准。
校准的留意事项


  • 上电后校准:在体系每次上电后实行一次校准是较好的做法,因为上电后电路状态大概与断电前差别,校准可确保 ADC 保持最佳状态。
  • 校定时间:校准过程耗时较短,但详细时间依靠于 ADC 时钟频率,通常只需几百微秒至数毫秒。
  • 低功耗应用:对于要求低功耗的应用,校定时的短暂断电大概会影响团体电流斲丧,需根据现实需求选择是否在每次启动时实行校准。
10.ADC外围电路


第一个是电位器产生可调电压的电路;
第二个是传感器输出电压的电路;
第三个是简单的电压转换电路。
11.api和布局体

11.1 布局体

  1. typedef struct
  2. {
  3.   uint32_t ADC_Mode;
  4.                       /*!< Configures the ADC to operate in independent or
  5.                                                dual mode.
  6.                                                This parameter can be a value of @ref ADC_mode */
  7.   FunctionalState ADC_ScanConvMode;
  8.        /*!< Specifies whether the conversion is performed in
  9.                                                Scan (multichannels) or Single (one channel) mode.
  10.                                                This parameter can be set to ENABLE or DISABLE */
  11.   FunctionalState ADC_ContinuousConvMode;
  12. /*!< Specifies whether the conversion is performed in
  13.                                                Continuous or Single mode.
  14.                                                This parameter can be set to ENABLE or DISABLE. */
  15.   uint32_t ADC_ExternalTrigConv;
  16.           /*!< Defines the external trigger used to start the analog
  17.                                                to digital conversion of regular channels. This parameter
  18.                                                can be a value of @ref ADC_external_trigger_sources_for_regular_channels_conversion */
  19.   uint32_t ADC_DataAlign;
  20.                  /*!< Specifies whether the ADC data alignment is left or right.
  21.                                                This parameter can be a value of @ref ADC_data_align */
  22.   uint8_t ADC_NbrOfChannel;
  23.                /*!< Specifies the number of ADC channels that will be converted
  24.                                                using the sequencer for regular channel group.
  25.                                                This parameter must range from 1 to 16. */
  26. }ADC_InitTypeDef;
复制代码
\1. ADC_Mode
  1. 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 同步模式(如交错采样、同时采样等)。
  • 示例
  1. ADC_InitTypeDef ADC_InitStructure;
  2. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
复制代码

\2. ADC_ScanConvMode
  1. FunctionalState ADC_ScanConvMode;
复制代码


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


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

  • 可选值


    • ENABLE: 启用扫描模式(用于多通道)。
    • DISABLE: 禁用扫描模式(仅单通道转换)。

  • 使用场景:当规则组中包罗多个通道时,需启用扫描模式。
  • 示例
  1. ADC_InitStructure.ADC_ScanConvMode = ENABLE;
复制代码

\3. ADC_ContinuousConvMode
  1. FunctionalState ADC_ContinuousConvMode;
复制代码


  • 作用:设置是否启用一连转换模式。


    • 启用后,ADC 在完成一次转换后会主动开始下一次转换,直得手动制止。

  • 可选值


    • ENABLE: 启用一连转换模式。
    • DISABLE: 禁用一连转换模式(单次转换模式)。

  • 使用场景:当必要一连收罗信号时(如数据流监测)。
  • 示例
  1. ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
复制代码

\4. ADC_ExternalTrigConv
  1. 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 转换时。
  • 示例
  1. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
复制代码

\5. ADC_DataAlign
  1. uint32_t ADC_DataAlign;
复制代码


  • 作用:指定 ADC 转换数据的对齐方式(左对齐或右对齐)。
  • 可选值


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

  • 阐明


    • ADC 输出为 12 位数据,左对齐时,数据存储在高 12 位;右对齐时,数据存储在低 12 位。

  • 使用场景:根据数据处置处罚需求选择对齐方式(如方便移位操纵时可用左对齐)。
  • 示例
  1. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
复制代码

\6. ADC_NbrOfChannel
  1. uint8_t ADC_NbrOfChannel;
复制代码


  • 作用:指定规则组必要转换的通道数。
  • 取值范围:1 到 16(最多支持 16 个通道)。
  • 阐明


    • 必须与规则组中设置的现实通道数目同等,否则会出现不可猜测的举动。
    • 通道的详细设置需通过函数 ADC_RegularChannelConfig() 逐一完成。

  • 使用场景:规则组必要收罗多个通道的数据时。
  • 示例
  1. ADC_InitStructure.ADC_NbrOfChannel = 4; // 规则组包含 4 个通道
复制代码

布局体初始化与使用示例

  • 界说并初始化布局体
  1. ADC_InitTypeDef ADC_InitStructure;
复制代码

  • 设置初始化参数
  1. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;               // 独立模式ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  2.                      // 扫描模式ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  3.                // 一连转换模式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 软件触发ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  4.            // 数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 3;                          // 规则组 3 个通道
复制代码

  • 调用初始化函数
  1. ADC_Init(ADC1, &ADC_InitStructure);
复制代码

  • 设置通道序次和采样时间
  1. ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_28Cycles5);
  2. ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_28Cycles5);
  3. ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_28Cycles5);
复制代码

  • 启动 ADC
  1. ADC_Cmd(ADC1, ENABLE); // 启用 ADC
  2. ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 开始转换
复制代码
11.2 api

详细的用法照旧发起去参考库函数参考手册
1. ADC_DeInit

  1. void ADC_DeInit(ADC_TypeDef* ADCx);
复制代码


  • 作用:将指定的 ADC 外设寄存器重置为默认值。
  • 参数


    • ADCx: 指定要重置的 ADC 外设(ADC1 或 ADC2)。

  • 使用场景


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

  • 使用方法
  1. ADC_DeInit(ADC1); // 将 ADC1 寄存器复位到默认值
复制代码

2. ADC_Init

  1. 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: 通例转换通道数。

  • 使用方法
  1. ADC_InitTypeDef ADC_InitStructure;
  2. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  3. ADC_InitStructure.ADC_ScanConvMode = DISABLE;ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  4. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  5. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  6. ADC_InitStructure.ADC_NbrOfChannel = 1;ADC_Init(ADC1, &ADC_InitStructure);
  7. // 初始化 ADC1
复制代码

3. ADC_StructInit

  1. void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);
复制代码


  • 作用:初始化 ADC_InitTypeDef 布局体的默认值。
  • 参数


    • ADC_InitStruct: 要初始化的布局体指针。

  • 使用场景


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

  • 使用方法
  1. ADC_InitTypeDef ADC_InitStructure;
  2. ADC_StructInit(&ADC_InitStructure); // 初始化布局体为默认值
复制代码

4. ADC_Cmd

  1. void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
复制代码


  • 作用:使能或禁用指定的 ADC 外设。
  • 参数


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

  • 使用方法
  1. ADC_Cmd(ADC1, ENABLE); // 使能 ADC1
复制代码

5. ADC_DMACmd

  1. void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);
复制代码


  • 作用:使能或禁用 ADC 的 DMA 功能。
  • 参数


    • ADCx: 要设置的 ADC 外设。
    • NewState: 设置为 ENABLE 或 DISABLE。

  • 使用方法
  1. ADC_DMACmd(ADC1, ENABLE); // 使能 ADC1 的 DMA 功能
复制代码

6. ADC_ITConfig

  1. void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);
复制代码


  • 作用:设置 ADC 的停止。
  • 参数


    • ADCx: 要设置的 ADC 外设。
    • ADC_IT: 指定停止范例(如 ADC_IT_EOC、ADC_IT_AWD)。
    • NewState: ENABLE 或 DISABLE。

  • 使用方法
  1. ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE); // 启用 ADC1 的转换结束中断
复制代码

7. ADC_ResetCalibration

  1. void ADC_ResetCalibration(ADC_TypeDef* ADCx);
复制代码


  • 作用:重置 ADC 的校准。
  • 参数


    • ADCx: 要重置校准的 ADC 外设。

  • 使用方法
  1. ADC_ResetCalibration(ADC1); // 重置 ADC1 的校准
复制代码

8. ADC_GetResetCalibrationStatus

  1. FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);
复制代码


  • 作用:查抄校准复位是否完成。
  • 参数


    • ADCx: 要查抄的 ADC 外设。

  • 返回值


    • SET: 校准复位尚未完成。
    • RESET: 校准复位已完成。

  • 使用方法
  1. while (ADC_GetResetCalibrationStatus(ADC1) == SET); // 等待复位完成
复制代码

9. ADC_StartCalibration

  1. void ADC_StartCalibration(ADC_TypeDef* ADCx);
复制代码


  • 作用:启动 ADC 的校准。
  • 参数


    • ADCx: 要启动校准的 ADC 外设。

  • 使用方法
  1. ADC_StartCalibration(ADC1); // 启动 ADC1 的校准
复制代码

10. ADC_GetCalibrationStatus

  1. FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);
复制代码


  • 作用:查抄校准是否完成。
  • 返回值


    • SET: 校准尚未完成。
    • RESET: 校准已完成。

  • 使用方法
  1. while (ADC_GetCalibrationStatus(ADC1) == SET); // 等待校准完成
复制代码

11. ADC_SoftwareStartConvCmd

  1. void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
复制代码


  • 作用:启动 ADC 的软件触发转换。
  • 参数


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

  • 使用方法
  1. ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 软件触发 ADC1 的转换
复制代码

12. ADC_GetConversionValue

  1. uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
复制代码


  • 作用:获取 ADC 转换后的值。
  • 返回值


    • 转换后的 12 位数字值。

  • 使用方法
  1. uint16_t adc_value = ADC_GetConversionValue(ADC1); // 获取 ADC1 的转换值
复制代码

13. ADC_AnalogWatchdogCmd

  1. void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);
复制代码


  • 作用:启用或禁用 ADC 模拟看门狗。
  • 参数


    • ADCx: 要设置的 ADC 外设。
    • ADC_AnalogWatchdog: 设置看门狗的模式。

  • 使用方法
  1. ADC_AnalogWatchdogCmd(ADC1, ADC_AnalogWatchdog_SingleRegEnable);
复制代码

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

14. ADC_GetDualModeConversionValue

  1. uint32_t ADC_GetDualModeConversionValue(void);
复制代码


  • 作用:用于获取双 ADC 模式下的转换结果。
  • 返回值:返回一个 32 位值,其中:


    • 高 16 位是 ADC2 的转换结果。
    • 低 16 位是 ADC1 的转换结果。

  • 使用场景


    • 双模式收罗数据时,使用该函数读取两路数据。

  • 使用方法
  1. uint32_t dual_value = ADC_GetDualModeConversionValue();
  2. uint16_t adc1_value = (uint16_t)(dual_value & 0xFFFF);
  3. uint16_t adc2_value = (uint16_t)(dual_value >> 16);
复制代码

15. ADC_AutoInjectedConvCmd

  1. void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
复制代码


  • 作用:启用或禁用主动注入转换模式。
  • 参数


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

  • 阐明


    • 当启用时,通例组转换完成后,会立刻触发注入组的转换。

  • 使用方法
  1. ADC_AutoInjectedConvCmd(ADC1, ENABLE); // 启用 ADC1 的自动注入模式
复制代码

16. ADC_InjectedDiscModeCmd

  1. void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
复制代码


  • 作用:启用或禁用注入组的不一连模式。
  • 参数


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

  • 阐明


    • 当启用时,注入组的通道转换不一连举行。

  • 使用方法
  1. ADC_InjectedDiscModeCmd(ADC1, ENABLE); // 启用注入组不连续模式
复制代码

17. ADC_ExternalTrigInjectedConvConfig

  1. void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv);
复制代码


  • 作用:设置注入组的外部触发源。
  • 参数


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

  • 使用方法
  1. ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_T1_TRGO);
复制代码

18. ADC_ExternalTrigInjectedConvCmd

  1. void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
复制代码


  • 作用:启用或禁用注入组的外部触发功能。
  • 参数


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

  • 使用方法
  1. ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE); // 启用注入组外部触发
复制代码

19. ADC_SoftwareStartInjectedConvCmd

  1. void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
复制代码


  • 作用:启动注入组的软件触发转换。
  • 参数


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

  • 使用方法
  1. ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE); // 软件触发注入组转换
复制代码

20. ADC_GetSoftwareStartInjectedConvCmdStatus

  1. FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx);
复制代码


  • 作用:查抄注入组的软件触发转换是否完成。
  • 返回值


    • SET: 转换正在举行。
    • RESET: 转换已完成。

  • 使用方法
  1. while (ADC_GetSoftwareStartInjectedConvCmdStatus(ADC1) == SET); // 等待注入组转换完成
复制代码

21. ADC_InjectedChannelConfig

  1. void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
复制代码


  • 作用:设置注入组的指定通道。
  • 参数


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

  • 使用方法
  1. ADC_InjectedChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_7Cycles5);
复制代码

22. ADC_InjectedSequencerLengthConfig

  1. void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length);
复制代码


  • 作用:设置注入组的通道序列长度。
  • 参数


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

  • 使用方法
  1. ADC_InjectedSequencerLengthConfig(ADC1, 2); // 设置注入组长度为 2
复制代码

23. ADC_SetInjectedOffset

  1. void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset);
复制代码


  • 作用:设置注入组指定通道的偏移值。
  • 参数


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

  • 使用方法
  1. ADC_SetInjectedOffset(ADC1, 1, 0x100); // 为注入通道 1 设置偏移值
复制代码

24. ADC_GetInjectedConversionValue

  1. uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel);
复制代码


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

25. ADC_AnalogWatchdogCmd

  1. void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);
复制代码


  • 作用:启用或禁用模拟看门狗。
  • 参数


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

  • 使用方法
  1. ADC_AnalogWatchdogCmd(ADC1, ADC_AnalogWatchdog_SingleRegEnable);
复制代码

26. ADC_AnalogWatchdogThresholdsConfig

  1. void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold);
复制代码


  • 作用:设置看门狗的高、低阈值。
  • 参数


    • HighThreshold: 高阈值。
    • LowThreshold: 低阈值。

  • 使用方法
  1. ADC_AnalogWatchdogThresholdsConfig(ADC1, 3000, 1000);
复制代码

27. ADC_AnalogWatchdogSingleChannelConfig

  1. void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel);
复制代码


  • 作用:为模拟看门狗指定监控通道。
  • 使用方法
  1. ADC_AnalogWatchdogSingleChannelConfig(ADC1, ADC_Channel_1);
复制代码

28. ADC_TempSensorVrefintCmd

  1. void ADC_TempSensorVrefintCmd(FunctionalState NewState);
复制代码


  • 作用:启用或禁用温度传感器和内部参考电压丈量。
  • 使用方法
  1. ADC_TempSensorVrefintCmd(ENABLE); // 启用温度传感器和内部参考
复制代码

29. ADC_GetFlagStatus

  1. FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
复制代码


  • 作用:查抄指定的ADC 标记状态。
  • 返回值:SET 或 RESET。
  • 使用方法
  1. if (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == SET) {
  2.     // 转换完成
  3. }
复制代码

30. ADC_ClearFlag

  1. void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
复制代码


  • 作用:扫除指定的 ADC 标记。
  • 使用方法
  1. ADC_ClearFlag(ADC1, ADC_FLAG_EOC); // 清除转换完成标志
复制代码
12.实行

留意

留意肯定要设置ADC的时钟:RCC_ADCCLKConfig函数,ADC的时钟似乎最大不能超过14MHz
12.1 AD单通道

📎7-1 AD单通道.zip

User:


  • 📎main.c
Hardware:


  • 📎OLED.c📎OLED.h📎OLED_Font.h📎AD.h📎AD.c
12.2 AD多通道

📎7-2 AD多通道.zip

User:


  • 📎main.c
Hardware:


  • 📎OLED.c📎OLED.h📎OLED_Font.h📎AD.h📎AD.c

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表