ADC的认识

ADC介绍

Q:ADC是什么?

A:全称:Analog-to-Digital Converter,指模拟/数字转换器

 

ADC的性能指标

  • 量程:能测量的电压范围
  • 分辨率:ADC能辨别的最小模拟量,通常以输出二进制数的位数表示,比如:8、10、12、 16位等;位数越多,分辨率越高,一般来说分辨率越高,转化时间越长
  • 转化时间:从转换开始到获得稳定的数字量输出所需要的时间称为转换时间

ADC特性

  • 12位精度下转换速度可高达1MHZ
  • 供电电压:V SSA :0VV DDA :2.4V~3.6V
  • ADC输入范围:VREF- ≤ VIN ≤ VREF+ 

一般VREF-接 VSSA; VREF+接VDDA; 而VSSA一般接地,VDDA一般接3.3V;

所以量程是0 ~3.3v

  • 采样时间可配置,采样时间越长, 转换结果相对越准确, 但是转换速度就越慢
  • ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中

16位寄存器里存放12位的精度的数据,就会涉及到左对齐右对齐的问题(默认右对齐

ADC通道

总共2个ADC(ADC1,ADC2)每个ADC有18个转换通道: 16个外部通道(也就是和GPIO口连在一起的)、 2个内部通道(温度 传感器、内部参考电压)

 

外部的16个通道在转换时又分为规则通道注入通道,其中规则通道最多有16路注入通道最多 有4路

可以这样理解:

规则组正常排队的人

注入组有特权的人(军人、孕妇)(假如注入组的过来了,就要暂停规则组的动作,可以说注入组打断规则组的动作

 

ADC转换顺序

每个ADC只有一个数据寄存器16个通道一起共用这个寄存器,所以需要指定规则转换通道的转 换顺序。(假如前面的数据没有被读走,后面的数据就会将前面的数据覆盖)

规则通道中的转换顺序由三个寄存器控制:SQR1SQR2SQR3,它们都是32位寄存器。SQR寄存器控制着转换通道的数目和转换顺序,只要在对应的寄存器位SQx中写入相应的通道,这个通 道就是第x个转换。

 和规则通道转换顺序的控制一样,注入通道的转换也是通过注入寄存器来控制,只不过只有一个 JSQR寄存器来控制,控制关系如下: 

注入序列的转换顺序是从JSQx[ 4 : 0 ](x=4-JL[1:0])开始。只有当JL=4的时候,注入通道的转换 顺序才会按照JSQ1、JSQ2、JSQ3、JSQ4的顺序执行。

ADC触发方式

1. 通过向控制寄存器ADC-CR2的ADON位写1来开启转换,写0停止转换。(软件)

2. 也可以通过外部事件(如定时器)进行转换。(硬件)

ADC转化时间

ADC是挂载在APB2总线(PCLK2)上的,经过分频器得到ADC时钟(ADCCLK),最高 14 MHz。

转换时间 = 采样时间+12.5个周期

 

12.5个周期是固定的,一般我们设置 PCLK2=72M,经过 ADC 预分频器能分频到最大的时钟只能 是 12M,采样周期(采样时间)设置为 1.5 个周期,则一共是14倍周期,为14 *(1/12000000)秒; 算出最短的转换时间为 1.17us。

ADC转化模式

扫描模式

关闭扫描模式:只转换ADC_SQRx或ADC_JSQR选中的第一个通道

打开扫描模式:扫描所有被ADC_SQRx或ADC_JSQR选中的所有通道

单次转换/连续转换

单次转换:只转换一次

连续转换:转换一次之后,立马进行下一次转换

使用ADC读取烟雾传感器的值 的实验

硬件介绍

烟雾传感器:

 烟雾传感器的AODO分别代表模拟信号数字信号,由于现在学习的ADC(模数转换),所以将AO引脚接入单片机,而不使用DO引脚。

那么AO应该接在哪里呢?

查看产品手册:

在STM32中,两路ADC的同一通道使用的同一个引脚

在这个实验中,将AO接入单片机的PA0,对应ADC1或2的通道0

CubeMx

1.常规配置

SYS->Debug->Serial Wire

RCC->High Speed Clock(HSE)->Crystal/Ceramic Resonator

时钟树HSE、PLLCLK打开,HCLK设置成72MHz

打开uart1

注意这里的时钟配置“Clock Configuration”,上面提到过,ADC是挂载在PCLK2上的,并经过分配得到ADC自己的时钟频率的。

问题在于,如果像之前那样设置HCLK为72MHz, 那么在尝试打开ADC的时候,会报错:

原因就是 ADC的最高频率是14MHz,然而根据惯例设置,分配到ADC处的频率变成了36MHz了。

解决办法就是:

先将弹出来的会话框点击NO(因为这是会自动帮忙配置的请求,这里只需要自己调整一下就可以),然后将ADC的分频系数改为“/6” 或 “/8”,这样就不会报错了:

2. 点击左侧的ADC,选择通道0: 

可以看到右侧的图中PA0被选中,再次证明PA0的确是ADC1的通道0: 

在下方的参数设置,可以看到上面提到的关于ADC各种的设置,此处暂不修改 

3.生成代码 

Keil

1. 因为要通过串口来打印数据,所以要重写printf,所以要打开miro-lib:

2.程序代码

#include "stdio.h"



int fputc(int a, FILE *f) //一个字符一个字符发送
{
	unsigned char temp[1] = {a};
	HAL_UART_Transmit(&huart1, temp, 1, 0xffff);
	return a;
}

int main(void)
{
 
	uint32_t smoke_valve = 1;

  while (1)
  {
   
		HAL_ADC_Start(&hadc1);  //启动ADC1转换
		HAL_ADC_PollForConversion(&hadc1,50);  //等待ADC转换完成,50是time out
		smoke_valve = HAL_ADC_GetValue(&hadc1);//读取ADC转换数据,通过跳转可以知道返回值是“uint32_t”类型
		//printf("smoke_valve = %d\r\n",smoke_valve);
		printf("smoke_valve = %fV\r\n",3.3/4096*smoke_valve);//读取的是刻度,总共是2^12的刻度(读取到的值/2^12*3.3V则可得电压值)

		HAL_Delay(500);
  }
  
}

从HAL_ADC_GetValue(&hadc1)中读取到的是一个12位有效二进制数的值,而电压是3.3V,所以一个刻度的值就是 3.3/2^12 = 3.3/4096,把这个最小刻度值乘以读取到的值,就是有效的数据了。

而读出来的数其实就是电压的值,至于电压的值究竟对应多少烟雾含量,这个要看烟雾报警器的手册等。

实现效果

串口助手中:可见,每隔500ms,就会通过串口打印通过ADC转换得到的有效电压值! 

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

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

相关文章

康耐视visionpro-CogBlobTool工具操作详细说明

CogBlobTool功能说明: 通过设置灰度值提取感兴趣区域,并分析所提取区域的面积、长宽等参数。 Cog BlobTool操作说明: .打开工具栏,双击或点击鼠标拖拽添加CogBlobTool工具 ②.添加输入图像:单击鼠标右键“链接到”或以连线拖拽的方式选择相应输入源 ③.极性: “白底黑点…

搭建基于Hexo的个人博客,以及git相关命令

全文写完之后的总结 测试命令 hexo clean hexo g hexo s 上传到服务器命令 hexo clean hexo g hexo d 上传到服务器(如果上一个命令用不了),也要先hexo clean,hexo g git init git add . git commit -m "first commit" git p…

vscode配置c\c++及美化

文章目录 vscode配置c\c及美化1.安装vscode2.汉化3.安装c\c插件4.安装mingw5.配置mingw6. 运行c代码6.1 创建代码目录6.2 设置文件配置6.3 创建可执行任务:task.json6.4 编译执行6.5 再写其他代码6.6 运行多个c文件 7. 运行c文件8.调式代码8.1 创建launch.json8.2 修…

jenkins下载安装(mac)

下载官网 具体 直接命令安装 Sample commands: Install the latest LTS version: brew install jenkins-ltsStart the Jenkins service: brew services start jenkins-ltsRestart the Jenkins service: brew services restart jenkins-ltsUpdate the Jenkins version: brew u…

Requests,一个强大的 Python 库

Requests,一个强大的 Python 库 ​ 一. 介绍 在当今的互联网时代,网络数据的获取和处理变得尤为重要。无论是数据科学家获取数据集,还是开发者与外部API进行交互,都需要一个强大且易于使用的HTTP库来帮助完成这些任务。这就是r…

2024年认证杯数学建模挑战赛C题全解析

2024年认证杯C题的已经完成啦,包括参考论文,模型代码,分享给大家~ 问题分析 对于这些问题,我们首先需要确定影响日光辐射降低效应的关键参数,例如海盐气溶胶的浓度、粒子大小、分布以及喷洒高度和范围。同…

英特尔、联想等服务器曝出难以修复的漏洞

文章目录 前言一、漏洞潜伏六年,服务器供应链安全堪忧二、漏洞广泛存在但难以修复前言 近日,英特尔、联想等多个厂商销售的服务器硬件曝出一个难以修复的远程可利用漏洞。该漏洞属于供应链漏洞,源自一个被多家服务器厂商整合到产品中的开源软件包——Lighttpd。 Lighttpd是…

【C++算法竞赛 · 图论】图的存储

前言 图的存储 邻接矩阵 方法 复杂度 应用 例题 题解 邻接表 方法 复杂度 应用 前言 上一篇文章中(【C算法竞赛 图论】图论基础),介绍了图论相关的概念和一种图的存储的方法,这篇文章将会介绍剩下的两种方法&#xff…

elasticSearch从零整合springboot项目实操

type会被弃用 ,就是说之后的elasticSearch中只会存在 索引(indices) 和 一行(document) 和字段(fields) elasticSearch 和solr的区别最大的就是 es对应的 是 json的格式 。 solr有xml和josn等…

OpenHarmony实例应用:【常用组件和容器低代码】

介绍 本篇Codelab是基于ArkTS语言的低代码开发方式实现的一个简单实例。具体实现功能如下: 创建一个低代码工程。通过拖拽的方式实现任务列表和任务信息界面的界面布局。在UI编辑界面实现数据动态渲染和事件的绑定。 最终实现效果如下: 相关概念 低代…

【opencv】示例-points_classifier.cpp 使用不同机器学习算法在二维空间中对点集进行分类...

#include "opencv2/core.hpp" // 包含OpenCV核心功能的文件 #include "opencv2/imgproc.hpp" // 包含OpenCV图像处理功能的文件 #include "opencv2/ml.hpp" // 包含OpenCV机器学习模块的文件 #include "opencv2/highgui.hpp" // 包含O…

【MIT6.S081】Lab3: page tables(详细解答版)

实验内容网址:https://xv6.dgs.zone/labs/requirements/lab3.html 本实验的代码分支:https://gitee.com/dragonlalala/xv6-labs-2020/tree/pgtbl2/ Print a page table 关键点:递归、三级页表 思路: 用上图来解释三级页表的原理最…

RISC-V技术变革:一颗芯片,CPU与GPU合二为一

一颗万能的RISC-V芯片: 将CPU和GPU整合到一个核中 X-Silicon 推出创新的 RISC-V 芯片架构,将 CPU、矢量功能和 GPU 加速无缝集成。这种开源混合芯片专为多功能工作负载而设计,包括人工智能,旨在通过高效处理提升性能。 革命性的 CPU/GPU 混合处理器全新的 RISC-V CPU/GPU 混…

【前端面试3+1】12 toktn验证过程、面向对象特性、webpack和vite的区别、【字符串中的第一个唯一字符】

一、token验证过程 用户登录:用户提供用户名和密码进行登录。服务器验证:服务器接收到用户提供的用户名和密码,进行验证。生成token:如果用户名和密码验证通过,服务器会生成一个token,通常包含一些加密的信…

从 iPhone 上的短信中恢复已删除的图片的可靠方法

您可能在浏览消息聊天时不小心删除了一些文本和照片。事实上,如果这些消息对你来说意义重大,那对你来说可能会很麻烦。当发生意外情况时,您可能不想恢复整个聊天,而是恢复其中的附件。 好了,这篇文章主要是讲如何灵活…

关于故障诊断的一些事-答知乎问(四)

利用深度学习模型进行机械故障诊断技术的难点是什么? 除了严格的可解释性之外,还有 1.很多机械设备经常运行在转速多变、载荷冲击、噪声淹没的恶劣工作环境之下,振动监测信号内包含了多种故障频率成分和背景噪声信息,是一种非常…

【C语言基础】:预处理详解(一)

文章目录 一、预定义符号二、#define定义常量三、#define定义宏四、带有副作用的宏参数五、宏替换的规则 一、预定义符号 在C语言中设置了许多的预定义符号,这些预定义符号是可以直接使用的,预定义符号也是在预处理阶段进行处理的。 常见的预定义符号&…

【系统分析师】计算机组成与体系架构

文章目录 1、编码及浮点数运算2、flynn分类法3、CISC和 RISC4、流水线技术5、存储技术5.1层次化存储结构5.2 Cache5.2.1 cache页面淘汰5.2.2 cache的读写 5.3 主存5.3.1主存编址5.3.2 磁盘 5.4 总线 6、校验码7、系统可靠性计算7.1可靠性指标7.2 串联系统与并联系统7.3性能指标…

Vue3——html-doc-ja(html导出为word的js库)

一、下载 官方地址 html-doc-js - npm npm install html-doc-js 二、使用方法 // 使用页面中引入 import exportWord from html-doc-js// 配置项以及实现下载方法 const wrap document.getElementById(test)const config {document:document, //默认当前文档的document…

如何将三方库集成到hap包中——通过IDE集成非cmake方式构建的C/C++三方库

简介 DevEco Studio(简称IDE)目前只支持cmake构建方式,对于非cmake构建方式的三方库需要通过IDE工具集成的话,我们需要对原生库编写一个cmake的构建脚本。本文通过tinyxpath三方库为例介绍如何在IDE上移植一个非cmake构建方式的三方库。 cmake构建脚本…