当前位置:AIGC资讯 > 数据采集 > 正文

ADC电压采集(基于STM32hal库)(保姆级应用)

目录

STM32 ADC电压采集应用

前言

独立模式单通道采集实验

硬件设计

软件设计

STM32CubeMX配置

MDK程序完善

独立模式多通道采集实验

硬件设计

软件设计

编程要点

STM32CubeMX配置

MDK程序完善

双重 ADC 同步规则模式采集实验

硬件设计

软件设计

编程要点

STM32CubeMX配置

MDK程序完善

STM32 ADC电压采集应用

前言

本文详细介绍了ADC外设在STM32中的裸机应用,如果想要事先了解ADC的相关概念,可参考:

ADC电压采集(基于STM32hal库)(详细介绍)_竹烟淮雨的博客-CSDN博客

如果想要了解ADC在嵌入式实时操作系统RTOS中的应用,可参考:

RTT(RT-Thread)ADC设备(保姆级)_竹烟淮雨的博客-CSDN博客

独立模式单通道采集实验

首先是比较基础实 用的单通道采集,实现开发板上电位器电压的采集,并通过串口打印至 PC 端串口调试助手。单 通道采集适用 AD 转换完成中断,在中断服务函数中读取数据,不使用 DMA 传输,在多通道采 集时才使用 DMA 传输。

硬件设计

我们的霸道开发板板载了一个贴片滑动变阻器,滑动变阻器的滑片端连接到了 STM32 的 PC1 引脚。

贴片滑动变阻器的动触点通过连接至 STM32 芯片的 ADC 通道引脚。当我们旋转滑动变阻器调 节旋钮时,其动触点电压也会随之改变,电压变化范围为 0~3.3V,亦是开发板默认的 ADC 电压 采集范围。

软件设计

STM32CubeMX配置

1.创建工程,芯片选择stm32f103zet6

2.配置系统时钟

由于ADC最大输入时钟为14M,所以我们设置为6分频

3.开启串口调试

4.配置串口1,用于待会儿将读取的电压值打印出来

5.配置ADC:由于我们要读取的是PC1引脚的输入电压,因此我们使用ADC1的通道11

我们使用一个ADC默认就是独立模式

对于F4以及更高系列的芯片,可以进行ADC时钟的分频以及分辨率的选择

(1)对齐模式,使用默认的右对齐即可

(2)扫描模式:由于现在只使用一个ADC通道,如果使用扫描多个ADC通道,我们就需要设置扫描顺序,让哪个通道先转换,谁后转换

(3)开启连续采样:如果不使能连续采样的话,ADC采集完一次数据后将数据保存到数据存储寄存器中之后,ADC就暂停工作了,之后想要再使用需要代码重新开启。如果设置为使能,ADC数据就会不断地进行更新采样通道引脚上的电平,等我们需要用的时候,我们只需要访问寄存器里面的数据即可。

(4)触发模式,我们使用软件触发,如果选择定时器触发,我们还需要配置相应的极性(上升沿、下降沿)

(5)需要规则通道转换的通道数量,这里选择一个

(6)rank用于采样的通道的采样顺序,由于我们现在只有一个通道,因此rank1设置为通道11,采样时间默认设置为最快的1.5个周期即可

(7)是否使用注入通道,我们选择不使能,开门狗也不需要开启

6.最后开启中断

7.其它都不需要配置,中断向量表默认即可,也没使用到串口中断

MDK程序完善

用CubeMX生成的程序并不能直接使用,我们还需要进行相应的程序编写

1.打开CubeMX生成的工程代码,定义一个全局变量用于存储每次读取的电压值

2.填写ADC中断回调服务函数,函数接口添加在main文件中,它已经在hal库中被弱定义了

3.获取结果,我们使用hal库的ADC接口函数,并传入ADC结构体句柄

4.然后我们需要手动开启ADC

5.通过串口打印获取到的电压值:由于我们没有实现printf的重定义到串口,因此我们使用sprintf函数组包,然后通过hal库的串口发送数据函数将结果打印到上位机,然后延时500ms

6.烧录程序,发现可以正确打印电压值,旋动电压调节旋钮,电压值改变

独立模式多通道采集实验

硬件设计

开发板已通过排针接口把部分 ADC 通道引脚引出,其中电位器通过跳线帽默认接了一个 ADC 的 IO,其他的 ADC IO 在做实验的时候可以用杜邦线连接到开发板中的 GND 或者 3V3 来获取模 拟信号。要注意的是,用来做 ADC 输入的 IO 不能被复用,否则会导致采集到的信号不准确。

软件设计

