STM32 ADC数模转换器

单片机学习!

目录

文章目录

前言

一、ADC简介

1.1 ADC名称

1.2 ADC功能

1.3 分辨率与转换时间

1.4 输入电压与转换范围

1.5 输入通道

1.6 增强功能

1.7 自动监测输入电压范围

1.8 STM32F103C8T6 ADC资源

二、逐次逼近型ADC

2.1 ADC内部结构原理图

2.2 输入通道选择

2.3 电压比较

2.4 输出

2.5 逐次逼近型ADC总结

总结


前言

        GPIO只能读取引脚的高低电平,只有两个值:高电平或低电平。而ADC可以对高电平和低电平之间的任意电压进行量化,最终用一个变量来表示。读取这个变量就可以知道引脚的具体电压是多少。ADC好比一个电压表,可以把引脚的电压值测出来,放在一个变量里。


一、ADC简介

  • ADC(Analog-Digital Converter)模拟-数字转换器
  • ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁
  • 12位逐次逼近型ADC,1us转换时间
  • 输入电压范围:0~3.3V,转换结果范围:0~4095
  • 18个输入通道,可测量16个外部和2个内部信号源
  • 规则组和注入组两个转换单元
  • 模拟看门狗自动监测输入电压范围
  • STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道

1.1 ADC名称

        ADC模拟到数字转换器,简称模数转换器或者AD转换器。

  • AD(Analog to Digital):模拟-数字转换,将模拟信号转换为计算机可操作的数字信号。
  • DA(Digital to Analog):数字-模拟转换,将计算机输出的数字信号转换为模拟信号。

1.2 ADC功能

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

        STM32主要是数字电路,数字电路只有高低电平,没有几伏电压的概念。要想读取电压值,就需要借助ADC模拟转换器来实现了。ADC读取引脚上的模拟电压,转换为一个数据,存在寄存器里,再把这个数据读取到变量里来就可以进行显示、判断、记录等操作了。

        ADC是模拟到数字的桥梁,DAC是数字到模拟的桥梁。DAC数字模拟转换器,使用DAC就可以将数字变量转换为模拟电压。DAC主要应用在波形生产这些领域,如信号发生器、音频解码芯片等。

        还有一个数字到模拟的桥梁是PWM,PWM可以控制LED的亮度、电机的速度等。PMW只有完全导通和完全断开两种状态,这两种状态都没有功率损耗,所以在直流电机调速这种大功率的应用场景使用PWM来等效模拟量是比DAC等好的选择,并且PWM电路更加简单,更加常用,所以PWM的应用空间比DAC更广。

1.3 分辨率与转换时间

        STM32的ADC是12位逐次逼近型ADC,1us转换时间。

        逐次逼近型是ADC的工作模式,下文展开描述。

        12位和1us转换时间涉及到ADC的两个关键参数。

        第一个是分辨率,一般用多少位来表示,12位AD值,它的表示范围就是0到2的12次方减1,就是量化结果的范围是0~4095,位数越高量化结果就越精细,对应分辨率就越高。

        第二个是转换时间,就是转换频率,AD转换是需要花一小段时间的,这里1us就表示从AD转换开始到产生结果,需要花1us的时间,对应AD转换的频率就是1MHz。1MHz就是STM32 ADC的最快转换频率。如果需要转换一个频率非常高的信号,就需要考虑一下这个转换频率是不是够用;如果信号频率比较低那最大1MHz的转换频率也完全够用。

1.4 输入电压与转换范围

        输入电压范围:0~3.3V,转换结果范围:0~4095。

        ADC的输入电压一般要求都是要在芯片供电的负极和正极之间变化的。

  • 最低电压就是负极0V,最高电压是正极3.3V。
  • 经过ADC转换之后,最小值就是0,最大值是4095.

0V对应0,3.3V对应4095,中间都是一一对应的线性关系,计算起来比较简单,可直接乘除一个系数就行了。

1.5 输入通道

        ADC有18个输入通道,可测量16个外部和2个内部信号源。

        外部信号源就是16个GPIO口,在引脚上直接接模拟信号就行了,不需要任何额外的电路,引脚就直接能测电压。

        2个内部信号源是内部温度传感器和内部参考电压。温度传感器可以测量CPU的温度,如电脑可以显示一个CPU温度,就可以用ADC读取这个温度传感器来测量。内部参考电压是一个1.2V左右的基准电压,这个基准电压是不随外部供电电压变化而变化的。如果芯片的供电不是标准的3.3V,那测量外部引脚的电压可能就不对。这时就可以读取这个基准电压进行校准,校准后可得到正确的电压值了。

