【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采集。

相关推荐
NEWEVA__zzera222 小时前
利用光耦来隔离485芯片与串口引脚,实现自动收发485电路
单片机·嵌入式硬件
m0_748240542 小时前
STM32第十一课:STM32-基于标准库的42步进电机的简单IO控制(附电机教程,看到即赚到)
stm32·单片机·嵌入式硬件
温柔的男孩像海洋丶2 小时前
vscode的keil assistant 中搜索不到全局变量
ide·vscode·单片机
沐欣工作室_lvyiyi3 小时前
基于单片机的多功能智能小车(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·单片机毕业设计
鸿喵小仙女3 小时前
C# WPF读写STM32/GD32单片机Flash数据
stm32·单片机·c#·wpf
lucy153027510794 小时前
MCU 功耗基准测试
科技·单片机·嵌入式硬件·智能家居·信号处理·工控主板
m0_748240914 小时前
OpenMV与STM32通信全面指南
stm32·单片机·嵌入式硬件
Cchengzu6 小时前
阿里巴巴2017实习生笔试题(二)
stm32·单片机·嵌入式硬件
重生之我是数学王子10 小时前
单片机 STM32入门
stm32·单片机·嵌入式硬件
qq_4597300314 小时前
4-3 MCU中ARM存储器的作用
arm开发·单片机·嵌入式硬件