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

三重ADC交替采样

目录

三重ADC交替采样

前言:

正文:

时钟配置:

基础配置:

串口配置:

TIM定时器配置:

ADC配置:

DMA配置:

代码示例:

结语:


前言:

        本教程使用stm32f407VET6,基于cubemx与keil5软件开发。刚刚参加完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[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 */

结语:

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

STM32三重ADC采样功能可以实现更高精度的模拟信号采集。具体实现方法如下: 1. 配置ADC时钟和DMA传输 首先需要配置ADC的时钟和DMA传输,可以使用HAL库提供的函数进行配置。例如: ```c /* 配置ADC时钟 */ __HAL_RCC_ADC_CLK_ENABLE(); /* 配置DMA传输 */ __HAL_RCC_DMA2_CLK_ENABLE(); hdma_adc.Instance = DMA2_Stream0; hdma_adc.Init.Channel = DMA_CHANNEL_0; hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE; hdma_adc.Init.MemInc = DMA_MINC_ENABLE; hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_adc.Init.Mode = DMA_CIRCULAR; hdma_adc.Init.Priority = DMA_PRIORITY_HIGH; hdma_adc.Init.FIFOMode = DMA_FIFOMODE_DISABLE; ``` 2. 配置ADC采样模式 接下来需要配置ADC采样模式,使其进入三重采样模式。可以使用HAL库提供的函数进行配置。例如: ```c /* 配置ADC采样模式 */ hadc.Instance = ADC1; hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc.Init.Resolution = ADC_RESOLUTION_12B; hadc.Init.ScanConvMode = DISABLE; hadc.Init.ContinuousConvMode = ENABLE; hadc.Init.DiscontinuousConvMode = DISABLE; hadc.Init.NbrOfDiscConversion = 0; hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.NbrOfConversion = 3; hadc.Init.DMAContinuousRequests = ENABLE; hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV; ``` 注意要将`hadc.Init.NbrOfConversion`设置为3,表示进行三次采样。 3. 启动ADC和DMA传输 配置完成后,可以启动ADC和DMA传输。可以使用HAL库提供的函数进行启动。例如: ```c /* 启动ADC */ HAL_ADC_Start_DMA(&hadc, (uint32_t*)&adc_values, 3); /* 启动DMA传输 */ HAL_DMA_Start_IT(&hdma_adc, (uint32_t)&ADC1->DR, (uint32_t)&adc_values, 3); ``` 其中,`adc_values`是一个数组,用于存储三次采样的结果。 4. 处理采样结果 采样完成后,可以在DMA传输完成的回调函数中处理采样结果。例如: ```c void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { /* 处理采样结果 */ uint16_t adc1_value = adc_values[0]; uint16_t adc2_value = adc_values[1]; uint16_t adc3_value = adc_values[2]; } ``` 以上就是STM32三重ADC采样的实现方法。需要注意的是,采样的精度和速度都会受到一定的影响,具体情况需要根据实际情况进行调整。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值