1.6 增强功能

        规则组和注入组两个转换单元,这个是STM32 ADC的增强功能,普通的AD转换流程是,启动一次转换、读一次值,然后再启动、再读值,这样的流程。而STM32的ADC就比较高级,可以列一个组,一次性启动一个组,连续转换多个值。并且有两个组可以启动,一个是用于常规使用的规则组;一个是用于突发事件的注入组。

1.7 自动监测输入电压范围

        模拟看门狗自动监测输入电压范围。

        ADC一般可以用于测量光线强度、温度这些值。并且经常会有个需求:如果光线高于某个阈值或低于某个阈值;温度高于某个阈值或低于某个阈值时。需要执行一些操作。高于某个阈值、低于某个阈值的判断,就可以用模拟看门狗来自动执行。

        模拟看门狗可以监测指定的某些通道,当AD值高于它设定的上阈值或者下阈值时,就会申请中断,可以在中断函数里执行相应的操作。执行这个操作可以不用不断手动读值,再用if进行判断了。

1.8 STM32F103C8T6 ADC资源

        STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道。

        STM32F103C8T6 ADC资源有ADC1、ADC2 共两个ADC外设。10个外部输入通道也就是它最多只能测量10个外部引脚的模拟信号。上文所说ADC有16个外部信号源,这是这个系列最多有16个外部信号源,但是STM32F103C8T6芯片引脚比较少,有很多引脚没有引出来,所以只有16个外部信号源。

二、逐次逼近型ADC

2.1 ADC内部结构原理图

        了解逐次逼近型ADC如何测电压,需要先了解逐次逼近型ADC的内部结构,以下结构图和STM32的ADC原理是一样的,它是ADC0809的内部结构图。ADC0809是一个独立的8位逐次逼近型ADC芯片。在单片机性能还不够强的时候,需要外挂一个ADC芯片才能进行AD换, ADC0809就是一款比较经典的ADC芯片。现在单片机的性能和集成度都有很大的提升,很多单片机内部就已经集成了ADC外设,不用外挂芯片,引脚可以直接测电压。

2.2 输入通道选择

        (1)IN0~IN7是8路输入通道。通过(2)通道选择开关,选中输入通道其中一路输入进行转换。(3)地址锁存和译码可以将选中通道的通道号放在(4)ADDA、ADDB、ADDC三个引脚上,然后给一个锁存信号(5)ALE,对应选中的输入通道通路开关就可以自动拨好了。ADDA、ADDB、ADDC三个引脚就是用来控制通道选择开关选择哪一路通道输入的。

        这部分就相当于一个可以通过模拟信号的数据选择器。因为ADC转换是一个很快的过程,给个开始信号,过几个us就能转换完成。所以如果要转换多路信号,不用设计多个AD转换器,只需要一个AD转换器再加一个多路选择开关。需要转换哪一路就拨一下多路选择开关选中对应通道,然后再开始转换。

        以上就是输入通道选择的部分,ADC0809芯片只有8个输入通道,STM32内部的ADC有18个输入通道,对应通道选择开关就是一个18路输入的多路开关。

2.3 电压比较

        输入信号选好后怎么能得出电压对应的编码数据是多少呢?这里需要用逐次逼近的方法来一一比较。(6)电压比较器可以判断两个输入电压的大小关系。输出一个高低电平指示谁大谁小,电压比较器的两个输入端,一个是选中输入通道的带测电压,另一个是DAC的电压输出端。DAC是数模转换器,给DAC一个数据,DAC就可以输出数据对应的电压。DAC内部是使用加权电阻网络来实现的转换。

        有一个外部通道输入的未知编码的电压,还有一个DAC输出的已知编码的电压。将两个电压同时输入到电压比较器,进行大小判断。

  • 如果DAC输出的电压比较大,就相应调小DAC数据;
  • 如果DAC输出的电压比较小,就相应调大DAC数据。

