【STM32】ADC(模拟/数字转换)

news2024/11/16 23:53:15

一、ADC的简介

1.什么是ADC

1)将【电信号】-->【电压】-->【数字量】

2)ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字量,建立模拟电路到数字电路的桥梁。

3)12位逐次逼近型ADC,1us转换时间(表示从产生电压到转换得出结果所使用的时间)

2.常见的ADC

3.并联比较型工作示意图

1)比较器:当两个数值相同时才会生成信号传输给编码器

2)D0,D1,D2(从低位--》高位)---》二进制数(分辨率)---》2^3

4.逐次逼近型工作示意图

如果是n位的锁存缓冲器(数码控制器),就需要进行n次的判断

5.ADC特性参数

1.分辨率:刻度划分

表示ADC能分辨的最小模拟量,用二进制位数进行表示,比如;8,10,12

比如此时电压为3.3V,我们使用12位进行表示   2^12=4096   3.3%4096=0.0008V,表示当数字量为1的时候,输出电压为0.0008V。

输入电压范围:0-3.3V,转换结果范围:0-4095(2^12)

2.转换时间

表示完成一次A/D转换所需要的时间,转换时间越短,采用频率就越高

假设1s的时间中转换时间为200ms,则表示可以转换5次

3.精度:物理量的精确程度

4.量化误差

6.STM32各系列ADC主要特性

7.ADC基本结构

二、ADC工作原理

1.ADC框图简介

1.参考电压/模拟部分电压

1) 输入电压的范围在参考电压的两个范围之间

2)Vref+和Vref-分别接着Vdda(3.3V)和Vssa(0V)

2.输入通道

输入的GPIO必须具有模拟输入功能的IO口才可以。

GPIO通道:快速通道VS慢速通道

内部ADC源直接绑定,外部ADC绑定GPIO

18个输入通道,可测量16个外部和2个内部信号源(温度传感器 && 内部的参考电压)

 ADC1和ADC2两个的通道都使用同一个引脚。---->双ADC

3.转换序列(转换顺序)

1)转换被组织分为2组:规则组&&注入组【注入组可以打断规则组的转换】

2)规则组最多可以有16个转换(通道),注入组最多有4个转换(通道)

 规则组和注入组执行优先级对比

注入组(类似于中断)的优先级比规则组的优先级高

规则序列:(regular channel)

1)规则组有16个通道

2)这里的意思理解为,有16个规则通道,即为16个规则的不同编号的盘子,每个盘子可以放18个通道即为GPIO其中的一个口

3)必须按顺序来执行(如果想要执行通道3,则通道1和通道2都要执行)

4)我们有3个ADC,表示可以设置3个最高的优先级【可以同步进行】

5)一个菜单,可以点16个菜,也可以只写一个菜。【同时上16个菜,但是只能一个一个上(因为只有一个寄存器),否则前面会被覆盖--->所以我们使用DMA】

注入序列:(injected channel)

1)注入组有4个通道

2)注入组的寄存器写入位是反向写入的

3)一次性最多可以点4个菜,且可以同时上4个菜,不会被覆盖【因为有4个寄存器】

4.触发源

1)触发转换分为:a.ADON位触发转换  b.外部事件触发转换(规则组和注入组)

规则组外部触发

注入组外部触发

5.转换时间

如何设置ADC时钟?

1)ADCCLK的最大时钟频率是:14MHZ

如何设置ADC转换时间

1)ADC中的最短转换时间为:1us【在ADC时钟频率为:14MHZ,采样时间为1.5个ADC时钟周期,12.5个周期(固定值-->12位寄存器)的情况下】

2)采样时间(可以进行编程的)越大,就可以尽量避免毛刺信号的干扰,精确度越高

6.数据寄存器

数据对齐

7.中断

DMA请求(只适用于规则组)

规则组每一个通道转换结束后,除了可以产生中断外,还可以产生DMA请求,我们利用DMA及时把转换好的数据传输到指定的内存中,防止数据被覆盖

2.单次转换模式VS连续转换模式

单次转换模式:如果我们不需要实时检测,则使用单次

连续转换模式:如果需要实时检测,则使用连续

3.转换/扫描模式

关闭扫描模式:只能扫描第一个通道

使用扫描模式:表示扫描全部通道

连续是一个通道多次采集,扫描是每个通道依次采集

不同模式组合的作用

扫描:切换通道(遍历),连续:多次

单词转换,非扫描模式 

 单词转换,扫描模式

连续转换,非扫描模式 

连续转换模式 

4.ADC校准

如果需要使用到精确计算,则需要校准

影响ADC转换的因素:

1)温飘(温度影响)

2)基准电压值

5.ADC与低功耗

外部引脚输入也会耗电--->采样时间

采样间隔周期

