STM32入门学习之ADC

news2024/11/16 23:32:22

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.coloradmin.cn/o/1643138.html

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

相关文章

《老相册》读后感

外面在下着瓢泼大雨&#xff0c;豆粒大的雨点打在窗户上&#xff0c;发出啪啪的巨响。这样的雨天&#xff0c;是不适宜外出的&#xff0c;最惬意的方式就是一个人待在宿舍里&#xff0c;打开一本书&#xff0c;慢慢地看&#xff0c;静静地想&#xff0c;让所有的烦恼融化在这雨…

数据结构学习/复习7--栈的实现/括号匹配练习题/队列的实现/队列实现栈练习

一、栈 1.概念及性质 2.栈的实现(top0版) 注意事项&#xff1a;top也可初始为-1,代码需要调整 二、栈练习 1.括号匹配 三、队列 1.概念及性质 2、队列的实现 四、队列练习 1.两个队列实现栈

从零开始学AI绘画,万字Stable Diffusion终极教程(四)

【第4期】图生图 欢迎来到SD的终极教程&#xff0c;这是我们的第四节课 这套课程分为六节课&#xff0c;会系统性的介绍sd的全部功能&#xff0c;让你打下坚实牢靠的基础 1.SD入门 2.关键词 3.Lora模型 4.图生图 5.controlnet 6.知识补充 在前面的课程中&#xff0c;我…

动手写一个简单的Android 表格控件支持固定列

Android 动手写一个简洁版表格控件 简介 源码已放到 Github Gitee 作为在测绘地理信息行业中穿梭的打工人&#xff0c;遇到各种数据采集需求&#xff0c;既然有数据采集需求&#xff0c;那当然少不了数据展示功能&#xff0c;最常见的如表格方式展示。 当然&#xff0c;类似…

论文辅助笔记:TimeLLM

1 __init__ 2 forward 3 FlattenHead 4 ReprogrammingLayer

Go 语言基础(一)【基本用法】

前言 最近心情格外不舒畅&#xff0c;不仅仅是对前途的迷茫&#xff0c;这种迷茫倒是我自己的问题还好&#xff0c;关键它是我们这种普通吗喽抗衡不了的。 那就换个脑子&#xff0c;学点新东西吧&#xff0c;比如 Go&#xff1f; 1、Go 语言入门 介绍就没必要多说了&#xff0…

vue快速入门(五十四)$nextTick的使用

注释很详细&#xff0c;直接上代码 上一篇 新增内容 $nextTick的使用场景演示 源码 App.vue <template><div id"app"><h3>{{name}}</h3><button click"showfixed">修改</button><form action"post" v-s…

Git常用(持续更新)

常用场景&#xff1a; 初始化&#xff1a; git config --global user.name "codelabs" git config --global user.email mycodelabs.com git init git remote add origin https://github.com/username/repository.git git pull origin master 提交&#xff1a; gi…

设计模式: 责任链模式

目录 一&#xff0c;责任链模式 二&#xff0c;特点 四&#xff0c;实现步骤 五&#xff0c;代码 一&#xff0c;责任链模式 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种软件设计模式&#xff0c;它属于行为型模式。在这种模式中&#xff0c…

2024五一赛数学建模A题B题C题完整思路+数据代码+参考论文

A题 钢板最优切割路径问题 &#xff08;完整资料在文末获取&#xff09; 1. 建立坐标系和表示方法&#xff1a; 在建模之前&#xff0c;我们需要将切割布局转换为数学表示。首先&#xff0c;我们可以将布局中的每个点表示为二维坐标系中的一个点。例如&#xff0c;B1可以表示…

【吊打面试官系列】Java高并发篇 - Thread 类中的 yield 方法有什么作用?

大家好&#xff0c;我是锋哥。今天分享关于 【Thread 类中的 yield 方法有什么作用&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Thread 类中的 yield 方法有什么作用&#xff1f; 使当前线程从执行状态&#xff08;运行状态&#xff09;变为可执行态&#x…

【数据结构(邓俊辉)学习笔记】列表04——排序器

文章目录 0. 统一入口1. 选择排序1.1 构思1.2 实例1.3 实现1.4 复杂度 2. 插入排序2.1 构思2.2 实例2.3 实现2.4 复杂度分析2.5 性能分析 3. 归并排序3.1 二路归并算法3.1.1 二路归并算法原理3.1.2 二路归并算法实现3.1.3 归并时间 3.2 分治策略3.2.1 实现3.2.2 排序时间 4. 总…

源支付V7开源版,源支付开源版,已去除安装扩展

源支付V7开源版&#xff0c;源支付开源版&#xff0c;已去除安装扩展 上传源码 设置伪静态 已去除安装扩展&#xff0c;直接上传就可以安装 开源版通道少了好几个 视频教程&#xff1a;https://www.bilibili.com/video/BV1mZ42177VY/

基于OpenCV-DNN的YOLOv9目标检测实现

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

力扣打卡第二天

206. 反转链表 class Solution { public:ListNode* reverseList(ListNode* head) {// //迭代法// ListNode *pre nullptr;// ListNode *curr head;// while(curr){// ListNode *next curr -> next;// curr -> next pre;// pre curr;// curr next;/…

【实时数仓架构】方法论

笔者不是专业的实时数仓架构&#xff0c;这是笔者从其他人经验和网上资料整理而来&#xff0c;仅供参考。写此文章意义&#xff0c;加深对实时数仓理解。 一、实时数仓架构技术演进 1.1 四种架构演进 1&#xff09;离线大数据架构 一种批处理离线数据分析架构&#xff0c;…

SFOS1:开发环境搭建

一、简介 最近在学习sailfish os的应用开发&#xff0c;主要内容是QmlPython。所以&#xff0c;在开发之前需要对开发环境&#xff08;virtualBox官方SDKcmake编译器python&#xff09;进行搭建。值得注意的是&#xff0c;我的开发环境是ubuntu22.04。如果是windows可能大同小异…

ZooKeeper以及DolphinScheduler的用法

目录 一、ZooKeeper的介绍 数据模型 ​编辑 操作使用 ①登录客户端 ​编辑 ②可以查看下面节点有哪些 ③创建新的节点&#xff0c;并指定数据 ④查看节点内的数据 ⑤、删除节点及数据 特殊点&#xff1a; 运行机制&#xff1a; 二、DolphinScheduler的介绍 架构&#…

回溯法——(1)装载问题(C语言讲解)

目录 一、装载问题 1.问题概括&#xff1a; 2.解决方案&#xff08;思路&#xff09;&#xff1a; 3.图片讲解&#xff08;超详细&#xff09;&#xff1a; 4.代码分析&#xff1a; 二、算法改进&#xff1a;引入上界函数 1.问题概念&#xff1a; 2.图片讲解&#xff1a…

Room简单实操

1. Room介绍&#xff0c;直接Copy官网介绍&#xff1a; Room 持久性库在 SQLite 上提供了一个抽象层&#xff0c;以便在充分利用 SQLite 的强大功能的同时&#xff0c;能够流畅地访问数据库。具体来说&#xff0c;Room 具有以下优势&#xff1a; 提供针对 SQL 查询的编译时验…