直到DAC输出的电压和外部通道输入的电压近似相等。这样DAC输入的数据就是外部电压的编码数据了,这就是DAC实现的原理,电压调节的过程就是(7)逐次逼近SAR来完成的。

        为了最快找到未知电压的编码,通常会使用二分法进行查找。这里ADC0809芯片是8位的ADC,那编码就是从0~255.举例一个未知电压在0~5V之间。

  • 第一次比较:用5/2V的电压和未知电压比较,DAC输入电压编码也为255/2也就是128来比较。转换为二进制就是1000 0000.

若未知电压比5/2V的电压小

  • 第二次比较:用5/4V的电压和未知电压比较,DAC输入电压编码也为128/2也就是64来比较。转换为二进制就是0100 0000.

若未知电压比5/4V的电压大

  • 第三次比较:用(5/4+5/8)V的电压和未知电压比较,DAC输入电压编码也为64+(64/2)也就是96来比较。转换为二进制就是0110 0000.

............

一直进行到第八次比较后,得出与未知电压近似的电压值。

        分析发现,在对电压编码进行二等分的时候,就是转化为二进制的数值1000 0000从左到右依次判断:

  • 若第一次判断未知电压小于电压编码第一次二等分的值,则二进制数值第一位置0:0100 0000,再用这个值进行第二次判断;
  • 若第一次判断未知电压大于电压编码第一次二等分的值,则二进制数值保留第一位置1:1100 0000,再用这个值进行第二次判断。

二进制的8位数值每一位依次判断完后,得到的数值就是未知电压的近似编码电压。

        AD转换结束后,(8)DAC的输入数据就是未知电压的编码。

2.4 输出

        通过(9)8位三态锁存缓冲器进行输出,8位就有8根线,12位就有12根线。

  1. EOC:是End Of Convert,转换结束信号。
  2. START:是开始转换,给一个输入脉冲,开始转换。
  3. CLOCK:是ADC时钟。因为ADC内部是一步一步进行判断的,所以需要时钟来推动这个过程。
  4. VREF+和VREF-:是DAC的参考电压。如给一个数据255,是对应5V还是3.3V就取决于参考电压。DAC的参考电压也决定了ADC的输入范围,所以它也是ADC参考电压。
  5. VCC和GND:整个芯片电路的供电。通常参考电压的正极和VCC是一样的,会接在一起;参考电压的负极和GND也是一样的,会接在一起。一般情况下,ADC输入电压的范围就和ADC的供电是一样的。

        

2.5 逐次逼近型ADC总结

        输入一个未知电压,再用DAC输出一个已知电压和输入的未知电压比较。如果未知电压大,就将DAC输出调高;如果未知电压小,就将DAC输出调低。多次调节后DAC调节得到一个和未知电压接近相等的已知电压,最终得到的已知的DAC电压值就可以表示为未知电压的值。


总结

        以上就是今天要讲的内容,本文仅仅简单介绍了ADC.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI 驱动的医疗变革:迈向未来医疗新生态

直面呼啸而来的人工智能,医疗行业将首当其冲,发生翻天覆地的变化。美国心脏病学家兼基因学教授埃里克托普在《未来医疗》中预测,未来人类将拥有“健康小助手”——个人医疗数据和处理能力,还能轻松预防疾病。诸多评论家也持类似观…

Jade 处理XRD并计算半峰宽FWHM、峰面积、峰强度等数据

1.打开软件 2.导入测试的XRD数据 3.平滑数据 4.抠一下基底 5.分析具体数据 6.按住鼠标左键,在峰底部拉一条线,尽量和基底持平 7.结果就出来了,想要的都在里面,直接取值就行

数据分析-Pandas如何观测数据的中心趋势度

数据分析-Pandas如何观测数据的中心趋势度 数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律? 数据…

Stable Diffusion 模型:从噪声中生成逼真图像