要采样则唤醒,不需要就进入睡眠。

 三、单通道ADC采集实验

1.实验简要

2.寄存器描述

1.ADC控制寄存器 1(ADC_CR1)

2.ADC控制寄存器 2(ADC_CR2)

3.ADC采样时间寄存器 1(ADC_SMPR1)

通道10-通道17的设置

4.ADC采样时间寄存器 2(ADC_SMPR2)

通道0-通道9的设置

5.ADC规则序列寄存器 1(ADC_SQR1)

设置第13-第16个转换

6.ADC规则序列寄存器 2(ADC_SQR2)

设置通道12-通道7

7.ADC规则序列寄存器 3(ADC_SQR3)

设置通道6-通道0

8.ADC规则数据寄存器(ADC_DR)

9.ADC状态寄存器(ADC_SR)

3.单通道ADC采集实验配置步骤

相关HAL库介绍

关键结构体介绍

ADC句柄

ADC通道设置

四、使用CubeMX创建ADC和DMA

将外部0-3.3V的模拟信号接入到单片机底座脚P11(PA1)口

1.CubeMX使用

因为ADC1和ADC2所使用的通道对应的GPIO引脚是一致的,所以使用ADC1或者ADC2都可以。

0.其他相关设置

1)选择外部晶振

2)启动DMA

1.通道选择

2.中断选择

此时我们的实验是将从ADC获取到的模拟信号通过转换为电压传输给DAM,然后DMA在通知CPU。

1)ADC不需要中断:因为当ADC采样到的结果直接丢给DMA,而不需要停下来告诉DMA,因为他们两个之间有专门的传输通道

2)DMA需要中断:因为当接收到ADC传输过来的数据后,DMA需要告诉CPU,我接收到ADC的数据了。

3.ADC中的DMA Setting

4.ADC中的Parameter Settings

5.总结

本实验使用了APB2(ADC1的时钟频率为14MhZ)

使用了ADC1的通道1,测试外部0-3.3V的模拟信号

2.代码编写

五、STM32随机数生成器

1.什么是随机数

1.真正的随机数

2.伪随机数

2.随机数的生成

1.用纯软件算法

伪随机数生成算法 - shine-lee - 博客园 (cnblogs.com)

2.采集随机事件为元素生成

3.用Soc内置伪随机数发生模块生成:使用硬件方法【HAL_RNG】

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

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

相关文章

iOS_折叠展开 FoldTextView

1. 显示效果 Test1:直接使用: Test2:在 cell 里使用: 2. 使用 2.1 直接使用 // 1.1 init view private lazy var mooFoldTextView: MOOFoldTextView {let view MOOFoldTextView(frame: .zero)view.backgroundColor .cyanvie…

Node.js之fs文件系统模块

什么是fs文件系统模块?又如何使用呢?让我为大家介绍一下! fs 模块是 Node.js 官方提供的、用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作需求 注意:如果要在JavaScript代码中&#xff0c…

Linux 网络:PMTUD 简介

文章目录 1. 前言2. Path MTU Discovery(PMTUD) 协议2.1 PMTUD 发现最小 MTU 的过程 3. Linux 的 PMTUD 简析3.1 创建 socket 时初始化 PMTUD 模式3.2 数据发送时 PMTUD 相关处理3.2.1 源头主机发送过程中 PMTU 处理3.2.2 转发过程中 PMTUD 处理 4. PMTUD 观察5. 参考链接 1. 前…

k8s的高可用集群搭建,详细过程实战版

kubernetes高可用集群的搭建 前面介绍过了k8s单master节点的安装部署 今天介绍一下k8s高可用集群搭建 环境准备: vip :192.168.121.99 keeplive master01:192.168.121.153 centos7 master02:192.168.121.154 centos7 master03&a…

Ubuntu20.0中安装Gradle

下载Gradle到temp文件夹 wget https://services.gradle.org/distributions/gradle-8.3-bin.zip -P /tmp 然后解压文件到/opt/gradle目录 sudo unzip -d /opt/gradle /tmp/gradle-8.3.zip 配置Gradle环境变量 接下来我们会创建一个gradle.sh文件来保存Gradle的环境变量 sudo…

图像分类(六) 全面解读复现MobileNetV1-V3

MobileNetV1 前言 MobileNetV1网络是谷歌团队在2017年提出的,专注于移动端和嵌入设备的轻量级CNN网络,相比于传统的神经网络,在准确率小幅度降低的前提下大大减少模型的参数与运算量。相比于VGG16准确率减少0.9%,但模型的参数只…

云存储与物理存储:优缺点对比分析

当您需要存储数字文件时,您有两个基本选择:云存储和物理存储。 云存储允许您通过互联网将文件保存在云存储提供商运营的服务器上。这些公司通常在多个数据中心制作文件的备份副本,并使用复杂的加密来保护它们。您可以从任何连接互联网的设备访…

