STM32入门学习之ADC

1.ADC在STM32进行数据采集时十分重要。通过ADC可以将外界的数字信号转换为模拟信号,以满足采样的需求。(资料参考于正点原子)

STM32 拥有 1~3 ADC STM32F101/102 系列只有 1 ADC ),这些 ADC 可以独立使用,
也可以使用双重模式(提高采样率)。 STM32 ADC 12 位逐次逼近型的模拟数字转换器。
它有 18 个通道,可测量 16 个外部和 2 个内部信号源。各通道的 A/D 转换可以单次、连续、扫
描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。
模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高 / 低阀值。
STM32 ADC 的转换分为 2 个通道组:规则通道组和注入通道组。 注入通道的转换可以打断规则通道的转换, 在注入通道被转换完成之 后,规则通道才得以继续转换。
配置ADC的基本步骤为:
(1)使能相应的时钟。
(2)配置相应的引脚和引脚对应的ADC。
(3)配置ADC的通道信息。
(4)进行ADC校准,并开启ADC。
2.ADC的相关寄存器:
(1) ADC 控制寄存器( ADC_CR1 ADC_CR2 ):
ADC_CR1:
ADC_CR2:
(2) ADC 采样事件寄存器( ADC_SMPR1 ADC_SMPR2 ):
ADC_SMPR1:
ADC_SMPR2:
(3) ADC 规则序列寄存器( ADC_SQR1~3 ):
(4) ADC 规则数据寄存器 (ADC_DR):
(5) ADC 状态寄存器( ADC_SR): 该寄存器保存了 ADC 转换时的各种状态。
3.代码:本文只展示adc和main部分的代码,完整的工程可结合前面的文章。
(1)adc.h:
#ifndef __ADC_H
#define __ADC_H

#include "stm32f10x.h"
#include <stdio.h>

void adc_init(void);

#endif

(2) adc.c

#include "adc.h"

void adc_init(void)
{
	//¶¨ÒåGPIOºÍADCÏà¹ØµÄ½á¹¹Ìå
	GPIO_InitTypeDef GPIO_InitStructure;
	ADC_InitTypeDef ADC_InitStructure;
	
	//ʹÄÜGPIOAºÍADC1µÄʱÖÓ£º
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1,ENABLE);
	
	//ÉèÖÃADCµÄʱÖÓ£º
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);																//ÉèÖÃΪ6·ÖƵ£¬72/6=12£¬×î´ó²»Äܳ¬¹ý14M
	
	//ÅäÖÃPA1Òý½Å£º
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AIN;									//Ä£ÄâÊäÈë
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	//ÅäÖÃADCµÄÏà¹ØÐÅÏ¢£º
	ADC_DeInit(ADC1);																															//¸´Î»ADC,ʹµÃADCµÄËùÓмĴæÆ÷µÄֵΪȱʡֵ
	ADC_InitStructure.ADC_Mode 								= ADC_Mode_Independent;							//ADCµÄ¹¤×÷ģʽ
	ADC_InitStructure.ADC_ScanConvMode 				= DISABLE;													//ÊÇ·ñɨÃ裬µ¥Í¨µÀʱ²»ÐèҪɨÃè
	ADC_InitStructure.ADC_ContinuousConvMode 	= DISABLE;													//ÊÇ·ñÁ¬Ðøת»»
	ADC_InitStructure.ADC_ExternalTrigConv		= ADC_ExternalTrigConv_None;				//ADCµÄ´¥·¢·½Ê½£¬ÕâÀïÑ¡ÔñÈí¼þ´¥·¢
	ADC_InitStructure.ADC_DataAlign 					= ADC_DataAlign_Right;							//Ö¸¶¨ADCÊý¾ÝÓÒ¶ÔÆë
	ADC_InitStructure.ADC_NbrOfChannel				= 1;																//ÉèÖÃADCÒª½øÐÐת»»µÄͨµÀÊýÁ¿
	
	ADC_Init(ADC1,&ADC_InitStructure);											//ÅäÖÃADC1µÄ³õʼ»¯
	ADC_Cmd(ADC1,ENABLE);																		//ʹÄÜADC1
	
	//ÉèÖÃADC1µÄ¹æÔòת»»Í¨µÀ£º
	ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5);	//ADC1,ͨµÀ1£¬¹æÔòת»»Ë³ÐòΪ1£¬²ÉÑùʱ¼äΪ239.5¸öÖÜÆÚ
	
	//Ò»¶¨Òª½øÐÐУ׼£¬·ñÔò»áÓ°Ïì²ÉÑùµÄ׼ȷÐÔ
	ADC_ResetCalibration(ADC1);															//adc1¸´Î»Ð£×¼
	while(ADC_GetResetCalibrationStatus(ADC1));							//µÈ´ý¸´Î»Ð£×¼½áÊø
	
	ADC_StartCalibration(ADC1);															//¿ªÆôADCУ׼
	while(ADC_GetCalibrationStatus(ADC1));									//µÈ´ýУ׼Íê³É
	
	//ADC_SoftwareStartConvCmd(ADC1, ENABLE);									//Èí¼þ¿ªÆôADCת»»		
}


