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

江科大/江协科技 STM32学习笔记P21

文章目录

  • ADC模数转换器
    • ADC简介
    • 逐次逼近型ADC
    • STM32的ADC
    • ADC基本结构
    • 输入通道
    • 转换模式
      • 单次转换,非扫描模式
      • 连续转换,非扫描模式
      • 单次转换,扫描模式
      • 连续转换,扫描模式
    • 触发控制
    • 数据对齐
    • 转换时间
    • 校准
    • 硬件电路
      • 电位器产生可调电压的电路
      • 传感器输出电压的电路
      • 电压转换电路


ADC模数转换器

ADC简介

在这里插入图片描述
有ADC也有DAC数字模拟转换器,使用DAC可以将数字变量转化为模拟电压,与PWM相比较,PWM也有DAC的功能,同时PWM只有完全导通和完全断开两种状态,没有功率损耗,在直流电机调速这种大功率的应用场景使用PWM来等效模拟量比DAC更好。DAC的应用主要在波形生成,比如信号发生器、音频解码芯片等。
AD转换需要花一小段时间,1us表示从AD转换开始到产生结果需要1us,对应AD转换的频率就是1MHz,是STM32ADC的最快转换频率。
两个内部信号源是内部温度传感器和内部参考电压,温度传感器可以测CPU温度,内部参考电压是1.2V左右的基准电压,不随外部供电电压变化而变化,如果芯片的供电不是标准3.3V,测量外部引脚的电压可能不对,这时可以读基准电压进行校准。
普通的AD转换流程是启动一次转换读一次值,再启动再读值,但STM32的ADC可以列一个组,一次性启动一个组,连续转换多个值,并且有两个组,一个用于常规使用的规则组,一个用于突发事件的注入组。
ADC一般可以用于测量光线强度、温度这些值,并且经常有需求,如果高于某个阈值或低于某个阈值执行一些操作,判断高于或低于可以用模拟看门狗来自动执行,模拟看门狗可以监测指定的某些通道,当高于或低于它设定的阈值时申请中断,就可以在中断函数里执行相应的操作,这样就不用不断手动读值再if判断了。

逐次逼近型ADC

在这里插入图片描述

地址锁存和译码的作用是,想选中哪一路就把通道号放在ADDA、ADDB、ADDC这三个脚上,然后给一个锁存信号,上面对应的通路开关就自动拨好了。
之后看电压比较器,它可以判断两个输入信号电压的大小关系,输出一个高低电平指示谁大谁小,两个输入端,一个是待测电压,另一个是DAC的电压输出端,DAC内部是使用加权电阻网络来实现的转换,当输入一个未知编码的电压,和一个DAC输出的已知编码的电压,两个同时输出到电压比较器进行大小判断,如果DAC输出的电压比较小,就增大DAC数据,直到DAC输出的电压和外部通道输入的电压近似相等,这样DAC输入的数据就是外部电压的编码数据了。电压调节的过程就是逐次逼近SAR来完成的,通常用二分法进行寻找电压,比如这里八位DAC,编码0-255,第一次比较给255的一半128,如果DAC电压大了,第二次比较给128的一半64…,对于8位ADC,依次判断8次就能找到未知电压的编码,对于12位的ADC判断12次。这就是逐次逼近的过程。
EOC是End of Convert转换结束信号,START是开始转换,给一个输入脉冲开始转换CLOCK是ADC时钟,因为ADC内部是一步一步进行判断的,需要时钟进行推动,VREF+和VREF-s是DAC的参考电压,DAC的参考电压也决定了ADC的输入范围,所以也是ADC参考电压

STM32的ADC

在这里插入图片描述
规则通道组最多选16个通道,但是规则通道取出结果时前15个数据会被覆盖掉,依次只能留一个数据,需要配合DMA进行数据转运。注入通道最多选4个通道,而且有四个数据寄存器,不用担心数据覆盖
在这里插入图片描述

