当前位置: 首页 > news >正文

【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 */

实现效果

在这里插入图片描述

http://www.lryc.cn/news/296605.html

相关文章:

  • 蓝桥杯基础知识6 pair
  • 后端返回给前端的数据格式有哪些?
  • Transformer的PyTorch实现之若干问题探讨(一)
  • 系统参数SystemParameters.MinimumHorizontalDragDistance
  • 平屋顶安装光伏需要注意哪些事项?
  • 《Git 简易速速上手小册》第7章:处理大型项目(2024 最新版)
  • 从0开始学Docker ---Docker安装教程
  • 嵌入式学习之Linux入门篇笔记——15,Linux编写第一个自己的命令
  • 【C语言】SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
  • C++实现鼠标点击和获取鼠标位置(编译环境visual studio 2022)
  • Matplotlib绘制炫酷散点图:从二维到三维,再到散点图矩阵的完整指南与实战【第58篇—python:Matplotlib绘制炫酷散点图】
  • Docker-Learn(一)使用Dockerfile创建Docker镜像
  • 问题:银行账号建立以后,一般需要维护哪些设置,不包括() #学习方法#经验分享
  • 教授LLM思考和行动:ReAct提示词工程
  • FPGA_工程_按键控制的基于Rom数码管显示
  • WordPress Plugin HTML5 Video Player SQL注入漏洞复现(CVE-2024-1061)
  • 【Kotlin】Kotlin基本数据类型
  • UDP端口探活的那些细节
  • 拦截器配置,FeignClient根据业务规则实现微服务动态路由
  • 预测模型:MATLAB线性回归
  • 【人工智能】神奇的Embedding:文本变向量,大语言模型智慧密码解析(10)
  • Redis + Lua 实现分布式限流器
  • ruoyi若依框架SpringSecurity实现分析
  • Habitat环境学习四:Habitat-sim基础用于导航——使用导航网格NavMesh
  • python学习笔记 -- 字符串
  • 2024年GPT如何发展?
  • 从REPR设计模式看 .NET的新生代类库FastEndpoints的威力
  • 前端入门:(五)JavaScript 续
  • 研究多态恶意软件,探讨网络安全与AI
  • linux驱动工作原理