零基础STM32单片机编程入门(四)ADC详解及实战含源码视频

文章目录

    • 一.概要
    • 二.STM32F103C8T6单片机ADC外设特点
    • 三.STM32单片机ADC内部结构图
      • 1.ADC相关引脚说明
      • 2.ADC通道分类
      • 3.触发源
      • 4.转换周期
      • 5.电压转换计算
      • 6.更精确电压转换计算
    • 四.规则通道ADC采集信号流向
      • 1.单次转换模式
      • 2.连续转换模式
    • 五.CubeMX配置一个ADC采集例程
    • 六.CubeMX工程源代码下载
    • 七.讲解视频链接地址
    • 八.小结

一.概要

ADC(Analog to Digital Converter),即模数转换器,是将连续的模拟信号转换为离散的数字信号的单片机外设。典型的模拟数字转是将模拟信号转换为表示一定比例电压值的数字信号,比如温度传感器等一些传感器,输出的信号是0~3.3V的电压信号。
例如温度传感器输出电压0V代表采集到的温度是0­°C,输出电压3.3V代表温度是100­°C,温度跟电压成线性比例关系,如果单片机ADC外设采集的到电压是1.65V,那就代表温度是50­°C(100°C*1.65/3.3),如果单片机ADC外设采集到的电压是3.3V,那就代表温度是100­°C。
在这里插入图片描述

二.STM32F103C8T6单片机ADC外设特点

STM32F103C8T6含有2个12位的模拟/数字转换器(ADC1,ADC2),每个ADC共用多达10个外部通道,可以实现单次或连续转换,1MHz转换速率,转换范围:0~3.6V,ADC供电要求:2.4V~3.6 V。ADC1同时含有2个内部通道:连接到芯片内部温度传感器和内部参考电压(VREFINT = 1.2V)

10个外部通道对应的单片机上的引脚如下图
在这里插入图片描述

三.STM32单片机ADC内部结构图

ADC内部结构图如下
在这里插入图片描述

1.ADC相关引脚说明

(1)VDDA(Analog Supply Voltage)
ADC模块的模拟电源引脚,通常连接到MCU的模拟电源线路。VDDA提供ADC模块所需的模拟电源电压,确保ADC的正常工作和准确的模拟信号转换。

(2)VSSA(Analog Ground Voltage)
ADC模块的模拟地引脚,通常连接到MCU的模拟地线路。

(3)VREF+(Positive Voltage Reference)
ADC模块的正参考电压引脚,通常连接到外部提供的正参考电压源。VREF+确定了ADC转换过程中的上限电压参考点,通常对应于模拟输入信号的最大量程值。在ADC转换过程中,被测量的模拟信号会与VREF+进行比较,以确定其对应的数字量,STM32F103C8T6是没有这个引脚,64脚和小于64脚的STM32F103型号,其VREF+在芯片内部与VCC信号线相连,没有引到片外,这样AD的参考电压就是VCC上的电压。

(4)VREF-(Negative Voltage Reference)
ADC模块的负参考电压引脚,通常连接到外部提供的负参考电压源或地。VREF-确定了ADC转换过程中的下限电压参考点,通常对应于模拟输入信号的最小量程值。
STM32F103C8T6也没有这个引脚。

2.ADC通道分类

在STM32的ADC模块中,分成了两种不同类型的通道类型:规则通道和注入通道,它们适应于不同的采集场景,在功能框图所示:
在这里插入图片描述

ADC规则通道
规则通道顾名思义就是,最平常的通道、也是最常用的通道,平时的ADC转换都是用规则通道模式的。它允许用户配置ADC以便按照预定的顺序对这些通道进行连续或单次采样。

ADC注入通道
注入通道是相对于规则通道的,注入通道可以在规则通道转换时,强行插入转换,相当于一个“中断通道”吧。当有注入通道需要转换时,规则通道的转换会停止,优先执行注入通道的转换,当注入通道的转换执行完毕后,再回到之前规则通道进行转换。这种功能使得注入通道特别适合于采集突发事件或需要高优先级响应的应用,比如实时监控或故障检测。

3.触发源

