STM32LL库编程系列第八讲——ADC模数转换

系列文章目录

`往期文章
STM32LL库编程系列第一讲——Delay精准延时函数(详细,适合新手)
STM32LL库编程系列第二讲——蓝牙+USART串口通信(步骤详细、原理清晰)
STM32LL库编程系列第三讲——USART+DMA通信
STM32LL库编程系列第四讲——定时器输入捕获+超声波测距
STM32LL库编程系列第五讲——定时器PWM输出+DS3115舵机控制
STM32LL库编程系列第六讲——定时器编码器模式+电机驱动
STM32LL库编程系列番外——DMA常用编程
STM32LL库编程系列第七讲——SPI通信(W25Q128)
STM32的SPI通信的NSS引脚设置原理


文章目录

  • 系列文章目录
  • 前言
  • 一、ADC是什么?
  • 二、使用STM32cubeMX配置工程
    • 1.ADC配置
  • 三、keil工程编写
    • 1.adc.c
    • 2.adc_read.c
  • 总结


前言

ADC模数转换这个字眼大家都已经习以为常了,但是在STM32中有很多关于ADC工作的配置大家可能还不是那么清楚,这里借助蓝桥杯嵌入式的开发板,利用STM32cubemx对ADC的配置进行一个全面的介绍。


一、ADC是什么?

ADC的主要功能是将模拟信号转换为数字信号,以便微控制器进行数据处理,整个转换的机制大致为采样——量化——编码。
STM32 ADC是12 位逐次趋近型模数转换器。它具有多达 19 个复用通道,可测量来自 16 个外部 源、两个内部源和 VBAT通道的信号。这些通道的 A/D 转换可在单次、连续、扫描或不连续 采样模式下进行。ADC 的结果存储在一个左对齐或右对齐的 16 位数据寄存器中。


二、使用STM32cubeMX配置工程

这里只说明关于ADC部分的配置介绍,其他外设配置说明见往期文章

1.ADC配置

在这里插入图片描述
在进入ADC1配置界面,IN5通道有IN5 differential和IN5 single-ended两个选项。区别如下:
单端输入(IN5 single - ended):单端输入模式是指 ADC 仅对一个输入信号进行采样。在这种模式下,以地(GND)作为参考电位,ADC 测量的是输入信号与地之间的电压差。当选择IN5 single - ended时,ADC 会测量连接到 ADC 通道 IN5 引脚的信号相对于地的电压值。
差分输入(IN5 differential):差分输入模式下,ADC 测量的是两个输入信号之间的电压差。当选择IN5 differential时,ADC 会测量正输入信号(连接到 IN5 引脚)和负输入信号(此时会产生选通一个ADC通道连接此信号,注意看右侧图示就能找到)之间的差值。
这里我们只需要测量IN5通道电压值,所以选择单端输入。
下拉还有三项勾选对应的就是两个内部源和 VBAT通道的信号,这里不需要。
在这里插入图片描述
Clock Prescaler
预分频器分频的时钟,其中有同步时钟分频和异步时钟分频两个选项。
同步时钟分频是ADC 的时钟源与 APB(通常APB2)时钟是同步的, ADC 的时钟是由 APB 总线时钟经过分频得到。
异步时钟分频是ADC 的时钟源独立于 APB 总线时钟,通常是由专用的时钟源(如 PLL、sysclk 等)经过分频得到。
尽量使用同步时钟分频,这样ADC 与其他基于 APB 总线的外设之间的通信和数据交互更加方便。因为它们的时钟是同步的,所以在数据传输和处理过程中,不容易出现时钟不同步导致的数据错误或丢失问题。另外, APB 总线时钟更加稳定。但是同步时钟分频能力有限,当频率无法满足工作要求时使用异步时钟分频。
这里4次分频后得到42MHz可以使用,故用同步时钟分频。

Resolution
ADC转换的分辨率,一个 x位的 ADC 可以将满量程范围分为2^x个离散的量化级别,分辨率越高精度越高。从而能够测量的最大信号与最小信号的宽度更大,同时高分辨率需要更高的成本和时间,按实际需要选择就好。

Data Alignment
选择转换后存储的数据的对齐方式,右对齐好取用,所以选择Right alignment
在这里插入图片描述

Gain Compensation
ADC 的实际增益往往与理想增益存在偏差。ADC 的理想增益是将输入信号按照 1:1 的比例进行转换,但实际中可能会出现将输入信号放大或缩小的情况,导致转换结果不准确。增益补偿系数可以对这种增益误差进行校准。通过测量 ADC 的实际增益与理想增益的比值,得到一个补偿系数。在进行数据处理时,将 ADC 转换得到的数字值乘以这个补偿系数,就可以将实际的转换结果调整到接近理想值,从而提高测量的准确性。这里选择0,也就是不补偿。

Scan Conversion Mode
当转换次数大于1时会自动使能,无需我们配置
在这里插入图片描述
End Of Conversion Selection
设置 ADC 转换结束标志(EOC)的触发时机,有 “End Of Single Conversion”(单次转换结束)和 “End Of Sequence Of Conversion”(序列转换结束)等选项,具体如下:
End Of Single Conversion:选择该选项时,ADC 在每次完成单个通道的转换后,就会置位 EOC 标志。适用于只需要对单个通道进行单次采样的情况,例如在特定时刻对某个传感器的信号进行一次性采集。此时,一旦单个通道的转换完成,相关的中断或事件就会被触发,通知处理器可以读取转换结果。
End Of Sequence Of Conversion:若选择此选项,ADC 会在完成整个转换序列后才置位 EOC 标志。当使用多个通道进行连续采样,并且希望在整个采样序列完成后再进行统一的处理时,就可以选择这个选项。比如在需要同时采集多个传感器数据,并在所有数据都采集完成后进行分析或处理的场景中,使用 “End Of Sequence Of Conversion” 可以减少中断次数,提高数据处理的效率。
但是序列转换结束模式下DR(数据寄存器)在整个转换序列中会不断被新的转换结果覆盖,最终只保留最后一个通道的转换数据。若想保存每一次的数据可使用如下方法:
使用DMA: DMA 能够在不经过 CPU 干预的情况下,直接将 ADC 转换的数据从 DR 寄存器传输到内存中。在 ADC 完成每个通道的转换后,DMA 会立即将转换结果搬运到预先指定的内存地址,这样就避免了数据被后续转换结果覆盖的问题。
为了方便,这里就使用End Of Single Conversion。

Low Power Auto Wait
指定低功耗自动等待模式的使用:只有当用户软件处理了之前的转换(针对常规组)或之前的序列(针对注射组)后,才开始新的转换。在低功耗状态下,ADC 会持续监测转换触发信号。当检测到新的转换触发信号时,ADC 会从低功耗状态中唤醒,重新启动转换操作。触发信号可以是软件触发、定时器触发或外部事件触发等。

Continuous Conversion Mode
在连续转换模式下,ADC 完成一次模拟信号到数字信号的转换后,不会停止工作,而是紧接着自动开始下一次转换,如此循环不断,只要不手动停止该模式或者发生异常情况,ADC 就会持续对输入的模拟信号进行转换。
需要一个初始的触发信号来启动连续转换过程。这个触发信号可以是软件触发(通过代码向 ADC 控制寄存器写入特定的值来触发),也可以是硬件触发(如定时器溢出、外部中断等)。一旦触发信号到来,ADC 开始对输入的模拟信号进行转换,将其转换为数字值并存储在数据寄存器中。转换完成后,ADC 会自动重新开始下一次转换,无需额外的触发信号。每次转换完成后,数据寄存器中的值都会被新的转换结果覆盖。因此,在使用连续转换模式时,需要及时读取数据寄存器中的值,以获取最新的转换结果。

Discontinuous Conversion Mode
间断转换模式下,ADC 并非持续不断地对模拟信号进行转换,而是将整个转换序列分割成多个子序列,每个子序列包含一定数量的转换通道。ADC 会按照设定,依次完成每个子序列的转换,在完成一个子序列后暂停,等待下一次触发信号后再继续进行下一个子序列的转换。

DMA Continuous Requests
不使用DMA时不配置此项,本示例没有用到DMA,故暂时不解释。

Overrun behaviour
Overrun behaviour(溢出行为)主要是指在 ADC(模拟 - 数字转换器)的数据处理过程中,当新的转换结果产生时,前一次转换结果还未被及时读取,从而导致数据被覆盖的情况。
Overrun data preserved(溢出数据保留)
当 ADC 发生溢出时,即新的转换结果已经产生,但之前的转换结果还未被系统(如 CPU 或 DMA)从数据寄存器中读取,这种模式会保留原有的数据,不允许新的转换结果覆盖旧数据。同时,ADC 可能会暂停后续的转换操作,直到旧数据被读取,才会继续进行新的转换。
Overrun data overwritten(溢出数据覆盖)
当 ADC 发生溢出时,新的转换结果会直接覆盖数据寄存器中尚未被读取的旧数据。ADC 会继续进行后续的转换操作,不会因为数据未被读取而暂停。
我们需要读取最新数据,所以选择覆盖

Enable Regular Conversions
在 STM32 的 ADC 中,转换通道可分为规则通道(Regular Channels)和注入通道(Injected Channels)两类。规则通道是最常用的转换通道组,Enable Regular Conversions 的作用是开启对规则通道的模拟信号到数字信号的转换功能。开启此功能后,ADC 就会依据设定好的规则对指定的规则通道进行转换操作。这一项是几乎一定要启用的。

Enable Regular Oversampling
Enable Regular Oversampling 就是开启规则通道的过采样功能,允许 ADC 在规则转换过程中运用过采样技术来提升转换精度。当启用规则通道过采样后,ADC 会对规则通道的模拟信号进行多次采样,每次采样得到的数字值会被累加起来,累加完成后,根据过采样倍率,对累加和进行右移操作,将多次采样的结果进行平均,得到一个最终的转换结果,相当于提高了 ADC 的分辨率。

Number Of Conversion
有多少个采样通道,就设为多少。

External Trigger Conversion Source
External Trigger Conversion Source 就是指定用于触发 ADC 转换的外部信号来源。除了软件触发外,定时器溢出、比较匹配等事件可以作为外部触发源。例如,定时器在计数达到设定值时产生溢出事件,该事件可以触发 ADC 开始转换。这种方式适用于需要按照一定时间间隔进行数据采集的应用,如周期性的传感器数据采集。

External Trigger Conversion Edge
当外部触发信号出现上升沿时,ADC 会立即启动转换操作。这种触发方式适用于需要在外部信号开始变化的瞬间进行数据采集的场景。

Sampling Time
在这里插入图片描述
大致的介绍就到这里了


三、keil工程编写

1.adc.c

在生成的程序最后需要加上一下几句。

  /* USER CODE BEGIN ADC1_Init 2 */LL_ADC_StartCalibration(ADC1,LL_ADC_SINGLE_ENDED);while(LL_ADC_IsCalibrationOnGoing(ADC1));LL_ADC_Enable(ADC1);/* USER CODE END ADC1_Init 2 */

*void LL_ADC_StartCalibration(ADC_TypeDef ADCx, uint32_t SingleDiff)
ADC 在将模拟信号转换为数字信号的过程中,可能会受到各种因素的影响,例如内部电路的偏移、增益误差等,这些因素会导致转换结果产生偏差。校准就是为了减少这些误差,提高 ADC 转换结果的准确性。该函数的主要作用就是触发指定 ADC 的校准操作,通过特定的算法和流程来调整 ADC 的内部参数,从而使转换结果更加精确。
*uint32_t LL_ADC_IsCalibrationOnGoing(const ADC_TypeDef ADCx)
获取ADC的校准状态,0-校准完成,1-校准正在进行。
最后就可以使能adc了。

2.adc_read.c

想要读取ADC还需要编写读取函数,如下

void ADC1_read(uint16_t *pusbuf)
{LL_ADC_REG_StartConversion(ADC1);while(LL_ADC_IsActiveFlag_EOC(ADC1) == 0);pusbuf[0] = LL_ADC_REG_ReadConversionData10(ADC1);while(LL_ADC_IsActiveFlag_EOC(ADC1) == 0);pusbuf[1] = LL_ADC_REG_ReadConversionData10(ADC1);
}

*void LL_ADC_REG_StartConversion(ADC_TypeDef ADCx)
启动 ADC 组的规则通道转换。在该 STM32 系列中,此功能与内部触发(软件启动)和外部触发都相关。如果 ADC 触发已设置为软件启动,则 ADC 转换会立即开始, 如果 ADC 触发已设置为外部触发,则 ADC 转换将在 ADC 启动转换命令之后的下一个触发事件(在选定的触发边沿)开始。
*uint32_t LL_ADC_IsActiveFlag_EOC(const ADC_TypeDef ADCx)
获取EOC标志位,从而获取转换完成标志
*uint16_t LL_ADC_REG_ReadConversionData10(const ADC_TypeDef ADCx)
获取分辨率为10的转换数据。

前面开启了ADC1的IN5和IN10两个通道,且配置成“End Of Single Conversion”(单次转换结束),所以每个通道的转换都需要运行一个转换开启函数LL_ADC_REG_StartConversion。通道11在前,所以pusbuf[0]得到的就是通道11的数值,pusbuf[1]得到的就是通道5的数值了。

得到采样数值后使用的时候进行一步转换就可以得到实际采样值。比如所我要采样滑动变阻器电压,量程是0-3.3V;采样分辨率为10,则采样量程为0-1024.那么实际采样电压值 = 采样数值*3.3/1024


总结

ADC的配置比较复杂,但是熟练之后使用起来还是比较方便的,还有更多其他用法等待发掘。

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

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

相关文章

网络5 TCP/IP 虚拟机桥接模式、NAT、仅主机模式

TCP/IP模型 用于局域网和广域网;多个协议;每一层呼叫下一层;四层;通用标准 TCP/IP模型 OSI七层模型 应用层 应用层 表示层 会话层 传输层 传输层 网络层 网络层 链路层 数据链路层 物理层 链路层:传数据帧&#xff0…

【C语言】预处理(下)(C语言完结篇)

一、#和## 1、#运算符 这里的#是一个运算符,整个运算符会将宏的参数转换为字符串字面量,它仅可以出现在带参数的宏的替换列表中,我们可以将其理解为字符串化。 我们先看下面的一段代码: 第二个printf中是由两个字符串组成的&am…

【高性能缓存Redis_中间件】一、快速上手redis缓存中间件

一、铺垫 在当今的软件开发领域,消息队列扮演着至关重要的角色。它能够帮助我们实现系统的异步处理、流量削峰以及系统解耦等功能,从而提升系统的性能和可维护性。Redis 作为一款高性能的键值对数据库,不仅提供了丰富的数据结构,…

Java如何获取文件的编码格式?

Java获取文件的编码格式 在计算机中,文件编码是指将文件内容转换成二进制形式以便存储和传输的过程。常见的文件编码格式包括UTF-8、GBK等。不同的编码使用不同的字符集和字节序列,因此在读取文件时需要正确地确定文件的编码格式 Java提供了多种方式以获…

客户端负载均衡与服务器端负载均衡详解

客户端负载均衡与服务器端负载均衡详解 1. 客户端负载均衡(Client-Side Load Balancing) 核心概念 定义:负载均衡逻辑在客户端实现,客户端主动选择目标服务实例。典型场景:微服务内部调用(如Spring Cloud…

Quartus II的IP核调用及仿真测试

目录 第一章 什么是IP核?第二章 什么是LPM?第一节 设置LPM_COUNTER模块参数第二节 仿真 第三章 什么是PLL?第一节 设置ALTPLL(嵌入式锁相环)模块参数第二节 仿真 第四章 什么是RAM?第一节 RAM_1PORT的调用第…

各地物价和生活成本 东欧篇

东欧地区的物价差异相对较大,一些国家的物价较高,而另一些国家则相对便宜。这些差异主要受当地经济发展水平、工资水平、旅游业发展以及国际关系等因素影响。以下是一些典型的东欧国家,按物价高低进行分类: 🌍 物价较高…

改进神经风格迁移

改进神经风格迁移(Neural Style Transfer, NST)可以从多个方向入手,包括模型结构优化、损失函数设计、计算效率提升、应用场景扩展等。以下是一些关键的改进方向及具体方法: 1. 模型结构优化 (1)轻量化网络…

1、从零搭建魔法工坊:React 19 新手村生存指南

一、开篇:新世界的入场券 "你好,年轻的魔法学徒!欢迎来到React魔法世界。我是你的向导赫敏韦斯莱,今天我们将用React 19这根全新魔杖,搭建属于你的第一座魔法工坊。" ——以对话形式开场,消除技…

基于 Redis 实现一套动态配置中心 DCC 服务与反射基础知识讲解

目录 动态配置中心核心价值 轻量级 Redis 方案与 ZooKeeper 的对比分析 为什么选择自定义 Redis 方案? 1. 技术决策背景 一、活动降级拦截 1. 定义与作用 2. 实现原理 二、活动切量拦截 1. 定义与作用 2. 实现原理 三、两者的核心区别 四、实际应用案例 1. 电商大促…

如何从项目目标到成功标准:构建可量化、可落地的项目评估体系

引言 在项目管理领域,"项目成功"的定义往往比表面看起来更复杂。根据PMI的行业报告,67%的项目失败源于目标与成功标准的不匹配。当项目团队仅关注"按时交付"或"预算达标"时,常会忽视真正的价值创造。本文将通…

深度学习基础--CNN经典网络之分组卷积与ResNext网络实验探究(pytorch复现)

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 ResNext是分组卷积的开始之作,这里本文将学习ResNext网络;本文复现了ResNext50神经网络,并用其进行了猴痘病分类实验…

SQL 全文检索原理

全文检索(Full-Text Search)是SQL中用于高效搜索文本数据的技术,与传统的LIKE操作或简单字符串比较相比,它能提供更强大、更灵活的文本搜索能力。 基本概念 全文检索的核心思想是将文本内容分解为可索引的单元(通常是词或词组),然后建立倒排…

【Linux】Orin NX编译 linux 内核及内核模块

1、下载交叉编译工具:gcc 1)下载地址:https://developer.nvidia.com/embedded/jetson-linux 选择TOOLS中的交叉编译工具:gcc 11.3 2)解压 将gcc编译器解压到指定目录中,如:/home/laoer/nvidia/gcc 3)配置环境变量 创建: ~/nvidia/gcc/env.sh添加: #!/bin/bash e…

Transformers 是工具箱,BERT 是工具。

Transformers 是工具箱,BERT 是工具。 🔍 详细解释: 名称作用比喻理解举例🤖 transformers(库)一个框架,提供很多 NLP 模型的“使用方式”,包括文本分类、问答、摘要等相当于一个“…

k8s之Service类型详解

1.ClusterIP 类型 2.NodePort 类型 3.LoadBalancer 类型 4.ExternalName 类型 类型为 ExternalName 的 Service 将 Service 映射到 DNS 名称,而不是典型的选择算符, 例如 my-service 或者 cassandra。你可以使用 spec.externalName 参数指定这些服务…

find指令中使用正则表达式

linux查找命令能结合正则表达式吗 find命令要使用正则表达式需要结合-regex参数 另,-type参数可以指定查找类型(f为文件,d为文件夹) rootlocalhost:~/regular_expression# ls -alh 总计 8.0K drwxr-xr-x. 5 root root 66 4月 8日 16:26 . dr-xr-…

《穿透表象,洞察分布式软总线“无形”之奥秘》

分布式系统已成为众多领域的关键支撑技术,而分布式软总线作为实现设备高效互联的核心技术,正逐渐走入大众视野。它常被描述为一条“无形”的总线,这一独特属性不仅是理解其技术内涵的关键,更是把握其在未来智能世界中重要作用的切…

Ubuntu虚拟机连不上网

桥接 虚拟机Ubuntu系统必须能连接到外网,不然不能更新软件安装包 配置虚拟机网络(关机或者挂起状态) 第一步1.重启虚拟机网络编辑器(还原配置) 第二步2.重启虚拟机网络适配器(移除再添加) 启…

rom定制系列------红米9A批量线刷原生安卓14双版 miui系统解锁可登陆线刷固件

红米9A。联发科Helio G25芯片。该处理器支持64位运算‌,但此机miui系统运行环境是32位的,这意味着尽管处理器本身支持64位计算,但miui系统限制在32位环境下运行‌。官方miui系统稳定版最终为12.5.21安卓11的版本。 原生安卓14批量线刷功能固…