【STM32+HAL+Proteus】系列学习教程---ADC(查询、中断、DMA模式下的电压采集)

实现目标

1、学会STM32CubeMX软件关于ADC的配置

2、掌握ADC三种模式(查询、中断、DMA)编程

3、具体目标:1、将开发板单片机采集到的电压值上传至上位机串口调试助手显示。


一、ADC  概述

1、什么是ADC?

ADC(Analog to Digital Converter)即模数转换器,用来将模拟信号转换为数字信号。

A/D转换过程

分辨率: A/D转换器对输入模拟量微小变化的分辨能力,通常用二进制数的有效位表示。

在最大输入电压一定时,位数越多,量化单位越小,误差越小,分辨率越高。

2、STM32F103 的ADC

(1)简介

        STM32F103 系列最多有3个ADC控制器(ADC1,ADC2,ADC3),多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次连续扫描或间断模式执行。ADC的结果可以左对齐右对齐方式存储在16位数据寄存器中。ADC为12位,是一种逐次逼近型模拟数字转换器。

(2)ADC通道与引脚对应关系

(3)STM32分为两种组转换模式

规则通道:
        规则通道相当于你正常运行的程序,看它的名字就可以知道,很规矩,就是正常执行程序
注入通道:
        注入通道可以打断规则通道,听它的名字就知道不安分,如果在规则通道转换过程中,有注入通道进行转换,那么就要先转换完注入通道,等注入通道转换完成后,再回到规则通道的转换流程。

(4)ADC配置说明

配置选项说明:

模式设置

1、ADCs_Common_Settings  DC模式设置

 ADC_Mode_Independent      独立模式

        独立模式模式下,双ADC不能同步,每个ADC接口独立工作。所以如果不需要ADC同步或者只是用了一个ADC的时候,应该设成独立模式,多个ADC同时使用时会有其他模式,如双重ADC同步模式,两个ADC同时采集一个或多个通道,可以提高采样率

ADC常规设置

1、Data Alignment (数据对齐方式): 右对齐/左对齐

2、Scan Conversion Mode( 扫描模式 ) :

如果只是用了一个通道的话,DISABLE,果使用了多个通道的话,会自动设置为ENABLE。

3、Continuous Conversion Mode(连续转换模式) :

        设置为ENABLE,即连续转换。如果设置为DISABLE,则是单次转换。两者的区别在于连续转换直到所有的数据转换完成后才停止转换,而单次转换则只转换一次数据就停止,要再次触发转换才可以进行转换。

4、Discontinuous Conversion Mode(间断模式) 

这里只用到了1个ADC,所以这个直接不使能即可。

规则通道设置

1、Enable Regular Conversions (启用常规转换模式)    ENABLE

使能 否则无发进行下方配置

2、Number OF Conversion(转换通道数)    1
用到几个通道就设置为几,多个通道会自动使能扫描模式

3、Extenal Trigger Conversion Source (外部触发转换源)

默认采用:Regular Conversion launched by software 规则的软件触发 调用函数触发即可

Rank 转换顺序

1、多个通道时会有多个Rank,可以设定每个通道的转换顺序。

2、ADC总转换时间如下计算:

TCONV = 采样时间+ 12.5个周期   其中1周期为1/ADCCLK

        为了保证ADC转换结果的准确性,ADC的时钟最好不超过14M。当ADCCLK=14MHz(最大),采样时间为1.5周期(最快)时,TCONV =1.5+12.5=14周期=1μs。STM32的ADC最大的转换速率为1MHz,也就是说最快转换时间为1us,

注入通道设置

1、注入通道的设置,和规则通道设置差不多。

WahchDog

1、当ADC转换的模拟电压值低于低阈值或高于高阈值时,便会产生中断。阈值的高低值由ADC_LTR和ADC_HTR配置模拟看门狗。

(5)ADC的三种工作模式

1)阻塞模式(也叫查询模式);2)中断模式;3) DMA 模式

二、原理图设计

三、STM32CubeMX 配置串口重定向(printf)

此项目利用printf 打印ADC采样值,先对USART1重定向,详细教程参考前面的教程:

https://blog.csdn.net/luojuan198780/article/details/138044075

代码设计:

/* USER CODE BEGIN Includes */#include <stdio.h>/* USER CODE END Includes */
/* USER CODE BEGIN 4 *//*********************************************************
*
*重定义 fputc 函数
*
*********************************************************/
int fputc(int ch,FILE *f)
{HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );return ch;
}
/* USER CODE END 4 */