左下角是触发转换的部分,也就是START信号开始转换。对于STM32的ADC,触发转换的信号有两种,一种是软件触发,在程序中手动调用一条代码启动转换,另一种是硬件触发,就是左下角这些触发源,主要来自于定时器,有定时器的各个通道还有TRGO定时器主模式的输出,定时器可以通向ADC、DAC这些外设用于触发转换,因为ADC经常需要过一个固定时间段转换一次,比如每隔1ms转换一次,如果正常用定时器每隔1ms申请一次中断会频繁进中断对程序有影响,像这种需要频繁进中断,并且在中断只完成了简单工作的情况,用硬件进行支持,比如这里给TIM3定1ms时间,并且把TIM3的更新事件选择为TRGO输出,然后在ADC选择开始触发信号为TIM3的TRGO(‌Trigger Output)‌,这样TIM3的更新事件就能通过硬件自动触发ADC转换,这就是定时器触发的作用。
在这里插入图片描述
V R E F + V_{REF+} VREF+ V R E F − V_{REF-} VREF是ADC的参考电压,决定了ADC输入电压的范围,下面VDDA和VSSA是ADC的供电引脚,一般情况下 V R E F + V_{REF+} VREF+接VDDA,但我们学的这款芯片没有,在内部已经和VDDA连接在一起了,VDDA接3.3V 、VSSA接GND,所以ADC的输入电压范围就是0-3.3V。
右边的ADCCLK是ADC的时钟,也就是上面的CLOCK,用于驱动内部逐次比较的时钟,来源于以ADC预分频器,来源与APB2时钟。
在这里插入图片描述

模拟看门狗里面可以存一个阈值高限和阈值低限,如果启动了模拟看门狗,并且指定了看门的通道,那这个看门狗就会关注它看门的通道,一旦超过阈值范围就是申请看门狗的中断,最后通向NVIC。对于规则组和注入组而言,转换完成后,也会有一个EOC转换完成的信号,EOC是规则组的完成信号,JEOC是注入组完成的信号,这两个信号会在状态寄存器里置一个标志位,读取标志位就能知道是不是转换结束了,同时这两个标志位也可以去NVIC申请中断,如果开启了NVIC对应的通道,它们就会触发中断

ADC基本结构

在这里插入图片描述

输入通道

在这里插入图片描述
在这里插入图片描述

ADC12_IN0的意思是ADC1和ADC2和IN0都是在PA0上,下面全是ADC12说明ADC1和ADC2的引脚全都是相同的,作用是双ADC模式,ADC1和ADC2一起工作,他俩可以配合组成同步模式、交叉模式等,交叉模式就是ADC1和ADC2交叉对一个通道进行采样,进一步提高采样率,ADC1和ADC2也可以分开使用,分别对不同的引脚进行采样

转换模式

单次转换,非扫描模式

在这里插入图片描述

非扫描模式下只有序列一的通道有效,触发转换ADC就会对通道2进行模数转换,过一小段时间转换完成,结构放在数据寄存器,同时给EOC标志位置置1,判断EOC标志位来决定什么时候读数据寄存器。如果想要再一次转换,就需要再触发一次,如果想换一个通道转换,转换之前把第一个位置的通道2改成其他通道,然后再启动转换

连续转换,非扫描模式

在这里插入图片描述

非扫描模式还是只用序列1,但连续转换,转换结束后不会停止,而是立刻开启下一轮转换,一直持续下去,这样只需要一开始触发一次,之后就可以一直转换了。这个模式的好处是开始转换之后不需要等待一段时间,因为一直在转换,想要读AD值的时候直接从数据寄存器读就是了。

单次转换,扫描模式

在这里插入图片描述

单次转换,没触发一次,转换结束后停下来。扫描模式会用到“菜单列表”,可以在菜单里点菜,第一个菜是通道2,第二个菜是通道5…初始化结构体力多了一个通道数目参数,告诉主机用到了几个序列,比如指定通道数目为7,就只看前7个位置,每次触发后依次对前7个位置进行AD转换,转换结果都放在数据寄存器里,为了防止数据被覆盖需要用DMA及时将数据挪走。7个通道转换完成之后产生EOC信号转换结束,然后再触发下次,开始新一轮转换。

连续转换,扫描模式

一次转换后立刻开始下一次的转换。另外注意扫描模式的情况下还有一种模式是间断模式,它的作用是在扫描的过程中每隔几个转换就暂停一次,需要再次触发才能继续

触发控制

在这里插入图片描述

具体是引脚还是定时器,需要用AFIO重映射来确定。软件控制位是我们之前说的软件触发,这些触发信号可以通过设置右边寄存器来选择

数据对齐

在这里插入图片描述

数据右对齐,高位补0,数据左对齐,低位补0。一般用数据右对齐,因为右对齐直接读出寄存器的值就是转换结果,如果选择左对齐,直接读得到的数据会比实际的大,因为数据左对齐实际上是把数据左移了四次,相当于把结果乘以16。左对齐的作用是如果不想要很高的分辨率,可以选择左对齐,再把数据的高8位取出,这样就舍去了后四位的精度,12位的ADC退化为8位ADC。

