STM32ADC单通道采集中断方式

STM32ADC单通道采集中断方式

  • ADC内容补充
  • CubeMX配置
  • 代码展示

本期内容将将介绍STM32ADC单通道采集中断方式的使用方法,以及对ADC的一些知识进行补充,如果有不懂的内容,可以先去看看往期内容,会好理解很多。

  • 夜深人静学32系列18——DMA+ADC单/多通道采集

ADC内容补充

1. ADC时钟

  • STM32F1系列的ADC时钟最大为14MHz
  • STM32F4、F7、H7的ADC时钟最大为36MHz
  • 本期内容使用的F411RCT6最大ADC时钟只有25MHz

2. 转换时间(以12位分辨率为例)

  • ADC转换时间 = 采样时间 + 12个时钟周期
  • 采样时间越短,ADC转换结果越不准确,反之越精确
  • 最短采样为3时钟周期,最长为480时钟周期
  • F411RCT6最短转换时间为 15*(1/25000000)= 0.6us

3.ADC中断与ADC请求

  • 对于单通道转换,我们常使用中断的方式,避免多次采样浪费系统资源。
  • 对于多通道转换,我们常采用DMA请求方式,防止数据覆盖丢失。

STM32ADC单通道采集中断方式_第1张图片

CubeMX配置

STM32ADC单通道采集中断方式_第2张图片
STM32ADC单通道采集中断方式_第3张图片
STM32ADC单通道采集中断方式_第4张图片

进行以上配置并完成串口、时钟、Debug等配置后生成代码

代码展示

  1. adc.c
__IO uint32_t ADC_ConvertedValue;  //ADC转化的数据(12位右对齐)

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    ADC_ConvertedValue = HAL_ADC_GetValue(hadc);    //获取ADC转换结果
    HAL_ADC_Start_IT(&hadc1); //开启ADC中断转换(正常来说不需要这句,但是不知道为什么我的板子要才能正常运行)
}

在adc.c文件中加入一下代码,并在adc.h中对定义的变量 ADC_ConvertedValue 进行外部声明。

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

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

/* USER CODE END Includes */

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

// 用于保存转换计算后的电压值     
float ADC_Vol;
/* 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 */

/* 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();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
//  HAL_ADCEx_Calibration_Start(&hadc1);    //AD校准
  HAL_ADC_Start_IT(&hadc1); //开启ADC中断转换
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
      ADC_Vol =(float) ADC_ConvertedValue/4096*3.3; // 读取转换的AD倿
      printf("The current AD value = 0x%04X \r\n", ADC_ConvertedValue); 
      printf("The current AD value = %f V \r\n\r\n",ADC_Vol); //实际电压值
      HAL_Delay(1000); 
    /* USER CODE END WHILE */

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

运行结果如下:

STM32ADC单通道采集中断方式_第5张图片

你可能感兴趣的:(stm32,单片机,嵌入式硬件)