跟单通道例程一样,我们编写两个 ADC 驱动文件, bsp_adc.h 和 bsp_adc.c,用来存放 ADC 所用 IO 引脚的初始化函数以及 ADC 配置相关函数,实际上这两个文件跟单通道实验的文件是非常相 似的。

编程要点

1) 初始化 ADC GPIO;

2) 初始化 ADC 工作参数;

3) 配置 DMA 工作参数;

4) 读取 ADC 采集的数据;

ADC 转换结果数据使用 DMA 方式传输至指定的存储区,这样取代单通道实验使用中断服务的 读取方法。

实际上,多通道 ADC 采集一般使用 DMA 数据传输方式更加高效方便。

STM32CubeMX配置

主要关心ADC和DMA的配置

1.ADC我们使用6个通道

2.将规则通道数改为6之后,软件会自动将扫描模式使能

记得使能连续转换

触发方式选择软件触发,通道扫描顺序默认

通道记得选择,否则默认通道1

3.DMA我们只需要开启循环模式即可,由于ADC分辨率为12bit,因此我们数据长度选择半字长即可

MDK程序完善

1.定义一个全局数组用于存放数据

2.在usart.c中,实现我们的printf重写,记得添加头文件

记得开启微库支持

3.在main.c中使能adc1并开启DMA传输,虽然在HAL_ADC_Start_DMA中已经使能了ADC1,但手动使能养成好习惯,注意传参时数据需要强转为32位(因为DMA的宽度是32bit)

4.打印数据

5.编译下载后查看现象

双重 ADC 同步规则模式采集实验

对于双重 ADC模式,转换的启动只能是 ADC1主和ADC2从的交替触发或同步触发。

AD 转换包括采样阶段和转换阶段,在采样阶段才对通道数据进行采集;而在转换阶段只是将采 集到的数据进行转换为数字量输出,此刻通道数据变化不会改变转换结果。

独立模式的 ADC 采集需要在一个通道采集并且转换完成后才会进行下一个通道的采集。而双重 ADC 的机制就是使用两个 ADC 同时采样一个或者多个通道。双重 ADC 模式较独立模式一个最 大的优势就是提高了采样率,弥补了单个 ADC 采样不够快的缺点。

启用双 ADC 模式的时候,通过配置 ADC_CR1 寄存器的DUALMOD[3:0] 位,可以有几种不同的 模式,具体见表格

双 ADC 模式的各种模式汇总

这里只对这些模式做了简要的说明,更具体的信息请参考数据手册 ADC 章节的双 ADC 模式小 节。

这里我们选取同步规则模式来作为实验讲解。同步规则模式是 ADC1 和 ADC2 同时转换一个规 则通道组, ADC1 是主, ADC2 是从, ADC1 转换的结果放在 ADC1_DR 的低 16 位, ADC2 转换 的结果放在 ADC1_DR 的高十六位。并且必须开启 DMA 功能。

外部触发来自 ADC1 的规则组多路开关 (由 ADC1_CR2 寄存器的 EXTSEL[2:0] 选择),它同时给 ADC2 提供同步触发。为了简单起见, ADC1 我们选择软件触发, ADC2 必须选择外部触发,这 个外部触发来自于 ADC1 的规则组多路开关。

为了实验的简单起见,实验中我们选取 ADC1 和 ADC2 各采集一个通道。

硬件设计

开发板用引出了 6 路 ADC,实验中选取其中的两路(根据软件配置来选择)接开发板中的电位 器/GND/3V3 来获取模拟信号即可做实验。

软件设计

编程要点

1) 初始化 ADC GPIO;

2) 初始化 DMA 配置;

3) 初始化 ADC 参数;

4) 读取 ADC 采集的数据,并打印出来校正;

STM32CubeMX配置

原来一个ADC采集一个通道最快速率是0.85Mps,如果采用两个ADC外设交替采集同一个通道,速率可以提升两倍为1.7Mps

1.选择通道11,模式配置为双重 ADC 规则同步模式

2.扫描模式只使用了一个通道,不需要使能;连续转换模式使能

其它不需要改

3.开启ADC的DMA的转换

MDK程序完善

1.如果使用三个ADC交替读取,我们需要定义一个全局数组用于保存ADC采样的结果,数组要定义大一点,因为数组要作为DAM的缓冲区,如果定义得很小,那么会频繁地进入DMA的中断处理函数,这样会导致CPU花大量时间在中断切换上

由于我们这里是双ADC,所以只需要一个32bit的变量即可

2.实现串口printf重定义

3.添加启动ADC采样器的校准代码并启动 AD 转换并使能 DMA 传输和中断

4.配置好串口,初始化好 ADC,然后把 ADC1 和 ADC2 采集的数据分离出来,最后调用 printf 函 数打印到电脑的串口调试助手

5.运行结果

更新时间 2024-07-01