028 - STM32学习笔记 - ADC结构体学习(二)

news2025/1/16 3:00:23

028 - STM32学习笔记 - 结构体学习(二)

在这里插入图片描述

上节对ADC基础知识进行了学习,这节在了解一下ADC相关的结构体。

一、ADC初始化结构体

在标准库函数中基本上对于外设都有一个初始化结构体xx_InitTypeDef(其中xx为外设名,例如之前使用过的GPIO_InitTypeDef),结构体成员用来设置外设的工作模式,通过标准库函数xx_Init()调用将这些设定的参数送入外摄对应的寄存器。

对于ADC来说也是这样的操作,先看一下ADC_InitTypeDef结构体的定义:

ADC_InitTypeDef结构体

typedef struct {
    uint32_t ADC_Resolution; 					//设置ADC分辨率选择
    FunctionalState ADC_ScanConvMode; 			 //设置ADC扫描选择
    FunctionalState ADC_ContinuousConvMode; 	 //设置ADC连续转换模式选择
    uint32_t ADC_ExternalTrigConvEdge; 			//设置ADC外部触发极性
    uint32_t ADC_ExternalTrigConv; 			    //设置ADC外部触发选择
    uint32_t ADC_DataAlign; 				   //设置输出数据对齐方式
    uint8_t ADC_NbrOfChannel; 				   //设置转换通道数目
} ADC_InitTypeDef;

ADC_Resolution:用于配置ADC的分辨率,可选的分辨率有12 位、10 位、8 位和 6 位。分辨率越高, AD转换数据精度越高,转换时间也越长;分辨率越低,AD转换数据精度越低,转换时间也越短。

ADC_Resolution_12b				//12位精度
ADC_Resolution_10b				//10位精度
ADC_Resolution_8b				//8位精度c
ADC_Resolution_6b				//6位精度

ADC_ScanConvMode:该成员主要用于配置ADC是否使用扫描,可选参数为ENABLE和DISABLE,如果只用到一个通道,配置为DISABLE,如果时多个通道,则选择ENABLE。

ADC_ContinuousConvMode:用于配置启动自动连续转换还是单次转换,可选参数为ENABLE(连续转换)和DISABLE(单次转换)。如果选择为单次转换,那么每次转换完成后,都需要手动控制才能重新启动转换。

ADC_ExternalTrigConvEdge:设置外部触发极性,如果使用外部触发,可选有:

ADC_ExternalTrigConvEdge_None				//禁止触发检测
ADC_ExternalTrigConvEdge_Rising				//上升沿触发检测
ADC_ExternalTrigConvEdge_Falling			//下降沿触发检测
ADC_ExternalTrigConvEdge_RisingFalling		//上升下降沿均检测

ADC_ExternalTrigConv:外部触发模式选择,可选的触发条件如下图-4,常用的一般使用软件自动触发:

在这里插入图片描述

ADC_DataAlign:设置转换结果数据对其模式,可选有右对齐ADC_DataAlign_Right或者左对齐ADC_DataAlign_Left,这里我们选择右对齐。

ADC_NbrOfChannel:设置AD转换通道数目。

ADC_CommonInitTypeDef结构体

除了ADC_InitTypeDef初始化结构体外,还有ADC_CommonInitTypeDef通用初始化结构,ADC_CommonInitTypeDef结构体内容决定了三个ADC共用的工作环境。

typedef struct{
  uint32_t ADC_Mode; 						//ADC模式选择
  uint32_t ADC_Prescaler; 					//ADC分频系数
  uint32_t ADC_DMAAccessMode;				//DMA模式配置
  uint32_t ADC_TwoSamplingDelay;			//采样延迟
}ADC_CommonInitTypeDef;

ADC_Mode:ADC工作模式选择在前面有学习过,有独立模式、双重模式以及三重模式;

ADC_Prescaler:ADC时钟分频系数选择,ADC时钟是由PCLK2分频而来,分频系数决定ADC时钟频率,可选的分频系数位2、4、6和8,在之前也学习过ADC的最大时钟配置为36MHz。

ADC_DMAAccessMode:DMA模式设置,在双重或者三重模式下才需要设置,可以设置三种模式,分别为:

ADC_DMAAccessMode_Disabled				//独立模式下选择
ADC_DMAAccessMode_1					    //模式1
ADC_DMAAccessMode_2					    //模式2
ADC_DMAAccessMode_3					    //模式3

ADC_TwoSamplingDelay:2个采样阶段之前的延迟,仅适用于双重或三重交错模式。

二、独立模式单通道采集实验

