【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.hqwc.cn/news/453846.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码审计-CVE-2023-6654-PHPEMS-加密-解密分析

路由&#xff1a; 入口方法&#xff1a; 鉴权分析&#xff1a; 由此可以得出 鉴权是由session类负责获取参数后&#xff0c;由各个类的魔术方法负责&#xff1a;&#xff08;在此还有一个方法 全局搜索登录关键词&#xff09; 1、断点分析&#xff1a; 寻找鉴权点分析&#…

docker安装zpan

安装 1.创建数据库 docker run -di --namezpan_mysql -p 3309:3306 -e MYSQL_ROOT_PASSWORD123456 mysql 2.手动新建数据库zpan 3.创建目录 mkdir -p /opt/zpan cd /opt/zpan 4.编写配置文件 vim config.yml #详细配置文档可参考&#xff1a; https://zpan.space/#/zh…

八中友好教室1

题目 思路 我们可以在dfs遍历时顺便统计以每个节点为根的子树的节点个数&#xff0c;然后在回溯的时候判断如果以当前节点的子节点为根的子树的节点个数个数为偶数&#xff0c;说明这些点可以两两配对&#xff0c;所以当前节点与子节点之间不需要配对&#xff0c;否则的话就把…

代码随想录算法训练营29期|day41 任务以及具体任务

第九章 动态规划part03 343. 整数拆分 class Solution {public int integerBreak(int n) {//dp[i] 为正整数 i 拆分后的结果的最大乘积int[] dp new int[n1];dp[2] 1;for(int i 3; i < n; i) {for(int j 1; j < i-j; j) {// 这里的 j 其实最大值为 i-j,再大只不过是重…

保护个人信息安全,避免成为“互联网中的裸泳者”

⚽️ 一、互联网中的裸泳者&#x1f3c0; 二、代理 IP 的应用 - 解锁无限可能⚾️ 三、代理 ip 的几种类型 3.1 动态住宅代理&#xff08;Rotating Residential Proxy&#xff09;3.2 静态住宅代理&#xff08;Static Residential Proxy&#xff09;3.3 动态长效ISP&#xff08…

交友系统---让陌生人变成熟悉人的过程。APP小程序H5三端源码交付,支持二开。

随着社交网络的发展和普及&#xff0c;人们之间的社交模式正在发生着深刻的变革。传统的线下交友方式已经逐渐被线上交友取而代之。而同城交友正是这一趋势的产物&#xff0c;它利用移动互联网的便利性&#xff0c;将同城内的人们连接在一起&#xff0c;打破了时空的限制&#…

挖矿系列:细说Python、conda 和 pip 之间的关系

继续挖矿&#xff0c;挖金矿&#xff01; 1. Python、conda 和 pip Python、conda 和 pip 是在现代数据科学和软件开发中常用的工具&#xff0c;它们各自有不同的作用&#xff0c;但相互之间存在密切的关系&#xff1a; Python&#xff1a;是一种解释型、面向对象的高级程序设…

自定义Dockerfile构建运行springboot

自定义Dockerfile构建运行springboot 通过dockerfile生成自定义nginx镜像 &#xff01;&#xff01;&#xff01;docker 必须在linux环境下才能进行如果你是window则需要装虚拟机 新建一个文件名字为Dockerfile&#xff0c;无需后缀 文件完整名就是Dockerfile,也可以自定义d…

全新 鸿蒙系统

一&#xff0c; 开发框架 基础 二&#xff0c; 官网地址 文档开发&#xff1a;华为HarmonyOS智能终端操作系统官网 | 应用设备分布式开发者生态 三&#xff0c;基础了解 鸿蒙系统是基于 js 和 ts 衍生出来的一个东西 要学 arkts 就要学习 js 和 ts 语法 四&#xff0c…

《合成孔径雷达成像算法与实现》Figure6.4

clc clear close all参数设置 距离向参数设置 R_eta_c 20e3; % 景中心斜距 Tr 2.5e-6; % 发射脉冲时宽 Kr 20e12; % 距离向调频率 alpha_os_r 1.2; % 距离过采样率 Nrg 320; % 距离线采样数 距离向…

相同的树[简单]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你两棵二叉树的根节点p和q&#xff0c;编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,…

opencv中使用cuda加速图像处理

opencv大多数只使用到了cpu的版本&#xff0c;实际上对于复杂的图像处理过程用cuda&#xff08;特别是高分辨率的图像&#xff09;可能会有加速效果。是否需要使用cuda需要思考&#xff1a; 1、opencv的cuda库是否提供了想要的算子。在CUDA-accelerated Computer Vision你可以…