STM32的HAL库开发---ADC

news2025/5/9 13:13:05

一、ADC简介

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

把一些传感器的物理量转换成电压,使用ADC采集电压,然后转换成数字量,经过单片机处理,进行控制和显示。

 2、常见的ADC类型

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

 假如VREF参考电压为8v,那么从下到上电压为1V,2V、、8V,Vx为模拟电压输入,假如输入电压为1V,那最下边的比较器就会给编码器输出电压,然后编码器经过编码,就是输出001,代表1V。如果输出为3V,则第三个比较器输出给编码器,输出011,代表3V。这个编码器输出是3位的,称为ADC的分辨率。

优点:转换速度快

缺点:成本高、功耗高、分辨率低,成本高主要是需要2的分辨率次方个电阻,这里分辨率为3,所以需要8个电阻,7个比较器。如果是12位的分辨率,需要4096个电阻和4095个比较器。

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

首先是数码寄存器进行编码,一般是先把高位定位1,也就是100,然后经过D/A转换器转换成模拟电压,连接到比较器上边,输入电压Vx与这个电压进行比较,如果输入电压大于等于比较电压,控制电路会把数码寄存器的最高位锁存下来,然后第二轮把次高位置为1,当还是输入电压大,就把第二位也保存下来,将最低位设置为1,进行第三轮比对,如果输入电压还是比比较电压大,就超过了量程范围了,如果比比较电压小,就说明此时输入电压与比较电压接近,次数数码寄存器的值就是ADC的值了,采集也是接近,不是准确的。 

类似于天平,一点点的加大电压。

特点:分辨率和采样速度相互矛盾,分辨率越高,采样速率越低

优点:结构简单、低功耗

缺点:转换速度较慢

5、ADC的特性参数

分辨率:表示ADC能辨别的最小模拟量,用二进制位数表示,比如:8、10、12、16位等。可以理解为刻度划分,以12位为例,如果参考电压为3.3V,就会把3.3V平分为4096份。
转换时间:表示完成一次A/D转换所需要的时间,转换时间越短,采样率就可以越高,如果一次转换时间为200ms,则1s可以转换5次。
精度:最小刻度基础上叠加各种误差的参数,精度受ADC性能、温度和气压等影响
量化误差:用数字量近似表示模拟量,采用四舍五入原则,此过程产生的误差为量化误差。假设最小分辨率为1V,当输入电压为0.8V的时候,四舍五入被ADC采集后是1V,量化误差就是0.2V。

6、STM32各系列ADC的主要特性


二、ADC工作原理 

2.1 ADC框图简介

F1系列:

参考电压/模拟部分电压,其中VDDA和VSSA就是供电电源,VREF+和VREF-是参考电压。

输入通道,总共有16个通道,都是来自IO口的复用。可以看到图中ADC通道总共有18个,16个为IO口,还有两个通道,一个通道连接温度传感器,另一个连接内部参考电压VREFINT。

转换序列,决定18个通道怎么分组进行转换的。

触发源,一个是规则组触发,一个是注入组触发。规则组触发来自下面部分,首先需要将图中EXTRIG位置1。然后看图发现,由EXTSEL位决定。如果选择外部中断线11或者定时器8的,还需要多设置一个选择器。注入组触发跟规则组是类似的。只是触发源不一样。左边是ADC1和ADC2的触发源,右边的是ADC3的触发源。

转换时间,由ADC时钟影响。

数据寄存器,ADC转换结果会放到数据寄存器里边,有注入通道数据寄存器和规则通道数据寄存器。其中注入通道数据寄存器有4个,每个注入通道各对应一个寄存器。而规则通道数据寄存器只有一个,所以16个通道公用一个寄存器。由于公用可能导致数据丢失,所以下方有DMA请求,开启相应的DMA请求,让DMA帮助搬运数据,防止数据丢失。

中断

当数据寄存器里边有数据代表转换结束,就会产生响应的标志位。转换结束将EOC置1,如果还把对应的中断使能,就会产生中断请求,中断信号就会来到NVIC里边。

当注入组通道转换结束之后,JEOC标志位就会置为1,开启中断使能位之后,也会产生中断。

模拟看门狗,在ADC寄存器里边可以设置阀值高限和阀值低限。当ADC转换结果高于阀值或者低于阀值,模拟看门狗时间标志位都会置1。