在F429实验板上,提供了一个板载贴片滑动变阻器,供我们调试ADC时使用,原理图如下:

在这里插入图片描述

滑动变阻器动触点连接到STM32的ADC通道引脚(GPIOC_3),固定触点一边接0V,一边接3.3V,因此旋转滑动变阻器调节旋钮时,动触点的电压会在0~3.3V之间变化。

根据以上电路设计,设计个模拟量采集程序,具体需要实现如下步骤:

  1. 初始化配置ADC目标引脚为模拟输入模式;
  2. 使能ADC时钟(再次强调,使用外设一定要先开启时钟!!!);
  3. 配置通用ADC为独立模式,采样4分频;
  4. 设置目标ADC为12位分辨率,1通道的连续转换,不需要外部触发;
  5. 设置ADC转换通道顺序及采样时间;
  6. 配置使能ADC转换完成中断,在中断内读取转换完数据;
  7. 启动ADC转换;
  8. 使能软件触发ADC转换。

这里需要注意,没用使用到DMA进行数据传输,而是使用中断方式进行读取。

bsp_adc.h

#ifndef __BSP_ADC_H_
#define __BSP_ADC_H_

#include "stm32f4xx.h"

#define R_ADC_IRQ               ADC_IRQn
#define R_ADC_INT_FUNCTION      ADC_IRQHandler
#define R_ADC_GPIO_PORT         GPIOC
#define R_ADC_GPIO_PIN          GPIO_Pin_3
#define R_ADC_GPIO_CLK          RCC_AHB1Periph_GPIOC

#define R_ADC                   ADC1
#define R_ADC_CLK               RCC_APB2Periph_ADC1
#define R_ADC_CHANNEL           ADC_Channel_13

void R_ADC_Init(void);
#endif

bsp_adc.c

#include "bsp_adc.h"

/** @brief  初始化ADC GPIO引脚
  * @parm   无
  * @retval 无
  */
static void R_ADC_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_AHB1PeriphClockCmd(R_ADC_GPIO_CLK,ENABLE);          //开启ADC外设引脚时钟
    GPIO_InitStructure.GPIO_Pin = R_ADC_GPIO_PIN;           //配置引脚位3引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;           //配置引脚为模拟输入
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;        //配置为无上下拉
    GPIO_Init(R_ADC_GPIO_PORT,&GPIO_InitStructure);         //初始化引脚
}

/** @brief  配置ADC引脚工作模式
  * @parm   无
  * @retval 无
  */
static void R_ADC_Mode_Config(void)
{
    ADC_InitTypeDef ADC_InitStructure;
    ADC_CommonInitTypeDef ADC_CommonInitStructure;
    RCC_APB2PeriphClockCmd(R_ADC_CLK,ENABLE);
    //-----------------ADC Common结构体参数初始化--------------//
    ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;        //设置模式为独立模式
    ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;     //设置为4分频
    ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;     //禁止DMA直接访问模式
    ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_10Cycles;       //设置采样间隔周期为10个周期
    ADC_CommonInit(&ADC_CommonInitStructure);
    //-----------------ADC Init结构体参数初始化--------------//
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;      //设置ADC采样分辨率为12位
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;               //多通道下才会用到扫描模式,这里直接禁止
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;          //设置为连续转换
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;     //禁用外部边沿触发
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;      //设置为右对齐
    ADC_InitStructure.ADC_NbrOfConversion = 1;                  //转换通道只有1个
    ADC_Init(R_ADC,&ADC_InitStructure);
    ADC_RegularChannelConfig(R_ADC,R_ADC_CHANNEL,1,ADC_SampleTime_56Cycles);   //配置ADC通道转换顺序为1,第一个转换,才压根时间为56个时钟周期
    ADC_ITConfig(R_ADC,ADC_IT_EOC,ENABLE);      //ADC转换结束产生中断,在中断服务程序中读取转换数值
    ADC_Cmd(R_ADC,ENABLE);                  //使能ADC
    ADC_SoftwareStartConv(R_ADC);           //开始ADC转换,由软件触发
}

static void R_ADC_NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);				//设置中断向量组为1
    NVIC_InitStructure.NVIC_IRQChannel = R_ADC_IRQ;				//配置中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;	 //设置主优先级为1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//设置此优先级为1
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//通道使能
    NVIC_Init(&NVIC_InitStructure);							   //初始化中断
}
void R_ADC_Init(void)
{
    R_ADC_GPIO_Config();
    R_ADC_Mode_Config();
    R_ADC_NVIC_Config();
}

main.c

