STM32 HAL库 STM32CubeMX -- ADC

文章详细介绍了STM32的ADC模块,包括ADC的功能、通道配置、转换顺序、触发源、转换时间和数据存储。此外,还提到了STM32CubeMX的配置步骤以及提供了六种不同的ADC应用示例,涵盖了单通道、多通道的轮询、中断、定时器中断和DMA采集模式。
摘要由CSDN通过智能技术生成


一、ADC 简介

ADC(Analog-to-Digital Converter)指模/数转换器或者模拟/数字转换器。 是指将连续变量的模拟信号转换为离散的数字信号的器件。

也就是将模拟信号转化为数字信号

STM32f103 系列有3 个ADC,精度为12 位,每个ADC 最多有16 个外部通道和2个内部信号源。其中ADC1 和ADC2 都有16 个外部通道,ADC3 根据CPU 引脚的不同通道数也不同,一般都有8 个外部通道。

各通道的A/D转换可以单次、连续、扫描或间断模式执行。

ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。

二、ADC功能框图

功能框图

电压输入范围

ADC 输入范围为:VREF- ≤ VIN ≤ VREF+。
由VREF-、VREF+ 、VDDA 、VSSA、这四个外部引脚决定。
一般把VSSA 和VREF- 接地,把VREF+ 和VDDA 接3V3,得到ADC 的输入电压范围为:0~3.3V。

如果想让输入的电压范围变宽,去到可以测试负电压或者更高的正电压,我们可以在外部加一个电压调理电路,把需要转换的电压抬升或者降压到0~3.3V,这样ADC 就可以测量了。

输入通道

STM32的ADC 多达18 个通道,其中外部的16 个通道就是框图中的ADCx_IN0、ADCx_IN1 ⋯ ADCx_IN5。

这16 个通道对应着不同的IO 口,具体是哪一个IO 口可以从手册查询到。

其中ADC1/2/3 还有内部通道
ADC1 的通道16 连接到了芯片内部的温度传感器,Vrefint 连接到了通道17。
ADC2 的模拟通道16 和17 连接到了内部的VSS。
ADC3 的模拟通道9、14、15、16 和17 连接到了内部的VSS。

STM32F103ZET6 ADC IO 分配 :

ADC1 IO ADC2 IO ADC3 IO
通道0 PA0 通道0 PA0 通道0 PA0
通道1 PA1 通道1 PA1 通道2 PA1
通道2 PA2 通道2 PA2 通道2 PA2
通道3 PA3 通道3 PA3 通道3 PA3
通道4 PA4 通道4 PA4 通道4 PF6
通道5 PA5 通道5 PA5 通道5 PF7
通道6 PA6 通道6 PA6 通道6 PF8
通道7 PA7 通道7 PA7 通道7 PF9
通道8 PB0 通道8 PB0 通道8 PF10
通道9 PB1 通道9 PB1 通道9 连接内部VSS
通道10 PC0 通道10 PC0 通道10 PC0
通道11 PC1 通道11 PC1 通道11 PC1
通道12 PC2 通道12 PC2 通道12 PC2
通道13 PC3 通道13 PC3 通道13 PC3
通道14 PC4 通道14 PC4 通道14 连接内部VSS
通道15 PC5 通道15 PC5 通道15 连接内部VSS
通道16 连接内部温度传感器 通道16 连接内部VSS 通道16 连接内部VSS
通道17 连接内部Vrefint 通道17 连接内部VSS 通道17 连接内部VSS

外部的16 个通道在转换的时候又分为规则通道注入通道,其中规则通道最多有16 路,注入通道最多有4 路。

规则通道
普通通道,大部分时候都用这个。

注入通道
注入,可以理解为插入,插队的意思。它是一种在规则通道转换的时候强行插入要转换的一种通道
如果在规则通道转换过程中,有注入通道插队,那么就要先转换完注入通道,等注入通道转换完成后,再回到规则通道的转换流程。

转换顺序

规则序列

规则序列寄存器有3 个,分别为SQR3、SQR2、SQR1。

SQR3 控制着规则序列中的第一个到第六个转换,对应的位为:SQ1[4:0] ~ SQ6[4:0],第一次转换的是位4:0 SQ1[4:0],如果通道16 想第一次转换,那么在SQ1[4:0] 写16 即可。

SQR2 控制着规则序列中的第7 到第12 个转换,对应的位为:SQ7[4:0] ~ SQ12[4:0],如果通道1 想第8 个转换,则SQ8[4:0] 写1 即可。

SQR1 控制着规则序列中的第13 到第16 个转换,对应位为:SQ13[4:0] ~ SQ16[4:0],如果通道6 想第10 个转换,则SQ10[4:0] 写6 即可。