F4系列:

参考电压/模拟部分电压,与F1一样

输入通道,比F1对一个VBAT通道,总共19个通道。

转换序列,与F1一样

触发源,与F1不一样,不过也是配置选择器,规则组有规则组的触发,注入组有注入组的触发。

转换时间

数据寄存器

中断,多了一个DMA溢出中断,如果DMA读的数据是丢失的,就会产生中断。

 F7系列与F4几乎差不多,自行查看使用手册。

H7系列:

VREF+电压,参考数据手册即可。

ADC双时钟域架构,可以选择两个ADC工作时钟。

输入通道,H7系列支持差分转换,常用的是单端模式,所以一般只使用上面那个通道即可。在单端模式下,下面那个会自动接到地上面。

转换序列

触发源,也是分为规则组触发和注入组触发。

转换时间

参考电压

ADC核心,逐次逼近型ADC。

数据寄存器

中断,中断非常多

通道预选控制信号,例如想要转换通道5,就需要先将这个预选里边对应的通道位置1,不然转换结果不正确,相当与开关 。

2.2 参考电压/模拟部分电压

模拟部分电源:正极VDDA由3.3V经过RC低通滤波器,即可得到。负极VSSA就是地。

ADC供电电源:VSSA、 VDDA (2.4V≤VDDA≤3.6V ) ,实际接的3.3V。

参考电压:

VREF+实际经过一个跳线帽,把这个跳线帽接上,那么VREF+也就连接到了VDDA,VDDA就是3.3V。VREF-接的地。

ADC输入电压范围:VREF–≤VIN≤VREF+(即0V≤VIN≤3.3V ) ,ADC输入的电压一定在这个范围内,不然会烧掉芯片。

2.3 输入通道

其中ADC前16个通道是GPIO复用配置的,后面两个是内部的。ADC2和ADC3有一些通道连接的是VSS。这个表在手册里是找不到的,但是可以在数据手册里边的引脚部分看到ADC引脚。 

2.4 转换序列

A/D转换被组织为两组:规则组(常规转换组)和注入组(注入转换组),在F1和F4系列里边,叫规则组和注入组。在F7和H7里边,叫常规转换组和注入转换组。

规则组最多可以有16个转换,注入组最多有4个转换。通道转换顺序可以设置。

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

规则组有16个通道,可以设置16个顺序。注入组有4个通道,可以设置4个转换顺序。

这里注入组可以打断规则组的转换,假如规则组正在按顺序转换,先转换第1个通道,然后在转换第二个通道的时候,发现注入组转换被触发了,这时候会先把规则组的第二个转换完成,然后转去转换注入组的通道,最多把注入组的4个通道都抓换完成,在回去转换规则组的通道。

注入组类似于中断一样,可以打断规则组的转换。其中的顺序1、2、3、4.。。。N就是转换序列。抓换序列分为规则序列和注入序列。

规则组序列设置:

 规则序列寄存器转换序列控制由SQR1、SQR2\SQR3控制,其中SQR3的SQ1[4:0]位设置第一个要转换的通道,假如第一个要转换的通道是15,就把15写入SQ1里边。第二个转换通道12,就把12写入SQ2里边。第三个转换通道1,第四个转换通道1,可以对一个通道多次转换。这里ADC有18个通道对应0-17,规则序列有16个转换顺序。最后把转换的通道数写在SQL里边。这里配置了4个通道,就写入3,而不是写入4,写入4代表有5个通道了。

 注入组序列设置:

由于注入组只有4个通道顺序需要配置,所以一个寄存器即可满足。假如现在需要配置两个通道,那么直接在JL里边设置为1即可。 例如将通道15设置为第一个转换,通道10设置为第二个转换,那么需要将15写进JSQ3里边,而不是JSQ1里边,将10写进JSQ4里边。也就是说从JSQ4开始往上倒着设置。如果转换4个通道就是从JSQ1开始设置。

注意:注入序列的转换顺序是从JSQx[ 4 : 0 ]x=4-JL[1:0])开始

2.5 触发源

F1系列:

触发转换的方法有两种:

1ADON位触发转换(仅限F1系列)

ADC_CR2寄存器的ADON位为1,再单独给ADON位写1,只能启动规则组转换。这个里边的单独意思是,上电后ADON位为1,这时候只给ADON写1,不改变其他位。