#include "stm32f4xx.h"
#include "bsp_usart_dma.h"
#include "bsp_systick.h"
#include "bsp_adc.h"
#include <stdio.h>
__IO uint16_t ADC_Value;
float ADC_Vol = 0;
int main(void)
{
    DEBUG_USART1_Config();
    R_ADC_Init();
    SysTick_Init();
    printf("\r\n---------------ADC实验(中断模式)----------------\r\n");
    while(1)
    {
        Delay_ms(1000);
        printf("\r\n ADC数据(未转换) = 0x%04X \r\n",ADC_Value);
        
        ADC_Vol =(float)(ADC_Value*3.3/4096); // 读取转换的 AD 值 
        printf("\r\n ADC数据(已转换) = %.2f V \r\n",ADC_Vol);
    }
}

stm32f4xx_it.c

//此处记得在头文件中声明函数
extern __IO uint16_t ADC_ConvertedValue;
void ADC_IRQHandler(void)
{
	if (ADC_GetITStatus(R_ADC,ADC_IT_EOC)==SET)			//获取ADC中断状态
    {
        ADC_ConvertedValue = ADC_GetConversionValue(R_ADC);			// 等待转换完成后,读取ADC的转换值
    }
    ADC_ClearITPendingBit(R_ADC,ADC_IT_EOC);				//清除状态寄存器
}

输出结果如下,调整电位器会发现数值在0V~3.3V之间变化。
在这里插入图片描述

单通道相对比较简单,这里先了解一下,后面在学习一下多通道并且启用DMA传输模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1239888.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从mysql源码编译出相应的库和可执行文件及搭建mysql服务端

目录 1. 问题的提出 2. 源码下载 3. 升级或安装某些前置软件 3.1. 升级CMake 3.2. 升级gcc、g 4. 安装依赖库 4.1. 安装OpenSSL 4.2. 安装Curses 4.3. 安装pkg-config 5. 编译、安装 6. 编译结果、配置 7. 编译错误处理 7.1. 错误1 7.2. 错误2 8. 搭建mysql数…

FindMy技术用于充电宝

充电宝是一种便捷的充电器&#xff0c;方便个人随身携带&#xff0c;能够自行储备电能&#xff0c;为主流电子设备提供充电服务。它广泛应用于没有外部电源供应的场所&#xff0c;例如旅行、户外活动或紧急情况下&#xff0c;为用户的手持设备提供持续的电力支持&#xff0c;确…

C语言--数组与指针--打印字符串的n种方式

一.知识背景 一维数组名的含义 arr一般表示数组的起始地址&#xff08;除了两种例外&#xff09; 1.在定义数组的同一个函数中(不是形参),求sizeof(arr),求整个数组的字节数 2.在定义数组的同一个函数中(不是形参),&arr1,加整个数组的大小 (经常考试) 3.除上面以外,arr都表…

第四代智能井盖传感器:智能井盖位移怎么进行监测

井盖是城市基础设施的一个重要组成部分&#xff0c;若井盖出现移位等现象&#xff0c;可能会对路过的车辆和行人造成潜在危险。特别是那些含有甲烷气体的井盖&#xff0c;一旦气体超过阈值且被意外踩踏&#xff0c;可能会导致气体的释放&#xff0c;这便会引发一系列安全事故&a…

给定一个非严格递增排列的有序数组,删除数组中的重复项

实例要求&#xff1a;1、给定一个非严格递增排列的有序数组 nums &#xff1b;2、原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff1b;3、返回删除后数组的新长度&#xff1b;4、元素的 相对顺序 应该保持 一致 &#xff1b;5、然后返回 nums 中唯一元素的…

Unsupervised MVS论文笔记

Unsupervised MVS论文笔记 摘要1 引言2 相关工作3 实现方法 Tejas Khot and Shubham Agrawal and Shubham Tulsiani and Christoph Mertz and Simon Lucey and Martial Hebert. Tejas Khot and Shubham Agrawal and Shubham Tulsiani and Christoph Mertz and Simon Lucey and …

二十二、数组(4)

本章概要 随机生成泛型和基本数组 随机生成 我们可以按照 Count.java 的结构创建一个生成随机值的工具&#xff1a; Rand.java import java.util.*; import java.util.function.*;import static com.example.test.ConvertTo.primitive;public interface Rand {int MOD 10_0…

详解自动化之单元测试工具Junit

目录 1.注解 1.1 Test 1.2 BeforeEach 1.3 BeforeAll 1.4 AfterEach 1.5 AfterAll 2. 用例的执行顺序 通过 order() 注解来排序 3. 参数化 3.1 单参数 3.2 多参数 3.3 多参数(从第三方csv文件读取数据源) 3.4 动态参数ParameterizedTest MethodSource() 4. 测试…

