当前位置: 首页 > news >正文

STM32 ADC控制器及其应用

一.ADC介绍

ADC,即模/数转换器,是一种将模拟信号转化为数字信号的电子元件。

ADC转换的主要流程三个过程:采样,量化,编码。

1.采样:采样是指在模拟信号上打采样点(就是在间隔相同时间取一次点)那么采样频率Fs=1/T(T是采样周期)那么采样一定会造成连续信号的失真,在现实中是频率越高越好吗?不一定因为频率越高量化(后面会讲)也越慢,一般频率会取原始信号的最高的频率的2倍。那么此时还不是数字信号咋办所以要量化。

2.量化:量化的作用就是将采样的模拟信号进行分级,然后一个级别对应一个数字值。(ADC参考电压就是最高电压)

量化的方式:1.只舍不入法,就是类似于取最大的整数比如:0~0.625v之间的电压取0v...

2.四舍五入法:一量化间隔/2为界,进行取舍。在这种情况下我们会发现量化误差就 是等于一个量化间隔,不难发现量化间隔越小,输入信号和输出信号越像,就是精 度越高。

分辨率:量化间隔越小,把规定范围的电压分成的份数就越多,这就代表它的分辨率越高,分辨率也就是系统能够测量的最小电压。在上面的例子中,我们将10V 的电压分成16份,也就是2的四次方,所以它的分辨率就是4位,那如果我们将电压分成1024份,也就是2的10次方,所以它的分辨率就是10位,量化将直接从0.625V变成了0.0098V。常见的ADC分辨率一般有8位、10位、12位等等。
参考电压:要想得到量化的间隔,就需要两个参数,一个就是分辨率,确定划分的份数,另一个就是一个基准电压,例子中的10V,这个基准电压被称为参考电压(VREF)。STM32的ADC控制器,其参考电压一般是3.3V。

3.编码:经过量化之后,模拟信号已经成功数字化了,下一步就是编码,编码的含义就是用“1”和“0”的组合,为每个量化等级进行编号,从而代替相应区间的电压值。注:这里以四舍五入为例

二.ADC控制器原理

1.参考电压(ADC量化基准)

2.分辨率

分辨率是ADC能分辨的最小的电平,分辨率常以位数表示。8,10,12位ADC...寄存器ADC.CR1.RES位配置。

3.输入通道

ADC通道是指将模拟信号输入到ADC控制器的单个输入路线或信号通道,以STM32F407来说有三个ADC控制器,每个ADC控制器对应多个通道。

4.转换序列

当多个ADC通道,以任意的顺序进行转化就有了.转换序列的概念,序列包含长度,顺序。长度:要转化的通道的个数。顺序:指想要以什么样的顺序进行转化。转换序列两种转化方式:规则序列,注入序列。

讲一下上面的重点:1.规则序列长度最大是16个从SQ1开始到SQ16(就是有16个通道可以进行通道转换),ADC_SQR1.L位配置长度,有3个规则序列,ADC_SQR1(从规则序列1(SQ1)到6设置转换通道),ADC_SQR2(7~12),ADC_SSQR3(13~16)。2.注入序列最大长度4个从注入序列1(JSQ1)到注入序列4(JSQ4),由ADC_JSRQ.JSQx位设置注入序列添加转换通道。

注:以上的转化改为转换

5.转换触发源

软件触发和事件触发分别是什么,事件触发就是单片机的引脚或是其它的事件发生电平的改变。软件触发是利用程序触发。

规则序列的软件触发:当ADC控制器被使能后,若ADC_CR2.SWSTART位被写入1时,即可触发开始对规则序列中的通道进行转换。转换一旦开始,ADC_CR2.SWSTART位将会被控制器清0。


注入序列的软件触发:当ADC控制器被使能后,若ADC_CR2.JSWSTART位被写入1时,即可触发开始对注入序列中的通道进行转换。当转换开始时,ADC_CR2.JSWSTART位将会被控制器清0。

ADC控制器使能:简单来说就是给ADC控制器上电,通过向ADC_CR2.ADON位写1,即可上电ADC。

事件触发:外部触发转换,可以通过外部事件(例如,定时器捕获、EXTI中断线)触发转换,事件源可以通过ADC_CR2.EXTSEL(规则序列外部事件源选择)和ADC_CR2.JEXTSE(注入序列外部事件源选择)位进行选择。外部事件能够以所选的极性(上升沿、下降沿、上升和下降沿)触发转换。

6.注入序列的意义

1.扩展个数因为ADC控制器1有19个通道,而规则序列只有16个通道。

2.突发情况,要临时打断规则序列的转化。例如:有以下一个需求,需要ADC 一直轮番转换通道0、通道1 和通道2,但是在这三个通道转换期间偶尔需要转换一下通道15,等通道15转换完成后,继续恢复规则序列的转换。

