STM32 CUbeIDE ADC采集 单通道和多通道 DMA

STM32 CUbeIDE ADC采集单通道和多通道 DMA

  • 1、ADC采集单通道
    • 1.1 、创建工程选择ADC
    • 1.2、重定向printf 可以输出小数
    • 1.3、开启 ADC DMA
  • 2、ADC采集2通道

  STM32拥有 1~3个 ADC STM32F101/102系列只有 1个 ADC)),这些 ADC可以独立使用,也可以使用双重模式(提高采样率)。 STM32的 ADC是 12位逐次逼近型的模拟数字转换器。它有 18个通道,可测量 16个外部和 2个内部信号源。各通道的 A/D转换可以单次、连续、扫描或间断模式执行。 ADC的结果可以左对齐或右对齐方式存储在 16位数据寄存器中。
  STM32F103系列最少都拥有 2个 ADC, STM32F103RCT包含有 3个ADC。STM32的 ADC最大的转换速率为 1Mhz,也就是转换时间为 1us(在ADCCLK=14M,采样周期为 1.5个 ADC时钟下得到),不要让 ADC的时钟超过 14M,否则将导致结果准确度下降。

1、ADC采集单通道

1.1 、创建工程选择ADC

开始创建工程文件,选择对应的芯片,我自己使用的是STM32F103RC
STM32 CUbeIDE ADC采集 单通道和多通道 DMA_第1张图片
打开调试,可以下载代码
STM32 CUbeIDE ADC采集 单通道和多通道 DMA_第2张图片
开启外部时钟
STM32 CUbeIDE ADC采集 单通道和多通道 DMA_第3张图片
配置时钟树
STM32 CUbeIDE ADC采集 单通道和多通道 DMA_第4张图片
开启ADC选择 ,选择了PA1
STM32 CUbeIDE ADC采集 单通道和多通道 DMA_第5张图片
选择连续转换模式(Continuous Conversion Mode),并调整采样时间。
STM32 CUbeIDE ADC采集 单通道和多通道 DMA_第6张图片
开启DMA转换,选择循环模式,半字。
STM32 CUbeIDE ADC采集 单通道和多通道 DMA_第7张图片

为了方便调试,开启串口1,USART1,选择异步通信。
STM32 CUbeIDE ADC采集 单通道和多通道 DMA_第8张图片
为了让生成的文件都是单独分开的,这样看着方便,选择如下所示
STM32 CUbeIDE ADC采集 单通道和多通道 DMA_第9张图片
生成代码,在此之前,还有重要的一步,编码问题,STM32 CUbeIDE 默认UTF-8编码,会出现中文字符乱码问题,所以我选择了GBK编码,防止乱码。
STM32 CUbeIDE ADC采集 单通道和多通道 DMA_第10张图片
STM32 CUbeIDE ADC采集 单通道和多通道 DMA_第11张图片

1.2、重定向printf 可以输出小数

我的重定向和你看到一般重定向可能不一样,但是效果是一样的。特别注意的一点就是,在STM32 CUbeIDE中,要输出小数还要选择勾选对应的选项。
STM32 CUbeIDE ADC采集 单通道和多通道 DMA_第12张图片
STM32 CUbeIDE ADC采集 单通道和多通道 DMA_第13张图片
定义数组保存要发送的数据,和adc值保存数组,定义为uint16_t 是因为,在开启ADC的时候,选择了半字。
STM32 CUbeIDE ADC采集 单通道和多通道 DMA_第14张图片

/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "stdint.h"
#include  // correct header
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
#define printf(...)  HAL_UART_Transmit((UART_HandleTypeDef *)&huart1, (uint8_t *)u_buf,\
		                                sprintf((char*)u_buf,__VA_ARGS__), 0xFFFF);
/* USER CODE END PTD */

定义的发送数据数组,和adc值保存变量

/* USER CODE BEGIN PV */
uint8_t u_buf[64];//定义数据存放
uint16_t adc_buf[2];
/* USER CODE END PV */

生成hex文件,STM32 CUbeIDE默认不生成hex文件,需要勾选对应项。
STM32 CUbeIDE ADC采集 单通道和多通道 DMA_第15张图片

1.3、开启 ADC DMA

在HAL 库中使用ADC 、定时器等,都是需要自己先开启,在使用的。
在这里插入图片描述

HAL_ADC_Start_DMA((ADC_HandleTypeDef*)&hadc1, (uint32_t*)adc_buf, (uint32_t)1); //通道数1

hadc1 :定义的ADC结构体变量,在adc.c中可以看到
adc_buf :前面定义的变量
STM32 CUbeIDE ADC采集 单通道和多通道 DMA_第16张图片
串口输出ADC转换的值
STM32 CUbeIDE ADC采集 单通道和多通道 DMA_第17张图片

while (1)
  {
	  printf("ADC = %d\r\n",adc_buf[0]);
	  printf("voltage: %f\r\n,(float)adc_buf[0]/4096*3.3");
	  HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

  }

2、ADC采集2通道

  既然有了1路的ADC采集,那么多路的ADC其实就是在1路ADC上面改改。现在生成2路ADC。选择了PA1 PA2
STM32 CUbeIDE ADC采集 单通道和多通道 DMA_第18张图片
  采样时间可以不修改,保持默认也是可以的,但是为了保证采样周期完整,周期修改大一点。

STM32 CUbeIDE ADC采集 单通道和多通道 DMA_第19张图片
生成代码,开启ADC 。
在这里插入图片描述

HAL_ADC_Start_DMA((ADC_HandleTypeDef*)&hadc1, (uint32_t*)adc_buf,(uint32_t)2); //2路

输出采样数据
STM32 CUbeIDE ADC采集 单通道和多通道 DMA_第20张图片

你可能感兴趣的:(STM32F103)