问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32三重ADC交替采样技术详解:实现7.2M极限采样率

创作时间:
作者:
@小白创作中心

STM32三重ADC交替采样技术详解:实现7.2M极限采样率

引用
CSDN
1.
https://blog.csdn.net/2301_79131841/article/details/141086606

STM32的三重ADC交替采样技术可以实现高达7.2M的采样率,是处理高速信号采集任务的理想选择。本文将详细介绍如何通过配置时钟、基础设置、串口、定时器、ADC和DMA等模块来实现这一功能。

三重ADC交替采样

前言

本教程使用stm32f407VET6,基于cubemx与keil5软件开发。在信号类题目中,ADC是一个复杂且实用的要点,而与其紧密相关的几个参数就是——采样率、采样精度。单个ADC的最大采样率为2.4M,有时不能满足需求,因此三重ADC交替采样技术值得学习。本次将分享“三重ADC交替采样”的配置与使用。

关于三重ADC的原理,这里就不过多解释,主要给大家分享用法,便于大家快速使用。原理可参考相关技术文档。

正文

时钟配置

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

基础配置


串口配置

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

TIM定时器配置

实际采样率为2M x 3 = 6M(更改时钟可以达到7.2M)

ADC配置

DMA配置

关于DMA模式——循环与普通模式的区别,字节长度——word与half word的区别,可以参考相关技术文档。

代码示例

先进行数组定义等,这里将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[i]= (float)(ADC_Value[m]&0x0000FFFF)*3.3f/4095.0f;
            i++;
            ADC1_ConvertedValue[i]= (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[i]);
              // printf("%d\r\n",ADC_Value[i]);
       }				  			  	  
   }	
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
      
  }
  /* USER CODE END 3 */  

结语

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

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号