STM32快速入门(ADC数模转换)

news2024/11/26 21:22:40

STM32快速入门(ADC数模转换)

前言

ADC数模转换存在的意义就是将一些温度传感器、各自数据传感器产生的模拟信号转换成方便识别和计算的数字信号。

导航

图24 通用定时器框图:

在这里插入图片描述

图片截取自STM32 F1XX中文参考手册。还是以框图为中心,来叙述我对ADC的理解。

ACD实现细节

核心原理

所谓ADC转换目的是为了将连续变化的模拟量转变成数字,方便程序的计算。这里的模拟量不单单指代那些以正弦规律变化的波形,只要是连续变化的波形,我们都称它为模拟量。简单来说,数模转化器就是按一定分辨率对连续变化的模拟信号进行切分,每一段都会给他进行数字编码,当然分辨越大,模拟信号被切分的越细,精度也会越精确。图片引用自知乎,如有侵权,可联系我将其删除,如图:

在这里插入图片描述

ADC转换器的实现是:首先对输入的模拟信号进行采样,因为数模转换的精度是确定的,所以会以精度来进行一个二分,每次取命中的精度范围的中间数值,然后将数值通过DA转换,转换成模拟量,然后和采样的模拟量比较,判断大小,再进行一次二分,最终确定采样的模拟量对应的数字编码是多少。这里帖一张简单8位的ADC内部构造的原理图,图片引用自江协科技,如有侵权,联系我将其删除,如图2。

在这里插入图片描述

图24的中间部分

回到图24,框图左侧ADCx_INx就是各个GPIO端口也称为通道,模拟信号可以从这里输入,旁边的GPIO端口矩形框,内部就是一个硬件开关,STTM32中的ACD一次可以处理多个ADC通道的转换,通道的转换就靠硬件开关来选择。我们这里主要讲规则通道的转换。注入通道原理其实是一样的。规则通道有16路通道,而输出寄存器只有一个,所以在完成一次通道的转换,我们就应该快速讲输出寄存器的值读取走,不然就会覆盖,一般会配合DMA使用。中间的模拟至数字转换器的内部原理就是图2所示。ADCCLK就是给ADC转换器的驱动时钟,和图2的CLOCK引脚对应。

图24的上半部分

图2上部分有连接到输出寄存器(包括1个规则通道寄存器、4个注入通道寄存器)的各种标志位,这些标志位都有相应的寄存器,并且也能触发中断。模拟看门狗的作用在图中也描述的非常明了,就是给定一个检测范围,在范围中就会触发标志位或中断。

图24的下半部分

下半部分就是描绘数模转换触发的一些方式,这里是支持硬件触发的软件触发。硬件触发包括主模式下定时器的TRGO输出、以及定时器的输出通道、外部中断的触发等。各种触发方式和图2的START引脚对应。

实现ADC转换的细节记录

1. 首先要区分:间断模式和扫描模式、单次转换和连续转换。

所谓间断模式,就是一次触发只转换部分通道。所谓扫描,就是一次触发将规则组(注入组)的所有待转换的通道都转换完。

所谓单次转换,就是将规则组转换完了,就停止转换。所谓连续转换,就是规则组(注入组)转换完了,就自动从头开始新一轮的转换。

间断模式和扫描模式通过配置ADC_CR1.SCAN[8]可以开启或者关闭扫描模式,规则组和注入组共用这一位。通过配置ADC_CR1.JDISCEN[12]、ADC_CR1.DISCEN[11]分别可以配置注入组或者规则组去启用或禁用间断模式。通过配置ADC_CR1.DISCNUM[15:13]可以配置间断模式下规则组一次触发事件转换的通道数目,这里只强调规则组!中文手册并没提到注入组,目前不确认规则组是否也受该位的影响!扫描模式下,只有最后一个条目转换完毕才会置位EOC。

具体使用连续转换还是单次转换,由ADC_CR2.CONT[1]控制。

2. 关于看门狗的细节

规则组和注入组可以独立的开启模拟看门狗,分别使用ADC_CR1.AWDEN[23]、ADC_CR1.JAWDEN[22],通过ADC_CR1.AWDSGL[9]位可以实现扫描模式下让看门狗只监控一个特定通道,监视的通道号由ADC_CR1.AWDCH[4:0]位给出。

3. 模式选择和触发方式

本文只讲解独立模式的配置,由ADC_CR1.DUALMOD[19:16]可以配置是独立模式还是双模式。规则组和注入组都可以独立配置触发方式。规则组通过ADC_CR2.EXTSEL[19:17]选择触发源。典型值是[111:软件触发SWSTART],还需要使用ADC_CR2.EXTTRIG[20]使能外部触发源。ADC_CR2.SWSTART[22]置位可激活软件触发,使规则组开始转换。

4. 规则组和通道的关系

STM32F103系列规则组可以有16个条目(entry)(标号从1开始,范围[1, 16]),通道一共有18个(标号从0开始,范围[0, 17])。

ADC1的模拟输入通道16和通道17在芯片内部分别连到了温度传感器和VREFINT。

