【STM32笔记】STM32的ADC开发基础(二)---轮询模式

本文详细介绍了STM32ADC的单通道和多通道配置,包括轮询模式下的单次和连续转换,以及使用HAL库中的关键函数如启动、阻塞式转换和结果读取。还展示了如何在STM32103C8芯片上实现ADC通道的单次和连续转换操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. ADC单通道配置(轮询模式)

  打开STM32CubeMX,选择STM32103C8芯片,设置基本配置。
  在ADC单通道配置中,当只进行一次ADC转换:需配置成“单次转换模式”,扫描模式关闭。ADC通道转换一次后,就停止转换。等待再次使能后才会重新转换。
在这里插入图片描述

  在ADC单通道配置中,当进行多次ADC转换:需配置成“连续转换模式”,扫描模式关闭。ADC通道转换一次后,接着进行下一次转换,不断的转换。
在这里插入图片描述
扫描模式:如果 只使用一个通道,默认DIEABLE,如果使用了多个通道会自动设置为ENABLE。
连续转换模式;如果设置了DISABLE,则是使用单次转换。如果设置为ENABLE模式,则是使用连续模式。它们的区别是连续转换是将所有开启的通道的数据转换完成后才停止转换,单次转换是则是只转换一次数据后就停止转换,要再次转换则需再次触发转换。

配置好ADC单通道转换模式后,会发现时钟配置报错在这里插入图片描述
点进去查看,发现是这里报错,在这里插入图片描述说明ADC时钟频率不能大于14MHz
这里将ADC分频器设置为/6在这里插入图片描述

设置好之后,设置存储路径,选择所用IDE,然后点击GENERATE CODE创建工程,open project打开工程进行全局编译。

二. HAL库中ADC转换的重要函数

启动ADC函数: HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);

/**
  * @简介    开启ADC,开启常规组转换,无中断功能
  * @参数    hadc: ADC实例指针
  * @返回值  函数执行状态
  */

HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);

阻塞式ADC转换函数:HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);

/**
  * @简介  等待常规组A/D转换完成。
  * @参数  hadc,ADC实例指针。
  * @参数  Timeout,超时时间。
  * @返回值  HAL_StatusTypeDef,函数执行状态。
*/

HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);

ADC转换结果读取函数:uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc);

/**
  * @简介  获取ADC常规组转换完成结果
  * @参数  hadc,ADC实例指针。
  * @返回值  uint32_t,ADC转换结果。
*/
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc);

关闭ADC函数:HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc);

/**
  * @简介    停止常规组(和注入通道)的ADC转换,禁止ADC外设
  * @参数    hadc: ADC实例指针
  * @返回值  函数执行状态
  */

HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc)

以上函数在stm32f1xx_hal_adc.c文件中
在这里插入图片描述
在这里插入图片描述

三. 实现ADC单通道转换

在main.c文件的main函数中的while下写入以下代码:

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  HAL_ADC_Start(&hadc1); // 开启ADC转换
	  if(HAL_OK == HAL_ADC_PollForConversion(&hadc1,10)){ // 等待ADC转换完成
		  printf("adc value: %d\r\n",HAL_ADC_GetValue(&hadc1)); // 得到ADC转换数据后通过串口发送到串口助手展示
		  printf("voltage value: %.2f\r\n",HAL_ADC_GetValue(&hadc1)*3.3/4096);
	  }
	  HAL_ADC_Stop(&hadc1); // 关闭ADC转换
	  HAL_Delay(500);
    /* USER CODE END WHILE */

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

为了是实验数据更加直观,这里的PA1引脚口连接到PS2双轴按键摇杆的X轴上进行数据读取,并发送到上位机。
在这里插入图片描述
可以发现数据正常读取到了。

四. ADC多通道配置(轮询模式)

  打开STM32CubeMX,选择STM32103C8芯片,设置基本配置。
在这里插入图片描述
在这里插入图片描述
间断模式:允许用户通过设置一个或多个转换序列,并通过设置转换序列的长度来指定要进行的连续转换的次数。

  在ADC多通道配置中,只进行一次ADC转换:配置为“单次转换模式”,扫描模式使能,开启间断模式。开启ADC的多个通道,按照配置的顺序依次转换一次后,就停止转换。等待再次使能后才会重新转换
在这里插入图片描述

  在ADC多通道配置中,进行连续ADC转换:配置为“连续转换模式”,扫描模式使能,开启间断模式。开启ADC的多个通道,按照配置的顺序依次转换一次后,接着进行下一次转换,不断的转换。
在这里插入图片描述
设置好之后,设置存储路径,选择所用IDE,然后点击GENERATE CODE创建工程,open project打开工程进行全局编译。

五. 实现ADC多通道转换

在main.c文件的main函数中的while下写入以下代码:

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  for(int i = 0; i<2;i++){
		  HAL_ADC_Start(&hadc1);
		  HAL_ADC_PollForConversion(&hadc1,10);
		  adc_value[i] = HAL_ADC_GetValue(&hadc1);
	  }
	  HAL_ADC_Stop(&hadc1);
    /* USER CODE END WHILE */

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

在main.c文件中的Private variables下的USER CODE BEGIN PV注释对中写入以下代码

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

/* USER CODE BEGIN PV */
unsigned int adc_value[2];
/* USER CODE END PV */

编译下载到开发板上,连接上位机。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值