【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为最大等待时间,单位为ms
 
 
 if(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);


总结

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis入门学习二(配置文件、mapper文件、动态SQL)

目录 1、映射配置文件 1.1 properties 1.2 settings 1.3 typeAliases 1.4 typeHandlers 1.5 plugins 1.5 environments 1.6 mappers 2、映射Mapper文件 2.1 CRUD 2.1.1 select 2.1.2 Insert 2.1.3 update 2.1.4 delete 2.1.5 parameterType传入多个参数 2.1.5 …

图像在神经网络中的预处理与后处理的原理和作用(最详细版本)

1. 问题引出及内容介绍 相信大家在学习与图像任务相关的神经网络时&#xff0c;经常会见到这样一个预处理方式。 self.to_tensor_norm transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) 具体原理及作用稍后解释&…

2024年vue 开发环境 Node.js于win10环境下的安装

2024年vue 开发环境 Node.js于win10环境下的安装 导航 文章目录 2024年vue 开发环境 Node.js于win10环境下的安装导航一、下载node.js二、安装node.js三、测试(一)四、环境配置五、测试(二)六、安装淘宝镜像七、安装vue脚手架 一、下载node.js Node.js 官方网站下载&#xff…

如何利用交易形态的失败进行现货黄金?

进行现货黄金理财&#xff0c;除了需要投资者对黄金投资有热情之外&#xff0c;有方法也是很重要的&#xff0c;光有热情而没有技术&#xff0c;我们的资金很可能会成为其他人的囊中之物。但如果有了现货黄金理财的技术&#xff0c;情况就可能扭转过来。下面我们就从买入的角度…

关于豆瓣电影数据抓取以及可视化

首先我们可以先了解以下网络爬虫的定义&#xff1a; 爬虫是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。它可以在互联网上自动抓取网页内容&#xff0c;将这些信息存储起来。爬虫可以抓取网站的所有网页&#xff0c;从而获取对于我们有价值的信…

BGP的路径属性

路径属性 l每条BGP路由都拥有多个的路径属性&#xff0c;有些是必须携带的&#xff0c;有些是可选添加的 lBGP的路径属性将影响最优路由的选择 lBGP路径属性是描述路由的一组参数&#xff0c;BGP根据路由的属性选择最佳路由&#xff0c;可以人为置值&#xff0c;以便执行路由…

【AI】Deepstream入门(2)Ubuntu20.04安装Deepstream

1、安装GPU驱动 本人显卡型号:RTX4060 Laptop(笔记本专用显卡) 【AI】惠普暗夜精灵9安装Ubuntu20.04+nvidia驱动 2、安装cuda、cuDNN 【AI】Ubuntu20.04安装cuda、cuDNN 3、安装TensorRT 1)下载 下载地址:https://docs.nvidia.com/deeplearning/tensorrt/archives/i…

vue报错:Do not mutate vuex store state outside mutation handlers.

vue报错&#xff1a;Do not mutate vuex store state outside mutation handlers. 原因&#xff1a;在vuex store的state外部直接修改了state的值&#xff0c;但是Vuex要求所有的state的修改必须在vuex中&#xff0c;不允许直接咋组件中修改store中的状态&#xff0c;除非通过m…

FPM 快速报表开发

背景&#xff1a; 使用FPM开发报表时&#xff0c;如果报表字段过多&#xff0c;页面拖拽等操作不方便 报表数量过多时&#xff0c;新建应用操作步骤较为繁琐 更习惯通过少量代码而非页面操作去实现功能 处理&#xff1a; 将FPM报表开发简化为类似GUI端ALV的开发过程:&#xff…

Spring Boot | Spring Boot “自定义“ Redis缓存 “序列化机制“

目录: Spring Boot "自定义" Redis缓存 "序列化机制" &#xff1a;一、基于 "注解" 的 "Redis缓存管理" 的 "默认序列化机制" 和 "自定义序列化机制"1.1 基于 "注解" 的 "Redis缓存管理" 的 …

基于OpenCV的人脸签到系统

