STM32 ADC模块深度解析
目录
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路输入的多路开关。
选择好对应的输入通道后,怎么去知道其输入的电压对应的编码数据呢?? — 就得靠逐次逼近的方法去一一比较了。
START是输入开始转换信号的
CLOCK是ADC时钟,因为ADC是一步一步进行判断的,是需要时钟来推动这个过程。
**VREF+和VREF-**是DAC的参考电压,SAR给DAC的编码值对应多少V的电压,由这两个决定。通常是和Vcc和GND相连在一起的。
那么接下来可以看看stm32内部的ADC框图:
1. 模拟输入
2. 模拟多路开关
3. ADC 模块核心功能
常规通道和注入通道:ADC 支持两种通道类型:
数据寄存器:
4. 转换时钟与采样控制
ADCCLK:这是来自分频器的时钟信号,控制 ADC 的采样速率。ADCCLK 频率可以通过预分频器设置,以满足不同的采样速率要求。貌似只能设置6和8分频,其输入不能超过14MHz
转换控制:
5. 触发控制
外部触发选择:
触发控制使能位:
6. 模拟比较器和模拟看门狗
7. 中断与状态标志
转换完成标志:
中断使能位:
这些标志位可以通过配置中断传递给 NVIC,从而触发中断服务例程处理相应的事件。
8. DMA 数据传输
描述了 ADC 模块的整体结构,包括信号输入、通道选择、触发控制、数据存储、状态监测和中断控制。通过多路开关选择输入信号,进行模数转换后,将采样数据存储到相应的寄存器中,并可通过中断和 DMA 机制实现数据采集和传输。
3.基本结构
以规则组,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.转换模式
单次转换,非扫描模式:
在单次转换,非扫描模式下,ADC 只对一个通道执行一次转换并停止。这种模式适合采集单个信号源的数据,不需要多通道或连续采样。
工作流程
应用场景
连续转换,非扫描模式:
在连续转换,非扫描模式下,ADC 会对一个通道进行持续不断的连续转换。它适用于需要实时监测单个信号源的场景。
工作流程
配置单个通道:指定一个通道,例如通道 2。
连续转换:启动后 ADC 会对该通道不断执行转换操作,不间断地采集数据。
标志位和中断:
数据读取:在每次转换完成后,可以从数据寄存器中读取最新的转换值;如果不及时读取,新的值会覆盖上一个数据。
应用场景
单次转换,扫描模式:
在单次转换,扫描模式下,ADC 会对多个通道依次进行一次转换,然后停止。这种模式适合采集多个通道的瞬时值,但不需要连续采样。
工作流程
应用场景
连续转换,扫描模式:
在连续转换,扫描模式下,ADC 会对多个通道进行循环、连续的采样,适合需要持续监测多个通道的场景。
工作流程
配置多通道:指定多个需要采样的通道(例如通道 1、通道 2 和通道 4)。
连续扫描转换:启动后,ADC 按照通道序列依次对每个通道进行采样,每一轮扫描完成后自动开始下一轮。
标志位和中断:
数据存储:每个通道的数据会依次存入 FIFO 或内存;结合 DMA 使用时,可将数据自动传输到内存。
应用场景
单次转换,非扫描模式:对一个通道采集一次数据,适合单次测量。
连续转换,非扫描模式:对一个通道连续采集,适合实时监控一个信号。
单次转换,扫描模式:对多个通道各采集一次数据,适合一次性采集多路数据。
连续转换,扫描模式:对多个通道进行循环采集,适合多通道的实时监控。
6.触发控制
7.数据对齐
需要注意的是模拟信号转换后的编码值要注意自己选择的是右对齐还是左对齐模式。如果是左对齐,其数据会比真实数据大16倍。
8.转换时间
AD转换是需要时间的,只不过这个时间是us级别,我们是感知不到。
AD转换的步骤:采样,保持,量化,编码。前两个成一组,后两个成一组
STM32 ADC的总转换时间为: TCONV = 采样时间 + 12.5个ADC周期
例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期 TCONV = 1.5 + 12.5 = 14个ADC周期 = 1μs
转换时间影响因素 :
不同采样时间的应用:
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 准确性。校准只需在上电后执行一次,无需每次转换前都进行校准。
校准的注意事项
10.ADC外围电路
第一个是电位器产生可调电压的电路;
第二个是传感器输出电压的电路;
第三个是简单的电压转换电路。
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;
作用:设置是否启用连续转换模式。
可选值:
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_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
\6. ADC_NbrOfChannel
uint8_t ADC_NbrOfChannel;
作用:指定规则组需要转换的通道数。
取值范围:1 到 16(最多支持 16 个通道)。
说明:
ADC_RegularChannelConfig()
逐一完成。使用场景:规则组需要采集多个通道的数据时。
示例:
ADC_InitStructure.ADC_NbrOfChannel = 4; // 规则组包含 4 个通道
结构体初始化与使用示例
- 定义并初始化结构体:
ADC_InitTypeDef ADC_InitStructure;
- 设置初始化参数:
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 个通道
- 调用初始化函数:
ADC_Init(ADC1, &ADC_InitStructure);
- 配置通道顺序和采样时间:
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);
- 启动 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 外设(ADC1
或 ADC2
)。使用场景:
使用方法:
ADC_DeInit(ADC1); // 将 ADC1 寄存器复位到默认值
2. ADC_Init
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
作用:初始化 ADC 的常规功能配置。
参数:
ADCx
: 要初始化的 ADC 外设。ADC_InitStruct
: 指向包含 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_EOC
、ADC_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 转换后的值。
返回值:
使用方法:
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 位值,其中:
使用场景:
使用方法:
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);
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);
SET
或 RESET
。if (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == SET) {
// 转换完成
}
30. ADC_ClearFlag
void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
ADC_ClearFlag(ADC1, ADC_FLAG_EOC); // 清除转换完成标志
12.实验
注意
注意一定要配置ADC的时钟:RCC_ADCCLKConfig
函数,ADC的时钟好像最大不能超过14MHz
12.1 AD单通道
📎7-1 AD单通道.zip
User:
Hardware:
12.2 AD多通道
📎7-2 AD多通道.zip
User:
Hardware:
作者:憧憬一下