STM32————ADC模块

STM32H743-梳理ADC模数转换器在CubeMX上的配置_overrun behaviour-CSDN博客(写的很好,很详细)

STM32-HAL库-ADC学习 - 曲杨 - 博客园

ADC定义

模数转换器(Analog to Digital Converter,ADC) 模拟信号->数字信号转换器

通过对输入的模拟信号进行测量,将其分级转换为数字信号

STM32单片机中的ADC

一般计算采用一下逻辑方式进行转换

1
2
3
4
5
6
7
if( V>V_ref_low && V<V_ref_high ) {
	return (V-V_ref_low)/(V_ref_high-V_ref_low) * (2<<X-1);
	//归一化,再按照配置的x进行转换
}
else {
	return erro ;
}

STM32单片机中的ADC,x一般是12,也可以是其他数值 一般情况下,参考电压为0V,参考高电压为3.3V

分辨率与精度

分辨率与位数有关,精度与性能有关,位数越高,分辨率越高,性能越高,波动越小,精度越强 ADC位数为12位,则分辨率是1/4096

使用时PLCK频率控制在36MHz以内,不然ADC模块的精度会大幅降低

STM32CubeMX配置

这里以STM32C8T6为例

  1. x即Resolution 12bits( 15ADC时钟周期 )(看芯片型号,有的需要配置)
  2. 数据选择右对齐,得到的数据就是转换后的值
  3. Mode选择Independent mode

Scan Conversion Mode(扫描转换模式),会采集ADC开启的所有通道,按顺序采集所有通道 Continuous Conversion Mode(连续转换模式),可以在使能ADC时自动开始采集,而非手动采集 Discontinuous Conversion Mode(间断采集模式),可以在一轮采集完成后暂停等待指令控制下一轮采集

Number Of Discontinuous Conversions(单次转换次数)此参数定义每次触发后ADC执行的转换次数,每次转换完都需要HAL_ADC_GetValue来获取值。 如果它设为2,且ADC1使能了通道1,2,5,7的话,那么第一次触发ADC1采样时,就会采样通道1与通道2的值,再一次触发ADC1采样的话,就会采样通道5与通道7值,如此类推。

ADC_Regular_ConversionMode 可以配置每个通道的采集顺序和采样时间

代码使用

1.开始采集

1
HAL_ADC_Start(&hadc2);

2.采集后转换

1
HAL_ADC_PollForConversion(&hadc2,20);//地址,等待时间

关于多数据通道采集

ADC_value[1]对应rank_1的通道的值,第一次采集rank1通道 ADC_value[2]对应rank_2的通道的值,第一次采集rank2通道 rank指在ADC_Regular_ConversionMode中的rank设置

1
2
3
4
5
6
7
for( int t = 1 ; t <= 10 ; ++ t ) {
	for( int i = 0 ; i < 2 ; ++ i ) {
		HAL_ADC_Start(&hadc2);
		HAL_ADC_PollForConversion(&hadc2,20);//采集后转换
		AD_value[i] += HAL_ADC_GetValue(&hadc2) ;//采集十次,平均值处理
	}
}

检测

1
2
3
if(HAL_IS_BIT_SET( HAL_ADC_GetState(&hadc2),HAL_ADC_STATE_REG_EOC) ) {//检测是否正常采集
	ADC_value += HAL_ADC_GetValue(&hadc2);
}

关于Number Of Discontinuous Conversions

在STM32CubeMX中,Number Of Discontinuous Conversions(单次转换次数)是ADC(模数转换器)的一个配置选项,主要用于控制ADC在**非连续采样模式(Discontinuous Mode)**下的转换行为。以下是详细解释和使用方法:

1. 功能含义

  • 作用
    当ADC配置为非连续模式(Discontinuous Mode)时,此参数定义每次触发后ADC执行的转换次数。
    • 例如,设置为3,则每次触发ADC后,会自动连续完成3次转换(无需额外触发信号)。
    • 若设置为1,则每次触发仅执行1次转换(等同于标准单次模式)。
  • 应用场景
    适用于需要分组采样的场景,例如:
    • 周期性触发ADC,但每次触发需采集多个通道的数据。
    • 降低CPU干预频率(通过一次触发完成多次转换)。

