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

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转换数值变小。


本章完结

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

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

相关文章

C++中的一些困惑(长期更新中)

C中的一些困惑 文章目录 C中的一些困惑1. using std::具体命名与using namespace std;2. 【int \*p[10] 】与 【int (\*p)[10]】3. main()函数可带参,参从何来?4. constexpr函数的返回值可不为常量,那这时constexpr关键字作用是什么&#xff…

【C语言】预处理详解(上卷)

前言 预处理也是C语言中非常重要的存在。那么就详细地来了解一下吧。 预定义符号 C语言设置了一些预定义符号,可以直接使用,预定义符号也是在预处理期间处理的。 1 __FILE__ //进行编译的源文件 2 __LINE__ //文件当前的…

LabVIEW硬件与仿真双模式设计液压系统

在实际项目中,结合LabVIEW与液压运动控制器,通过设计两种运行方式:硬件运行和仿真运行,使得系统既能进行实际操作又能进行仿真测试。此设计不仅方便了开发调试,也为教学培训和展示提供了极大的便利。本文将从项目背景、…

手把手AI实战(一)治愈系动画视频

手把手AI实战(一)治愈系动画视频 一、成果展示 二、步骤拆解 2.1 AI出图 可以使用你顺手的AI绘图工具,国外的像Midjouney、Stable Diffusion,国内的像扣子、智普清言等等。我这里用了剪映的,地址是:https://jimeng.jianying.com/a…

【AI论文与新生技术】Follow-Your-Emoji:精细可控且富有表现力的自由式人像动画技术

我们提出了 Follow-Your-Emoji,这是一种基于扩散的肖像动画框架,它使用目标地标序列对参考肖像进行动画处理。肖像动画的主要挑战是保留参考肖像的身份并将目标表情转移到该肖像,同时保持时间一致性和保真度。为了应对这些挑战,Fo…

C++11 列表初始化(initializer_list),pair

1. {} 初始化 C98 中,允许使用 {} 对数组进行初始化。 int arr[3] { 0, 1, 2 };C11 扩大了 {} 初始化 的使用范围,使其可用于所有内置类型和自定义类型。 struct Date {int _year;int _month;int _day;Date(int year, int month, int day):_year(year…

梯度下降: 02. 批量梯度下降BGD,随机梯度下降SGD,小批量梯度下降MBGD

简介 本文从原理上介绍了三种梯度下降的方法,相同点,异同点,优缺点。 内容包含了数学公式的推导与说明 1. 梯度下降的3种方法 梯度下降分三类,原理基本相同,操作方式略有区别 批量梯度下降BGD(BatchGradient Descent):使用全量数据进行特征抽取,模型训练小批量梯度下降…

tkinter颜色选择器

tkinter颜色选择器 颜色选择器效果代码 颜色选择器 Tkinter 提供了一个简单易用的颜色选择器模块 colorchooser,通过调用 colorchooser.askcolor() 方法,我们可以轻松实现颜色选择功能。 效果 代码 import tkinter as tk from tkinter import colorch…

启动xv6遇坑记录

我是在VMware上的Ubuntu22.04.4搭建的,启动xv6遇到超多bug,搞了好几天,所以记录一下。 目录 git push的时候报错 make qemu缺少包 运行make qemu时卡住 可能有影响的主机设置 git push的时候报错 remote: Support for password authent…

Soildworks学习笔记(二)

放样凸台基体: 自动生成连接两个物体两个面的基体: 2.旋转切除: 3.剪切实体: 4.转换实体引用: 将实体的轮廓线转换至当前草图使其成为当前草图的图元,主要用于在同一平面或另一个坐标中制作草图实体或其尺寸的副本。 …

【Redis学习笔记05】Jedis客户端(string、list、set)

Jedis客户端 1. 命令 1.1 String类型 1.1.1 常见命令 SET命令 语法:SET key value [EX seconds | PX milliseconds] [NX|XX] 说明:将string类型的value值设置到指定key中,如果之前该key存在,则会覆盖原先的值,原先…

MyBatis二级缓存开启条件

MyBatis缓存为俩层体系。分为一级缓存和二级缓存。 一级缓存: 一级缓存默认开启,一级缓存的作用域是SqlSession级别的,这意味着当你更换SqlSession之后就不能再利用原来的SqlSession的一级缓存了。不同的SqlSession之间的一级缓存是隔离的。…

如何确保redis缓存中的数据与数据库一致

一、双写模式: 在写入数据库时,也写入缓存。 二:失效模式: 在写入新数据后,删除缓存中数据,下次请求时查询数据库,并把查到的最新数据写入缓存。 不管是双写模式还是失效模式,缓…

网页中生成ZIP文件,Zip 压缩、解压技术在 HTML5 浏览器中的应用

JSZip 是一款可以创建、读取、修改 .zip 文件的 javaScript 工具。在 web 应用中,免不了需要从 web 服务器中获取资源,如果可以将所有的资源都合并到一个 .zip 文件中,这时候只需要做一次请求,这样既减少了服务器的压力&#xff0…

每日题库:Huawe数通HCIA——15(30道)

注:由于限制原因,今后资料仅提供给粉丝 所有资料均来源自网络,但个人亲测有效,特来分享,希望各位能拿到好成绩! PS:别忘了一件三连哈! 今日题库: 231. 如下图所示的网…

OceanBase 4.3 特性解析:列存技术

在涉及大规模数据的复杂分析或即时查询时,列式存储是支撑业务负载的关键技术之一。相较于传统的行式存储,列式存储采用了不同的数据文件组织方式,它将表中的数据以列为单位进行物理排列。这种存储模式允许在分析过程中,查询计算仅…

Vitis HLS 学习笔记--接口存储器布局模型

目录 1. 简介 2. 详解 2.1 数据对齐 2.2 数据结构填充 3. 总结 1. 简介 软件开发者写的程序会在 CPU 处理器上运行,而硬件开发者设计的“内核”则会在 FPGA 上运行。这两部分需要通过一个精心设计的接口来沟通,就像两个人用对讲机来交流一样。为了…

GDPU unity游戏开发 寻路与导航

学会寻路,出门在外,身份不是他给的,他做不了你一直的导航。 角色寻路 角色控制器替换为普通的角色控制器,给实验九的地形增加NavMesh Surface组件,然后给角色增加NavMesh Agent组件,并选择合适的参数。通过…

mac安装brew遇到的一些问题

mac终端执行命令/bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)”,无法建立连接或连接超时错误,错误信息如下: curl: (28) Failed to connect to raw.githubusercontent.com port 443 af…

高性能MySQL(第3版)电子书笔记

Mysql官方文档:https://dev.mysql.com/doc/refman/5.7/en/ 高性能MySQL(第3版):百度网盘,基于Mysql5.1和Mysql5.5 本机版本 mysql> select version(); ------------ | version() | ------------ | 5.7.32-log |…