转换时间

在这里插入图片描述

为什么需要采样和保持?
AD转换就是后面的量化编码,需要一小段时间,如果这一小段时间里输入的电压还在不断变化,就无法定位输入电压到底在哪,所以在量化编码之前设置一个采样开关,先打开采样开关收集外部的电压,比如可以用一个小容量的电容存储一下电压,存储好之后断开采样开关再进行后面的AD转换。这样在量化编码的期间,电压始终保持不变,这样才能精确定位未知电压的位置,这就是采样保持电路,采样保持的过程中需要闭合采样开关,过一段时间再断开。
采样时间是采样保持花费的时间,可以在程序中配置,采样时间越大越能避免毛刺信号的干扰,不过转换时间也会相应延长,12.5个ADC周期是量化编码花费的时间,因为是12位ADC,所以花费12个周期,ADC周期就是从RCC分频过来的ADCCLK,最大是14MHz,下面是最快1us时间计算来源。

校准

在这里插入图片描述
校准过程是固定的,只需要在ADC初始化的最后加几条代码就行了。

硬件电路

在这里插入图片描述

电位器产生可调电压的电路

电位器产生一个可调的电压,电位器两个固定端一个接3.3V一个接GND,中间滑动端电压在这之间,一般接KΩ级的电阻,比如这里10k的电阻,这就是电位器产生可调电压的电路。

传感器输出电压的电路

中间是传感器输出电压的电路,一般像光敏电阻、热敏电阻、红外接收器、麦克风等,都可等效为一个可变电阻,电阻阻值没法直接测量,通过和一个固定电阻串联分压来得到一个反应电阻值电压的电路,传感器阻值变小,下拉作用变强,输出端电压就下降…固定电阻一般选和传感器阻值相近的电阻,这样可以得到一个位于中间电压区域比较好的输出。

电压转换电路

使用电阻进行分压,上面阻值17K,下面33K,加一起50K,根据分压公式,中间电压是VIN/50K*33K,最后得到的电压范围就是0-3.3V,就可以进入ADC转换了,如果电压再高不建议使用这个电路,高电压采集最好使用专门的采集芯片,比如隔离放大器等等,做好高低电压的隔离,保证电路安全

相关文章:

江科大/江协科技 STM32学习笔记P21

文章目录 ADC模数转换器ADC简介逐次逼近型ADCSTM32的ADCADC基本结构输入通道转换模式单次转换,非扫描模式连续转换,非扫描模式单次转换,扫描模式连续转换,扫描模式 触发控制数据对齐转换时间校准硬件电路电位器产生可调电压的电路…...

第三方jar自带logback导致本地日志文件不生成

1.问题及解决 这是依赖的jar包,自己有logback,只打印到控制台,导致我们项目里配置的error级别日志不会生成到日志文件中去。ai给的答案是自己控制加载顺序,但很麻烦,--logging.config也不行,最好下了个7z压…...

国产数据库备份恢复实现

数据库备份恢复是数据库高可用的基本能力,如何通过备份数据快速高效的恢复业务并且满足不同场景下的恢复需求,是各数据库厂商需要关注的要点。本文将介绍几种国产数据库的备份恢复功能,以加深了解。 1、数据库备份恢复方案 数据库备份是生产…...

数据仓库: 2- 数据建模

目录 2- 数据建模2.1 维度建模2.1.1 维度建模的基本概念2.1.1.1 事实表 (Fact Table)2.1.1.2 维度表 (Dimension Table)2.1.1.3 维度 (Dimension)2.1.1.4 度量 (Measure) 2.1.2 维度建模的主要模型2.1.2.1 星型模型 (Star Schema)2.1.2.2 雪花模型 (Snowflake Schema)2.1.2.3 星…...

Tomcat 漏洞

一.CVE-2017-12615 1.使用burp抓包 把get改成put jsp文件后加/ 添加完成后访问 木马 然后木马的网址 在哥斯拉测试并且添加 添加成功 然后我们就成功进去啦、 二.弱口令 点击后输入默认用户名、密码:tomcat/tomcat 登陆之后上传一个jsp文件 后缀改成war 然后访问我…...

分布式消息队列Kafka