这两种情况刚好对应注入序列的两种模式:自动注入(情况1)、触发注入(情况2),两种模式可以通过ADC_CR1.JAUTO位进行选择。
注入序列的自动注入(不常用,了解):
注入序列被设置成自动注入时,注入序列中的通道,会在规则序列转换完成后,自动转换。故自动注入模式下,注入序列的转换,并不需要软件触发或是通过外部事件去触发。在此模式下,必须禁止注入通道上的外部触发。

注入序列的触发注入:
通过外部触发或将 ADC_CR2 寄存器中的 SWSTART 位置 1 来启动规则通道组转换,如果在规则通道组转换期间出现外部注入触发或JSWSTART位置 1,则当前的转换会复位,并且注入通道序列会切换为单次扫描模式,然后,规则通道组的规则转换会从上次中断的规则转换处恢复。

6.转换时间

核心公式含义

公式 Tconv 代表总转换时间,它由两部分组成:

采样时间(Sampling Time):这是用户可配置的,即公式中的“通道采样周期数”。

转换时间(Conversion Time):这是固定的,取决于你设置的ADC分辨率。


具体公式解析

图片中列出了不同分辨率下的计算方式:

12位分辨率: Tconv = 通道采样周期数 + 12个ADCCLK周期

10位分辨率: Tconv = 通道采样周期数 + 10个ADCCLK周期

8位分辨率: Tconv = 通道采样周期数 + 8个ADCCLK周期

6位分辨率: Tconv = 通道采样周期数 + 6个ADCCLK周期

为什么加ADCCLK:它代表ADC内部进行数据计算所需的固定开销。


关键术语解释

Tconv:总的转换时间。

通道采样周期数:这是你在配置ADC时,通过寄存器(如 ADC_SMPR1 和 ADC_SMPR2 )设置的一个数值。你可以把它理解为“采集信号持续的时间长短”。采样时间越长,精度通常越高,但转换速度越慢。

ADCCLK周期:这是ADC的工作时钟周期。

12/10/8/6:这些数字代表了不同分辨率下,SAR(逐次逼近寄存器)算法进行计算所需的固定时钟周期数。分辨率越高,计算越复杂,需要的固定周期就越多。


举个例子帮助理解

假设你的ADC时钟(ADCCLK)是 1MHz(即1个周期是1微秒),你设置的是 12位分辨率,并且设置的 采样周期是3个周期。

那么一次完整的转换时间 Tconv 就是:
Tconv = 3(采样周期) + 12(12位分辨率固定周期) = 15个周期

因为每个周期是1微秒,所以总耗时就是 15微秒。

7.扫描模式和非扫描模式

扫描模式的含义
ADC 扫描模式是一种连续对多个输入通道进行转换的模式,这种模式下,ADC 会按照预先定义的顺序对多个输入通道轮流进行转换。
什么情况下使用扫描模式
 如果设置的序列长度大于1时,则为多通道转换,就需要使用扫描模式。
 如果序列的长度为1时,则是单通道转换,单通道转换则不需要开启扫描模式。
注意:如果关闭了扫描模式,即使序列设置的长度大于1,ADC 仍然按照单通道进行转换。
扫描模式和非扫描模式的切换
ADC的扫描模式和非扫描模式,由ADC_CR1.SCAN位进行控制
ADC_CR1.SCAN = 0,禁止扫描模式,也就是使用非扫描模式
ADC_CR1.SCAN = 1,使能扫描模式,也就是使用扫描模式

8.单次转换模式和连续转换模式

连续转换模式的含义
连续转换模式,指的是ADC 按照序列设置的长度,完成一次序列的转换后,回到序列头开始新一轮的转换。
注意:触发注入无法进行连续转换,注入序列想要连续转换的唯一例外情况是使用自动注入,将注入序列
配置为在规则序列之后,自动转换。
单次转换模式的含义
ADC 的单次转换模式,是指ADC 按照序列设置的长度,完成一次序列的转换后,ADC 停止。

9.

10.

11.模拟看门狗

用于规则序列和注入序列转换结果的检测。如果模拟电压低于阈值的下线或高于阈值的上线,那么模拟看门狗状态位AWD会置为1,阈值下线由ADC_LTR寄存器设置,上线由ADC_HTR控制(受分辨率控制。比如,12位的ADC那么模拟看门狗的阈值范围是0~4095,10位是0~1023)。

1.规着序列通道看模拟门狗检测,由ADC_CR1.AWDEN位使能。

2.注入序列通道看模拟门狗检测,由ADC_CR1.JAWDEN位使能。

3.模拟门狗的通道模式检测,由ADC_CR1.AWDSGL位进行配置。

12.ADC控制器原理-模式组合

单词转换模式+非扫描模式

连续转换模式+非扫描模式 注意:注意:触发注入无法进行连续转换,注入序列仅在自动 注入模式下,可进行连续转换。

单词转换模式+扫描模式

连续转换模式+扫描模式 注意:触发注入无法进行连续转换,注入序列仅在自动注入模式 下,可进行连续转换

