STM32H743-梳理ADC模数转换器在CubeMX上的配置_overrun behaviour-CSDN博客(写的很好,很详细)
ADC定义
模数转换器(Analog to Digital Converter,ADC) 模拟信号->数字信号转换器
通过对输入的模拟信号进行测量,将其分级转换为数字信号
STM32单片机中的ADC
一般计算采用一下逻辑方式进行转换
|
|
STM32单片机中的ADC,x一般是12,也可以是其他数值 一般情况下,参考电压为0V,参考高电压为3.3V
分辨率与精度
分辨率与位数有关,精度与性能有关,位数越高,分辨率越高,性能越高,波动越小,精度越强 ADC位数为12位,则分辨率是1/4096
使用时PLCK频率控制在36MHz以内,不然ADC模块的精度会大幅降低
STM32CubeMX配置
这里以STM32C8T6为例
- x即Resolution 12bits( 15ADC时钟周期 )(看芯片型号,有的需要配置)
- 数据选择右对齐,得到的数据就是转换后的值
- 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.开始采集
|
|
2.采集后转换
|
|
关于多数据通道采集
ADC_value[1]对应rank_1的通道的值,第一次采集rank1通道 ADC_value[2]对应rank_2的通道的值,第一次采集rank2通道 rank指在ADC_Regular_ConversionMode中的rank设置
|
|
检测
|
|
关于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)
- 启用Discontinuous Mode:
- 在ADC配置界面,勾选
Discontinuous Mode
(通常在Parameter Settings选项卡中)。 - 此时,Number Of Discontinuous Conversions选项会生效。
- 在ADC配置界面,勾选
- 设置转换次数:
- 输入需要的转换次数(取值范围取决于型号,通常为1~8)。
- 该值必须 ≤ 总启用通道数(例如,若启用5个通道,最多可设置为5)。
- 配置触发源:
- 选择触发方式(如定时器触发、外部引脚触发等)。
- 每次触发信号到来时,ADC会自动完成设定的转换次数。
3. 工作流程示例
- 硬件环境:
- ADC通道:CH0、CH1、CH2
- 配置:
Discontinuous Mode
+Number Of Discontinuous Conversions = 2
- 行为:
- 触发信号到来(如定时器溢出)。
- ADC自动连续转换2个通道(例如CH0→CH1)。
- 转换完成后产生中断/DMA请求。
- 下次触发时,继续从下一个通道开始(CH2→CH0,依此类推)。
在该配置下(Discontinuous Mode
+ Number Of Discontinuous Conversions = 2
),每次触发后ADC会连续转换2个通道(例如CH0→CH1),因此你需要调用两次 HAL_ADC_GetValue(&hadc2)
来分别读取这两个通道的转换结果。以下是具体说明和注意事项:
1. 数据读取方式
方法一:轮询模式(Polling)
每次触发后,需手动读取两次ADC值:
|
|
- 注意:每次调用
HAL_ADC_GetValue()
会返回最后一次完成的转换结果,因此需按顺序读取。
方法二:中断模式(Interrupt)
在ADC转换完成中断中读取:
|
|
- 关键点:在中断回调中需连续读取两次,顺序由ADC的Rank配置决定。
方法三:DMA模式(推荐)
若启用DMA,ADC会自动将多次转换结果存入指定数组,无需手动调用 HAL_ADC_GetValue()
:
|
|
- 结果存储:
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负担,适合分组采样需求。