具体使用多少个通道,由SQR1 的位L[3:0] 决定,最多16 个通道。

寄存器 寄存器位 功能 取值
SQR3 SQ1[4:0] 设置第1个转换的通道 通道1 ~ 16
SQR3 SQ2[4:0] 设置第2个转换的通道 通道1 ~ 16
SQR3 SQ3[4:0] 设置第3个转换的通道 通道1 ~ 16
SQR3 SQ4[4:0] 设置第4个转换的通道 通道1 ~ 16
SQR3 SQ5[4:0] 设置第5个转换的通道 通道1 ~ 16
SQR3 SQ6[4:0] 设置第6个转换的通道 通道1 ~ 16
SQR2 SQ7[4:0] 设置第7个转换的通道 通道1 ~ 16
SQR2 SQ8[4:0] 设置第8个转换的通道 通道1 ~ 16
SQR2 SQ9[4:0] 设置第9个转换的通道 通道1 ~ 16
SQR2 SQ10[4:0] 设置第10个转换的通道 通道1 ~ 16
SQR2 SQ11[4:0] 设置第11个转换的通道 通道1 ~ 16
SQR2 SQ12[4:0] 设置第12个转换的通道 通道1 ~ 16
SQR1 SQ13[4:0] 设置第13个转换的通道 通道1 ~ 16
SQR1 SQ14[4:0] 设置第14个转换的通道 通道1 ~ 16
SQR1 SQ15[4:0] 设置第15个转换的通道 通道1 ~ 16
SQR1 SQ16[4:0] 设置第16个转换的通道 通道1 ~ 16
SQR1 SQL[3:0] 需要转换多少个通道 通道1 ~ 16

注入序列

注入序列寄存器JSQR 只有一个,最多支持4 个通道,具体多少个由JSQR 的JL[2:0] 决定。

如果JL 的值小于4 的话,则JSQR 跟SQR 决定转换顺序的设置不一样,第一次转换的不是JSQR1[4:0],而是JCQRx[4:0] ,x = (4-JL),跟SQR 刚好相反。

如果JL=00(1 个转换),那么转换的顺序是从JSQR4[4:0] 开始,而不是从JSQR1[4:0] 开始,这个要注意,编程的时候不要搞错。当JL 等于4 时,跟SQR 一样。

寄存器 寄存器位 功能 取值
JSQR JSQ1[4:0] 设置第1个转换的通道 通道 1 ~ 4
JSQR JSQ2[4:0] 设置第2个转换的通道 通道 1 ~ 4
JSQR JSQ3[4:0] 设置第3个转换的通道 通道 1 ~ 4
JSQR JSQ4[4:0] 设置第4个转换的通道 通道 1 ~ 4
JSQR JL[1:0] 需要转换多少个通道 通道 1 ~ 4

触发源

ADC 转换可以由ADC 控制寄存器2: ADC_CR2 的ADON 这个位来控制,写1 的时候开始转换,写0 的时候停止转换;

ADC 还支持触发转换,内部定时器触发和外部IO 触发
触发源有很多,具体选择哪一种触发源,由ADC 控制寄存器2:ADC_CR2 的EXTSEL[2:0] 和JEXTSEL[2:0] 位来控制。
EXTSEL[2:0] 用于选择规则通道的触发源,JEXTSEL[2:0] 用于选择注入通道的触发源。

选定好触发源之后,由ADC 控制寄存器2:ADC_CR2 的EXTTRIG 和JEXTTRIG 这两位来激活ADC。

其中ADC3 的规则转换和注入转换的触发源与ADC1/2的有所不同。

转换时间

ADC 时钟

ADC 输入时钟ADC_CLK 由PCLK2 经过分频产生,最大是14M,分频因子由RCC 时钟配置寄存器RCC_CFGR 的位15:14 ADCPRE[1:0] 设置,可以是2/4/6/8 分频,注意这里没有1 分频。一般我们设置PCLK2=HCLK=72M

采样时间

ADC 使用若干个ADC_CLK 周期对输入的电压进行采样,采样的周期数可通过ADC 采样时间寄存器ADC_SMPR1 和ADC_SMPR2 中的SMP[2:0] 位设置,ADC_SMPR2 控制的是通道0 ~ 9,ADC_SMPR1 控制的是通道10~17。
每个通道可以分别用不同的时间采样。其中采样周期最小是1.5 个,即如果我们要达到最快的采样,那么应该设置采样周期为1.5 个周期,这里说的周期就是1/ADC_CLK。

ADC 的转换时间跟ADC 的输入时钟和采样时间有关,公式为:Tconv = 采样时间+ 12.5 个周期