三.ADC中断

ADC中断是怎么进行的?有什么意义?1.单次转换模式:你启动一次转换(比如调用HAL_ADC_Start_IT()),ADC采样一次,转换一次。完成时触发一次中断。之后你需要再次调用启动函数才会进行下一次转换。
· 连续转换模式:你启动后,ADC会以最快的速度不停地进行采样和转换,每次转换完成都会触发一次中断。你的程序会像潮水一样反复进入中断服务函数。这就是导致“CPU卡死”的常见原因——因为CPU根本没有时间去执行main函数里的其他任务。为了解决这个问题,常见做法是:
· 改回单次模式:在中断里把数据读走,然后根据某个条件(比如主循环里的标志)再手动启动下一次。
· 配合DMA使用:这是更推荐的做法。用DMA把数据自动搬运到内存数组里,等搬运完足够多的点后,由DMA触发“传输完成中断”。这样你只需要处理一批数据,而不是每个点都进中断。

2.减少CPU开销。

四.ADC的DMA开销

五.ADC采集电平

讲述一下ADC采集电平的过程,首先要进行对GPIO和ADC进行初始化然后使能ADC转换进入while(1)循环先进行判断EOC=1,等于1往下进行先禁止ADC再获取转换结果以此类推。

引脚的配置:

核心代码:

注意:句柄是&hadc1.

注意:我们如何找到这些函数可以进行一下步骤。

六.ADC+NVIC电平采集

引脚配置(只显示比上面多的):

核心代码:

注意:

1. 先 HAL_ADC_Stop_IT(hadc) 停止 ADC 的连续转换/中断
2. 再 HAL_ADC_GetValue(hadc) 读取最后一次转换结果

如果交换顺序:

· HAL_ADC_GetValue 会在 ADC 仍在运行时读取寄存器值,虽然也能读到数据,但此时转换可能还在更新
· 接着调用 HAL_ADC_Stop_IT 停止转换 —— 这样做逻辑上不严谨,因为你需要的是“停止后”的那一帧稳定数据

总结:停止后再读取,才能确保拿到的是最终有效的转换值。

七.ADC+NVIC+DMA电平采集

引脚配置(只显示比上面多的):

核心代码:

注意:数组的单个元素的大小

http://www.jsqmd.com/news/747215/

相关文章:

  • 第一章-04-构造方法
  • 蚂蚁S9控制板简介(zynq-7010系列)
  • 【AI模型】高性能推理框架
  • IX6024 × DeepSeek V4@ACP#国产 24 通道 PCIe 交换芯片,中端推理与边缘集群的 IO 强芯
  • 终极RDPWrap指南:免费解锁Windows远程桌面多用户并发连接
  • 科研小白看过来:EndNote X9搭配Zotero/知网,打造你的个人文献管理流水线
  • 2026年ERP系统怎么选:6款主流产品功能与适用场景对比
  • 要实现一个工作流,选择 Agent Skills 还是 AI 表格?
  • 如何高效获取八大网盘直链:LinkSwift专业级下载助手实战指南
  • Switch大气层系统深度优化指南:从基础配置到专家级调校
  • 彻底解决Windows图形驱动兼容性问题:Mesa3D驱动安装与故障排除终极指南
  • 手把手教你解决iTextPDF的‘trailer not found’:从错误日志到PDF文件结构分析
  • 如何快速优化Windows 11:Win11Debloat终极指南
  • CANoe+VH6501实战:手把手教你精准干扰CAN-FD的Rx报文(含CAPL代码)
  • 3分钟上手roop-unleashed:零代码AI换脸视频制作指南
  • 3步实现Windows电脑安装安卓应用的终极方案
  • 对比直连与通过Taotoken聚合调用的模型响应体验
  • 怎样高效获取网盘直链?开源下载助手8大平台一键解析方案
  • 百度文库助手:如何轻松获取纯净阅读体验
  • 美五大科技巨头Q1财报:业绩超预期股价分化,AI投入回报成焦点
  • Mesa3D Windows驱动故障排查:解决90%的兼容性问题与性能调优指南
  • Upoad靶场--文件上传
  • 网络空间安全-作业13
  • Icarus Verilog完整指南:如何快速掌握开源Verilog仿真器
  • HarmonyOS 6学习:应用签名文件丢失处理与更新完全指南
  • 能视奸员工的软件诞生了!
  • 创业公司如何借助 Taotoken 快速低成本地验证 AI 产品创意
  • 鸽了好久,我终于用 Go 写出了这款“零感”跨设备剪贴板神器
  • 网络优化工具!提升上传下载速度、网络连接与稳定性!检测优化有线宽带、WiFi流量,减少延迟、丢包率!提高多人联机、网络游戏与在线视频流畅度,下载协议程序优先级!
  • 2026年权威发布:GEO系统贴牌解决方案哪家靠谱?综合对比TOP5服务商选择建议