(3) main.c:

#include "stm32f10x.h"
#include "USART.h"
#include <stdio.h>
#include "adc.h"

extern u8 data;

int main(void)
{
	uint16_t adc;
	float temp;
	//ÖжÏÓÅÏȼ¶·Ö×飺
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	//³õʼ»¯´®¿ÚUSART1:
	usart_init(9600);
	adc_init();
	
	while(1)
	{
		ADC_SoftwareStartConvCmd(ADC1, ENABLE);									//Èí¼þ¿ªÆôADCת»»		
		while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC))						//µÈ´ýADCת»»Íê³É
		adc =  ADC_GetConversionValue(ADC1);										//»ñȡת»»½á¹û
		temp = (float)adc*(3.3/4096);		//3.3/4096Ϊ²ÉÑù¾«¶È£¬3.3vµÄÁ¿³Ì£¬12λADCÔòΪ4096.	
		printf("ADC = %f\r\n",temp);
	}
	return 0;
}


4. 运行结果:

5.总结:

本文介绍了STM32的ADC,在设计ADC采样时需要去了解相应的寄存器功能,然后利用结构体信息完成初始化。ADC在使用之前应该先进行校准,以提高采样的精确度。此外,需要注意在配置ADC的时钟时不能超过14M。

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

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

相关文章

20240504在RK3588的Buildroot系统下使用i2cdetect xxxx ppppp

20240504在RK3588的Buildroot系统下使用i2cdetect 2024/5/4 10:45 rootok3588:/# rootok3588:/# i2cdetect -y 0 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- …

2024年第六届先进材料、机械和制造国际会议(AMMM 2024)即将召开!

2024年第六届先进材料、机械和制造国际会议&#xff08;AMMM 2024&#xff09;将于2024年9月6-8日在日本东京举行。AMMM 2024将以国际材料&#xff0c;机械和制造为主题&#xff0c;吸引到来自多个领域的研究人员和学者相聚在一起分享知识&#xff0c;讨论想法&#xff0c;并了…

【系统架构师】-选择题(十二)

1、网闸的作用&#xff1a;实现内网与互联网通信&#xff0c;但内网与互联网不是直连的 2、管理距离是指一种路由协议的路由可信度。15表示该路由信息比较可靠 管理距离越小&#xff0c;它的优先级就越高&#xff0c;也就是可信度越高。 0是最可信赖的&#xff0c;而255则意味…

Typora编辑markdown的技巧

参考视频的B站链接&#xff1a; 手把手教你撰写Typora笔记 在其中选择了常用的部分做标记。 一、标题 使用ctrl数字键&#xff0c;可以快捷的把一行文字变成n级标题 二、源代码模式 可以在下图所示进入 三、设置typora能够自动显示粘贴的图片 打开“偏好设置”&#xff0…

利用 Zstandard (zstd) 高效压缩数据

目录标题 1. Zstandard 压缩算法概述主要特性&#xff1a; 2. Zstandard 在实践中的应用应用案例&#xff1a; 3. 如何使用 Zstandard3.1 安装 Zstandard3.2 使用命令行工具3.3 集成到程序中 4. 总结 在大数据时代&#xff0c;如何高效地存储和传输数据成为了许多企业和开发者面…

Elasticsearch 数据聚合

Bucket聚合&#xff08;桶聚合&#xff09; 对文档做分组&#xff0c;aggs 按照文档字段值或日期进行分组&#xff0c;能参与分词的字段不能做聚合&#xff0c;如text类型的字段 例如&#xff1a;根据城市名称做聚合&#xff0c;也就是城市名称对数据进行分组统计。可以加qu…

OSPF优化