ADC2的模拟输入通道16和通道17在芯片内部连到了VSS。

ADC3模拟输入通道9、14、15、16、17与Vss相连。

每个通道可以单独配置其采样时间。ADC_SMPRx(x=1、2)。通过配置ADC_SQRx(x=1、2、3)可以配置规则组每个条目指向哪个通道。其中ADC_SQR1.L[23:20]可设置规则组中有效条目的长度(也即通道数目)。

盗取江协科技的图片如下:

在这里插入图片描述

ADC转换的库函数实现

硬件接线图如下:

在这里插入图片描述

在这里插入图片描述

GPIO对应的ADC如下:

在这里插入图片描述

由表可知,我们需要配置的是ADC3

GPIO配置如下:

在这里插入图片描述

核心代码如下:

void LunarADCInit(void) {
	GPIO_InitTypeDef GPIOF8_Cfg;
	ADC_InitTypeDef ADC3_Cfg;

	// 先配置ADCCLK预分频器		12M HZ
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	// 打开ADC1时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);
	GPIOF8_Cfg.GPIO_Mode = GPIO_Mode_AIN;
	GPIOF8_Cfg.GPIO_Pin = GPIO_Pin_8;
	GPIOF8_Cfg.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOF, &GPIOF8_Cfg);

	ADC3_Cfg.ADC_ContinuousConvMode = ENABLE;					// 连续转换使能
	ADC3_Cfg.ADC_DataAlign = ADC_DataAlign_Left;
	ADC3_Cfg.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	// 软件触发
	ADC3_Cfg.ADC_Mode = ADC_Mode_Independent;					// 独立模式
	ADC3_Cfg.ADC_NbrOfChannel = 1;								// 只转换一个序列
	ADC3_Cfg.ADC_ScanConvMode = ENABLE;							// 使用扫描模式
	ADC_Init(ADC3, &ADC3_Cfg);

	ADC_RegularChannelConfig(ADC3, ADC_Channel_6, 1, ADC_SampleTime_7Cycles5);	// 配置规则序列寄存器以及通道采样时间

	ADC_Cmd(ADC3, ENABLE);

	ADC_ResetCalibration(ADC3);
	while (ADC_GetResetCalibrationStatus(ADC3) == SET);	// 硬件置0

	ADC_StartCalibration(ADC3);
	while (ADC_GetCalibrationStatus(ADC3) == SET);	// 硬件置0


	ADC_SoftwareStartConvCmd(ADC3, ENABLE);
	while (ADC_GetFlagStatus(ADC3, ADC_FLAG_STRT) == RESET);
}
 
 int main() {
	// 初始化usart
	LunarInitUSART1();
	LunarADCInit();

	SYSTick_Init();

	LunarNVICInit();

	printf("stm32 启动\n");

	int t = 3;
	while(1) {
		printf("light:%d\r\n", ADC_GetConversionValue(ADC3));
		while (t > 0){
			t--;
			Delay_Ms(1000);
		}
		t= 3;

	}

	return 0;
 }

实验现象就是手机背光照射光敏电阻时,ADC转换数值变小。


本章完结

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

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

相关文章

MySQL—多表查询—标量子查询

一、引言 上篇学习完子查询的概念和分类。 现在来学习第一种子查询——标量子查询。 (1)标量子查询的基本概念 子查询返回的结果是单个值,也就是一行一列(可以是数字、字符串、日期等) 是一种最简单的子查询形式&am…

Go 语言的函数详解:语法、用法与最佳实践

在 Go 语言的世界里,函数是构建和维护任何应用程序的基石。不仅因为它们提供了一种将大问题划分为更小、更易管理部分的方法,而且还因为它们在 Go 程序中扮演着至关重要的角色。从简单的工具函数到复杂的系统级调用,理解和利用 Go 的函数特性…

论文阅读:All-In-One Image Restoration for Unknown Corruption

发表时间:2022 cvpr 论文地址:https://openaccess.thecvf.com/content/CVPR2022/papers/Li_All-in-One_Image_Restoration_for_Unknown_Corruption_CVPR_2022_paper.pdf 项目地址:https://github.com/XLearning-SCU/2022-CVPR-AirNet 在本文…

Mysql使用中的性能优化——索引对插入操作的性能影响

当我们往表中插入数据时,如果表中有索引,则会给插入操作增加更多的工作量。带来的好处是可以提升查询效率。但是这种优劣该如何权衡,则需要通过数据对比来提供佐证。本文我们将对比没有索引、有一个普通索引、有一个唯一索引的性能差距。 结…

UniAnimate:华科提出人类跳舞视频生成新框架,支持合成一分钟高清视频

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

堆排序讲解

前言 在讲堆的删除时,我们发现一步一步删除堆顶的数据,排列起来呈现出排序的规律,所以本节小编将带领大家进一步理解堆排序。 1.堆排序概念 那么什么是堆排序? 堆排序(Heap Sort)是一种基于堆数据结构的排…

如何从 Android 图库中恢复误删除的照片

