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

news2024/9/24 19:21:36

【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.coloradmin.cn/o/1440140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【EEG信号处理】对信号进行模拟生成

生成信号的目的还是主要是为了学习和探究后面的分析方法&#xff1b;本文主要是对方法进行整理 瞬态 transient 瞬态信号是指的是一瞬间信号上去了&#xff0c;这种情况我们可以用在时域上高斯模拟 peaktime 1; % seconds width .12; ampl 9; gaus ampl * exp( -(EEG.tim…

RocketMQ下载安装及基本使用

目录 消息队列的作用 消息队列的优势 应用解耦 异步提速 削峰填谷 RocketMQ介绍 RocketMQ特点 RocketMQ安装下载(4.9.5版本) RocketMQ启动可视化管理服务 RocketMQ实现基本消息收发 消息队列的作用 队列是一种FIFO先进先出的数据结构。消息则是跨进程传递的数据。一个…

多线程JUC:多线程的实现和常用成员方法(守护、礼让、插入线程)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;首期文章 &#x1f4da;订阅专栏&#xff1a;多线程&JUC 希望文章对你们有所帮助 JUC的学习也是需要一些计算机、操作系统的…

【算法设计与分析】求根节点到叶节点数字之和

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给你一个二叉树的根节点 root &#xff0c;树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数…

高可用 k8s 1.29 一键安装脚本, 丝滑至极

博客原文 文章目录 集群配置配置清单集群规划集群网络规划 环境初始化主机配置 配置高可用ApiServer安装 nginx安装 Keepalived 安装脚本需要魔法的脚本不需要魔法的脚本配置自动补全加入其余节点 验证集群 集群配置 配置清单 OS&#xff1a; ubuntu 20.04kubernetes&#xf…

HarmonyOS class类对象基础使用

按我们之前的写法 就是 Entry Component struct Dom {p:Object {name: "小猫猫",age: 21,gf: {name: "小小猫猫",age: 18,}}build() {Row() {Column() {// ts-ignoreText(this.p.gf.name)}.width(100%)}.height(100%)} }直接用 Object 一层一层往里套 这…

MySQL用心总结

大家好&#xff0c;好久不见&#xff0c;今天笔者用心一步步写一份mysql的基础操作指南&#xff0c;欢迎各位点赞收藏 -- 启动MySQL net start mysql-- 创建Windows服务 sc create mysql binPath mysqld_bin_path(注意&#xff1a;等号与值之间有空格) mysql -h 地址 -…

【Flink状态管理(二)各状态初始化入口】状态初始化流程详解与源码剖析

文章目录 1. 状态初始化总流程梳理2.创建StreamOperatorStateContext3. StateInitializationContext的接口设计。4. 状态初始化举例&#xff1a;UDF状态初始化 在TaskManager中启动Task线程后&#xff0c;会调用StreamTask.invoke()方法触发当前Task中算子的执行&#xff0c;在…

如何从 iPhone 上恢复永久删除的照片

您的 iPhone 上缺少照片吗&#xff1f;讽刺的是&#xff0c;iPhone 的许多高级功能可能正是这个问题如此普遍的原因。幸运的是&#xff0c;还有很多方法可以从 iPhone 恢复已删除的照片&#xff0c;具体取决于您设备的设置方式。 本文涵盖了所有这些内容。该过程根据您的具体情…

git安装配置

1、下载安装 下载地址 2、配置git用户 git config --global user.name "yw" git config --global user.email "88888qq.com" 3、git init 初始化 4、生成ssh密钥 mkdir .ssh //创建文件夹cd .ssh //进入新建文件夹 ssh-keygen -t rsa // 输入密钥文…

计算机服务器中了halo勒索病毒如何处理,halo勒索病毒解密数据恢复

网络技术的不断发展与应用&#xff0c;为企业的生产生活提供了极大便利&#xff0c;但网络数据安全威胁无处不在&#xff0c;近日&#xff0c;云天数据恢复中心接到某连锁超市求助&#xff0c;企业计算机服务器被halo勒索病毒攻击&#xff0c;导致计算机系统瘫痪&#xff0c;无…

将xyz格式的GRACE数据转成geotiff格式

我们需要将xyz格式的文件转成geotiff便于成图&#xff0c;或者geotiff转成xyz用于数据运算&#xff0c;下面介绍如何实现这一操作&#xff0c;采用GMT和matlab两种方法。 1.GMT转换 我们先准备一个xyz文件&#xff0c;这里是一个降水文件。在gmt中采用以下的语句实现xyz转grd…

【Spring】GoF 之工厂模式

一、GoF 23 设计模式简介 设计模式&#xff1a;一种可以被重复利用的解决方案 GoF&#xff08;Gang of Four&#xff09;&#xff0c;中文名——四人组 《Design Patterns: Elements of Reusable Object-Oriented Software》&#xff08;即《设计模式》一书&#xff09;&…

TCP 传输控制协议

1 TCP 1.1 TCP 最主要的特点 1.TCP 是面向连接的运输层协议。 2.每一条 TCP 连接只能有两个端点 (endpoint)&#xff0c;每一条 TCP 连接只能是点对点的&#xff08;一对一&#xff09;。 3.TCP 提供可靠交付的服务。 4.TCP 提供全双工通信。 5.面向字节流 TCP 中的“流…

【Qt】Android上运行keeps stopping, Desktop上正常

文章目录 问题 & 背景背景问题 解决方案One More ThingTake Away 问题 & 背景 背景 在文章【Qt】最详细教程&#xff0c;如何从零配置Qt Android安卓环境中&#xff0c;我们在Qt中配置了安卓开发环境&#xff0c;并且能够正常运行。 但笔者在成功配置并完成上述文章…

Git、github与gitee码云

1.git核心是两个仓库&#xff1a;本地仓库和远程仓库 主要用于团队合作和代码版本控制&#xff08;个人现有版本代码出错可回溯上个提交版本的代码&#xff09; 远程仓库国际主流githut&#xff0c;但外网速度问题&#xff0c;国内可使用码云gitee github&#xff1a;https:…

Springboot拦截器中跨域失效的问题、同一个接口传入参数不同,一个成功,一个有跨域问题、拦截器和@CrossOrigin和@Controller

Springboot拦截器中跨域失效的问题 一、概述 1、具体场景 起因&#xff1a; 同一个接口&#xff0c;传入不同参数进行值的修改时&#xff0c;一个成功&#xff0c;另一个竟然失败&#xff0c;而且是跨域问题拦截器内的request参数调用getHeader方法时&#xff0c;获取不到前端…

CSS:九宫格布局

九宫格布局效果如下&#xff1a; HTML 结构&#xff1a; <div class"container"><div class"item">1</div><div class"item">2</div><div class"item">3</div><div class"item&q…

机器学习系列——(十六)回归模型的评估

引言 在机器学习领域&#xff0c;回归模型是一种预测连续数值输出的重要工具。无论是预测房价、股票价格还是天气温度&#xff0c;回归模型都扮演着不可或缺的角色。然而&#xff0c;构建模型只是第一步&#xff0c;评估模型的性能是确保模型准确性和泛化能力的关键环节。本文…

【力扣】快乐数,哈希集合 + 快慢指针 + 数学

快乐数原题地址 方法一&#xff1a;哈希集合 定义函数 getNext(n) &#xff0c;返回 n 的所有位的平方和。一直执行 ngetNext(n) &#xff0c;最终只有 2 种可能&#xff1a; n 停留在 1 。无限循环且不为 1 。 证明&#xff1a;情况 1 是存在的&#xff0c;如力扣的示例一…