STM32Cube学习(3)——ADC

0、引言

单片机:STM32F407ZGT6;
仿真器:ST Link V2;
开发环境:STM32CubeIDE 1.10.1;
功能说明:使用单片机内部ADC进行一次最基础的模数转换。

前情提要:
STM32Cube学习(1)——点灯&配置
STM32Cube学习(2)——定时器中断

参考资料:
【STM32】HAL库 STM32CubeMX教程九—ADC
STM32 ADC详细篇(基于HAL库)
STM32F4数据手册

0.1、STM32——ADC简介

在这里插入图片描述
在这里插入图片描述

1、STM32CubeIDE配置

打开CubeIDE,新建工程,选择匹配的芯片

1.1、配置时钟

RCC选择HSE,高速时钟
在这里插入图片描述
配置时钟树,外部晶振为8MHz,同时设置PLL、系统时钟等,最终频率为72MHz
在这里插入图片描述

1.2、配置ADC功能

选择ADC2——》IN3
在这里插入图片描述
按照下图配置ADC
Independent mode 独立模式:我们只采用了一个ADC,故设置为独立模式;如果需要多个ADC同步使用,将配置为其他模式;
Clock Prescaler PCLK2 divided by2

ADC分频后的时钟不要高于36MHz,经APB2分频,得到APB2外设时钟为36M
在这里插入图片描述
采样分辨率Resolution配置为默认的12bit;
数据对齐方式Data Alignment 右对齐;
扫描转换模式Scan Conversion Mode该模式通常在多通道ADC采样时使能;
连续转换模式Continuous Conversion Mode该模式使能为连续转换,失能为单次转换,即需要再次触发转换才可以进行转换;
间断模式Discontinuous Conversion Mode在使用单通道采样时可不使用。
在这里插入图片描述
规则通道设置ADC_Regular_ConversionMode
转换通道数Number Of Conversion根据实际使用通道配置,当前为1;
外部触发转换源External Trigger Conversion Source
regular conversion launched by softwar软件规则进行转换。
外部触发转换边缘External Trigger Conversion Edge默认
转换顺序 Rank 默认:1(如果是多个ADC通道,可以挨个配置,用于设置每个通道转换顺序)
转换通道Channel默认:根据设置配置3
转换时间Sampling Time默认:3个时钟周期
在这里插入图片描述

1.2.1、外部触发转换

除了上述的触发方式外,还有以下触发方式,如定时器1捕获比较事件1
在这里插入图片描述
此外在设定了其他触发方式后,触发边缘边可以设置,如下图的
Trigger detection on the rising edge触发器探测上升沿
Trigger detection on the falling edge触发器探测下降沿
Trigger detection on the rising edge and falling edge触发器探测上升沿和下降沿
在这里插入图片描述

1.2.2、注入模式(injected)

留坑

1.2.3、看门狗(WatchDog)

使能模拟看门狗模式。在该模式下,当高于阈值(ADC_HTR)或低于阈值(ADC_LTR)便进入中断。
在这里插入图片描述

1.2.4、转换结束后中断

在这里插入图片描述

1.2.5、管脚配置

在这里插入图片描述

1.3、其他配置

在这里插入图片描述
点击==‘齿轮’==图标,生成代码。

2、代码添加

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
//添加全局变量
uint16_t Get_ADC_Value;
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
    
    
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC1_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    
    
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
      HAL_ADC_Start(&hadc1);     //启动ADC转换
	  HAL_ADC_PollForConversion(&hadc1, 50);   //等待转换完成,50为最大等待时间,单位为ms
	  //判断ADC是否转换成功
	  if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
	  {
    
    
	   Get_ADC_Value = HAL_ADC_GetValue(&hadc1);   //获取AD值
	  }
	 HAL_Delay(1000);
  }
  /* USER CODE END 3 */
}

猜你喜欢

转载自blog.csdn.net/u014798590/article/details/126654907