STM32H7的ADC定时器触发配合定时器的DMA双缓冲


仅供个人学习

ADC基本简介

在这里插入图片描述
ADC_INP[0:19]和 ADC_INN[0:19]
INP 是差分正向输入,INN 是差分反向输入。
ADC_INP[0:5]和 ADC_INN[0:5]是快速通道。
ADC_INP[6:19]和 ADC_INN[6:19]是慢速通道。
adc_ext_trg[20:0]
共有 21 路触发用于规则通道,ADC1 和 ADC2 共用的,而 ADC3 是独立的。
adc_jext_trg[20:0]
共有 21 路触发用于注入通道,ADC1 和 ADC2 共用的,而 ADC3 是独立的。
adc_awd1,adc_awd2 和 adc_awd3
每个 ADC 都支持三个模拟看门狗。
adc_it
ADC 中断。
adc_hclk
ADC 的 AHB 时钟。
adc_ker_ck
ADC 的内核时钟。
adc_dma
用于 ADC 的 DMA 请求。
dac_out1,dac_out2,Vsense,Vrefint 和 Vbat
五条专用的内部通道,内部参考电压 VrefInt,内部温度传感器和 VBAT 监测通道 VBAT/4 都是连
接到 ADC3。另外内部 DAC 通道 1 和通道 2,连接到 ADC2。

ADC时钟选择

ADC 有两种时钟源可供选择,可以使用来自 AHB 总线的系统时钟(属于同步时钟,对应下面框图的adc_hclk),也可以使用PLL2,PLL3,HSE,HSI或者CSI时钟(属于异步时钟,对应下面框图的adc_ker_ck)。
在这里插入图片描述
ADC1,ADC2 和 ADC3 共用选择的时钟。
ADC 的时钟源使用 AHB 时钟,且使用注入模式,那么在 16bit,14bit,12bit 或者 10bit 分辨率时,ADC 的时钟不能超过 AHB 时钟的四分之一。8bit 模式时,不能超过 AHB 时钟的三分之一。
选择 AHB 时钟的话,ADC 的配置中提供了不分频,二分频和四分频。如果选择了不分频,那么配置
AHB 的时钟输出时也不可以设置分频,即 RCC 的 CFGR 寄存器配置不可分频。
如果使用 PLL 时钟,运行期间要一直开启,不可关闭
最后特别注意一点,如果 STM32H7 工作在 400MHz,ADC 使用 AHB 做时钟源,超频是不可避免的。ADC1 和 ADC2 位于 200MHz 的 AHB1 总线时钟,而 ADC3 位于 200MHz 的 AHB4 下。根据上面的框图,ADCx_CCR 寄存器的 CKMODE 最高可以选择 4 分频,那么就是 50MHz,而 ADC 数据手册限制最高是 36MHz,也就是说已经超频了。
使用 AHB 作为时钟源的好处就是定时器等外部触发方式的效果好。

ADC采样时间和转换时间

STM32H7 的 ADC 采样速度,即转换时间 = 采样时间 + 逐次逼近时间
采样时间是可配置的,通过 ADCx_SMPR1 和 ADCx_SMPR2 寄存器中的 SMP[2:0] 位就可以编程
所有 ADC 通道,可选采样时间值如下:
SMP = 000: 1.5 个 ADC 时钟周期
SMP = 001: 2.5 个 ADC 时钟周期
SMP = 010: 8.5 个 ADC 时钟周期
SMP = 011: 16.5 个 ADC 时钟周期
SMP = 100: 32.5 个 ADC 时钟周期
SMP = 101: 64.5 个 ADC 时钟周期
SMP = 110: 387.5 个 ADC 时钟周期
SMP = 111: 810.5 个 ADC 时钟周期
不同 ADC 分辨率对应的逐次逼近时间不同,具体数值如下:
在这里插入图片描述
比如配置 SMP = 110,采用 16 位分辨率,那么:
ADC 的转换时间 =采样时间 + 逐次逼近时间
= 387.5 个 ADC 时钟周期 + 8.5 个 ADC 时钟周期
= 396 个 ADC 时钟周期。

ADC单次转换和连续转换

STM32H7 的 ADC 支持单次转换和连续转换。
单次转换
在单次转换模式下,ADC 会将通道的所有转换执行一次。
连续转换
该模式仅适用于常规通道。
在连续转换模式下,如果发生软件或硬件触发,ADC 会执行所有常规通道的转换,随后会自动重启并继续执行每个通道的转换。

ADC 的外部触发

STM32H7 既可以选择软件触发也可以选择外部硬件触发,并且可以设置触发边沿。
在这里插入图片描述

ADC多通道连接方式

ADC1,ADC2 和 ADC3 均支持 20 条通道扫描采样(注意,部分引脚是多个 ADC 共用的):
◆ 6 路快速模拟输入 (ADCx_INP[0]/INN[0] 到 ADCx_INP[5]/INN[5])
◆ 14 路慢速模拟输入 (ADCx_INP[6]/INN[6] 到 ADCx_INP[19]/INN[19])
◆ ADC 连接至 5 路内部模拟输入:
在这里插入图片描述

ADC配合定时器触发和DMA双缓冲配置

