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

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传输模式。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

d3dx9_43.dll缺失怎么办?教你一分钟修复d3dx9_43.dll丢失问题

今天&#xff0c;与大家分享关于“d3dx9_43.dll丢失的5个解决方法”的主题。在我们的日常生活和工作中&#xff0c;我们可能会遇到各种各样的问题&#xff0c;而d3dx9_43.dll丢失就是其中之一。那么&#xff0c;什么是d3dx9_43.dll呢&#xff1f;它为什么会丢失&#xff1f;又该…

Ubuntu安装PCAN-View

目录 一. Hardware 二. Software 2.1 安装驱动 2.2 安装PCAN-View QA 本文介绍如何安装linux版的PCAN-View。 PCAN-View&#xff1a;用来抓包分析CAN/CANFD报文。Hardware: PEAK-System Linux generic #37~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Oct 9 15:34:04 UTC 2…

redis---主从复制及哨兵模式(高可用)

主从复制 主从复制&#xff1a;主从复制是redis实现高可用的基础&#xff0c;哨兵模式和集群都是在主从复制的基础之上实现高可用。 主从负责的工作原理 1、主节点&#xff08;master&#xff09; 从节点&#xff08;slave&#xff09;组成&#xff0c;数据复制是单向的&a…

AI原生应用为百度带来新增量

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; AI将彻底改变每一个行业!得益于AI和基础模型的驱动&#xff0c;百度在AI原生应用领域厚积薄发。 11月21日&#xff0c;百度Q3财报发布&#xff0c;数据显示&#xff1a;三季度营收达344.47亿元&…

JVM 堆外内存详解

Java 进程内存占用除了JVM 运行时数据区&#xff0c;还有直接内存&#xff08;Direct Memory&#xff09;区域及 JVM 程序自身也会占用内存 直接内存&#xff08;Direct Memory&#xff09;区域&#xff1a;直接内存通过使用Native堆外内存来存储数据&#xff0c;这意味着数据…

封面从这里取好啦

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

美团四年、字节三年,我的软件测试之路

前言 时间回到8年前&#xff0c;我人生中的第一份实习工作&#xff0c;是在某互联网公司做一个自动化测试工程师。当时的我可谓意气风发&#xff0c;想要大干一场&#xff0c;结果第一次做测试就出现了事故。由于对某些地方的不了解&#xff0c;把某一个地方侧漏了&#xff0c…

含分布式电源的配电网可靠性评估matlab程序

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 参考文献&#xff1a; 基于仿射最小路法的含分布式电源配电网可靠性分析——熊小萍 主要内容&#xff1a; 通过概率模型和时序模型分别进行建模&#xff0c;实现基于概率模型最小路法的含分布式电源配电网…

HTML玩转超链接a标签

大家应该都知道&#xff0c;a标签主要是转跳链接&#xff0c;接下来&#xff0c;让我为大家介绍一下a标签的使用&#xff01; 主要的作用&#xff1a;从当前页面进行跳转 标签名标签语义常用属性单/双标签a超链接href&#xff1a;要跳转的具体位置 target&#xff1a;跳转时如…

Unity中Shader双向反射分布函数BRDF

文章目录 前言一、渲染方程二、什么是BxDF1、BSSRDF2、BRDF3、BTDF4、BSDF 三、迪士尼原则的BRDF四、迪士尼原则的BRDF的参数五、在Unity中看一下默认Shader的这些参数六、在这里记录一下使用 Blender 和 SubstancePainter 的流程1、在Blender中导出模型为 .obj 格式2、在Subst…

谈一谈什么是接口测试?怎样做接口测试?

扫盲内容&#xff1a; 1.什么是接口&#xff1f; 2.接口都有哪些类型&#xff1f; 3.接口的本质是什么&#xff1f; 4.什么是接口测试&#xff1f; 5.问什么要做接口测试&#xff1f; 6.怎样做接口测试&#xff1f; 7.接口测测试点是什么&#xff1f; 8.接口测试都要掌…

python批量修改文件夹下的后缀名

python批量修改文件夹下的后缀名 &#xff08;所有的.txt结尾的文件&#xff0c;替换成.py结尾&#xff09; 1、需要将某个文件夹下所有的.txt结尾的文件&#xff0c;替换成.py结尾 2、Python代码&#xff1a; import os# 指定需要更改文件的目录 dir_path D:/study/py/4#…

蓝桥杯物联网_STM32L071_2_继电器控制

CubeMX配置&#xff1a; Function.c及Function.h&#xff1a; #include "Function.h" #include "gpio.h" void Function_LD5_ON(void){HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_Pin, GPIO_PIN_RESET); }void Function_LD5_OFF(void){HAL_GPIO_WritePin(LD5_…

如何使用YOLOv8代码框架中的RT-DETR

1. RT-DETR RT-DETR是由由此&#xff0c;百度推出了——RT-DETR (Real-Time DEtection TRansformer) &#xff0c;一种基于 DETR 架构的实时端到端检测器&#xff0c;其在速度和精度上取得了 SOTA 性能。 RT-DETR开源的代码在百度自己的飞桨paddlepaddle上&#xff0c;因此非…

Oauth2认证及Spring Security Oauth2授权码模式

Oauth2认证 Oauth2简介 简介 第三方认证技术方案最主要是解决认证协议的通用标准问题&#xff0c;因为要实现跨系统认证&#xff0c;各系统之间要遵循一定的接口协议。 OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时&#xff0c;任何第三方都可以使…

复旦、人大等发布大五人格+MBTI测试 角色扮演AI特质还原率达82.8%

近期&#xff0c;由复旦大学和中国人民大学合作的Chat凉宫春日团队发布了一项关于AI角色扮演的研究。该研究强调了良好的人设还原度对于评价AI角色扮演的重要性&#xff0c;特质还原率高达82.8%。研究使用了大五人格的NEO-FFI问卷和MBTI的16Personalities测试&#xff0c;并通过…

深度学习之基于YoloV5车辆和行人目标检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介YOLOv5 简介YOLOv5 特点 车辆和行人目标检测系统 二、功能三、系统四. 总结 一项目简介 # 深度学习之基于 YOLOv5 车辆和行人目标检测系统介绍 深度学习在…

电大搜题——让学习变得轻松高效

作为一名现代学者&#xff0c;您一定时刻关注着教育领域的进展和创新。今天&#xff0c;我将向大家介绍一个名为“电大搜题”的神奇工具&#xff0c;它将为您的学习之路带来一场完美的革命。 在快节奏的现代社会中&#xff0c;学习已经成为每个人追求成功的必经之路。然而&…

redis五种基本数据类型

redis存储任何类型的数据都是以key-value形式保存&#xff0c;并且所有的key都是字符串&#xff0c;所以讨论基础数据结构都是基于value的数据类型 常见的5种数据类型是&#xff1a;String、List、Set、Zset、Hash 一) 字符串(String) String是redis最基本的类型&#xff0c;v…

解决 Python整数值的 header 问题

在使用Python的requests库进行HTTP请求时&#xff0c;自requests 2.11版本以后&#xff0c;出现了无法处理包含整数值的header的问题。这导致了所有使用requests库的请求都出现错误。 问题的发起者遇到了一个麻烦&#xff0c;就是在使用Python的requests库进行HTTP请求时&#…