OSPF的优化主要目的是为了减少LSA的更新量 路由汇总-----可以减少骨干区域的LSA数量 特殊区域-----可以减少非骨干区域的LSA数量 OSPF路由汇总 域间路由汇总 域间路由汇总在ABR设备上进行操作 [GS-R2-ospf-1-area-0.0.0.1]abr-summary 192.168.0.0 255.255.224.0 [GS-R3-o…

面经总结系列(二): 面壁智能大模型算法工程师

&#x1f468;‍&#x1f4bb;作者简介&#xff1a; CSDN、阿里云人工智能领域博客专家&#xff0c;新星计划计算机视觉导师&#xff0c;百度飞桨PPDE&#xff0c;专注大数据与AI知识分享。✨公众号&#xff1a;GoAI的学习小屋 &#xff0c;免费分享书籍、简历、导图等&#xf…

设计模式之数据访问对象模式

在Java编程的浩瀚星海中&#xff0c;有一个模式低调却强大&#xff0c;它像是一位默默无闻的超级英雄&#xff0c;支撑起无数应用的数据脊梁——那就是数据访问对象&#xff08;DAO, Data Access Object&#xff09;模式&#xff01;想象一下&#xff0c;如果你能像操纵魔法一样…

网络基础(全)

协议 ”协议“就是一种约定。那么协议需要需要管理吗&#xff1f;答案是当然需要管理呀。 操作系统要进行协议管理——先描述&#xff0c;在组织协议本质就是软件&#xff0c;软件是可以进分层的协议在设计的时候&#xff0c;就是被层状的划分的为什么要划分为层状结呢&#…

综合能源系统:Modbus转IEC104网关解决方案

Modbus转IEC104网关BE102 方案概述 Modbus和IEC104是两种通信协议&#xff0c;各自适用于不同行业和场景&#xff0c;其中Modbus常见于工业自动化&#xff0c;而IEC104则主导电力行业。在某些项目中&#xff0c;需要将Modbus设备的数据传至IEC104电力平台&#xff0c;但两者协…

[嵌入式系统-65]:RT-Thread-组件:FinSH控制台, 用户与RT Thread OS实时命令行交互工具

目录 FinSH 控制台 1. FinSH 简介 2. FinSH 内置命令 - 内核代码自身提供的命令 显示线程状态 显示信号量状态 显示事件状态 显示互斥量状态 显示邮箱状态 显示消息队列状态 显示内存池状态 显示定时器状态 显示设备状态 显示动态内存状态 3. 自定义 FinSH 命令 …

【5/01-5/03】 Arxiv安全类文章速览

知识星球 首先推荐一下我们的知识星球&#xff0c;以AI与安全结合作为主题&#xff0c;包括AI在安全上的应用和AI本身的安全&#xff1b; 加入星球你将获得&#xff1a; 【Ai4sec】&#xff1a;以数据驱动增强安全水位&#xff0c;涵盖内容包括&#xff1a;恶意软件分析&…

MATLAB中功率谱密度计算pwelch函数使用详解

MATLAB中功率谱密度计算pwelch函数使用详解 目录 前言 一、pwelch函数简介 二、pwelch函数参数说明 三、pxx pwelch(x)示例 四、[pxx,f]pwelch(x,window,noverlap,nfft,fs)示例 四、[pxx,f] pwelch(x,window,noverlap,nfft,fs,freqrange,spectrumtype)示例 五、多通道功…

# cmd 报错 “npm 不是内部或外部命令,也不是可运行的程序 或批处理文件”

cmd 报错 “npm 不是内部或外部命令,也不是可运行的程序 或批处理文件” 1、报错原因分析&#xff1a; Node.js 没有安装或安装不正确。 npm 的路径没有添加到系统环境变量中。 安装 Node.js 时选择了不包含 npm 的安装选项。 2、解决方法&#xff1a; 1&#xff09;在 cm…

【房屋】租房攻略,萌新第一次租房需要考虑的要素(通勤、地段、房源)

【房屋】租房攻略&#xff0c;萌新第一次租房需要考虑的要素&#xff08;通勤、地段、房源&#xff09; 文章目录 1、位置要好&#xff08;通勤近 vs 地段好&#xff09;2、户型要好&#xff08;朝向/楼层&#xff0c;独卫/家具&#xff0c;水电费&#xff09;3、价格要便宜4、…

Github 2024-05-03 Java开源项目日报 Top9

根据Github Trendings的统计,今日(2024-05-03统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9Kotlin项目1C++项目1libGDX: 跨平台Java游戏开发框架 创建周期:4284 天开发语言:Java, C++协议类型:Apache License 2.0Star数量:2…

DDD:根据maven的脚手架archetype生成ddd多模块项目目录结构

随着领域驱动的兴起&#xff0c;很多人都想学习如何进行ddd的项目开发&#xff0c;那ddd的项目结构是怎么样的&#xff1f;又是如何结合SpringBoot呢&#xff1f;那么针对这个问题&#xff0c;笔者使用maven的archetype封装一个相对通用的ddd的项目目录&#xff0c;方便一键生成…

函数模板 template

函数模板的定义和调用 注意&#xff1a; 在调用函数模板时&#xff0c;编译器会根据调用的函数的参数类型自动推导出T的类型。 优先选择普通函数 强制调用函数模板 函数模板不能对函数的参数自动强制类型转换 myPrintAll(10,b)//普通函数&#xff0c;因为普通函数将b强制转换成…

安装vscode基础配置,es6基础语法,

https://code.visualstudio.com/ es6 定义变量 const声明常量&#xff08;只读变量&#xff09; // 1、声明之后不允许改变 const PI “3.1415926” PI 3 // TypeError: Assignment to constant variable. // 2、一但声明必须初始化&#xff0c;否则会报错 const MY_AGE /…
最新文章