记录stm32多重ADC模式
为什么要使用多重ADC模式呢?
主要是馋多重ADC模式下可以轻易实现采样率翻倍的效果
实现原理可以参考这篇ADI的文章:交织采样ADC基础的基本原理 | 亚德诺半导体 (analog.com)
总结:解决了单个ADC采样需要等待转换结束才能继续采样的问题,代价是使用更多的ADC
上个图:
理论部分(或者说参考手册中的说明?)
首先,是DMA的不同
这个具体可以看参考手册,简单易懂
这里,我选择使用DMA模式2
手册中的例子(我真的哭死,他还有例子)
其次,多重ADC模式下的交替模式(在cube中,英文为:XXX interleaved mode only, 有一个翻译过来极其相似的模式交替触发模式:xxx alternate mode 这个用于注入组的,我觉的也是一个坑...)
交替模式下,我们只转换一个规则组通道
工作过程:
首先,明确这里ADC1是主,ADC2、ADC3都是从,也就是说,我们只需要配置ADC1的具体触发模式
而且手册里没说,从模式下的ADC的其他配置参数,是不是可以认为,它们默认以ADC1配置的参数启动?
可后面有需要对三个ADC进行配置,才能启动规则通道连续转换模式,所以还是得配置三个ADC,并初始化
DMA请求产生,配合上述的DMA模式2。
转换流程图
接下来就是在stm32中实现三重ADC模式,我使用的的stm32F407系列
Cube配置
记得开启DMA传输,设置为字传输
ADC3类似,这里就不赘述了
keil中启动
HAL_ADC_Start(&hadc2); //HAL库必须start ADC,使能adc2 HAL_ADC_Start(&hadc3); HAL_ADCEx_MultiModeStart_DMA(&hadc1, adc_dma_buffer, SAMPLE_NUM);
这里我使用三重模式,必须开启adc2和adc3
到这里,ADC多重模式就可以开启了,但是还不能正常的融入到使用中,因为它的中断只会进入一次,之后,无论我如何调用各种中断开关函数,都启动不了
翻到一篇博客STM32 f407 3ADC 交替 实现 7.2Msps 采样率_memoff的博客-CSDN博客
和我一样,遇到了同样的问题,解决办法是通过重新初始化ADC实现,实测确实能够正常运行中断
MX_ADC1_Init(); //重新初始化,以启动中断 MX_ADC2_Init(); MX_ADC3_Init(); HAL_ADC_Start(&hadc2); //HAL库必须start ADC,使能adc2 HAL_ADC_Start(&hadc3); HAL_ADCEx_MultiModeStart_DMA(&hadc1, adc_dma_buffer, SAMPLE_NUM);
希望这个问题日后能够解决