四、STM32CubeMX 配置及程序设计(单通道)

1.阻塞模式(查询模式)

1.1CubeMX 配置 (单通道轮询)

配置:打开通道8,其他默认

1.2 程序设计

Step1 : 启用ADC
Step2 :   等待EOC标志位
Step3: 读取寄存器的数据 、<-- 查询环节
缺点:占用cpu的使用率

主要函数:
HAL_StatusTypeDef  HAL_ADC_Start (ADC_HandleTypeDefhadc); //打开ADC的转换通道
HAL_StatusTypeDef  HAL_ADC_Stop (ADC_HandleTypeDefhadc) //关闭ADC
HAL_StatusTypeDef  HAL_ADC_PollForConversion (ADC_HandleTypeDef*hadc,uint32_t Timeout); // 查询函数

(1)在main.c中定义一个全局变量

uint16_t ADC_Value;

(2)在main 初始化中开启ADC校准

HAL_ADCEx_Calibration_Start(&hadc1);    //AD校准

(3)在while 中编写ADC控制程序

 HAL_ADC_Start(&hadc1);     //启动ADC转换HAL_ADC_PollForConversion(&hadc1, 50);   //等待转换完成,50为最大等待时间,单位为msif(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC)){ADC_Value = HAL_ADC_GetValue(&hadc1);   //获取AD值printf("ADC值: %d \r\n",ADC_Value);printf("采样电压 : %.2f V\r\n",ADC_Value*3.3f/4096);}
HAL_Delay(1000);

2.中断模式(单通道)

2.1CubeMX 配置

配置:其打开ADC中断。他与查询模式一样,

2.2 程序设计

Step1 : 启用ADC,使能中断
Step2 :   等待EOC自动触发中断
Step3: 在中断中读取寄存器的数据
主要函数
HAL_StatusTypeDef HAL_ADC_Start_IT (ADC_HandleTypeDefhadc) //使能ADC,打开中断标志位
HAL_StatusTypeDef HAL_ADC_Stop——IT (ADC_HandleTypeDefhadc)
HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)//回调函数

 (1)在main.c中定义一个全局变量

uint16_t ADC_Value;

(2)在main函数中开启ADC中断

HAL_ADC_Start_IT(&hadc1);

(3)编写中断回调函数

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)//回调函数
{ADC_Value =  HAL_ADC_GetValue(&hadc1) * 3.3 /4096;printf("采样电压 : %.2f V\r\n",ADC_Value );
}

3.DMA 模式(单通道)

DMA 有两种模式,分别为循环模式circular和正常模式normal
circular模式:DMA 的circular模式只需要调用一次DMA 开启函数,DMA 就会持续的搬运数据,提高了数据的刷新速度,但是在circular模式下,不管ADC新的一轮数据采集是否完成,有可能直接将旧数据搬运走.
normal模式:该模式下,DMA 启动函数调用一次,DMA 通道只会搬运一次数据,这样每调一次DMA 启动函数,DMA 只会搬运一次数据,等待数据传输完成后再次开启DMA 启动函数,这样更能保证ADC数据采集的可靠性.

3.1CubeMX 配置(circular模式)

配置1:开启连续转换

配置2:添加DMA,模式选择为循环模式circular

3.1 程序设计

(1)在main.c中定义一个全局变量

 uint16_t ADC_Value=0;

(2)在main函数中开启ADC的 DMA

 HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&AD_value,sizeof(AD_value));

(3)在while 中编写ADC控制程序

      printf("ADC值: %d \r\n",ADC_Value);printf("采样电压 : %.2f V\r\n",ADC_Value*3.3f/4096);HAL_Delay(100);

五、STM32CubeMX 配置及程序设计(多通道)

1.阻塞模式(多通道)

1.1CubeMX 配置 

多个通道时必须开启间断模式,并且每个间断组中只有一个通道,否则每次只能读取到每组最后一个通道的值。

1.2 程序设计

(1)在main.c中定义一个全局变量

uint16_t AD_value[2]={0};

(2)在while 中编写ADC控制程序

for(i=0;i<2;i++)
{HAL_ADC_Start(&hadc1);HAL_ADC_PollForConversion(&hadc1,10);AD_value[i]=HAL_ADC_GetValue(&hadc1);printf("i= %d;AD_value%d\r\n",i,AD_value[i]);printf("i= %d;电压值 = %.3f v\r\n",i,AD_value[i]*3.3/4096);
}
HAL_Delay(500);

