当前位置: 首页 > news >正文

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. 惯例设置 + 开一路串口

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

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

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

 

解决办法就是:

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

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

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

 

 

2.2 在下方的参数设置,可以看到上面提到的关于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_value; //通过跳转可以知道 HAL_ADC_GetValue() 的返回值是“uint32_t”类型while (1){HAL_ADC_Start(&hadc1); //启动ADC单次转换HAL_ADC_PollForConversion(&hadc1, 50); //等待ADC转换完成,50是time outsmoke_value = HAL_ADC_GetValue(&hadc1); //读取ADC转换数据,通过跳转可以知道返回值是“uint32_t”类型printf("smoke_value = %f\r\n", 3.3/4096 * smoke_value);//printf("smoke_value = %d \r\n", smoke_value);HAL_Delay(500); //每500ms检测一次}
}

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

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

 

实现效果

串口助手中:

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

 

 

相关文章:

ADC 的初识

ADC介绍 Q: ADC是什么? A: 全称:Analog-to-Digital Converter,指模拟/数字转换器 ADC的性能指标 量程:能测量的电压范围分辨率:ADC能辨别的最小模拟量,通常以输出二进制数的位数表示,比如&am…...

MMdetection框架速成系列 第07部分:数据增强的N种方法

MMdetection框架实现数据增强的N种方法 1 为什么要进行数据增强2 数据增强的常见误区3 常见的六种数据增强方式3.1 随机翻转(RandomFlip)3.2 随机裁剪(RandomCrop)3.3 随机比例裁剪并缩放(RandomResizedCrop&#xff0…...

基于Kitti数据集的智能驾驶目标检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于Kitti数据集的智能驾驶目标检测系统可用于日常生活中检测与定位行人(Pedestrian)、面包车(Van)、坐着的人(Person Sitting)、汽车(Car)、卡车(Truck…...

4.4. 深拷贝 vs 浅拷贝

文章目录 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为…...

网络安全(黑客)自学建议笔记

前言 网络安全,顾名思义,无安全,不网络。现如今,安全行业飞速发展,我们呼吁专业化的 就职人员与大学生 ,而你,认为自己有资格当黑客吗? 本文面向所有信息安全领域的初学者和从业人员…...

Linux CentOS快速安装VNC并开启服务

以下是在 CentOS 上安装并开启 VNC 服务的步骤: 安装 VNC 服务器软件包。运行以下命令: sudo yum install tigervnc-server 输出 $ sudo yum install tigervnc-server Loaded plugins: fastestmirror, langpacks Repository epel is missing name i…...

redis到底几个线程?

通常我们说redis是单线程指的是从接收客户端请求->解析请求->读写->响应客户端这整个过程是由一个线程来完成的。这并不意味着redis在任何场景、任何版本下都只有一个线程 为何用单线程处理数据读写? 内存数据储存已经很快了 redis相比于mysql等数据库是…...

mysql修改UUID

mysql修改UUID 问题描述:集群搭建时克隆主服务的镜像导致所有节点的服务UUID都一致,此时在集群中添加节点时会提示UUID冲突报错。 解决方案 1、利用uuid函数生成新的uuid mysql> select uuid(); -------------------------------------- | uuid() …...

NoSQL之redis配置与优化

NoSQL之redis配置与优化 高可用持久化功能Redis提供两种方式进行持久化1.触发条件手动触发自动触发 执行流程优缺点缺点:优势AOF出发规则: AOF流程AOF缺陷和优点 NoSQL之redis配置与优化 mysql优化 1线程池优化 2硬件优化 3索引优化 4慢查询优化 5内…...

Python单例模式介绍、使用

一、单例模式介绍 概念:单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供访问该实例的全局访问点。 功能:单例模式的主要功能是确保在应用程序中只有一个实例存在。 优势: 节省系统资源:由…...

1334179-85-9,BTTAA,是各种化学生物学实验中生物偶联所需

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ BTTAA试剂 | 基础知识概述(部分): 中文名称:2-[4-({双[(1-叔丁基-1H-1,2,3-三唑-4-基)甲基]氨基}甲基)-1H-1,2,3-三唑-1-基]乙酸 英文名称:BTTAA CAS号:1334179-8…...

Linux系统中的SQL语句

本节主要学习,SQL语句的语句类型,数据库操作,数据表操作,和数据操作等。 文章目录 一、SQL语句类型 DDL DML DCL DQL 二、数据库操作 1.查看 2.创建 默认字符集 指定字符集 3.进入 4.删除 5.更改 库名称 字符集 6…...

力扣27 26 283 844 977 移除数组

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的…...

【沐风老师】3DMAX自动材质插件使用方法教程

3DMAX自动材质插件使用方法教程 3DMAX自动材质工具用于在将纹理加载到3dsax中时快速创建简单的材质,并具有一些很酷的材质功能。 这个插件可以根据真正制造商的纹理(通常比例为2:1)快速创建简单的木材材质,并根据板材的长度自动对…...

让你 React 组件水平暴增的 5 个技巧

目录 透传 className、style 通过 forwardRef 暴露一些方法 useCallback、useMemo 用 Context 来跨组件传递值 React.Children、React.cloneElement 总结 最近看了一些 Ant Design 的组件源码,学到一些很实用的技巧,这篇文章来分享一下。 首先&am…...

阿里云部署 ChatGLM2-6B 与 langchain+ChatGLM

1.ChatGLM2-6B 部署 更新系统 apt-get update 安装git apt-get install git-lfs git init git lfs install 克隆 ChatGLM2-6B 源码 git clone https://github.com/THUDM/ChatGLM2-6B.git 克隆 chatglm2-6b 模型 #进入目录 cd ChatGLM2-6B #创建目录 mkdir model #进入目录 cd m…...

F12开发者工具的简单应用

目录 elements 元素 1、元素的定位和修改 2、UI自动化应用 console 控制台 sources 源代码 network 网络 1、定位问题 2、接口测试 3、弱网测试 performance 性能 memory 存储 application 应用 recorder 记录器 界面展示如下(设置中可以切换中英文&am…...

【 Python 全栈开发 - 人工智能篇 - 45 】决策树与随机森林

文章目录 一、概念与原理1.1 决策树1.1.1 概念1.1.2 原理特征选择分割方法 1.1.3 优点与缺点1.1.4 Python常用决策树算法 1.2 随机森林1.2.1 概念1.2.2 原理1.2.3 优点与缺点1.2.4 Python常用随机森林算法 1.3 决策树与随机森林的比较1.3.1 相同之处1.3.2 不同之处 二、决策树算…...

SpringBoot集成kafka全面实战

本文是SpringBootKafka的实战讲解,如果对kafka的架构原理还不了解的读者,建议先看一下《大白话kafka架构原理》、《秒懂kafka HA(高可用)》两篇文章。 一、生产者实践 普通生产者 带回调的生产者 自定义分区器 kafka事务提交…...

新建Git仓库,将本地文件上传至仓库

1、新建仓库,勾选初始化仓库 2、复制仓库链接 3、打开本地文件目录 右键选择 Git Bash Here 打开命令窗口 4、依次按照下面的步骤(*如果报错,看原目录下是否存在 .git 需要删除) // 生成git文件 git init // 把文件加入暂存区 g…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

<6>-MySQL表的增删查改

目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表&#xf…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制&#xff0…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...