效果图 目录文件 camerathread.h 功能实现全写在.h里了 class CameraThread : public QThread {Q_OBJECT public:CameraThread(){//打开序号为0的摄像头m_cap.open(0);if (!m_cap.isOpened()) {qDebug() << "Error: Cannot open camera";}//判断是否有文件,人脸…

Unity 实现原神中的元素反应

一、元素反应 原神中共有七种元素&#xff0c;分别是水、火、冰、岩、风、雷、草。这七种元素能互相作用 Demo下载&#xff1a;Download 元素反应表格图示&#xff0c;可能不够精准 /火水雷冰草岩风绽放原激化火/蒸发超载融化燃烧结晶扩散烈绽放/水蒸发/感电冻结/碎冰绽放结晶…

数据分析:甲基化分析-从DNA methylation的IDAT文件到CpG site的Beta values

介绍 DNA Methylation和疾病的发生发展存在密切相关&#xff0c;它一般通过CH3替换碱基5‘碳的H原子&#xff0c;进而调控基因的转录。常用的DNA methylation是Illumina Infinium methylation arrays&#xff0c;该芯片有450K和850K&#xff08;也即是EPIC&#xff09;。 该脚…

【canvas】前端创造的图片粒子动画效果:HTML5 Canvas 技术详解

前端创造的图片粒子动画效果&#xff1a;HTML5 Canvas 技术详解 我们将深入探讨如何通过 HTML5 的 Canvas 功能&#xff0c;将上传的图片转换成引人入胜的粒子动画效果。这种效果将图片分解成小粒子&#xff0c;并在用户与它们交互时产生动态变化。我们将分步骤详细解析代码&a…

LabVIEW专栏九、类的应用

一、类的应用 接上一章"类" 类在项目中&#xff0c;一般会在类的私有成员簇内&#xff0c;包含一个数据类型为参数类的队列。 例如网口类&#xff0c;里面实际会包含很多信息&#xff0c;有IP地址和端口等等参数。这些参数如果不放在队列引用中缓存下来&#xff0c;…

DevOps(十四)怎么实现Gitlab更新后Jenkins自动发布

目录 1、在 Jenkins 中安装 GitLab 插件 2、在 GitLab 中创建一个访问令牌(Access Token) 3、在 Jenkins 中配置 GitLab 连接 4、在 Jenkins 中创建一个新的任务(Job) 5、在 GitLab 中配置 Webhook 6、以下是一些补充说明和建议 持续集成的一个特点就是开发可以随时提交&…

微服务组件-反向代理(Nginx)

微服务组件-反向代理(Nginx) Nginx 基本概念 1、nginx是什么&#xff1f; ①、Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器同时也提供了IMAP/POP3/SMTP服务。它是一款轻量级的Web服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&a…

TiDB 6.x 新特性解读 | Collation 规则

对数据库而言&#xff0c;合适的字符集和 collation 规则能够大大提升使用者运维和分析的效率。TiDB 从 v4.0 开始支持新 collation 规则&#xff0c;并于 TiDB 6.0 版本进行了更新。本文将深入解读 Collation 规则在 TiDB 6.0 中的变更和应用。 引 这里的“引”&#xff0c;…

Oracle 监控 SQL 精选 (一)

Oracle数据库的监控通常涉及性能、空间、会话、对象、备份、安全等多个层面。 有效的监控可以帮助 DBA 及时发现和解决问题&#xff0c;提高数据库的稳定性和性能&#xff0c;保障企业的数据安全和业务连续性。 常用的监控指标有&#xff1a; 性能指标&#xff1a; 查询响应时间…

产品推荐 | BittWare基于Altera Agilex“M FPGA的lA-860m加速卡

01 产品概述 BittWare的lA-860m是一款Altera Agilex“M系列FPGA卡&#xff0c;针对吞吐量和内存密集型应用进行了优化。M 系列 FPGA 具有广泛的内存层次结构&#xff0c;包括集成高带宽存储器 &#xff08;HBM2e&#xff09; 和硬内存片上网络 &#xff08;NoC&#xff09;&am…