你好,我是郭震 简介 Stable Diffusion 模型是一种生成式模型,可以从噪声中生成逼真的图像。它由 Google AI 研究人员于 2022 年提出,并迅速成为图像生成领域的热门模型。 数学基础 Stable Diffusion模型基于一种称为扩散概率模型(Diffusion P…

16 OpenCV Laplance算子

文章目录 图像的二阶导数Laplance算子代码示例 图像的二阶导数 在二阶导数的时候,最大变化处的值为零即边缘是零值。通过二阶 导数计算,依据此理论我们可以计算图像二阶导数,提取边缘。 Laplance算子 void Laplacian( InputArray src, Output…

Java代码审计安全篇-SSRF(服务端请求伪造)漏洞

前言: 堕落了三个月,现在因为被找实习而困扰,着实自己能力不足,从今天开始 每天沉淀一点点 ,准备秋招 加油 注意: 本文章参考qax的网络安全java代码审计,记录自己的学习过程,还希望各…

【C++进阶】C++多态概念详解

C多态概念详解 一,多态概念二,多态的定义2.1 多态构成的条件2.2 什么是虚函数2.3 虚函数的重写2.3.1 虚函数重写的特例2.3.2 override和final 2.4 重载和重写(覆盖)和重定义(隐藏)的区别 三,抽象…

性能指标:QPS、TPS、系统吞吐量理解

一、QPS,每秒查询 QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。 互联网中,作为域名系统服务器的机器的性能经…

[leetcode~dfs]1261. 在受污染的二叉树中查找元素

给出一个满足下述规则的二叉树: root.val 0 如果 treeNode.val x 且 treeNode.left ! null,那么 treeNode.left.val 2 * x 1 如果 treeNode.val x 且 treeNode.right ! null,那么 treeNode.right.val 2 * x 2 现在这个二叉树受到「污…

02.JavaScript的运算符和语句

JavaScriptt的运算符和语句 一.运算符 算术运算符 数字是用来计算的,比如:乘法 * 、除法 / 、加法 、减法 - 等等,所以经常和算术运算符一起。 算术运算符:也叫数学运算符,主要包括加、减、乘、除、取余&#xff…

python自学7

第二章第一节面向对象 程序的格式都不一样,每个人填写的方式也有自己的习惯,比如收集个人信息,可能有人用字典字符串或者列表, 类的成员方法 类和对象 构造方法 挨个传输值太麻烦了,也没有方便点的,有&…

每日一题——LeetCode2129.将标题首字母大写

方法一 个人方法 将字符串转为数组&#xff0c;遍历数组&#xff0c;对数组的每一个元素&#xff0c;先全部转为小写&#xff0c;如果当前元素长度大于2&#xff0c;将第一个字符转为大写形式 var capitalizeTitle function(title) {titletitle.split( )for(let i0;i<tit…

linux升级gcc版本详细教程

0.前言 一般linux操作系统默认的gcc版本都比较低&#xff0c;例如centos7系统默认的gcc版本为4.8.5。gcc是从4.7版本开始支持C11的&#xff0c;4.8版本对C11新特性的编译支持还不够完善&#xff0c;因此如果需要更好的体验C11以及以上版本的新特性&#xff0c;需要升级gcc到一个…

VC6.0 新建一个C语言文件

一、新建工程 左上角 文件 --> 新建 --> 选择“一个空工程” 点击“完成”&#xff0c;再点击“确定” 二、新建源文件 左上角 文件 --> 新建 --> 点击“确定” 三、输入代码 #include<stdio.h> int main() {printf("Hello World!\n&q…

Vulnhub靶机:Kioptrix_Level1

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;192.168.56.101&#xff09; 靶机&#xff1a;Kioptrix_Level1&#xff08;192.168.56.105&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vulnh…

GIS学习笔记(四):GIS数据可视化综合(矢量数据)

矢量数据 arcgis的主要可视化工具&#xff1a;属性 符号系统 符号系统 按类别 这里不会涉及到数字的大小因素&#xff0c;只是按照字符的分类去做可视化 “唯一值”的含义 “建筑年代”字段共有10个年份&#xff0c;一个年份也许有多个数据( eg.1990年的建筑有20个)&…

MySQL 事务的原理以及长事务的预防和处置

transaction_isolation 隔离级别 读未提交 读提交 视图是在每个 SQL 语句开始执行的时候创建的 可重复读 视图是在事务启动时创建的&#xff0c;整个事务存在期间都用这个视图 串行化…

【NR 定位】3GPP NR Positioning 5G定位标准解读(十)-增强的小区ID定位

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

python读取execl里的图片

正常的读取图片 from openpyxl import load_workbook from PIL import Imagefrom openpyxl import load_workbook wb load_workbook(rC:\Users\Administrator\Downloads\output1111.xlsx) ws wb[wb.sheetnames[0]] for image in ws._images:data image.anchor._fromif image…

接雨水(leetcode hot100)

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] …