ADC 转换既可以选择外部触发也可以选择软件触发。定时器属于外部触发方式,使用定时器触发的好处是可以设置任何 ADC 能够支持的转换频率。
对于 ADC1,ADC2,ADC3 来说,规则通道支持的外部触发源如下:

#define ADC_EXTERNALTRIG_T1_CC1 ((uint32_t)0x00000000)
#define ADC_EXTERNALTRIG_T1_CC2 ((uint32_t)ADC_CFGR_EXTSEL_0)
#define ADC_EXTERNALTRIG_T1_CC3 ((uint32_t)ADC_CFGR_EXTSEL_1)
#define ADC_EXTERNALTRIG_T2_CC2 ((uint32_t)(ADC_CFGR_EXTSEL_1 | ADC_CFGR_EXTSEL_0))
#define ADC_EXTERNALTRIG_T3_TRGO ((uint32_t)ADC_CFGR_EXTSEL_2)
#define ADC_EXTERNALTRIG_T4_CC4 ((uint32_t)(ADC_CFGR_EXTSEL_2 | ADC_CFGR_EXTSEL_0))
#define ADC_EXTERNALTRIG_EXT_IT11 ((uint32_t)(ADC_CFGR_EXTSEL_2 | ADC_CFGR_EXTSEL_1))
#define ADC_EXTERNALTRIG_T8_TRGO ((uint32_t)(ADC_CFGR_EXTSEL_2 | ADC_CFGR_EXTSEL_1 |
ADC_CFGR_EXTSEL_0))
#define ADC_EXTERNALTRIG_T8_TRGO2 ((uint32_t) ADC_CFGR_EXTSEL_3)
#define ADC_EXTERNALTRIG_T1_TRGO ((uint32_t)(ADC_CFGR_EXTSEL_3 | ADC_CFGR_EXTSEL_0))
#define ADC_EXTERNALTRIG_T1_TRGO2 ((uint32_t)(ADC_CFGR_EXTSEL_3 | ADC_CFGR_EXTSEL_1))
#define ADC_EXTERNALTRIG_T2_TRGO ((uint32_t)(ADC_CFGR_EXTSEL_3 | ADC_CFGR_EXTSEL_1 | 
ADC_CFGR_EXTSEL_0))
#define ADC_EXTERNALTRIG_T4_TRGO ((uint32_t)(ADC_CFGR_EXTSEL_3 | ADC_CFGR_EXTSEL_2))
#define ADC_EXTERNALTRIG_T6_TRGO ((uint32_t)(ADC_CFGR_EXTSEL_3 | ADC_CFGR_EXTSEL_2 | 
ADC_CFGR_EXTSEL_0))
#define ADC_EXTERNALTRIG_T15_TRGO ((uint32_t)(ADC_CFGR_EXTSEL_3 | ADC_CFGR_EXTSEL_2 | 
ADC_CFGR_EXTSEL_1))
#define ADC_EXTERNALTRIG_T3_CC4 ((uint32_t)(ADC_CFGR_EXTSEL_3 | ADC_CFGR_EXTSEL_2 | 
ADC_CFGR_EXTSEL_1 | ADC_CFGR_EXTSEL_0)
### STM32 双重 ADC 采样配置与实现方法 #### 配置概述 STM32 微控制器系列支持多个独立的模数转换器 (ADC),允许开发者利用这些资源来执行复杂的模拟信号处理任务。对于需要高精度和快速响应的应用场景,如电力监控系统中的电压电流同步采集,采用双重 ADC 同步采样是一种有效的方法[^1]。 #### 使用 DMA 实现同步采样 为了确保数据传输效率并减少 CPU 负载,在设置过程中应当分别为两个 ADC 单元分配单独的数据缓冲区,并开启相应的直接存储访问(DMA)功能。当定时器触发事件发生时,它会促使这两个 ADC 设备几乎在同一时刻启动各自的转换过程,从而达成真正的同步效果[^2]。 ```c // 初始化DMA流用于ADC1 hdma_adc1.Instance = DMA2_Stream0; hdma_adc1.Init.Channel = DMA_CHANNEL_0; HAL_DMA_Init(&hdma_adc1); // 初始化DMA流用于ADC2 hdma_adc2.Instance = DMA2_Stream1; hdma_adc2.Init.Channel = DMA_CHANNEL_1; HAL_DMA_Init(&hdma_adc2); ``` #### HAL 库内置双 ADC 模式 除了手动配置外,还可以借助于硬件抽象层(HAL)库提供的便捷函数来进行更高效的开发工作。具体来说就是调用 `HAL_ADCEx_MultiModeStart_DMA()` 函数以激活多路模式下的自动切换机制,这使得编程更加简洁明了。 ```c if (HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t *)aBuffer, BUFFER_SIZE * 2) != HAL_OK){ Error_Handler(); } ``` #### 提升采样速率至更高水平 如果项目需求更高的采样频率,则可以考虑启用交错模式(interleaved mode),该特性能够使相邻两次读取之间的时间间隔最小化,进而提高整体吞吐量。例如,在某些型号里(比如 H7),即使面对 USB 接口占用部分高速通道的情况,依然可以通过优化后的双 ADC 结构获得接近理论极限的速度表现[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值