2.中断模式(多通道)

        多通道情况下使用中断来读取数据理论上是可行的,但是读取的数据会混淆,即无法确定读取的数据是属于哪一个通道的,因此一般不使用。

3.DMA(多通道)

3.1CubeMX 配置 

开启DMA并采用circular模式

3.2 程序设计

(1)在main.c中定义变量

/* USER CODE BEGIN 1 */uint16_t ADC_Value1,i;uint16_t AD_Buf[2]={0};//两个通道采集数据存在这个数组里面/* USER CODE END 1 */

(2)在main函数中开启ADC的 DMA

//开启ADC的校准
HAL_ADCEx_Calibration_Start(&hadc1);
//开启ADC的DMA,采集的数据放入 AD_Buf数组
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&AD_Buf,2);

(3)在while 中编写ADC控制程序

		printf("AD1=%d\n\r",AD_Buf[0]);printf("AD2=%d\n\r",AD_Buf[1]);HAL_Delay(100);


总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/828725.shtml

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

相关文章

【课程发布】软考高项目十大管理ITTO宫殿记忆法新版第四版正式发布

软考高项十大管理ITTO宫殿记忆法视频课程&#xff1a; 平台&#xff1a;荔枝微课 连接&#xff1a;十方教育 各位软考高级信息系统项目管理师考生好&#xff0c;新版第四版十大管理ITTO宫殿记忆法视频课程终于发布了&#xff0c;之前苦等的考生终于迎来了救星&#xff0c;再也…

浅谈数据模型

1&#xff1a;事实表和维表的概述 前言&#xff1a;数据仓库是一种用于存储和管理大量数据的技术。其中&#xff0c;事实表和维表是数据仓库中的两个重要概念&#xff0c;首先了解一下事实表和维度表 1.事实表&#xff1a;是指用于存储测量“事实数据”的表&#xff0c;事实数…

算法学习笔记Day8——回溯算法

本文解决几个问题&#xff1a; 回溯算法是什么&#xff1f;解决回溯算法相关的问题有什么技巧&#xff1f;回溯算法代码是否有规律可循&#xff1f; 一、介绍 1.回溯算法是什么&#xff1f; 回溯算法就是个多叉树的遍历问题&#xff0c;关键在于在前序和后序时间点做一些操作…

Java基础入门day35

day35 js 简介 js&#xff1a;JavaScript&#xff0c;是一种解释性语言&#xff0c;动态类型、弱类型的计算机语言 它的解释器被称之为JavaScript引擎&#xff0c;作为浏览器的一部分&#xff0c;广泛用于客户端脚本语言&#xff0c;用来给html网页增加动态功能 问题描述&…

哈希表练习题

前言 本次博客将要写一写&#xff0c;哈希表的一些使用 哈希表主要是一个映射&#xff0c;比如数组就是一个哈希表 是一个整型对应另一个整型&#xff0c;介绍的哈希表还是要以写题目为例 第一题 242. 有效的字母异位词 - 力扣&#xff08;LeetCode&#xff09; 直接来看…

chrome插件 脚本 使用和推荐

chrome插件使用 在极简插件中可以进行下载并进行安装, 内部有安装教程在极简插件中搜索"油猴",下载一个油猴插件,并安装,可以用于下载很多的用户脚本用户脚本下载地址Greasy Fork,里面有很多实用的用户脚本供下载,并在油猴中进行管理 推荐的插件 Tampermonkey 篡改…

小红书自动互动,建立个人品牌的秘密武器!

在数字化的今天&#xff0c;个人品牌的重要性不言而喻。它不仅能让你在人群中脱颖而出&#xff0c;还能为你的事业或生意带来无尽的机会。然而&#xff0c;建立并推广个人品牌并非易事&#xff0c;需要策略、耐心和一定的工具辅助。在这里&#xff0c;我们要探讨的是如何利用小…

【Python数据库】Redis

文章目录 [toc]数据插入数据查询数据更新数据删除查询存在的所有key 个人主页&#xff1a;丷从心 系列专栏&#xff1a;Python数据库 学习指南&#xff1a;Python学习指南 数据插入 from redis import Redisdef insert_data():redis_cli Redis(hostlocalhost, port6379, db…

智慧健康旅居养老产业,做智慧旅居养老服务的公司