分布式消息队列Kafka 简介: Kafka 是一个分布式消息队列系统,用于处理实时数据流。消息按照主题(Topic)进行分类存储,发送消息的实体称为 Producer,接收消息的实体称为 Consumer。Kafka 集群由多个 Kafka 实…...

C# Unity 面向对象补全计划 七大原则 之 迪米特法则(Law Of Demeter )难度:☆☆☆ 总结:直取蜀汉

本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正 本系列作为七大原则和设计模式的进阶知识,看不懂没关系 请看专栏:http://t.csdnimg.cn/mIitr,查漏补缺 1.迪米特法则(…...

【C++】—— 类与对象(四)

【C】—— 类与对象&#xff08;四&#xff09; 6、赋值运算符重载6.1、运算符重载6.1.1、基础知识6.1.2、调用方法6.1.3、前置 与 后置 的重载6.1.4、注意事项6.1.5、<< 和 >> 运算符重载6.1.5.1、<< 和 >> 基础6.1.5.2、日期类 operator<< 的实…...

Qt无边框窗口,关闭后再show,鼠标等事件不响应问题解决办法

问题描述 使用Qt做了一个无边框界面&#xff0c;关闭后再打开&#xff0c;子控件的点击以及hover效果不可用。 setWindowFlags(windowFlags() | Qt::Dialog | Qt::FramelessWindowHint);//去掉标题栏解决方案&#xff1a; 在网上发现可以通过重写showEvent(QShowEvent* showE…...

StringJoiner更优雅创建含分隔符的字符序列

文章目录 1 why2 what3 how4 练习手段 1 why StringBuilder拼接包含分隔符的字符序列时&#xff0c;分隔符需要一个一个添加&#xff0c;或者需要手动删除末尾冗余的分隔符&#xff0c;代码不美观&#xff0c;不好看。 比如&#xff0c;单个字符串依次拼接时&#xff1a; Stri…...

线程池原理(一)线程池核心概述

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 线程回顾 创建线程的方式 继承 Thread 类实现 Runnable 接口 创建后的线程有如下状态&#xff1a; NEW&#xff1a;新建的线程&#xff0c;无任何操作 public static void main(String[] args) {Thread…...

关于redisson的序列化配置

由于使用redisson来存储list&#xff0c;返回的数据格式总是不对 原因是配置的序列化格式不对 Bean(value "redissonDtClient") public RedissonClient redissonClient() {RedisConnectionProperties.RedisConfigEntity configEntity properties.getDt();log.inf…...

CentOS安装ax200驱动

如果内核低于5.1需要安装一下内核 详细移步&#xff1a;Centos7安装高版本内核 大致如下&#xff1a; rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm yum --enablerepoelrepo-ke…...

FFMPEG Mac版本编译

Mac下FFMPEG使用 There are a few ways to get FFmpeg on OS X. One is to build it yourself. Compiling on Mac OS X is as easy as any other *nix machine, there are just a few caveats(警告). The general procedure is get the source, then ./configure <flags&g…...

Reactive Programing与“响应式”

将Reactive Programing翻译为“响应式编程”&#xff0c;的确不好理解。什么是Reactive&#xff1f;Reactive被翻译为“反应”&#xff0c;其英文原意是“事物对变化信号的回应、反应”。我热了&#xff0c;空调自动开&#xff0c;这就是空调对我的Reaction&#xff0c;我和空调…...

Pinterest:从 Druid 到 StarRocks,实现 6 倍成本效益比提升

导读&#xff1a; 开源无国界&#xff0c;StarRocks 自开源以来&#xff0c;近3年的时间里已在全球数据技术领域崭露头角。我们欣喜地发现&#xff0c;越来越多的海外用户正在使用并积极推广着 StarRocks。为了促进知识共享&#xff0c;StarRocks中文社区将精选优秀文章与大家共…...

代码+视频,R语言VRPM绘制多种模型的彩色列线图

列线图&#xff0c;又称诺莫图&#xff08;Nomogram&#xff09;&#xff0c;它是建立在回归分析的基础上&#xff0c;使用多个临床指标或者生物属性&#xff0c;然后采用带有分数高低的线段&#xff0c;从而达到设置的目的&#xff1a;基于多个变量的值预测一定的临床结局或者…...

Python 设计模式之工厂函数模式

文章目录 案例基本案例逐渐复杂的案例 问题回顾什么是工厂模式&#xff1f;为什么会用到工厂函数模式&#xff1f;工厂函数模式和抽象工厂模式有什么关系&#xff1f; 工厂函数模式是一种创建型设计模式&#xff0c;抛出问题&#xff1a; 什么是工厂函数模式&#xff1f;为什么…...