当ADCLK = 14MHZ(最高),采样时间设置为1.5 周期(最快),那么总的转换时间(最短)Tconv = 1.5 周期+ 12.5 周期= 14 周期= 1us。
一般我们设置PCLK2=72M,经过ADC 预分频器能分频到最大的时钟只能是12M,采样周期设置为1.5 个周期,算出最短的转换时间为1.17us,这个才是最常用的。

数据寄存器

一切准备就绪后,ADC 转换后的数据根据转换组的不同,规则组的数据放在ADC_DR 寄存器,注入组的数据放在JDRx。

规则数据寄存器
ADC 规则组数据寄存器ADC_DR 只有一个,是一个32 位的寄存器,低16 位在单ADC 时使用,高16 位是在ADC1 中双模式下保存ADC2 转换的规则数据,双模式就是ADC1 和ADC2 同时使用。

在单模式下,ADC1/2/3 都不使用高16 位。因为ADC 的精度是12 位,无论ADC_DR 的高16 或者低16 位都放不满,只能左对齐或者右对齐,具体是以哪一种方式存放,由ADC_CR2 的11 位ALIGN 设置。

规则通道可以有16 个这么多,可规则数据寄存器只有一个,如果使用多通道转换,那转换的数据就全部都挤在了DR 里面,前一个时间点转换的通道数据,就会被下一个时间点的另外一个通道转换的数据覆盖掉,所以当通道转换完成后就应该把数据取走,或者开启DMA 模式,把数据传输到内存里面,不然就会造成数据的覆盖。

对于多通道采集这里提出三个解决办法:
(1)使用间断模式,采集一个存储一个
(2)使用中断,采集到一个数据,进入中断,把这个数据保存
(3)使用DMA,直接将采集到的数据搬运到内存

注入数据寄存器

ADC 注入组最多有4 个通道,刚好注入数据寄存器也有4 个,每个通道对应着自己的寄存器,不会跟规则寄存器那样产生数据覆盖的问题。ADC_JDRx 是32 位的,低16 位有效,高16 位保留,数据同样分为左对齐和右对齐,具体是以哪一种方式存放,由ADC_CR2 的11 位ALIGN 设置。

中断

转换结束中断

数据转换结束后,可以产生中断,中断分为三种:规则通道转换结束中断,注入转换通道转换结束中断,模拟看门狗中断。

其中转换结束中断很好理解,跟我们平时接触的中断一样,有相应的中断标志位和中断使能位,我们还可以根据中断类型写相应配套的中断服务程序。

模拟看门狗中断

当被ADC 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断,前提是我们开启了模拟看门狗中断,其中低阈值和高阈值由ADC_LTR 和ADC_HTR 设置。

例如我们设置高阈值是2.5V,那么模拟电压超过2.5V 的时候,就会产生模拟看门狗中断,反之低阈值也一样。

DMA 请求

规则和注入通道转换结束后,除了产生中断外,还可以产生DMA 请求,把转换好的数据直接存储在内存里面。

要注意的是只有ADC1 和ADC3 可以产生DMA 请求。

一般我们在使用ADC 的时候都会开启DMA 传输。

电压转换

模拟电压经过ADC 转换后,是一个12 位的数字值,如果通过串口以16 进制打印出来的话,可读性比较差,那么有时候我们就需要把数字电压转换成模拟电压,也可以跟实际的模拟电压(用万用表测)对比,看看转换是否准确。

我们一般在设计原理图的时候会把ADC 的输入电压范围设定在:0~3.3v,因为ADC 是12 位的,那么12 位满量程对应的就是3.3V,12 位满量程对应的数字值是:2^12。数值0 对应的就是0V。

如果转换后的数值为X ,X 对应的模拟电压为Y,那么会有这么一个等式成立: 2^12 / 3.3 = X/ Y,=> Y = (3.3 * X ) / 2^12。

三、STM32Cube MX配置

基础STM32Cube MX的配置可以参考这篇博客:STM32 CubeMx教程 – 基础知识及配置使用教程

配置RCC,选择使用外部晶振模式

RCC

配置SYS,debug配置为Serial Wire

SYS

配置一个串口,使用异步通信模式

USART

ADC界面:

ADC

IN0~IN15: 16路12位ADC采样通道,外部模拟量信号输入

Temperature Sensor Channel: MCU内置温度传感器采样通道,用来测量器件周围的温度。在MCU内部与ADC1_IN16通道相连

Vrefint Channel: 内部参考电压检测通道,ADC 的参考电压都是通过 Vref+ 引脚提供的并作为ADC转换器的基准电压,当Vref+直接取自VDD电压时,易受VDD波动而影响,因此可以该通道对参考电压进行校准,以提升ADC计算精度。在MCU内部与ADC1_IN17通道相连

