【STM32】ADC

embedded/2024/10/21 16:42:18/

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

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

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


目录

1    常见ADC类型

1.1    并联比较型

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

1.3    STM32的ADC特性

2    原理

2.1    输入通道

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

2.3    触发

2.4    模拟看门狗

3    AD转换时间

3.1    ADC时钟

3.2    AD转换时间计算

4    寄存器

5    事件标志和事件使能位

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

7    工作模式

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

7.2    扫描模式

7.3    不同工作模式的组合

8    配置单通道ADC采集

8.1    配置步骤

8.2    相关HAL库函数

8.3    关键结构体

8.4    注意事项

9    配置DMA单通道ADC采集

9.1    不同之处

9.2    配置步骤

9.3    相关HAL库函数

9.4    关键结构体

9.5    关键步骤

10    配置DMA多通道ADC采集

10.1    不同之处

10.2    注意点

11    ADC过采样

11.1    面向的场景

11.2    过采样率的确定

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

12.1    相关数据资料查询

12.2    步骤

12.3    温度计算方式

13    ADC采集光敏二极管

13.1    原理

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库文件:

⚠️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采集。


http://www.ppmy.cn/embedded/104081.html

相关文章

Linux 用户缓冲区

1. 文件描述符的分配规则 我们知道Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入stdin--0, 标准输出stdout--1, 标准错误stderr--2。0,1,2对应的物理设备一般是:键盘,显示器,显示器.接下…

Web:PHP序列化和反序列化

简而言之&#xff0c;序列化和反序列化就是数据类型的转换&#xff0c;序列化是将对象&#xff0c;数组等转换为便于传输的形式&#xff0c;例如&#xff1a;JSON、XML等。而反序列化则是序列化逆向的过程。 一、序列化和反序列化 1.PHP序列化 例如&#xff1a; <?phpc…

Python知识点:如何使用Cassandra与Cassandra-driver进行大数据存储

使用Cassandra与cassandra-driver库进行大数据存储涉及几个关键步骤&#xff0c;从设置Cassandra数据库到使用Python的cassandra-driver进行数据操作。以下是详细的步骤&#xff1a; 1. 安装Cassandra和cassandra-driver 首先&#xff0c;确保你已经安装了Apache Cassandra数…

Mfuzz/ClusterGVis包时间(规律变化数据即可)序列分析学习和整理

Mfuzz是一个用于时间序列/状态空间/规律变化数据聚类分析的 R 包&#xff0c;适用于生物信息学中的规律变化数据分析。以下是 Mfuzz 包的主要作用&#xff1a; 模糊聚类分析&#xff1a;Mfuzz 使用模糊 C 均值&#xff08;Fuzzy C-Means&#xff09;算法对数据进行聚类。这种方…

C++类和对象(中)

Hello&#xff0c;大家好&#xff0c;今天&#xff0c;我们来继续学习类和对象部分的知识。 目录 1.类中的默认成员函数 2.构造函数 2.1构造函数的特点 3.析构函数 3.1析构函数的特点 4.拷贝构造函数 4.1拷贝构造函数的特点 5.赋值运算符重载 5.1运算符重载函数 5.2赋值运…

vscode解决运行程序无法从控制台输入问题

在vscode中运行一些简单的程序代码&#xff0c;需要从控制台接受输入参数&#xff0c;发现不能通过键盘输入。 本章教程&#xff0c;提供该问题的解决方法。 解决办法 由于我是使用的Code Runner这个插件&#xff0c;Code Runner插件支持运行多种编程语言&#xff0c;很方便。打…

YOLO与PyQt5结合-增加论文工作量-实现一个目标检测的UI界面

这是个简单的界面&#xff0c;Qtdesigner支持各种界面&#xff0c;支持替换背景添加图标等。 接下来实现一个简单YOLO目标检测界面&#xff1a; 功能&#xff1a; 1、在窗口打开视频或图片进行目标检测&#xff0c;具有中断检测功能&#xff1a;比如检测视频的时候突然打开图…

ubuntu24安装cuda和cudnn

一、安装cuda 确保显卡驱动正确安装 终端输入&#xff1a; nvidia-smi显示下面结果&#xff0c;说明显卡驱动安装正常&#xff0c;可以进行下一步 1.去官网下载CUDA&#xff0c;需要注册账号下载 https://developer.nvidia.com/cuda-toolkit-archive由于我们显卡支持12.2&…