STM32入门学习之ADC

news/2024/9/23 11:13:28/

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.ppmy.cn/news/1453663.html

相关文章

Angular进阶-NVM管理Node.js实现不同版本Angular环境切换

一、NVM介绍 1. NVM简介 Node Version Manager&#xff08;NVM&#xff09;是一个用于管理多个Node.js版本的工具。它允许用户在同一台机器上安装和使用多个Node.js版本&#xff0c;非常适合需要同时进行多个项目的开发者。NVM是开源的&#xff0c;支持MacOS、Windows和Linux…

MySQL ORDER BY实例及性能优化分析

MySQL ORDER BY简介 当使用SELECT语句从表中查询数据时&#xff0c;结果集不会按任何顺序排序。要对结果集排序&#xff0c;请使用ORDER BY 子句。ORDER BY 子句允许您&#xff1a; 按单列或多列对结果集排序。按升序或降序对不同列进行结果集排序。 下面介绍了ORDER BY子句…

【论文阅读】HAT-Activating More Pixels in Image Super-Resolution Transformer

Activating More Pixels in Image Super-Resolution Transformer 论文地址摘要1 介绍2 相关工作2.1 图像深度网络 SR2.2 Vision Transformer 3 方法3.1 Motivation3.2 Network Architecture总体结构。Residual Hybrid Attention Group (RHAG)。混合注意块&#xff08;HAB&#…

apex英雄在哪个平台玩/apex英雄在哪下 新手详细apex英雄下载教程

是一款以团队合作和技能搭配为核心的第一人称射击游戏&#xff0c;玩家在游戏中扮演传奇角色&#xff0c;通过击败对手、收集物资和装备来提升自己的实力&#xff0c;游戏中的玩法元素丰富多样&#xff0c;包括但不限于地图交火、队伍配置、决策、身法技巧、复活机制和道具管…

计算机网络实验一:对等网络的构建

实验一:对等网络的构建 1、实验要求 (1)掌握TCP/IP协议的配置; (2)掌握常见网络命令的使用; (3)掌握组建windows对等网络并配置文件共享。 2、实验内容 (1)以Microsofe Winodws 系统为例,对TCP/IP协议进行安装和配置; (2)学习使用常见的网络命令,并了解…

kettle将excel表数据导入到oracle表中

上一篇已经介绍过kettle8.2的安装。 之前一直使用的sqlldr导入外部表&#xff0c;导入比较耗时&#xff0c;这次想使用一下kettle试试。 1.新建转换 2.新建输入 3.新建输出 4.转换新建完成 5.配置输入 加载表格文件 配置工作表 加载字段 6.配置输出 测试数据库连接 这…

LeetCode-hot100题解—Day6

原题链接&#xff1a;力扣热题-HOT100 我把刷题的顺序调整了一下&#xff0c;所以可以根据题号进行参考&#xff0c;题号和力扣上时对应的&#xff0c;那么接下来就开始刷题之旅吧~ 1-8题见LeetCode-hot100题解—Day1 9-16题见LeetCode-hot100题解—Day2 17-24题见LeetCode-hot…

【Linux系统化学习】网络套接字(编写简单的UDP服务端和客户端)

目录 理解源IP地址和目的IP地址 认识端口号 端口号和进程ID的区别 源端口号和目的端口号 认识TCP和UDP协议 TCP协议 UDP协议 网络字节序 socket编程接口 socket常见API sockaddr结构 简单的UDP网络程序 UDP服务端 创建套接字 填充本地网络信息 绑定 收取消息 …