当前位置: 首页 > news >正文

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

相关文章:

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

028 - STM32学习笔记 - 结构体学习&#xff08;二&#xff09; 上节对ADC基础知识进行了学习&#xff0c;这节在了解一下ADC相关的结构体。 一、ADC初始化结构体 在标准库函数中基本上对于外设都有一个初始化结构体xx_InitTypeDef&#xff08;其中xx为外设名&#xff0c;例如…...

Pytest自动化测试框架:mark用法---测试用例分组执行

pytest中的mark&#xff1a; mark主要用于在测试用例/测试类中给用例打标记(只能使用已注册的标记名)&#xff0c;实现测试分组功能&#xff0c;并能和其它插件配合设置测试方法执行顺序等。 如下图&#xff0c;现在需要只执行红色部分的测试方法&#xff0c;其它方法不执行&am…...

【TCP连接的状态】

linux查看tcp的状态命令&#xff1a; 1&#xff09;、netstat -nat 查看TCP各个状态的数量 2&#xff09;、lsof -i:port 可以检测到打开套接字的状况 3)、 sar -n SOCK 查看tcp创建的连接数 4)、tcpdump -iany tcp port 9000 对tcp端口为9000的进行抓包 查看占用端口…...

Node.js入门指南(一)

目录 Node.js入门 什么是Node.js Node.js的作用 Node.js安装 Node.js编码注意事项 Buffer(缓冲器&#xff09; 定义 使用 fs模块 概念 文件写入 文件读取 文件移动与重命名 文件删除 文件夹操作 查看资源状态 路径问题 path模块 Node.js入门 什么是Node.js …...

使用Grpc实现高性能PHP RPC服务

文档&#xff1a;Quick start | PHP | gRPC 下面将介绍使用 Grpc 和 Protobuf 实现高性能 RPC 服务的具体步骤&#xff1a; 1. 安装 Grpc 和 Protobuf 首先需要安装 Grpc 和 Protobuf。可以从官网下载相应的安装包&#xff08;Supported languages | gRPC&#xff09;或通过…...

二、爬虫-爬取肯德基在北京的店铺地址

1、算法框架解释 针对这个案例&#xff0c;现在对爬虫的基础使用做总结如下&#xff1a; 1、算法框架 (1)设定传入参数 ~url: 当前整个页面的url:当前页面的网址 当前页面某个局部的url:打开检查 ~data:需要爬取数据的关键字&…...

linux驱动开发.之spi测试工具spidev_test源码(一)

同i2c-tools工具类似&#xff0c;spidev_test是用来测试SPI BUS的用户态程序&#xff0c;其源码存在kernel目录下的tools下&#xff0c;具体为tools\spi\spidev_test.c。buildroot同样也提供名为spidev_test的package&#xff0c;可以直接进行编译&#xff0c;方便用户调试spi总…...

基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码

基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于材料生成优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…...

Go——二、变量和数据类型

Go 一、Go语言中的变量和常量1、Go语言中变量的声明2、如何定义变量方式1&#xff1a;方式2&#xff1a;带类型方式3&#xff1a;类型推导方式定义变量方式4&#xff1a;声明多个变量总结 3、如何定义常量4、Const常量结合iota的使用 二、Golang的数据类型1、概述2、整型2.1 类…...

合并区间问题

以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff1a;intervals [[1,…...

2023 年最新 MySQL 数据库 Windows 本地安装、Centos 服务器安装详细教程

MySQL 基本概述 MySQL是一个流行的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛应用于各种业务场景。它是由瑞典MySQL AB公司开发&#xff0c;后来被Sun Microsystems收购&#xff0c;最终被甲骨文公司&#xff08;Oracle Corporation&#xff09;收购…...

每天一道算法题(十)——获取和为k的子数组

文章目录 1、问题2、示例3、解决方法&#xff08;1&#xff09;方法1——双指针 总结 1、问题 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 2、示例 示例 1&#xff1a; 输入&#x…...

2023年亚太杯数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 最短时…...

在vscode中使用Latex:TexLive2023

安装TexLive2023及配置vscode可参考https://zhuanlan.zhihu.com/p/166523064 然后编译模板 .tex文件时&#xff0c;出现以下几个错误&#xff1a; 1. ctexbook找不到字体集 d:/texlive/2023/texmf-dist/tex/latex/ctex/ctexbook.cls:1678: Class ctexbook Error: CTeX fo…...

Unity开发之C#基础-File文件读取

前言 今天我们将要讲解到c#中 对于文件的读写是怎样的 那么没接触过特别系统编程小伙伴们应该会有一个疑问 这跟文件有什么关系呢&#xff1f; 我们这样来理解 首先 大家对电脑或多或少都应该有不少的了解吧 那么我们这些软件 都是通过变成一个一个文件保存在电脑中 我们才可以…...

深度学习之二(前馈神经网络--Feedforward Neural Network)

概念 前馈神经网络(Feedforward Neural Network)是一种最基本的神经网络结构,也被称为多层感知器(Multilayer Perceptron,MLP)。它的特点是信息只在网络中单向传播,不会形成环路。每一层神经元的输出都作为下一层神经元的输入,没有反馈回路。 结构: 前馈神经网络通…...

2023全球边缘计算大会深圳站-核心PPT资料下载

一、峰会简介 边缘计算&#xff0c;是指在靠近物或数据源头的一侧&#xff0c;采用网络、计算、存储、应用核心能力为一体的开放平台&#xff0c;就近提供最近端服务。其应用程序在边缘侧发起&#xff0c;产生更快的网络服务响应&#xff0c;满足行业在实时业务、应用智能、安…...

【亚太杯思路助攻】2023年第十三届APMCM亚太地区大学生数学建模竞赛——(文末领取方式)

2023年第十三届APMCM亚太地区大学生数学建模竞赛——来啦&#xff01;&#xff01;&#xff01; 大家准备好了吗&#xff1f;别担心&#xff0c;【数模加油站】会像数模国赛、研赛一样&#xff0c;第一时间提供无偿解题思路、代码、参考文献等资料帮助大家。 祝各位小伙伴都能…...

vue开发一、在Vue中引入ElementUI二、在Vue中使用阿里图标库

目录 一、在Vue中引入ElementUI1. 安装ElementUI2. 引入ElementUI3. 使用ElementUI组件 二、在Vue中使用阿里图标库1. 在阿里图标库中选择图标2. 下载图标3. 引入图标4. 使用图标 总结 一、在Vue中引入ElementUI ElementUI是一种基于Vue的第三方UI库&#xff0c;提供了许多常用…...

基于SpringBoot+Mybatis plus+React.js实现条件选择切换搜索功能

笔记/朱季谦 在写React前端逻辑时&#xff0c;经常遇到可以切换不同条件的列表查询功能&#xff0c;例如下边截图这样的&#xff0c;其实&#xff0c;这块代码基本都一个逻辑&#xff0c;可以一次性将实现过程记录下来&#xff0c;待以后再遇到时&#xff0c;直接根据笔记复用…...

LLM工作流引擎:构建智能自动化流程的核心架构与实践

1. 项目概述&#xff1a;当LLM遇上工作流引擎最近在开源社区里&#xff0c;一个名为llm-workflow-engine的项目引起了我的注意。这个名字本身就很有意思&#xff0c;它把两个当下最火的概念——“大语言模型”和“工作流引擎”——直接焊在了一起。作为一个在自动化和AI应用领域…...

独立开发者如何借助 Taotoken 以更低成本启动 AI 产品原型

独立开发者如何借助 Taotoken 以更低成本启动 AI 产品原型 1. 独立开发者的 AI 产品原型挑战 对于独立开发者或小型团队而言&#xff0c;启动 AI 产品原型往往面临多重挑战。最直接的困难是初期资金有限&#xff0c;难以承担高昂的模型调用成本。传统方式需要为不同模型分别注…...

别再死记硬背了!用STM32CubeMX配置CAN波特率,手把手教你算Tq和采样点

告别手动计算&#xff1a;用STM32CubeMX智能配置CAN总线参数的实战指南 当你第一次在STM32项目中使用CAN总线时&#xff0c;是否曾被数据手册里那些晦涩的位时间参数搞得晕头转向&#xff1f;作为嵌入式开发者&#xff0c;我们经常需要在有限的时间内完成通信模块的配置&#x…...

RocketMQ入门第一篇:核心概念与整体工作原理零基础详解

文章目录一、前言&#xff1a;为什么学RocketMQ&#xff1f;它到底是什么&#xff1f;二、RocketMQ核心基础概念&#xff1a;看懂术语才算入门1. 消息&#xff08;Message&#xff09;&#xff1a;传输的最小数据单元2. 主题&#xff08;Topic&#xff09;&#xff1a;消息的一…...

实验室4篇论文被ICML 2026录用

点击下方卡片&#xff0c;关注“CVer”公众号AI/CV重磅干货&#xff0c;第一时间送达点击进入—>【顶会/顶刊】投稿交流群添加微信号&#xff1a;CVer2233&#xff0c;小助手拉你进群&#xff01;扫描下方二维码&#xff0c;加入CVer学术星球&#xff01;可以获得最新顶会/顶…...

【让你的电脑更好用】提升办公效率 OpenClaw 2.6.6 技能使用教程(含安装包)

OpenClaw 2.6.6 实用技能推荐&#xff5c;办公效率提升必备&#xff08;新手友好&#xff09; OpenClaw&#xff08;小龙虾&#xff09;的核心优势在于Skill 技能扩展。开启对应技能后&#xff0c;AI 可直接执行各类操作&#xff0c;满足文件整理、办公自动化、浏览器操作、系…...

企业内部工具如何通过统一API密钥管理实现安全接入

企业内部工具如何通过统一API密钥管理实现安全接入 1. 企业AI服务接入的安全挑战 在企业内部工具中集成AI能力时&#xff0c;开发团队通常面临三个核心问题&#xff1a;多项目密钥分散管理困难、调用行为难以追踪、以及成本分配不透明。传统做法是为每个项目单独申请不同厂商…...

2025年全球开发者时间处理习惯报告:为什么Arrow库成为Python开发者的终极选择

2025年全球开发者时间处理习惯报告&#xff1a;为什么Arrow库成为Python开发者的终极选择 【免费下载链接】arrow &#x1f3f9; Better dates & times for Python 项目地址: https://gitcode.com/gh_mirrors/ar/arrow 在Python开发中&#xff0c;日期和时间处理一直…...

电子产品风扇噪音评估与系统级噪音优化的综合解决方案

&#x1f393;作者简介&#xff1a;科技自媒体优质创作者 &#x1f310;个人主页&#xff1a;莱歌数字-CSDN博客 211、985硕士&#xff0c;从业16年 从事结构设计、热设计、售前、产品设计、项目管理等工作&#xff0c;涉足消费电子、新能源、医疗设备、制药信息化、核工业…...

别再报错‘PowerSI executable not found’了!手把手教你搞定Cadence 2017.4与Sigrity 2019的完整安装与联调

彻底解决Cadence与Sigrity联调报错&#xff1a;从安装到仿真的全流程指南 每次打开Allegro Sigrity SI准备大展拳脚时&#xff0c;突然跳出的"PowerSI executable not found"报错对话框&#xff0c;就像一盆冷水浇灭了所有热情。这个看似简单的路径配置问题&#xff…...