【stm32】hal库学习笔记-ADC模数转换(超详细!)

【stm32】hal库学习笔记-ADC模数转换(超详细!)

本篇章介绍了ADC实现电压检测的三种方式

ADC原理及选型

ADC将连续的模拟电压信号转换为二进制的数字信号

选型参数

速度(采样频率)
功耗
精度在这里插入图片描述

转换原理

在这里插入图片描述

ADC hal库驱动函数

在这里插入图片描述

普通通道检测电压

CubeMX图形化配置

导入TFT_LCD配置(配置方法见上一篇博客)

时钟树配置
在这里插入图片描述
打开外部时钟
在这里插入图片描述
FSMC配置
在这里插入图片描述
ADC配置
在这里插入图片描述

将Time base的优先级调为0 打开中断

在这里插入图片描述

代码实现

  /* USER CODE BEGIN 2 */
  lcd_init();
//  lcd_show_str(10, 40, 24, "ADC1-IN5 channel", RED);
//  lcd_show_str(10, 70, 24, "Please set jumper at first", RED);
//  lcd_show_str(10,100, 24, "Tune potentiometer for input", RED);
  lcd_show_str(10,130, 24, "ADC 12-bits Value = ", RED);
  lcd_show_str(10,190, 24, "Voltage(mV) = ", RED);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
   
	  HAL_ADC_Start(&hadc1);
	  if (HAL_ADC_PollForConversion(&hadc1, 200) == HAL_OK) {
   
		  uint32_t val = HAL_ADC_GetValue(&hadc1);
		  lcd_show_num(50, 160, val, 4, 24, RED);

		  uint32_t Volt = 3300 * val >> 12;
		  lcd_show_num(50, 220, Volt, 4, 24, RED);
	  }
	  //HAL_ADC_Stop(&hadc1);
	  HAL_Delay(500);
    /* USER CODE END WHILE */

实现效果

在这里插入图片描述
每0.5秒采样一次(不精确)

外部中断触发检测电压

CubeMX图形化配置

打开外部中断触发
在这里插入图片描述
在这里插入图片描述
修改时钟树
在这里插入图片描述
设置TIM3
在这里插入图片描述
参数设置原理见博客定时器篇章
更改中断优先级
在这里插入图片描述

代码实现

  /* USER CODE BEGIN 2 */
  lcd_init();
  lcd_show_str(10,160, 24, "ADC 12-bits Value = ", RED);
  lcd_show_str(10,220, 24, "Voltage(mV) = ", RED);

  HAL_ADC_Start_IT(&hadc1);
  HAL_TIM_Base_Start(&htim3);
  /* USER CODE END 2 */

重写回调函数

/* USER CODE BEGIN 4 */
__weak void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {
   
	if (hadc->Instance == ADC1) {
   
		uint32_t val = HAL_ADC_GetValue(&hadc1);
		lcd_show_num(50, 190, val, 4, 24, RED);

		uint32_t Volt = 3300 * val >> 12;
		lcd_show_num(50, 250, Volt, 4, 24, RED);
	}
}
/* USER CODE END 4 */

实现效果

每0.5秒采样一次(较精确)

DMA和多通道传输

设置三个输入通道
使用扫描转换模式
利用DMA方式传输数据

CubeMX图形化配置

DMA设置
在这里插入图片描述
ADC设置
在这里插入图片描述
在这里插入图片描述

代码实现

#define		BATCH_DATA_LEN	3
uint32_t	dmaDataBuffer[BATCH_DATA_LEN];
/* USER CODE END PV */
  /* USER CODE BEGIN 2 */
  lcd_init();
//  lcd_show_str(10, 40, 24, "Conversion triggered by", RED);
//  lcd_show_str(10, 70, 24, "TIM3 with interval of 500ms", RED);
  lcd_show_str(10,100, 24, "Channel 5 Voltage(mV) = ", RED);
  lcd_show_str(10,160, 24, "Reference Voltage(mV) = ", RED);
  lcd_show_str(10,220, 24, "Battery   Voltage(mV) = ", RED);

  HAL_ADC_Start_DMA(&hadc1, dmaDataBuffer, BATCH_DATA_LEN);
  HAL_TIM_Base_Start(&htim3);
  /* USER CODE END 2 */

重写回调函数

/* USER CODE BEGIN 4 */
__weak void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {
   
	uint32_t adcValue = 0, Volt;
	for (uint8_t i = 0; i < BATCH_DATA_LEN; ++i) {
   
		adcValue = dmaDataBuffer[i];
		Volt = 3300 * adcValue >> 12;
		if (i % 3 == 0) {
   
			lcd_show_num(50, 130, Volt, 4, 24, RED);
		} else if (i % 3 == 1) {
   
			lcd_show_num(50, 190, Volt, 4, 24, RED);
		} else if (i % 3 == 2) {
   
			lcd_show_num(50, 250, Volt, 4, 24, RED);
		}
	}
}
/* USER CODE END 4 */

实现效果

在这里插入图片描述

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-02-05 16:54:03       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-05 16:54:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-05 16:54:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-05 16:54:03       20 阅读

热门阅读

  1. 20240204金融读报1分钟小得

    2024-02-05 16:54:03       29 阅读
  2. Kafka的高可用机制

    2024-02-05 16:54:03       32 阅读
  3. 2.3作业

    2.3作业

    2024-02-05 16:54:03      27 阅读
  4. flink实战--flink的job_listener使用解析

    2024-02-05 16:54:03       29 阅读
  5. android tv开发-1,leanback替代品

    2024-02-05 16:54:03       33 阅读
  6. sklearn缺失值处理:SimpleImputer模块 补全缺失值

    2024-02-05 16:54:03       30 阅读
  7. 【Android】获取设备IP的方法

    2024-02-05 16:54:03       36 阅读
  8. 使用freemarker和itextpdf结合,将html转化为pdf

    2024-02-05 16:54:03       34 阅读
  9. vue封装滚动表格

    2024-02-05 16:54:03       32 阅读