【STM32】ADC

ADC,模数转换器,用于采集模拟信号的大哥,传感器数据采集就靠它了。

大部分图片来源:正点原子HAL库课程

专栏目录:记录自己的嵌入式学习之路-CSDN博客


目录

[1 常见ADC类型](#1 常见ADC类型)

[1.1 并联比较型](#1.1 并联比较型)

[1.2 逐次逼近型(STM32自带的是这个类型)](#1.2 逐次逼近型(STM32自带的是这个类型))

[1.3 STM32的ADC特性](#1.3 STM32的ADC特性)

[2 原理](#2 原理)

[2.1 输入通道](#2.1 输入通道)

[2.2 转换序列(就是AD转换的选后顺序)](#2.2 转换序列(就是AD转换的选后顺序))

[2.3 触发](#2.3 触发)

[2.4 模拟看门狗](#2.4 模拟看门狗)

[3 AD转换时间](#3 AD转换时间)

[3.1 ADC时钟](#3.1 ADC时钟)

[3.2 AD转换时间计算](#3.2 AD转换时间计算)

[4 寄存器](#4 寄存器)

[5 事件标志和事件使能位](#5 事件标志和事件使能位)

[6 使用DMA(仅适用于规则组)](#6 使用DMA(仅适用于规则组))

[7 工作模式](#7 工作模式)

[7.1 单次转换模式和连续转换模式](#7.1 单次转换模式和连续转换模式)

[7.2 扫描模式](#7.2 扫描模式)

[7.3 不同工作模式的组合](#7.3 不同工作模式的组合)

[8 配置单通道ADC采集](#8 配置单通道ADC采集)

[8.1 配置步骤](#8.1 配置步骤)

[8.2 相关HAL库函数](#8.2 相关HAL库函数)

[8.3 关键结构体](#8.3 关键结构体)

[8.4 注意事项](#8.4 注意事项)

[9 配置DMA单通道ADC采集](#9 配置DMA单通道ADC采集)

[9.1 不同之处](#9.1 不同之处)

[9.2 配置步骤](#9.2 配置步骤)

[9.3 相关HAL库函数](#9.3 相关HAL库函数)

[9.4 关键结构体](#9.4 关键结构体)

[9.5 关键步骤](#9.5 关键步骤)

[10 配置DMA多通道ADC采集](#10 配置DMA多通道ADC采集)

[10.1 不同之处](#10.1 不同之处)

[10.2 注意点](#10.2 注意点)

[11 ADC过采样](#11 ADC过采样)

[11.1 面向的场景](#11.1 面向的场景)

[11.2 过采样率的确定](#11.2 过采样率的确定)

[12 ADC采集内部温度传感器数值](#12 ADC采集内部温度传感器数值)

[12.1 相关数据资料查询](#12.1 相关数据资料查询)

[12.2 步骤](#12.2 步骤)

[12.3 温度计算方式](#12.3 温度计算方式)

[13 ADC采集光敏二极管](#13 ADC采集光敏二极管)

[13.1 原理](#13.1 原理)

[13.2 配置方法](#13.2 配置方法)


1 常见ADC类型

1.1 并联比较型

1.2 逐次逼近型(STM32自带的是这个类型)

  • 特点
    • 分辨率和采样速度相互矛盾,
    • 分辨率越高,采样速率越低

1.3 STM32的ADC特性

STM32f103 系列有3个ADC。


2 原理

2.1 输入通道

内外部共18个,16个GPIO,1个内部温感,1个内部参考电压。

2.2 转换序列(就是AD转换的选后顺序)

  • 注入组可以打断规则组:
  • 规则序列的比较好理解,就是按顺序来配置,配置完毕后将有多少个通道写入SQL寄存器:
  • 注入序列的稍微复杂一点,它的配置不是从头开始,而是尾部对齐。
    如下图,如果要配置两个通道,则配置JSQ3和JSQ4,若配置三个通道,则配置JSQ2、JSQ3、JSQ4,数字越小的优先级越高。JL也是要写入配置的通道数目。

2.3 触发

  • 触发方法1:ADON位触发转换(仅限F1系列,尽量不要用)
    • 当ADC_CR2寄存器的ADON位为1时,再单独给ADON位写1,只能启动规则组转换
  • 触发方法2:外部事件触发转换
    • 外部事件触发转换分为:规则组外部触发和注入组外部触发
    • 规则组外部触发和注入组外部触发的内部还都分为软件触发和硬件触发。

2.4 模拟看门狗

如果被ADC转换的模拟电压低于低阀值或高于高阀值,AWD模拟看门狗状态位将被置1。

感觉就是用来监测ADC采到的值有没有超出某个范围。


3 AD转换时间

3.1 ADC时钟

来源于APB2总线时钟(PCLK2),最大值为14MHz。

3.2 AD转换时间计算

AD转换时间=采样时间+12.5个ADC周期

其中,12.5个周期这个说法在《STM32F1XX参考手册》中可查,而ADC时钟周期就是通过ADC时钟频率算了。采样时间可通过SMPx寄存器设置。可设置1.5-39.5个ADC时钟周期。

因此对于STM32F103而言,最小的转换时间就是:

(12.5+1.5)×(1/14)=1us

但此时APB2的时钟频率就要设置为56MHz,不能是72MHz了。

  • 采样时间越长,结果越精确,但同时AD转换的时间就会受到影响。

4 寄存器

  • 规则组采到的数据存到的是一个32位的寄存器,其中高16位仅用于双ADC模式,使用独立模式时仅需考虑低16位;
  • 注入组直接就是一个16位的寄存器;
  • 考虑到ADC的分辨率仅为12位(STM32F103),因此ADCx_CR2寄存器中有一个位用来决定这12个位在存储中是和16位左对齐还是右对齐。

5 事件标志和事件使能位

  • 此处的事件标志是指当左边这件事后,标志位会置1。
  • 而使能控制位则是:若使能该位,则在左边的这件事发生后,会产生一个对应的中断。

6 使用DMA(仅适用于规则组)

  • 规则组每个通道转换结束后,除了可以产生中断外,还可以产生DMA请求。需要设置ADC的DMA相关寄存器。
  • 只有ADC1和ADC3可以产生DMA请求。
  • **优势:**及时把转换好的数据传输到指定的内存里,防止数据被覆盖。
  • **特征:**当某通道的规则转换结束后,产生一个DMA请求,使DMA搬运一个数据宽度的数据。

7 工作模式

7.1 单次转换模式和连续转换模式

  • 单次和连续的最重要区别其实就是:单次的话采完一次又要HAL_ADC_Start一次,否则HAL_ADC_GetValue的返回值会不表;而连续模式下,只需要Start一次,读的值就会变。
  • 当规则组使用了连续转换模式(仅规则组能用连续),那么注入组正常就不起作用了,若需要注入组起作用。则需要将注入组设置为自动注入模式。

7.2 扫描模式

7.3 不同工作模式的组合


8 配置单通道ADC采集

⚠️配置时使用哪个ADC和哪个通道,要由复用的GPIO的功能决定,如PA1写的就是ADC123_IN1,意味着ADC1、2、3都可以,而输入通道是1。

8.1 配置步骤

8.2 相关HAL库函数

8.3 关键结构体

  • 间断模式相关的不要用,因为只有F1有,而且不常用。

8.4 注意事项

需要在项目添加HAL库文件:

  • stm32f1xx_hal_adc.c
  • stm32f1xx_hal_adc_ex.c

⚠️GPIO应配置为模拟功能


9 配置DMA单通道ADC采集

⚠️配置时使用哪个ADC和哪个通道,要由复用的GPIO的功能决定,如PA1写的就是ADC123_IN1,意味着ADC1、2、3都可以,而输入通道是1。

⚠️配置时使用哪个DMA和哪个通道,需要根据使用的外设,查DMA的表格得到,见15.2。

9.1 不同之处

  • 使用连续转换模式,但依然不扫描,毕竟是单通道,也不需要扫描。

9.2 配置步骤

9.3 相关HAL库函数

9.4 关键结构体

9.5 关键步骤

  • 使能一次ADC的DMA传输
    • 操作寄存器的方式(兼容性好,不修改别的寄存器)
    • HAL库方式
  • DMA中断服务函数
    • 操作寄存器的方式
    • HAL库方式
      • 因为公共中断服务函数中已经含有了清除TC标志位的代码,因此不需要额外清除了。
      • 注意!在非循环模式下,DMA的公共中断服务函数会调用__HAL_DMA_DISABLE_IT将中断失能,因此如果需要其始终起作用,就需要在中断服务函数中加上__HAL_DMA_ENABLE_IT。
  • 无需每次循环都使能DMA传输的实现方式
    就是通过将DMA设置为循环模式,就不需要在主while循环中循环调用adc_dma_enable函数了。

10 配置DMA多通道ADC采集

10.1 不同之处

配置多通道其实和配置单通道区别不大,就是在ADC配置部分需要将ADC1的多个通道初始化(ADC_CH0~ADC_CH5),以及其对应的GPIO也是(PA0~PA5)。

10.2 注意点

  • GPIOx和ADC_CHx的编号都是从0开始的,而规则序列的排列是从1开始的,因此会造成这样的奇观:
  • 对于多通道的情况,开辟的内部DMA空间需要是所有通道合集的大小,像是一个通道如果每一次要采集100个数值取平均,总共6个通道,那么就需要有一个600个数据大小的内存空间。可以选择一种方式开辟:
    • uint16_t array[100][6];
    • uint16_t array[600];
  • 无需每次循环都使能DMA传输的实现方式:
    就是通过将DMA设置为循环模式,就不需要在主while循环中循环调用adc_dma_enable函数了。

11 ADC过采样

利用多次采样的结果进行计算,提高采样的分辨率。

11.1 面向的场景

ADC分辨率不足,又不想换MCU,不想增设外部ADC芯片的情况。

11.2 过采样率的确定


12 ADC采集内部温度传感器数值

12.1 相关数据资料查询

见芯片数据手册及下图。

12.2 步骤

(1) 温度传感器上电(HAL库已在HAL_ADC_ConfigChannel函数中实现);

(2) ADC采集温度传感器数值;

12.3 温度计算方式

除了VSENSE是通过ADC采集的之外,其他都是通过芯片数据手册查到的。

**注意⚠️:**采样时间需大于芯片数据手册所说的采样时间,否则电压数值会不准。

**注意⚠️:**要进行单位的转换,否则会不对。都要转成V。


13 ADC采集光敏二极管

13.1 原理


13.2 配置方法

同单通道ADC采集。

相关推荐
学习路上_write24 分钟前
FPGA/Verilog,Quartus环境下if-else语句和case语句RT视图对比/学习记录
单片机·嵌入式硬件·qt·学习·fpga开发·github·硬件工程
非概念30 分钟前
stm32学习笔记----51单片机和stm32单片机的区别
笔记·stm32·单片机·学习·51单片机
jjjxxxhhh1232 小时前
FPGA,使用场景,相比于单片机的优势
单片机·嵌入式硬件·fpga开发
无敌最俊朗@2 小时前
stm32学习之路——八种GPIO口工作模式
c语言·stm32·单片机·学习
EterNity_TiMe_2 小时前
【论文复现】STM32设计的物联网智能鱼缸
stm32·单片机·嵌入式硬件·物联网·学习·性能优化
changingshow3 小时前
Arduino IDE Windows 系统 离线安装 esp32 开发板 亲测好用。
单片机·嵌入式硬件
7yewh6 小时前
嵌入式硬件杂谈(一)-推挽 开漏 高阻态 上拉电阻
驱动开发·stm32·嵌入式硬件·mcu·物联网·硬件架构·pcb工艺
Chervin13 小时前
Windows,虚拟机Ubuntu和开发板三者之间的NFS服务器搭建
linux·单片机·ubuntu·arm
TeYiToKu13 小时前
笔记整理—linux驱动开发部分(8)framebuffer类设备
linux·驱动开发·笔记·嵌入式硬件·arm
电子工程师UP学堂15 小时前
STM32 设计的较为复杂的物联网项目,包括智能家居控制系统,涵盖了硬件和软件的详细设计。
stm32