如果您正在阅读这篇文章,那么您肯定意外地从 Android 设备中删除了照片。并且您正在寻找一种简单的方法来恢复 Android 图库中已删除的照片。 从图库恢复已删除的照片 随着技术的进步,现在使用单个设备(即 Android 手机)&#xf…

vue27:脚手架详细介绍main.js

在 Vue.js 中,render 函数是一个可选的选项,它允许你自定义组件的渲染逻辑。 如果你没有在 Vue 实例中提供 render 函数,Vue 将使用模板(template)来生成虚拟 DOM。 以下是render / template 两种方式的比较&#…

C++ Qt实现http url启动本地应用程序

更多Qt文章,请访问《深入浅出C++ Qt开发技术专栏》:https://blog.csdn.net/yao_hou/category_9276099.html 文章目录 1、注册自定义协议2、编写web页面3、编写C++应用程序我们在使用腾讯会议时经常会通过http链接打开本地的腾讯会议,例如下图: 打开会议发起人给的链接,会出…

Python代码大使用Paramiko轻松判断文件类型,提取上级目录

哈喽,大家好,我是木头左! 一、Paramiko简介 Paramiko是一个用于SSHv2协议的Python实现,提供了客户端和服务器功能。它可以用于远程连接和管理服务器,执行命令、上传下载文件等。本文将介绍如何使用Paramiko判断文件类…

树莓派4B 零起点(二) 树莓派 更换软件源和软件仓库

目录 一、准备工作,查看自己的树莓派版本 二、安装HTTPS支持 三、更换为清华源 1、更换Debian软件源 2,更换Raspberrypi软件仓库 四、进行软件更新 接前章,我们的树莓派已经启动起来了,接下来要干的事那就是更换软件源和软件…

LeetCode ---400周赛

题目列表 3168. 候诊室中的最少椅子数 3169. 无需开会的工作日 3170. 删除星号以后字典序最小的字符串 3171. 找到按位与最接近 K 的子数组 一、候诊室中的最少椅子数 简单的模拟题,我们可以这样来模拟:当有顾客来时,我们加一把椅子&…

java并发控制(猴子摘桃例子)

【问题】 有n个桃子, 猴子A每次固定摘2个,猴子B每次固定摘3个,这2只猴子不断摘桃子直到剩余桃子数量不足以摘(必须满足摘桃个数); 【1】 使用AtomicInteger(推荐) 1)利…

11 深入理解Linux文件系统与日志分析

目录 11.1 深入理解Linux文件系统 11.1.1 inode与block详解 1. inode和block概述 2. inode的内容 3. inode的号码 4. inode的大小 11.1.2 硬链接与软连接 1. 硬链接 2. 软连接 11.1.3 EXT类型文件恢复 1. 编译安装extundelete 2. 模拟删除并执行恢复操作 11.1.4 xfs类型文件备…

【Centos】深度解析:CentOS下安装pip的完整指南

【Centos】深度解析:CentOS下安装pip的完整指南 大家好 我是寸铁👊 总结了一篇【Centos】深度解析:CentOS下安装pip的完整指南✨ 喜欢的小伙伴可以点点关注 💝 方式1(推荐) 下载get-pip.py到本地 sudo wget https://bootstrap.p…

用python编撰一个电脑清理程序

自制一个电脑清理程序,有啥用呢?在电脑不装有清理软件的时候,可以解决自己电脑内存不足的情况。 1、设想需要删除指定文件夹中的临时文件和缓存文件。以下是代码。 import os import shutil def clean_folder(folder_path): for root,…

CleanMyMac X 4.15.4破解版含2024最新CleanMyMac激活码

CleanMyMac X 4.15.4 for Mac 2023最新中文激活版是一款mac电脑清理工具,可让您快速轻松地个性化您的 Mac 操作系统。此外,它提高了系统速度和性能,帮助你远离黑客和垃圾文件。该程序具有尖端工具和功能,能够清除Mac系统中的任何故…

利用SuperGlue算法实现跨尺度金字塔特征点的高效匹配(含py代码)

在计算机视觉领域,特征点匹配是一个基础而关键的任务,广泛应用于图像拼接、三维重建、目标跟踪等方向。传统的特征点匹配方法通常基于相同尺度下提取的特征进行匹配,然而在实际场景中,由于成像距离、分辨率等因素的差异&#xff0…

图像处理ASIC设计方法 笔记29 场景自适应校正算法

P152 7.2.3 场景自适应校正算法 (一)Scribner提出的神经网络非均匀性校正算法 非均匀性校正(Non-Uniformity Correction,简称NUC)算法是红外成像技术中非常重要的一个环节。它主要用于校正红外焦平面阵列(Infrared Focal Plane Arrays,简称IRFPA)中的固定模式噪声,以提…

《python程序语言设计》2018版第5章第46题均值和标准方差-下部(本来想和大家说抱歉,但成功了)

接上回,5.46题如何的标准方差 本来想和大家说非常抱歉各位同学们。我没有找到通过一个循环完成两个结果的代码。 但我逐步往下的写,我终于成功了!! 这是我大前天在单位找到的公式里。x上面带一横是平均值。 我不能用函数的办法…