ADC转换的输入、通道、转换顺序都已经说明了,但ADC转换是怎么触发的呢?就像通信协议一样,都要规定一个起始信号才能传输信息,ADC也需要一个触发信号来实行模/数转换。
其一就是通过直接配置寄存器触发,通过配置控制寄存器CR2的ADON位,写1时开始转换,写0时停止转换。在程序运行过程中只要调用库函数,将CR2寄存器的ADON位置1就可以进行转换,比较好理解。
另外,还可以通过内部定时器或者外部IO触发转换,也就是说可以利用内部时钟让ADC进行周期性的转换,也可以利用外部IO使ADC在需要时转换,具体的触发由控制寄存器CR2决定。

4.转换周期

可独立设置各通道采样时间ADC会在数个ADCCLK周期内对输入电压进行采样,可使用ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位修改周期数。每个通道均可以使用不同的采样时间进行采样。
总转换时间的计算公式如下:
Tconv=采样时间+12个周期
示例:
ADCCLK = 30 MHz且采样时间=3个周期时:
Tconv= 3+12=15个周期=0.5us (APB2为60MHz时)
最小采样时间0.42us(ADC时钟=36MHz,采样周期为3周期下得到)。

5.电压转换计算

转换后的数据是一个12位的二进制数,我们需要把这个二进制数代表的模拟量(电压)用数字表示出来。比如测量的电压范围是0~3.3V,ADC转换后的寄存器读到的数是x,因为12位ADC在转换时将电压的范围大小(也就是3.3)分为4096(2^12)份,所以真实电压的计算方法就是: y=3.3* x / 4096(V)

6.更精确电压转换计算

STM32F103C8T6是VDD3.3V做参考电压,但是这种方法在供电电压有可能随外部一些其他用电器工作使用的大电流而导致电压不稳定,内部参考电压能更加精确计算采样到的电压,具体方法是在测量某个通道的电压值之前,先读出参照电压的ADC测量数值(Vrefint Channel),记为ADrefint;再读出要测量通道的ADC转换数值,记为ADchx;则要测量的电压为:
Vchx = VREFINT * (ADchx/ADrefint)

四.规则通道ADC采集信号流向

在这里插入图片描述

1.单次转换模式

配置为单次模式使能,扫描模式失能。这样ADC的这个通道,转换一次后,就停止转换,需要下一次启动才可以。

2.连续转换模式

配置为连续模式使能,扫描模式失能。这样ADC的这个通道,转换一次后,接着进行下一次转换,不断连续。

五.CubeMX配置一个ADC采集例程

在这里插入图片描述

STM32F103C8T6小系统板PA4 引脚上的进行 ADC 电压采集,杜邦线连接 PA4 引脚与 VDD(3.3V),应该能读到单片机供电的电压值。
打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F103C8,再双击就创建新的工程
在这里插入图片描述
配置下载口引脚
在这里插入图片描述
配置外部晶振引脚
在这里插入图片描述
配置PA4引脚为ADC1的通道4,进行电压采集
在这里插入图片描述

配置系统主频
在这里插入图片描述
配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述
生成工程
在这里插入图片描述
用Keil5打开工程
在这里插入图片描述
Main.c中添加代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

STLINK连接好板子后,Keil 5进入调试,在Watch界面查看两个变量的值,ADC采样到的值是0xfff,转换成电压值就是3300mV。

在这里插入图片描述
main代码如下:

/* USER CODE BEGIN 0 */
int ADCData;
uint16_t VolDta;
/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();//外部8M晶振,系统72M主频/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_ADC1_Init();//PA4引脚配置成ADC1 Channel4输入/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE *//* USER CODE END WHILE *//* USER CODE BEGIN 3 */if(HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK)//启动校准{Error_Handler();}HAL_ADC_Start(&hadc1);//启动ADC/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE */ADCData=HAL_ADC_GetValue(&hadc1);//获取ADC采集值VolDta=ADCData*3300/4095;//ADC采集值转换成电压值,单位mVHAL_Delay(200);//等待200msHAL_ADC_Start(&hadc1);//再次启动ADC	HAL_Delay(200);/* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