Docker中快速安装RabbitMQ

文章目录 前言一、安装Docker二、安装RabbitMQ无脑命令行运行 总结 前言 在Ubuntu中的Docker容器中快速安装RabbitMQ,亲测有效,不废话,上操作。 一、安装Docker 直接按照Docker官方教程操作:官方安装教程 点进官网,往…

重命名com1.{d3e34b21-9d75-101a-8c3d-00aa001a1652}文件夹

今天在win10系统上,发现一个名称为: com1.{d3e34b21-9d75-101a-8c3d-00aa001a1652} 的文件夹,该文件夹很奇怪,既不能手动删除,也不能手动给文件夹重命名,如图(1)所示: E:\EncodeOne\hello\Thumbs.ms\com1.…

Nodejs中net模块多次Socket.setTimeout无法覆盖之前函数,导致叠加执行问题解决

Hi, I’m Shendi Nodejs中net模块多次Socket.setTimeout无法覆盖之前函数,导致叠加执行问题解决 问题描述 在 Nodejs 中,net 模块的 Socket 的 setTimeout 函数是设置超时时间,如果多次设置,超时时间会是最后一次的时间&#xff…

RepVgg: 网络结构重参化

CVPR2021 截至目前1004引 论文连接 代码连接 文章提出的问题 大多数的研究者追求的是设计一个好的网络结构,这种“好”体现在网络具有复杂的网络设计,这种网络虽然比简单的网络收获了更加高的准确率,但是网络结构中的大量并行分支,导致模型的难以应用和自定义,主要体现…

PC业务校验(已有该名称,已有该编码)

rules: {name: [{ required: true, message: "部门名称不能为空", trigger: "blur" },{min: 2,max: 10,message: "部门名称的长度为2-10个字符",trigger: "blur",},{trigger: "blur",validator: async (rule, value, callba…

算法通关村第十一关-青铜挑战理解位运算的规则

大家好我是苏麟 , 今天聊聊位运算 . 位运算规则 计算机采用的是二进制,二进制包括两个数码:0,1。在计算机的底层,一切运算都是基于位运算实现的,所以研究清整位运算可以加深我们对很多基础原理的理解程度。 在算法方面&#xf…

HTML5+CSS3+JS小实例:使用L2Dwidget实现二次元卡通看板娘

实例:使用L2Dwidget实现二次元卡通看板娘 技术栈:HTML+CSS+JS 效果: 源码: <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" conte…

YOLOv8优化策略:轻量级Backbone改进 | 高效模型 (Efficient MOdel, EMO),现代倒残差移动模块设计 | ICCV2023

🚀🚀🚀本文改进:面向移动端的轻量化网络模型——EMO,它能够以相对较低的参数和 FLOPs 超越了基于 CNN/Transformer 的 SOTA 模型,支持四个版本EMO_1M, EMO_2M, EMO_5M, EMO_6M 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到…

【Python从入门到进阶】42、使用requests的Cookie登录古诗文网站

接上篇《41、有关requests代理的使用》 上一篇我们介绍了requests代理的基本使用&#xff0c;本篇我们来学习如何利用requests的Cookie登录古诗文网。 一、登录网站及目的介绍 我们需要Cookie模拟登录的网站为&#xff1a;https://www.gushiwen.cn/&#xff08;古诗文网&…

Hive调优

1.参数配置优化 设定Hive参数有三种方式&#xff1a; &#xff08;1&#xff09;配置Hive文件 当修改配置Hive文件的设定后&#xff0c;对本机启动的所有Hive进程都有效&#xff0c;因此配置是全局性的。 一般地&#xff0c;Hive的配置文件包括两部分&#xff1a; a&#xff…

LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄

接着前两节的Langchain&#xff0c;继续实现Langchain中的Agent LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字 代码实现 # 从langchain库中导入模块 from langchain.llms import OpenAI # 从langchain.l…

【算法基础】动态规划

背包问题 01背包 每个物品只能放一次 2. 01背包问题 - AcWing题库 二维dp #include<bits/stdc.h> const int N1010; int f[N][N]; int v[N],w[N]; signed main() {int n,m;std::cin>>n>>m; for(int i1;i<n;i) std::cin>>v[i]>>w[i];for…

穷举法、回溯法、分支界限法解决旅行商(TSP)问题

文章目录 一、问题描述二、穷举法解决2.1 介绍2.2 代码 三、回溯法解决四、分支界限法4.1 介绍4.2 代码 一、问题描述 有一个旅行商由某城市出发&#xff0c;经过所有给定的 n n n 个城市后&#xff0c;再回到出发的城市。除了出发的城市外&#xff0c;其它城市只经过一回。这…