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_13void 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);                  //使能ADCADC_SoftwareStartConv(R_ADC);           //开始ADC转换,由软件触发
}static void R_ADC_NVIC_Config(void)
{NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);				//设置中断向量组为1NVIC_InitStructure.NVIC_IRQChannel = R_ADC_IRQ;				//配置中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;	 //设置主优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//设置此优先级为1NVIC_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.mzph.cn/news/160606.shtml

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

相关文章

YOLO目标检测——卫星遥感多类别检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;卫星遥感目标检测数据集说明&#xff1a;卫星遥感多类别检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;含网球场、棒球场、篮球场、田径场、储罐、车辆、桥、飞机、船等类别标签说明&#xff1a;使用lableimg标…

2023年【上海市安全员C证】考试及上海市安全员C证找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年上海市安全员C证考试为正在备考上海市安全员C证操作证的学员准备的理论考试专题&#xff0c;每个月更新的上海市安全员C证找解析祝您顺利通过上海市安全员C证考试。 1、【多选题】2017年9月颁发的《中共上海市委…

基于STM32的烟雾浓度检测报警仿真设计(仿真+程序+讲解视频)

这里写目录标题 &#x1f4d1;1.主要功能&#x1f4d1;2.仿真&#x1f4d1;3. 程序&#x1f4d1;4. 资料清单&下载链接&#x1f4d1;[资料下载链接](https://docs.qq.com/doc/DS0VHTmxmUHBtVGVP) 基于STM32的烟雾浓度检测报警仿真设计(仿真程序讲解&#xff09; 仿真图prot…

SkyWalking配置报警推送到企业微信

1、先在企业微信群里创建一个机器人&#xff0c;复制webhook的地址&#xff1a; 2、找到SkyWalking部署位置的alarm-settings.yml文件 编辑&#xff0c;在最后面加上此段配置 &#xff01;&#xff01;&#xff01;一定格式要对&#xff0c;不然一直报警报不出来按照网上指导…

JVM 堆外内存详解

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

大数据平台实践之CDH6.2.1+spark3.3.0+kyuubi-1.6.0

前言&#xff1a;关于kyuubi的原理和功能这里不做详细的介绍&#xff0c;感兴趣的同学可以直通官网&#xff1a;https://kyuubi.readthedocs.io/en/v1.7.1-rc0/index.html 下载软件版本 wget http://distfiles.macports.org/scala2.12/scala-2.12.16.tgz wget https://archi…

pikachu_php反序列化

pikachu_php反序列化 源代码 class S{var $test "pikachu";function __construct(){echo $this->test;} }//O:1:"S":1:{s:4:"test";s:29:"<script>alert(xss)</script>";} $html; if(isset($_POST[o])){$s $_POST[…

基于python人脸性别年龄检测系统-深度学习项目

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介简介技术组成1. OpenCV2. Dlib3. TensorFlow 和 Keras 功能流程 二、功能三、系统四. 总结 一项目简介 # Python 人脸性别年龄检测系统介绍 简介 该系统基…

Android studio 迁移之后打开没反应

把Android studio由d盘迁移到c盘&#xff0c;点击没反应&#xff1b; 需要把C:\Users\xxxx\AppData\Roaming\Google\AndroidStudio2022.3 目录下的studio64.exe.vmoptions 修改为C:&#xff0c;删除该文件会导致无法安装app。 里面配置了一个

SpringMVC问题

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

【React-Router】路由导航

1. 概念 路由系统中的多个路由之间需要进行路由跳转&#xff0c;并且在跳转的同时有可能需要传递参数进行通信。 2. 声明式导航 // /page/Login/index.jsimport { Link } from react-router-dom const Login () > {return <div>登录页{/* 解析成 a 链接 */}<Li…

Windows平台如何实现RTSP流二次编码并添加动态水印后推送RTMP或轻量级RTSP服务

技术背景 我们在对接RTSP播放器相关的技术诉求的时候&#xff0c;遇到这样的需求&#xff0c;客户做特种设备巡检的&#xff0c;需要把摄像头拍到的RTSP流拉下来&#xff0c;然后添加动态水印后&#xff0c;再生成新的RTSP URL&#xff0c;供平台调用。真个流程需要延迟尽可能…

6.基于蜻蜓优化算法 (DA)优化的VMD参数(DA-VMD)

代码原理 基于蜻蜓优化算法 (Dragonfly Algorithm, DA) 优化的 VMD 参数&#xff08;DA-VMD&#xff09;是指使用蜻蜓优化算法对 VMD 方法中的参数进行自动调优和优化。 VMD&#xff08;Variational Mode Decomposition&#xff09;是一种信号分解方法&#xff0c;用于将复杂…

【数据结构】链表中二级指针的应用

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 (注:为方便演示本篇使用的x86系统,因此指针的大小为4个字节) 目录 &#x1f4cc;形参的改变不影响实参! 1.调用函数更改整型时传值调用与传址调用的区别 &#x1f38f;传值…

微服务学习|初识Docker、使用Docker、自定义镜像、DockerCompose、Docker镜像仓库

初识Docker 项目部署的问题 大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署时会碰到一些问题 依赖关系复杂&#xff0c;容易出现兼容性问题 开发、测试、生产环境有差异 Docker如何解决依赖的兼容问题的? 将应用的Libs (函数库)、Deps (依赖)配置与应用…

线性回归的正则方法:岭回归和Lasso

线性回归的正则方法包括岭回归&#xff08;Ridge Regression&#xff09;和Lasso回归&#xff08;Least Absolute Shrinkage and Selection Operator Regression&#xff09;。这两种方法都是为了解决线性回归中可能存在的过拟合问题而提出的。 选择使用岭回归还是Lasso回归通常…

3d标签云实现过程(tagcloud.js)同步原生和 vue

写在前面 本来是没有准备写这个知识点&#xff0c;但是下载这个 js 的时候发现很多都是要钱或者是积分的&#xff0c;我就不明白了一个开源了这么久的 js 怎么还有人拿来挣钱的&#xff0c;同时还有一些只有原生 html 的例子&#xff0c;但是现在都是 框架主导的一些项目&#…

【LeetCode二叉树进阶题目】606,102,107

二叉树进阶题目 606. 根据二叉树创建字符串解题思路及实现 102. 二叉树的层序遍历解题思路及实现 107. 二叉树的层序遍历 II解题思路及实现 606. 根据二叉树创建字符串 描述 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号…

晶振有哪几种?晶振旁边的两个电容起什么作用?

晶振可以分为普通晶振、温补晶振、压控晶振、恒温晶振、差分晶振。 普通晶振通常用作微处理器的时钟器件&#xff0c;主要应用于那些稳定度要求不要的设备中&#xff0c;例如电视机、微波炉。 温补晶振&#xff0c;在晶振内部采取了对晶体频率、温度特性进行补偿&#xff0c;已…

软文推广有什么作用?媒介盒子分享

数字时代&#xff0c;品牌方以往的营销打法可能需要应时而变&#xff0c;传统的广告模式很难将品牌推广出去&#xff0c;原因就在于传统广告的成本高昂并且针对性较弱&#xff0c;而软文推广能够通过较低的成本将产品或品牌信息送到消费者面前&#xff0c;今天媒介盒子就来分享…