2)外部事件触发转换

外部事件触发转换分为:规则组外部触发和注入组外部触发

规则组外部触发使用方法:

注入组外部触发使用方法:

F4/F7系列:

规则组外部触发使用方法:

注入组外部触发使用方法:

 H7系列:基本与F4没啥区别,就是通道数多了

 规则组外部触发使用方法:

注入组外部触发使用方法:

 

2.6 转换时间 

F1系列:

设置ADC时钟:

这里边APB2最大72M,也就是说分频系数设置为2的时候,可以出现36M的ADC时钟频率。但是ADC最大工作频率14M,超过14M就会转换不准确。所以要设置比14M小。

常见设置分频系数为6,得到ADC工作时钟为12MHz

ADC转换时间:

使用手册:

这个是手册;里边给出的例子,意思就是ADC最短设置SMP为000,需要1.5 + 12,5 = 14个采样周期。ADC时钟为14M,则采样时间为14 * (1 / 14000000) = 1us 

F4系列:

设置ADC时钟:与F1系列一样,只是ADC最大时钟变成了36M了

ADC转换时间:

由于F4和F7系列的ADC分辨率是可以自行设置的,分辨率不同,他的采样周期是不一样的。

 

分辨率不同,F4系列的快速转换模式: 

下面这个是F4的ADC_CR1寄存器里边对RES位的描述,配置分辨率的。 

H7系列较为复杂,这里不举例了 

2.7 数据寄存器

F1系列:

数据寄存器分为规则组和注入组。

规则组:规则组最多16个转换,转换结果会按照转换顺序进行输出,输出到规则转换数据寄存器里边,这个寄存器是32位有效的,但是一般只使用独立模式,所以只用到低16位。高16位是用于双ADC模式的。

注入组:注入组有4个通道,同时注入组有4个数据寄存器,所以每个通道对应一个寄存器。

由于ADC的分辨率为12位的,也就是说ADC转换后,数据只有12位,但是可以看到数据寄存器里边是使用了16位的,那么就存在数据对齐。

ADCx_CR2寄存器的ALIGN位设置数据对齐方式,可选择:右对齐或者左对齐 。

F4//F7系列:

基本和F1系列一样,只是规则数据寄存器是16位有效的。

即使F4和F7系列支持设置分辨率,但是最高也只是12位,同样存在数据对齐问题。

ADCx_CR2寄存器的ALIGN位设置数据对齐方式,可选择:右对齐或者左对齐,右对齐就是左边留空格,左对齐就是右边留空格。 

H7系列:

H7系列最大分辨率可以设置为16位的。

OVSS[3:0]LSHIFT[3:0]位域设置数据对齐方式,可选择:右对齐或者左对齐

2.8 中断 

F1/F4/F7系列ADC中断事件汇总表:

EOC:用于标志规则通道转换结束,当规则通道数据转换结束完成的时候,这个EOC位会被硬件自动置1,如果使能了EOCIE位,就会产生中断来到NVIC。

JEOC:对应注入通道转换结束的。

AWD:设置了模拟看门狗之后,如果ADC转换结果超过了对应的上限阀值,或者低于下限阀值,就会将AWD位自动置1。如果使能了AWDIE位,就会产生对应的中断。

OVR:F1系列没有这个中断,当CPU读取数据时或者DMA读取数据时,对应数据寄存器已经丢失看或者还没有转换完成就会将OVR位置1.

DMA请求:只适用于规则组

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

H7系列中断:

1、ADC准备就绪就可以产生中断

2、常规组里边配置的每一个转换结束可以产生中断,同时常规组里边的所有转换结束也可以产生中断。

3、注入组和规则组一样,每一个和所有转换结束后,都可以产生中断。

4、H7系列有3个模拟看门狗,所以可以产生3个中断。

5、ADC转换分为采样过程和转换过程,采样结束后可以产生中断。

6、上溢就是数据丢失。

2.9 单次转换模式和连续转换模式 

通过设置ADC_CR2寄存器里边的CONT位配置是单词还是连续转换。

CONT

0

1

转换模式

单次转换模式

连续转换模式

单次转换模式就是只触发一次转换,而连续转换模式就是自动触发下一次转换。连续转换模式只有规则组能设置。

