ADC的认识

news2025/9/21 3:14:26

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转换得到的有效电压值! 

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

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

相关文章

论文笔记:LayoutNUWA: Revealing the Hidden Layout Expertise of Large Language Models

iclr 2024 reviewer 评分 568 图形布局生成大模型 1 intro 现有方法主要将布局生成视为一个数值优化任务,专注于量化方面,同时忽略了布局的语义信息,如各布局元素之间的关系。论文提出了LayoutNUWA,这是第一个将布局生成视为代…

【GD32】 MQ-135空气质量传感器

2.37 MQ-135空气质量传感器 MQ135 气体传感器所使用的气敏材料是在清洁空气中电导率较低的二 氧化锡(SnO2)。当传感器所处环境中存在污染气体时,传感器的电导率随空 气中污染气体浓度的增加而增大。MQ135 气体传感器对氨气、硫化物、苯系 蒸汽的灵敏度高&#xff0…

【大语言模型】应用:10分钟实现搜索引擎

本文利用20Newsgroup这个数据集作为Corpus(语料库),用户可以通过搜索关键字来进行查询关联度最高的News,实现对文本的搜索引擎: 1. 导入数据集 from sklearn.datasets import fetch_20newsgroupsnewsgroups fetch_20newsgroups()print(fNu…

朵米3.5客服系统源码2023正式版(带详细安装教程)

朵米客服系统是一款全功能的客户服务解决方案,提供多渠道支持(如在线聊天、邮件、电话等),帮助企业建立与客户的实时互动。该系统具有智能分流功能,可以快速将客户请求分配给适当的客服人员,提高工作效率。…

(待更)DRF:限流(单视图或全局设置限流方案)

建议先看完本人的另两篇博客:认证(http://t.csdnimg.cn/G4idK)和权限(http://t.csdnimg.cn/0hpJf),或者了解认证和权限,有一定基础,再来看本篇博客。 基本原理 开发过程中如果某个接…

测试计划和测试报告

1、软件测试计划简介 测试计划,一般是主管写,在需求分析之后,测试工作开始之间做的一些准备划工作。一般包含以下内容:5W1H 目的、测试范围、测试进度安排、测试人员、测试环境、测试方法工具,风险评估 (w…

在Linux上利用mingw-w64生成exe文件

一、概要 1、elf与exe 在Linux上用gcc直接编译出来的可执行文件是elf格式的,在Windows上是不能运行的 Windows上可执行文件的格式是exe 利用mingw-w64可以在Linux上生成exe格式的可执行文件,将该exe文件拷贝到Windows上就可以运行 2、程序要留给用户…

C语言学习笔记之结构体(一)

目录 什么是结构体? 结构体的声明 结构体变量的定义和初始化 结构体成员的访问 结构体传参 什么是结构体? 在现实生活中的很多事物无法用单一类型的变量就能描述清楚,如:描述一个学生,需要姓名,年龄&a…

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

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

LLM大语言模型微调方法和技术汇总

本文详细介绍了机器学习中的微调技术,特别是在预训练模型上进行微调的方法和技术。文章首先解释了什么是微调,即在预训练模型的基础上,通过特定任务的数据进行有监督训练,以提高模型在该任务上的性能。随后,详细介绍了…

ubuntu 安装java

在Ubuntu上安装Java通常有两种方式:使用包管理器安装默认仓库中的Java或者手动安装Oracle JDK。 使用APT包管理器安装: sudo apt update sudo apt install default-jdk 手动安装Oracle JDK: 首先,你需要从Oracle官网下载JDK的…

AI Agent概念、能力初探

AI Agent无疑是大语言模型当前最热门且最具前景的方向,也是通往AGI的必经之路,下面我们从基本概念和系统能力层面来逐步揭开AI Agent的神秘面纱。 一、概念解析 1、什么是AI Agent? AI Agent(人工智能代理)是一种能够…

(N-149)基于微信小程序网上商城系统

开发工具:IDEA、微信小程序 服务器:Tomcat9.0, jdk1.8 项目构建:maven 数据库:mysql5.7 前端技术:vue、uniapp 服务端技术:springbootmybatisredis 本系统分微信小程序和管理后台两部分&a…

20240413,类和对象

对象:一切都可为对象,类:相同特性的对象;面向对象特性:封装,继承,多态 一,封装 CLASS 类名 { 访问权限 :属性/行为 } 实例化:通过一个类,创建一…

策略者模式(代码实践C++/Java/Python)————设计模式学习笔记

文章目录 1 设计目标2 Java2.1 涉及知识点2.2 实现2.2.1 实现两个接口飞行为和叫行为2.2.2 实现Duck抽象基类(把行为接口作为类成员)2.2.3 实现接口飞行为和叫行为的具体行为2.2.4 具体实现鸭子2.2.5 模型调用 3 C(用到了大量C2.0的知识&…

C语言-详解内存函数

文章目录 1.memcpy使用和模拟实现1.1 memcpy函数的使用规则1.2 memcpy函数的使用1.2 模拟实现memcpy函数 2.memmove 函数的使用和模拟实现2.1 memmove 函数使用规则2.2 memmove函数的使用2.3 模拟实现memmove函数2.3.1 从后往前移2.3.2 从前往后移 2.4 算法实现2.4.1 从前往后移…

C# 图形化的导航界面的设计方法

目录 一、涉及到的知识点 1、BackColor属性 2、FlatStyle属性 3、TextlmageRelation属性 4、其它共性设计 二、设计实例 1、 Resources.Designer.cs 2、Form1.Designer.cs 3、Form1.cs 4、运行结果 图形化导航用于代替文字导航,比如对Button控件 进行图形…

NzN的数据结构--归并排序及计数排序

篇接上文,今天要学习的是归并排序以及非比较排序--计数排序。这么励志的日更博主,你怎么能不三连一下呢? 目录 一、归并排序 1. 递归实现 2. 非递归实现 3. 特性总结 二、非比较排序--计数排序 三、排序算法复杂度及稳定性分析 一、归并…

vue3+element plus图片预览点击按钮直接显示图片的预览形式

1 需求 直接上需求&#xff1a; 我想要直接点击下面这个“预览”按钮&#xff0c;然后呈现出预览图片的形式 ok&#xff0c;需求知道了&#xff0c;下面让我们来看看如何实现吧 ~ 2 实现 template部分 <el-buttontype"primary"size"small"click&qu…

DRF多表关联的序列化和反序列化

DRF多表关联的序列化和反序列化 目录 DRF多表关联的序列化和反序列化序列化定制字段source一对多的序列化 多表关联的序列化方式1&#xff1a;在表模型中定义方法方式2&#xff1a;定制返回格式SerializerMethodField方式3&#xff1a;子序列化 多表关联的反序列化反序列化保存…