2. 配置步骤(STM32CubeMX)

  1. 启用Discontinuous Mode
    • 在ADC配置界面,勾选 Discontinuous Mode(通常在Parameter Settings选项卡中)。
    • 此时,Number Of Discontinuous Conversions选项会生效。
  2. 设置转换次数
    • 输入需要的转换次数(取值范围取决于型号,通常为1~8)。
    • 该值必须 ≤ 总启用通道数(例如,若启用5个通道,最多可设置为5)。
  3. 配置触发源
    • 选择触发方式(如定时器触发、外部引脚触发等)。
    • 每次触发信号到来时,ADC会自动完成设定的转换次数。

3. 工作流程示例

  • 硬件环境
    • ADC通道:CH0、CH1、CH2
    • 配置:Discontinuous Mode + Number Of Discontinuous Conversions = 2
  • 行为
    1. 触发信号到来(如定时器溢出)。
    2. ADC自动连续转换2个通道(例如CH0→CH1)。
    3. 转换完成后产生中断/DMA请求。
    4. 下次触发时,继续从下一个通道开始(CH2→CH0,依此类推)。

在该配置下(Discontinuous Mode + Number Of Discontinuous Conversions = 2),每次触发后ADC会连续转换2个通道(例如CH0→CH1),因此你需要调用两次 HAL_ADC_GetValue(&hadc2) 来分别读取这两个通道的转换结果。以下是具体说明和注意事项:

1. 数据读取方式
方法一:轮询模式(Polling)

每次触发后,需手动读取两次ADC值:

1
2
3
4
5
6
7
8
HAL_ADC_Start(&hadc2);  // 启动ADC(或通过触发信号启动)
//开启一次,采集两次
if (HAL_ADC_PollForConversion(&hadc2, timeout) == HAL_OK) {//采集后第一次转换
    uint32_t ch0_value = HAL_ADC_GetValue(&hadc2);  // 读取CH0结果
}
if (HAL_ADC_PollForConversion(&hadc2, timeout) == HAL_OK) {//采集后第二次转换
    uint32_t ch1_value = HAL_ADC_GetValue(&hadc2);  // 读取CH1结果
}
  • 注意:每次调用 HAL_ADC_GetValue() 会返回最后一次完成的转换结果,因此需按顺序读取。
方法二:中断模式(Interrupt)

在ADC转换完成中断中读取:

1
2
3
4
5
6
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {
    if (hadc == &hadc2) {
        uint32_t ch0_value = HAL_ADC_GetValue(&hadc2);  // 第一次转换结果(CH0)
        uint32_t ch1_value = HAL_ADC_GetValue(&hadc2);  // 第二次转换结果(CH1)
    }
}
  • 关键点:在中断回调中需连续读取两次,顺序由ADC的Rank配置决定。
方法三:DMA模式(推荐)

若启用DMA,ADC会自动将多次转换结果存入指定数组,无需手动调用 HAL_ADC_GetValue()

1
2
uint32_t adc_results[2];  // 存储2次转换结果
HAL_ADC_Start_DMA(&hadc2, adc_results, 2);  // 启动DMA传输
  • 结果存储
    adc_results[0] → CH0的值,adc_results[1] → CH1的值(顺序由Rank决定)。

4. 注意事项

  • 与连续模式(Continuous Mode)的区别
    • 连续模式:ADC无限循环转换所有启用通道,无需触发。
    • 非连续模式:需外部触发,且每次触发仅转换设定的次数。
  • DMA配合
    • 建议启用DMA,以高效搬运多组转换结果(尤其是高频触发场景)。
    • DMA缓冲区大小需 ≥ 转换次数 × 通道数。
  • 通道顺序
    • 转换顺序由Rank(在ADC配置中定义)决定,而非通道编号。

总结

  • Number Of Discontinuous Conversions 是ADC非连续模式下每次触发的转换次数。
  • 关键配置:启用Discontinuous Mode → 设置转换次数 → 配置触发源。
  • 优势:灵活控制采样节奏,减少CPU负担,适合分组采样需求。
experience
使用 Hugo 构建
主题 StackJimmy 设计