随着社会的进步和科技的飞速发展&#xff0c;传统的养老模式已经无法满足 现代老年人的多元化 需求。智慧健康旅居养老产业应运而生&#xff0c;成为了一种新型的养老模式&#xff0c;旨在为老年人提供更加舒适、便捷、安全的养老生活。随着社会的进步和人口老龄化趋势的加剧&a…

如何3分钟,快速开发一个新功能

背景 关于为什么做这个代码生成器&#xff0c;其实主要有两点: 参与的项目中有很多分析报表需要展示给业务部门&#xff0c;公司使用的商用产品&#xff0c;或多或少有些问题&#xff0c;这部分可能是历史选型导致的&#xff0c;这里撇开不不谈&#xff1b;项目里面也有很多C…

Sping源码(七)—context: component-scan标签如何扫描、加载Bean

序言 简单回顾一下。上一篇文章介绍了从xml文件context component-scan标签的加载流程到ConfigurationClassPostProcessor的创建流程。 本篇会深入了解context component-scan标签底层做了些什么。 component-scan 早期使用Spring进行开发时&#xff0c;很多时候都是注解 标…

项目上线流程(保姆级教学)

01&#xff1a;注册阿里云账户 02&#xff1a;登录阿里云 03&#xff1a;在桌面新建记事本保存个人账号密码等信息 04&#xff1a;完成重置密码 05&#xff1a;安装宝塔面板 命令行 yum install -y wget && wget -O install.sh http://download.bt.cn/install/instal…

大学生在线考试|基于SprinBoot+vue的在线试题库系统系统(源码+数据库+文档)

大学生在线考试目录 基于SprinBootvue的在线试题库系统系统 一、前言 二、系统设计 三、系统功能设计 试卷管理 试题管理 考试管理 错题本 考试记录 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#…

Java数据结构堆

堆的概念 所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中。 小根堆&#xff1a;根节点的大小小于孩子节点。整棵树都是小根堆必须满足每颗子树都是小根堆。 堆的存储方式 从堆的概念可知&#xff0c;堆是一棵完全二叉树&#xff0c;因此可以层序的规则采用顺序的…

【JVM】java内存区域

目录 一、运行时数据区域 1、方法区 2、堆 3、虚拟机栈 4、本地方法栈 5、程序计数器 6、运行时常量池 二、HotSpot虚拟机的对象 1、对象的创建 指针碰撞&#xff1a; 空闲列表&#xff1a; 2、对象的内存布局 对象头 实例数据 对齐填充 3、对象的访问定位 句…

git忽略文件配置 !

.gitignore中!表示取反 注意&#xff0c;如果父目录被排除&#xff0c;则父目录下的子目录也会被排除&#xff0c;此时对父目录下的子目录取反也不会生效&#xff0c;比如存在目录结构&#xff0c;再.gitignore目录下配置的 /*&#xff08;排除所有文件&#xff09;&#xff0c…

【LLM多模态】Qwen-VL模型结构和训练流程

note 观点&#xff1a;现有很多多模态大模型是基于预训练&#xff08;和SFT对齐&#xff09;的语言模型&#xff0c;将视觉特征token化并对齐到语言空间中&#xff0c;利用语言模型得到多模态LLM的输出。如何设计更好的图像tokenizer以及定位语言模型在多模态LLM中的作用很重要…

面试算法题之暴力求解

这里写目录标题 1 回溯1.1 思路及模板1.1 plus 排列组合子集问题1.2 例题1.2.1 全排列1.2.2 N 皇后1.2.3 N皇后问题 II1.2.4 子集 &#xff08;子集/排列问题&#xff09;1.2.4 组合(组合/子集问题)1.2.5 全排列 &#xff08;排列问题&#xff09;1.2.1做过1.2.6 子集II &#…

项目十一:爬取热搜榜(小白实战级)

首先&#xff0c;恭喜各位也恭喜自已学习爬虫基础到达圆满级&#xff0c;今后的自已python爬虫之旅会随着网络发展而不断进步。回想起来&#xff0c;我学过请求库requests模块、解析库re模块、lmxl模块到数据保存的基本应用方法&#xff0c;这一次的学习python爬虫之旅收获很多…

模块三:二分——153.寻找旋转排序数组中的最小值

文章目录 题目描述算法原理解法一&#xff1a;暴力查找解法二&#xff1a;二分查找疑问 代码实现解法一&#xff1a;暴力查找解法二&#xff1a;CJava 题目描述 题目链接&#xff1a;153.寻找旋转排序数组中的最小值 根据题目的要求时间复杂度为O(log N)可知需要使用二分查找…