规则组:在单次转换模式下,ADC只会转换一次,然后ADC停止,而连续模式下,ADC不会停止。

注入组:单次转换就是转换一次后停止,连续转换模式下,由于规则组一直在转换,需要将JAUTO位置1,注入组才能转换。

2.10 扫描模式

通过设置SCAN位,SCAN位为1,开启扫描模式,SCAN位为0,关闭扫描模式。

 关闭扫描模式,ADC只会转换规则序列里或者注入系列里边的第一个通道进行转换,后面序列的就不转换了。而开启扫描模式后,ADC会把规则序列里或者注入系列里边的通道都转换一次。

不同模式组合的作用: 如果开启了连续转换和使用扫描模式,会对所有设置的通道都转换一次后,再次开启转换所用通道,连续转换就相当于一个循环。而扫描相当于一个开关,控制转换一个还是序列里边的所有。

例子:如果是转换一次,就选择单次转换,如果是一个通道就不开启扫描,多个通道就开启扫描。

 一种比较少用的模式:不连续采样模式(F1手册称为:间断模式),只适用在扫描模式下。如果设置为2,就是第一次转换1、2通道,第二次转换3、4通道。

 

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

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

相关文章

6.编写正排索引切分字符串|倒排索引原理|引入jieba到项目(C++)

编写正排索引 继续编写incde.hpp #pragma once#include <iostream> #include <string> #include <vector> #include <fstream> #include <unordered_map> #include "util.hpp"namespace ns_index{struct DocInfo{std::string title;…

在Windows系统上测试safari浏览器的兼容性

文章目录 前言手机端的safari浏览器能替代PC端吗在Windows上测试safari浏览器的兼容性的方法利用云服务使用虚拟机在Windows上下载虚拟机遇到的问题以及解决思路总结 前言 在测试网站的兼容性时需要用到safari浏览器&#xff0c;在没有Mac的情况下&#xff0c;又不想麻烦同事&…

【设计模式】【结构型模式】桥接模式(Bridge)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f3b5; 当你的天空突…

惠普HP Color LaserJet CP1215/1210彩色打印机打印校准方法

执行校准 &#xff08;用随机光盘安装驱动&#xff09;完整安装打印机驱动程序。安装驱动程序的操作方法请参考以下文章&#xff1a; 惠普HP Color laserjet cp1215激光打印机在windows 7下使用随机光盘安装驱动程序&#xff0c;安装完成后&#xff1b; 依次点击“开始”→“所…

【雅思博客02】Virus!

Elementary ‐ Virus! (C0007) A: Oh great! This stupid computer froze again! That’s the third time today! Hey Samuel, can you come take a look at my PC? It’s acting up again. It must have a virus or something. B: Just give me a second; I’ll be right …

模型GPU->NPU(Ascend)迁移训练简述

目录 一、迁移训练流程图解 二、详细流程步骤 1. 模型训练与日志记录 2. 跨平台精度对齐对比 3. 问题定位与修复 4. 迭代验证 三、关键技术点 四、常见问题与解决方案 一、迁移训练流程图解 通过华为云的modelart进行运行环境选型 北京四使用GPU进行模型训练&#xff…

sql语言语法的学习

sql通用语法 sql分类 DDL(操作数据库和表) 操作数据库 操作表_查询 操作表_创建 举例&#xff1a; 操作表_删除 操作表_修改 DML(增删改表中数据) DML添加数据 DML删除数据

3.buuctf [BSidesCF 2019]Kookie

进入题目页面如下 尝试弱口令密码登录&#xff0c;无果 显示无效密码 用题中给出的用户名和密码登录虽然成功但没得到flag 用burp suite抓包试试 看到username处显示cookie 题目说用admin登录 将username的值改为admin 拿到flag 最后拿到flag

springboot245-springboot项目评审系统(源码+论文+PPT+部署讲解等)

&#x1f495;&#x1f495;作者&#xff1a; 爱笑学姐 &#x1f495;&#x1f495;个人简介&#xff1a;十年Java&#xff0c;Python美女程序员一枚&#xff0c;精通计算机专业前后端各类框架。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xf…

Dify+Ollama+DeepSeek部署本地大模型+知识库搭建