数据赋能(171)——开发:数据挖掘——概述、关注焦点

概述 数据挖掘是从大量的数据中&#xff0c;提取隐藏在其中的、事先不知道的、但潜在有用的信息的过程。 数据挖掘是数据分析过程中的一个核心环节。 数据挖掘的主要目的是从大量数据中自动发现隐藏的模式、关联和趋势&#xff0c;以揭示数据的潜在价值。数据挖掘技术可以帮…...

L1 - OpenCompass 评测 InternLM-1.8B 实践

基础任务&#xff08;完成此任务即完成闯关&#xff09; 使用 OpenCompass 评测 internlm2-chat-1.8b 模型在 ceval 数据集上的性能&#xff0c;记录复现过程并截图。 按照教程中的顺序安装包有问题&#xff0c;网上找了解决方案&#xff0c;按一下顺序能正常执行 使用OpenCo…...

JS【详解】数据类型检测(含获取任意数据的数据类型的函数封装、typeof、检测是否为 null、检测是否为数组、检测是否为非数组/函数的对象)

【函数封装】获取任意数据的数据类型 /*** 获取任意数据的数据类型** param x 变量* returns 返回变量的类型名称&#xff08;小写字母&#xff09;*/ function getType(x) {// 获取目标数据的私有属性 [[Class]] 的值const originType Object.prototype.toString.call(x); //…...

OpenCV图像滤波(10)Laplacian函数的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 功能描述 计算图像的拉普拉斯值。 该函数通过使用 Sobel 运算符计算出的 x 和 y 的二阶导数之和来计算源图像的拉普拉斯值&#xff1a; dst Δ src ∂…...

docker系列11:Dockerfile入门

传送门 docker系列1&#xff1a;docker安装 docker系列2&#xff1a;阿里云镜像加速器 docker系列3&#xff1a;docker镜像基本命令 docker系列4&#xff1a;docker容器基本命令 docker系列5&#xff1a;docker安装nginx docker系列6&#xff1a;docker安装redis docker系…...

LVS(Linux virual server)详解

目录 一、LVS&#xff08;Linux virual server&#xff09;是什么&#xff1f; 二、集群和分布式简介 2.1、集群Cluster 2.2、分布式 2.3、集群和分布式 三、LVS运行原理 3.1、LVS基本概念 3.2、LVS集群的类型 3.2.1 nat模式 3.2.2 DR模式 3.2.3、LVS工作模式总结 …...

Session共享方法

在Web开发中&#xff0c;会话&#xff08;Session&#xff09;管理是跟踪用户与服务器之间交互的一种常见方法。Session 共享通常指的是在一个应用集群或多个应用服务之间保持用户的会话状态一致。这在负载均衡、微服务架构或者分布式系统中尤为重要 一、基于SQL的session管理…...

Ubuntu 22.04 Docker安装笔记

1、准备一台虚机 可以根据《VMware Workstation安装Ubuntu 22.04笔记》来准备虚拟机。完成后&#xff0c;根据需求安装必要的软件&#xff0c;并设置root权限进行登录。 sudo apt update sudo apt install iputils-ping -y sudo apt install vim -y允许root ssh登录&#xff1…...

编程-设计模式 6:适配器模式

设计模式 6&#xff1a;适配器模式 定义与目的 定义&#xff1a;适配器模式将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。目的&#xff1a;该模式的主要目的是解决接口不匹配的问题&#xff0c;使得一个…...

ERC721 概念解释

目录 FeaturesVotesAccess ControlUpgradeabilityFeatures Mintable: 允许创建新的代币(minting)。合约的所有者或有权限的账户可以调用 mint 函数来生成新的代币,并将其分配给指定的地址。 Auto Increment Ids:自动递增 ID。每次创建新的代币时,代币的 ID 会自动递增,确保…...

数据结构(其五)--串

目录 12.串 12.1 基本操作 12.2 串的存储结构 12.3 字符串的模式匹配算法 (1).朴素模式匹配算法 (2).KMP算法 i.next[]数组的求解 ii.next[]数组的优化——nextval数组 iii.手算nextval数组 iiii.机算nextval数组 + KMP函数 12.串 串,即字符串(string),由零个或多…...

LeetCode Hot100 LRU缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否则返回 -…...