EXTI Conversion Trigger: 外部触发转换。
ADC转换可由外部事件触发,EXTSEL[2:0]和JEXTSEL[2:0]控制位允许应用程序选择8个可能的事件中的某一个,触发规则通道组合注入通道组的采样。这里若选择Disable,则可以在6个来自片上定时器的内部信号中选择一个作为触发源;
若选择Injected Trigger/Regular Trigger/Injected and Regular Trigger,表示由外部引脚信号触发相应的通道组。

ADC

ADCs_Common_Settings:(ADC模式设置)

Mode:Independent mode
独立模式。此模式中,双ADC同步不工作,ADC1和ADC2相互独立工作。
如果不需要ADC同步或者只是用了一个ADC的时候,应该设成独立模式,多个ADC同时使用时会有其他模式,如双重ADC同步模式,两个ADC同时采集一个或多个通道,可以提高采样率。对应ADC控制寄存器1(ADC_CR1)中的DUALMOD[3:0]位。

ADC_Settings:(ADC设置)

Data Alignment:(数据对齐方式)
数据左对齐/右对齐,一般选择使用右对齐。

Scan Conversion Mode:(扫描模式)
扫描模式使能。对应ADC控制寄存器1(ADC_CR1)中的SCAN位。
如果只是用了一个通道的话,设置为DISABLE;
如果使用了多个通道的话,可以选择设置ENABLE或者DISABLE;(后面结合具体场景介绍)

Continuous Conversion Mode:(连续转换模式)
数据的连续转换,对应ADC控制寄存器2(ADC_CR2)中的CONT位。
设置为ENABLE,即使能连续转换;设置为DISABLE,则是单次转换。
两者的区别在于连续转换直到所有的数据转换完成后才停止转换,而单次转换则只转换一次数据就停止,要再次触发转换才可以进行转换

Discontinuous Conversion Mode:(间断模式)
间断模式,对应ADC控制寄存器1(ADC_CR1)中的DISCEN位。
如果单通道不需要采用间断,多通道具体分析,后面示例中具体介绍

ADC_Regular_ConversionMode:规则通道组采样设置

Enable Regular Conversions:(常规转换模式)
使能规则通道组转换。

Number of Conversion:(转换通道数量)
规则通道组序列长度为3,即包含3个采样通道。

External Trigger Conversion Source:(外部触发转换源)
选择外部触发源,
Regular Conversion launched by software 规则的软件触发 调用函数触发
Timer X Capture Compare X event 外部引脚触发,
Timer X Trigger Out event 定时器通道输出触发
外部触发源

Rank:ADC转换通道顺序
当使用多通道采集的时候,可以在这里设置每个通道采集的先后顺序

ADC_Injected_ConversionMode:注入通道设置
参数和上面的规则通道一样;
需要注意的是,注入通道的功能和规则通道的一样,但是注入通道的优先级要比规则通道的高;

WatchDog: 模拟看门狗中断

四、应用示例

涉及到的HAL库函数


开启ADC 3种模式 ( 轮询模式 中断模式 DMA模式 )

• HAL_ADC_Start(&hadcx);       //轮询模式开启ADCHAL_ADC_Start_IT(&hadcx);       //中断轮询模式开启ADCHAL_ADC_Start_DMA(&hadcx);       //DMA模式开启ADC

关闭ADC 3种模式 ( 轮询模式 中断模式 DMA模式 )

• HAL_ADC_Stop()HAL_ADC_Stop_IT(
引用\[1\]和\[3\]提供了一些关于STM32CubeMX配置ADC的代码片段。这些代码片段展示了如何使用STM32CubeMX生成的代码来配置和使用ADC模块进行数据采集。 在这些代码片段中,首先需要包含一些头文件,如"main.h"、"adc.h"、"dma.h"、"usart.h"、"gpio.h"和"stdio.h"。然后,需要定义一些变量和数组来存储ADC采集的数据。接下来,需要调用一些函数来初始化和配置ADC、DMA和其他外设。最后,在主循环中,可以使用HAL_ADC_Start_DMA函数启动ADC的DMA采集,并在采集完成后进行数据处理和输出。 需要注意的是,这些代码片段只是展示了一种可能的配置方式,具体的配置和使用方法可能会根据具体的应用需求和硬件平台而有所不同。因此,如果您有关于STM32CubeMX ADC配置的具体问题,请提供更详细的信息,以便我能够更好地回答您的问题。 #### 引用[.reference_title] - *1* *3* [【STM32STM32CUBEMX + ADC(单通道,双通道DMA)](https://blog.csdn.net/qq_38145331/article/details/120235607)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32CubeMX学习六 之ADC配置](https://blog.csdn.net/weixin_42648781/article/details/126697074)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值