六.CubeMX工程源代码下载

在这里插入图片描述
链接:https://pan.baidu.com/s/1A3tst65eeeLbxwtFvOe0iA
提取码:7wht

如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行

七.讲解视频链接地址

ADC外设视频讲解

八.小结

ADC外设是STM32单片机开发中的最基本操作,学会了ADC,可以采集外部的一些传感器的模拟信号,适应更多模块的驱动。

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

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

相关文章

大厂程序员上班猝死成常态?

大家好,我是瑶琴呀,拥有一头黑长直秀发的女程序员。 近日,连续看到大厂程序员猝死、低血糖晕倒的新闻,同为程序员感到很难受。互联网加班成常态这是既定事实,尤其在这个内卷严重、经济不景气的环境中,加班…

【漏洞复现】电信网关配置管理系统——命令执行

声明:本文档或演示材料仅供教育和教学目的使用,任何个人或组织使用本文档中的信息进行非法活动,均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 电信网关配置管理系统是一个用于管理和配置电信网关设备的软件系…

高性能Web服务器-Nginx的常用模块

文章目录 Nginx安装Nginx平滑升级与回滚平滑升级流程第1步,下载新版本第2步,编译第3步,执行make第4步,对比新旧版本第5步,备份旧nginx二进制文件第6步,模拟用户正在访问nginx第7步,替换旧的ngin…

【资源】太绝了!整整16本Python必看书籍详细讲解,适合零基础小白,高清电子版PDF开放下载,带你从入门到入土~

小编为初学Python的朋友们汇总了16本零基础入门书籍,包括Python三剑客等,都是在编程届多年畅销的书籍,也是众多从业者的选择,全文详细介绍了书籍主要内容,有需要的宝子根据自身情况自取 【教程领取方式在文末&#xff…

基于weixin小程序农场驿站系统的设计

管理员账户功能包括:系统首页,个人中心,农场资讯管理,用户管理,卖家管理,用户分享管理,分享类型管理,商品信息管理,商品类型管理 开发系统:Windows 架构模式…

「性能指标」CPU飙高排查实战

上篇提到了什么是 CPU 以及如何计算的。接下来主要说说实际工作中遇到 CPU 飙高如何去排查呢? 往期回顾: 聊聊性能指标 CPU 利用率如何计算的? 问题发现 前段时间我们新上线了一个应用,由于流量一直不大,集群的每秒…

力扣 单链表元素删除解析及高频面试题

目录 删除元素的万能方法 构造虚拟头结点来应对删除链表头结点的情况 一、203.移除链表元素 题目 题解 二、19.删除链表中倒数第K个节点 题目 题解 三、 83.删除某个升序链表中的重复元素,使重复的元素都只出现一次 题目 题解 82.删除某个升序链表中的…

2023年第十四届蓝桥杯JavaB组省赛真题及全部解析(下)

承接上文:2023年第十四届蓝桥杯JavaB组省赛真题及全部解析(下)。 目录 七、试题 G:买二赠一 八、试题 H:合并石子 九、试题 I:最大开支 十、试题 J:魔法阵 题目来自:蓝桥杯官网…

【星海随笔】vue+vite

开头问一个问题&#xff0c;我发现有的人粉丝是点赞数的好几倍&#xff0c;可能和必须关注他才能阅读他的文章有关。 所以问一下怎么设置为关注才能查看该文章。 screen -ls #查看 id 列表 screen -S <session_name> # 创建一个会话 screen -R <session_id> # 根据…

iconfont-阿里巴巴矢量图标库 在vue项目使用记录

官网地址&#xff1a;https://www.iconfont.cn/manage/index?manage_typemyprojects&projectId4539761 第一步&#xff1a; 下载资源 ->解压到项目文件夹 第二步 在项目中main.ts 或者main.js 引入资源 import //assets/iconfont/font/iconfont.js; import //assets…

IBM Spectrum LSF RTM,针对 IBM Spectrum LSF 环境的高级报告、跟踪和监控工具

