STM32单片机(七)ADC模拟数字转换器----第一节:ADC模数转换器

本文主要是介绍STM32单片机(七)ADC模拟数字转换器----第一节:ADC模数转换器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。
☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋。
🌙专栏目标:实现从零基础入门51单片机和STM32单片机,力求在玩好单片机的同时,能够了解一些计算机的基本概念,了解电路及其元器件的基本理论等。

⭐️ 专栏主要内容: 主要学习STM32单片机的功能、各个模块、单片机的外设、驱动等,最终玩好单片机和单片机的外设,全程手敲代码,实现我们所要实现的功能。
🌴 专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。
💑专栏主页:http://t.csdn.cn/HCD8v

本学习过程参考:https://space.bilibili.com/383400717

STM3单片机安装软件、各种资料以及源码的路径:
链接:https://pan.baidu.com/s/1snD0uuTfMhchFqOMWvAiHA?pwd=asdf#list/path=%2F
提取码:asdf

链接里压缩包的解压密码:32

本大节主要学习ADC模拟数字转换器的相关知识,包含两小节:
第一小节主要学习ADC模拟数字转换器的理论基础知识,第二小节是对第一小节的内容写两个程序进行练习,分别是AD单通道和AD多通道;
最终附上所有的源代码;

本小节主要学习ADC模拟数字转换器的理论基础知识。

ADC的作用:
对于GPIO来说,它只能读取引脚的高低电平,要么是高电平,要么是低电平,只有两个值;而使用ADC之后,我们就可以对这个高电平和低电平之间的任意电压进行量化,最终用一个变量来表示,读取这个变量,就可以知道引脚的具体电压是多少了;所以ADC其实就是一个电压表,把引脚的电压值测出来,放在一个变量里,这就是ADC的作用

文章目录

    • 1 ADC简介
    • 2 逐次逼近型ADC
    • 3 ADC框图
    • 4 ADC基本结构
    • 5 输入通道
    • 6 转换模式
    • 7 触发控制
    • 8 数据对齐
    • 9 转换时间
    • 10 校准
    • 11 硬件电路

1 ADC简介

在这里插入图片描述

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

ADC有两个关键参数:

  • 第一个是分辨率,一般用多少位来表示,12位AD值,它的表示范围就是0~2^12-1;就是量化结果范围是0~4095;位数越高,量化结果就越精细,对应分辨率就越高;
  • 第二个是转换时间,就是转换频率;AD转换是需要花一小段时间的,这里的1us就表示从AD转换开始,到产生结果,需要花1us时间,对应AD转换的频率就是1MHz;这个就是STM32 ADC最快的转换频率;

2 逐次逼近型ADC

在这里插入图片描述

  • 上图是ADC0809的内部结构图;它是一个独立的8位逐次逼近型ADC芯片,其是一款经典的外挂型ADC芯片;
  • 左边IN0-IN7是8路输入通道;通过通道选择开关,选中一路,输入到比较器进行转换;
  • 下面的地址锁存和译码模块;就是你想选中哪个通道,就把通道号放在ADDA-ADDC这三个引脚上,然后给一个锁存信号,则上面通道选择开关里对应的通路开关就可以自动拨好了;
  • 这个ADC只有8个输入通道,而我们STM32内部的ADC是有18个输入通道的;所以对应上面输入通道,STM32内部是有18个输入的;
  • 比较器可以判断两个输入信号电压的大小关系,输出一个高低电平指示谁大谁小,它的两个输入端,一个是待测电压,另一个是DAC的电压输出端,DAC是数模转换器,给它一个数据,它就可以输出数据对应的电压;现在在比较器两端,一端有了一个外部通道输入的位置编码的电压,另一端有了一个DAC输出的一直编码的电压,他俩同时输入到电压比较器,进行大小判断;如果DAC输出的电压比较大,我就调小DAC数据,如果DAC输出的电压比较小,我就增大DAC数据,直到他们相等;就得到了外部位置编码电压的具体数值,这样DAC输入的数据就是外部电压的编码数据了 ;这就是DAC的实现原理
  • 上面提到的比较方法,使用的是二分法的比较方法;

3 ADC框图

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

  • 模拟多路开关,可以指定我们想要选择的通道;右边是多路开关的输出,进入到模数转换器;这里的模数转换器就是执行逐次比较的过程;转换结果会直接放在数据寄存器里;通过程序读取寄存器就能直到ADC转换的结果了;

在这里插入图片描述

4 ADC基本结构

在这里插入图片描述

  • 左边是输入通道,16个GPIO口,外加两个内部的通道;
  • 然后进入AD转换器,AD转换器里有两个组,一个是规则组,一个是注入组,规则组最多可以选中16个通道,注入组最多可以选择4个通道;
  • 转换的结果可以存放在AD数据寄存器里,其中规则组只有1个数据寄存器,注入组有4个
  • 然后下面有触发机制,提供了开始转换这个START信号,触发控制可以选择软件触发和硬件触发,硬件触发主要是来自于定时器,当然也可以选择外部中断的引脚;右边是来自于RCC的ADC时钟CLOCK;ADC逐次比较的过程就是由这个时钟推动的;
  • 模拟看门狗用于检测转换结果的范围, 如果超出设定的阈值,就通过中断输出控制,向NVIC申请中断;
  • 另外,规则组和注入组转换完成后会有个EOC信号,它会置一个标志位,当然也可以通向NVIC;
  • 最后右下角还有个开关控制,在库函数中,就是ADC_Cmd函数,用于给ADC上电的;

5 输入通道

在这里插入图片描述

上图是ADC通道和引脚复用的关系;

6 转换模式

在这里插入图片描述

  • 单词转换,非扫描模式,单次转换后就会停止;然后开启下一次转换;

在这里插入图片描述

  • 连续转换,非扫描模式:它与单次转换,非扫描模式的不同是,它在一次转换结束后不会停止,而是立刻开始下一轮的转换,然后一直持续下去;这样只需要最开始触发一次,之后就可以一直转换了;
  • 这个模式的好处是开启转换后不需要等待一段时间;

在这里插入图片描述

  • 单次转换,扫描模式:也是单次转换,所以每触发一次,转换结束后就会停下来,下次转换就得再触发才能开始;然后它是扫描模式,就会用到列表了,左边的每个位置是通道几可以任意指定,并且可以重复;初始化结构体里还会有个参数,就是通道数目,因为16个位置可以不用完,只用前几个,所以需要指定通道数;
    在这里插入图片描述
  • 连续转换,扫描模式

7 触发控制

在这里插入图片描述

8 数据对齐

在这里插入图片描述

  • 一般我们使用右对齐

9 转换时间

在这里插入图片描述

10 校准

在这里插入图片描述

11 硬件电路

在这里插入图片描述

这篇关于STM32单片机(七)ADC模拟数字转换器----第一节:ADC模数转换器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/335249

相关文章

从去中心化到智能化:Web3如何与AI共同塑造数字生态

在数字时代的演进中,Web3和人工智能(AI)正成为塑造未来互联网的两大核心力量。Web3的去中心化理念与AI的智能化技术,正相互交织,共同推动数字生态的变革。本文将探讨Web3与AI的融合如何改变数字世界,并展望这一新兴组合如何重塑我们的在线体验。 Web3的去中心化愿景 Web3代表了互联网的第三代发展,它基于去中心化的区块链技术,旨在创建一个开放、透明且用户主导的数字生态。不同于传统

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,