数字IC后端设计利器 - 《Innovus的基本使用流程和命令》

Innovus作为数字后端工具的后起之秀&#xff0c;在先进工艺下已经取得了令人瞩目的成就。其在Run time上的优势令人刮目&#xff0c;在timing、DRC、IR-drop上的结果更是让人竖起大拇指。 数字IC后端工程师学习Cadence公司的Innovus工具非常重要&#xff0c;因为Innovus是一款…

YOLOv8改进实战 | 更换主干网络Backbone(六)之轻量化模型VanillaNet进阶篇

前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操作,并将它们分别作用于输入的不…

封面从这里取好啦

文章目录 前端NPMViteNode.js 后端JavaMavenPython 数据库算法 前端 NPM Vite Node.js 后端 Java Maven Python 数据库 算法

常见面试题-Redis持久化策略

谈谈Redis 的持久化策略&#xff1f; 参考文章&#xff1a; Redis 持久化机制演进与百度智能云的实践 Redis的确是将数据存储在内存的&#xff0c;但是也会有相关的持久化机制将内存持久化备份到磁盘&#xff0c;以便于重启时数据能够重新恢复到内存中&#xff0c;避免数据丢…

反编译-ApkTool

ApkTool下载地址&#xff1a; Apktool | ApktoolA tool for reverse engineering Android apk fileshttps://apktool.org/ 1、使用 apktool 解包 执行 java -jar apktool_2.4.1.jar d demo.apk -o demo 命令 java -jar apktool_2.4.1.jar d demo.apk -o demo 其中 d 后面是…

嵌入式基础知识学习:Flash、EEPROM、RAM、ROM

https://blog.csdn.net/y673533511/article/details/87913989 FLASH存储器又称闪存&#xff0c;它结合了ROM和RAM的长处&#xff0c;不仅具备电子可擦出可编程(EEPROM) 的性能&#xff0c;还不会断电丢失数据同时可以快速读取数据 (NVRAM 的优势)&#xff0c;U 盘和MP3 里用的…

JSP:Javabean

起初&#xff0c;JavaBean的目的是为了将可以重复使用的代码进行打包&#xff0c;在传统的应用中&#xff0c;JavaBean主要用于实现一些可视化界面&#xff0c;如一个窗体、按钮、文本框等&#xff0c;这样的JavaBean称之可视化的JavaBean。 随着技术的不断发展与项目的需求&am…

MySQL 事务的底层原理和 MVCC(一)

在事务的实现机制上&#xff0c;MySQL 采用的是 WAL&#xff08;Write-ahead logging&#xff0c;预写式日志&#xff09;机制来实现的。 在使用 WAL 的系统中&#xff0c;所有的修改都先被写入到日志中&#xff0c;然后再被应用到系统中。通常包含 redo 和 undo 两部分信息。 …

react大文件上传

目录 大文件上传优点&#xff1a; 大文件上传缺点: 大文件上传原理&#xff1a; 为什么要用md5 实现流程&#xff1a; 部分代码1&#xff1a; 部分代码2&#xff1a;​ 大文件上传优点&#xff1a; 文件太大分片上传能加快上传速度,提高用户体验能断点续传 如果上次上传失败…

纳米软件电源芯片测试案例分享:测试方案、仪器选型、解决测试难点

一、背景介绍 成都某半导体芯片公司是一家专注于开发设计半导体电源芯片的高新技术企业&#xff0c;目前企业对于电源管理芯片研发阶段的测试&#xff0c;绝大部分采用人工手动测试&#xff0c;效率低&#xff0c;耗时长&#xff0c;数据管理储存难度大&#xff0c;无法快速地完…

依托数据、平台、知识增强等优势 夸克大模型大幅降低问答幻觉率

“大模型时代&#xff0c;夸克有巨大机会创造出革新性搜索产品。”11月22日&#xff0c;夸克大模型公布了其面向搜索、生产力工具和资产管理助手的大模型技术布局。数据显示&#xff0c;夸克千亿级参数大模型登顶C-Eval和CMMLU两大权威榜单&#xff0c;夸克百亿级参数大模型同样…

SpringMVC问题

文章目录 SpringMVC运行流程MVC的概念与请求在MVC中的执行路径&#xff0c;ResponsBody注解的用途SpringMVC启动流程 SpringMVC运行流程 • 客户端&#xff08;浏览器&#xff09;发送请求&#xff0c;直接请求到 DispatcherServlet 。 • DispatcherServlet 根据请求信息调用 …