打印
[应用相关]

STM32——三重ADC交替采样—极限采样率7.2M

[复制链接]
397|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-8-15 13:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
前言:
        刚刚参加完2024年全国大学生电子设计竞赛,在备赛过程中学习了很多信号类相关知识,在信号类题目中呢,ADC是一个复杂且实用的要点,而与其紧密相关的几个参数就是——采样率、采样精度,而是 stm32F407 单个adc最大采样率为2.4M,这个采样率在有些时候还是不能满足我们的需求,这时三重ADC交替采样值得我们一学了。本次将给大家分享“三重ADC交替采样”的配置与使用。

关于三重ADC的原理,这里就不过多解释,主要给大家分享用法,便于大家快速使用。

原理可参考这位博主的文章——《stm32教程之三重ADC交错采样》

正文:
时钟配置:
由于不同型号单片机开启单ADC2.4M采样率的方法不完全相同,所以这里就以2M采样率为示例,最终采样率为6M。



基础配置:





串口配置:
串口重定义的方法这里就不在赘述,网上教程很多。



TIM定时器配置:
实际采样率为2M x 3 = 6M(更改时钟可以达到7.2M)



ADC配置:







DMA配置:
     关于DMA模式——循环与普通模式的区别,字节长度——word与half word的区别,可以看这篇博客——《stm32-HAL 电赛信号教程》




代码示例:
先进行数组定义等,这里我将ADC数据个数、采样率进行了宏定义,方便程序修改与调用。采样率为6M,ADC数据个数为1024(这里我是为了方便进行fft,大家可以按需求更改)。这里定义了一个标志位DMA_FLAG,后面会用到。

#define  ADC1_DMA_Size           1024

float    ADC1_ConvertedValue[ADC1_DMA_Size];
uint32_t ADC_Value          [ADC1_DMA_Size/2];

uint8_t DMA_FLAG=0;
然后将adc、tim开启,并使用函数HAL_ADCEx_MultiModeStart_DMA,开始DMA的传输

注意:这里DMA传输数据的个数是ADC采样个数的一半,即1024/2=512。并且不需要手动打开ADC1,它会自动打开。这些都是写在while前面。

  HAL_ADC_Start(&hadc2);
  HAL_ADC_Start(&hadc3);

  HAL_ADCEx_MultiModeStart_DMA(&hadc1,(uint32_t*)ADC_Value,512);

  HAL_TIM_Base_Start(&htim8);  
在函数HAL_ADCEx_MultiModeStart_DMA执行完后会进入中断服务函数HAL_ADC_ConvCpltCallback中,我们在里面改变标志位的值,方便我们知在函数执行完后再进行后续处理。这个函数可以直接复制到main.c中,放在主函数前面或后面。

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
        DMA_FLAG=1;
}
然后在主函数while中进行数据处理,这个处理方式与三重ADC采样模式的原理有关,就不解释了。

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {         
        if(DMA_FLAG==1)
        {
             DMA_FLAG=0;
                               
          for(int i=0,m=0;m<512&&i<1024;)
          {
                        ADC1_ConvertedValue= (float)(ADC_Value[m]&0x0000FFFF)*3.3f/4095.0f;
                        i++;
                        ADC1_ConvertedValue= (float)((ADC_Value[m]&0xFFFF0000)>>16)*3.3f/4095.0f;
                        i++;
                        m++;
          }
          for(int i=0;i<1024;i++)
           {
                    printf("%f\r\n",ADC1_ConvertedValue);
                          // printf("%d\r\n",ADC_Value);
           }                                                                      
   }       
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
          
  }
  /* USER CODE END 3 */



结语:
如果有错误或建议,欢迎大家指出。有任何疑问大家也可以直接留言。祝大家学业进步!
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/2301_79131841/article/details/141086606

使用特权

评论回复
沙发
呐咯密密| | 2024-8-15 13:59 | 只看该作者
说明一下什么事交替采样就好了,链接文章需要付费

使用特权

评论回复
板凳
狄克爱老虎油| | 2024-8-17 23:23 | 只看该作者
如果有更多ADC的话采集速度是不是更快啊

使用特权

评论回复
地板
kqh11a| | 2024-8-28 12:18 | 只看该作者
三重 ADC 交替采样指的是利用 STM32F407 的三个独立 ADC 进行交替采样,从而提高采样率和减少采样之间的时间间隔。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1734

主题

15126

帖子

10

粉丝