亮点 为 IBM Spectrum LSF 环境提供性能监控和报告 监控 FlexNet Publisher 和 Reprisebased 许可证的使用&#xff0c;提供详细和总结性报告 通过多个级别&#xff08;包括应用程序和组织&#xff09;的报告来监控共享存储的利用率 提供强大的生产力工具&#xff0c;包括操…

JVM专题五:类加载器与双亲委派机制

通过上一篇Java的类加载机制相信大家已经搞明白了整个类加载从触发时机&#xff0c;接着我们就来看下类加载器&#xff0c;因为类加载机制是有加载器实现的。 类加载器的分类 启动类加载器 Bootstrap ClassLoader 是 Java 虚拟机&#xff08;JVM&#xff09;的一部分&#x…

斜光测距的原理及python实现

1.前言 最近做了一个基于opencv的斜光测距的小项目&#xff0c;东西不多&#xff0c;但是很有意思&#xff0c;值得拿出来学一学。项目里面需要比较精确的定位功能&#xff0c;将前人matlab代码移植到python上&#xff0c;并且做了一些优化&#xff0c;简化逻辑(毕竟我是专业的…

我教会了我妈搭建自己的 AI 聊天机器人...

在这个人工智能爆发的年代,ChatGPT、Claude、Kimi、文心一言等 AI 大模型产品火遍全网,仿佛一夜之间,人人都在谈论 AI。 作为普通人的我们,难道就只能看着程序员们尽情玩耍,自己却无法参与其中吗?NO! 鉴于最近自己社群学员和粉丝的要求&#xff0c;一进来大家无论是不是小白…

Linux防火墙【SNAT,DNAT】

NAT: 支持PREROUTING&#xff0c;INPUT&#xff0c;OUTPUT&#xff0c;POSTROUTING四个链 请求报文&#xff1a;修改源/目标IP&#xff0c; 响应报文&#xff1a;修改源/目标IP&#xff0c;根据跟踪机制自动实现 NAT的实现分为下面类型&#xff1a; SNAT&#xff1a;source…

如何实现数字人系统私有化部署?数字人源码部署教程简易版来了!

当前&#xff0c;数字人行业的市场前景和应用潜力不断显现&#xff0c;不少创业者都想要通过学习数字人源码部署教程来搭建属于自己的数字人系统&#xff0c;以此获得进军数字人行业的入场券。而事实上&#xff0c;该想法本身当然是固然值得鼓励的&#xff0c;但就目前的实践情…

基于改进天鹰优化算法(IAO)优化RBF神经网络数据回归预测 (IAO-RBF)的数据回归预测(多输入多输出)

改进天鹰优化算法(IAO)见&#xff1a;【智能优化算法】改进的AO算法(IAO)-CSDN博客 代码原理 基于改进天鹰优化算法&#xff08;IAO&#xff09;优化RBF神经网络数据回归预测&#xff08;IAO-RBF&#xff09;的多输入多输出&#xff08;MIMO&#xff09;数据回归预测&#xf…

视频去水印软件?在线去除视频水印工具网站?

视频去水印软件哪个好&#xff1f;在数字时代&#xff0c;视频内容的传播变得日益普遍&#xff0c;然而&#xff0c;许多视频带有水印&#xff0c;影响了观看体验&#xff0c;如果有这些图案我们需要找方法把这些图案从视频上去掉。今天我们就来看一下视频去水印的超级简单的方…

添加阈值滞后以实现平滑的欠压/过压锁定

电阻分压器将高压衰减到低压电路可以承受的水平&#xff0c;而不会过驱动或损坏。在电源路径控制电路中&#xff0c;电阻分压器有助于设置电源欠压和过压锁定阈值。这种电源电压鉴定电路存在于汽车系统、电池供电的便携式仪器以及数据处理和通信板中。 欠压锁定 (UVLO) 可防止…

goLang小案例-打印99乘法表

goLang小案例-打印99乘法表 1. 打印99乘法表 func Print99multiplication1() {//横向9排for i : 1; i < 9; i {//竖向9列//第一批第一个 和第一列比较 如果大于排就结束//假设第三排i3 最走有三列 1*3 2*3 3*3//j3打印完 j 当j4就要结束 以此类推for j : 1; j < i; j …