记录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);

  希望这个问题日后能够解决

 

  

posted @ 2023-05-18 22:29  哈啰世界  阅读(303)  评论(2编辑  收藏  举报