前言 上一篇文章《OllamaDeepSeek部署本地大模型》我们已经知道如何在本地搭建自己的大模型了&#xff0c;不过想要让大模型能够根据我们个人或者企业的数据情况做出精准的回答&#xff0c;我们还需要将自己的数据投喂给大模型才可以。本篇文章我们将会使用一个开源项目dify集…

每日一题——不同路径的数目与矩阵最小路径和

机器人路径问题与矩阵最小路径和 1. 机器人路径问题题目描述示例示例 1示例 2 解题思路动态规划 代码实现复杂度分析 2. 矩阵的最小路径和题目描述示例示例 1示例 2 解题思路动态规划 代码实现复杂度分析 总结 1. 机器人路径问题 题目描述 一个机器人在 (m \times n) 大小的地…

143,【3】 buuctf web [GYCTF2020]EasyThinking

进入靶场 一开始那个题目名字就想到了框架 扫描目录 访问后自动下载了 找源码 <?php namespace app\home\controller;use think\exception\ValidateException; use think\facade\Db; use think\facade\View; use app\common\model\User; use think\facade\Request; use …

腾讯混元hunyuan3d生成模型,本地搭建和使用

腾讯混元hunyuan3d生成模型,本地搭建和使用 腾讯混元hunyuan3d生成模型,本地搭建和使用一. 话不多说,我们直接上本地部署的详细步骤1. 将仓库拉到本地2. 下载2个模型, 注意这里推荐 先使用conda创建环境后在安装modelscope进行下载模型2.1 关于第一个模型我们要在 Hunyuan3D-1 …

flutter image_cropper插件安装后 打包apk 报错命名空间问题

本篇文章主要讲解&#xff0c;Flutter安装完新依赖打包apk报错 A problem occurred configuring project ‘:image_cropper’. 命名空间问题的解决办法及原因说明。 日期&#xff1a;2025年2月15日 作者&#xff1a;任聪聪 一、报错现象&#xff1a; 报文信息&#xff1a; FAI…

2025-2-15-4.5 链表(基础题)

文章目录 4.6 链表&#xff08;基础题&#xff09;206. 反转链表92. 反转链表II24. 两两交换链表中的节点 4.6 链表&#xff08;基础题&#xff09; 有一天我做题忽然发现要把一个数组完全倒着翻过来很费劲&#xff0c;今天看&#xff0c;链表为此而生啊。 206. 反转链表 题目…

免费大模型网站

腾讯元宝 腾讯元宝 秘塔搜索 秘塔搜索 超算互联网 超算互联网回答速度很慢 Chatbot Arena Chatbot Arena 大模型竞技场。

macOS部署DeepSeek-r1

好奇&#xff0c;跟着网友们的操作试了一下 网上方案很多&#xff0c;主要参考的是这篇 DeepSeek 接入 PyCharm&#xff0c;轻松助力编程_pycharm deepseek-CSDN博客 方案是&#xff1a;PyCharm CodeGPT插件 DeepSeek-r1:1.5b 假设已经安装好了PyCharm PyCharm: the Pyth…

java八股文-mysql

1. 索引 1.1 什么是索引 索引(index)是帮助Mysql高效获取数据的数据结构(有序).提高数据的检索效率,降低数据库的IO成本(不需要全表扫描).通过索引列对数据进行排序,降低数据排序成本,降低了CPU的消耗. 1.2 mysql索引使用的B树? 1. 没有使用二叉树&#xff0c;最坏情况o&…

YOLO11环境搭建CUDA12.6

1.安装CUDA和cuDNN 1.1安装CUDA 1.1.1查看当前你的电脑显卡支持的最高CUDA版本,后面的安装不能超过它 通过命令的方式查看 输入nvidia-smi 1.1.2 下载CUDA 官网地址:CUDA Toolkit Archive | NVIDIA Developer 选择cuda_12.6.3 下载完成后,如下: 安装,一直下一步即可:…

OpenEuler学习笔记(三十二):在OpenEuler上搭建项目管理平台

在OpenEuler上搭建一个支持网页和手持访问、且支持用户功能自定义的项目管理平台&#xff0c;可以选择多种开源工具。以下是基于 Redmine 的搭建方案&#xff0c;Redmine 是一个灵活的项目管理工具&#xff0c;支持网页和移动端访问&#xff0c;并且可以通过插件扩展功能。 1.…