当前位置: 首页 > news >正文

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 HZRCC_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);	// 硬件置0ADC_StartCalibration(ADC3);while (ADC_GetCalibrationStatus(ADC3) == SET);	// 硬件置0ADC_SoftwareStartConvCmd(ADC3, ENABLE);while (ADC_GetFlagStatus(ADC3, ADC_FLAG_STRT) == RESET);
}int main() {// 初始化usartLunarInitUSART1();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转换数值变小。


本章完结

相关文章:

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

STM32快速入门(ADC数模转换) 前言 ADC数模转换存在的意义就是将一些温度传感器、各自数据传感器产生的模拟信号转换成方便识别和计算的数字信号。 导航 图24 通用定时器框图: 图片截取自STM32 F1XX中文参考手册。还是以框图为中心&#x…...

Linux环境在非root用户中搭建(java-tomcat-redis)

注: 本文在内网(离线)环境,堡垒机中搭建,服务器不同可能有所差异,仅供参考 本文安装JDK-20.0.1版本,apache-tomcat-10.1.10版本,redis-6.2.15版本 本文服务器IP假设:192.168.88.133 root用户创建子用户并…...

Unity 之 代码修改材质球贴图

Unity 之 代码修改材质球贴图 代码修改Shader:ShaderGraph:材质球包含属性 代码修改 meshRenderer.material.SetTexture("_Emission", texture);Shader: ShaderGraph: 材质球包含属性 materials[k].HasProperty("…...

spark-3.5.1+Hadoop 3.4.0+Hive4.0 分布式集群 安装配置

Hadoop安装参考: Hadoop 3.4.0HBase2.5.8ZooKeeper3.8.4Hive4.0Sqoop 分布式高可用集群部署安装 大数据系列二-CSDN博客 一 下载:Downloads | Apache Spark 1 下载Maven – Welcome to Apache Maven # maven安装及配置教程 wget https://dlcdn.apache.org/maven/maven-3/3.8…...

Matlab实现GWO-CNN-LSTM-Mutilhead-Att灰狼算法卷积长短期记忆神经网络融合多头注意力机制预测 SCI顶级优化

数据预处理:准备和清理数据,包括数据的加载、特征提取、归一化等。 GWO (灰狼算法) 的实现:根据灰狼算法的原理和公式,编写 MATLAB 代码来初始化灰狼群体、计算适应度函数、更新位置等。 CNN (卷积神经网络) 的构建:使…...

RTKLIB之RTKPLOT画图工具

开源工具RTKLIB在业内如雷贯耳,其中的RTKPLOT最近正在学习,发现其功能之强大,前所未见,打开了新的思路。 使用思博伦GSS7000卫星导航模拟器,PosApp软件仿真一个载具位置 1,RTKPLOT支持DUT 串口直接输出的NMEA数据并…...

本地部署 RAGFlow

本地部署 RAGFlow 0. RAGFlow 是什么?1. 安装 wsl-ubuntu2. (可选)配置清华大学软件源3. 系统更新和安装构建工具4. 安装 Miniconda35. 安装 CUDA Toolkit6. 安装 git lfs7. 配置 Hugging Face 的缓存路径8. 配置 vm.max_map_count9. 安装 Docker Engine10. 安装 nginx11. 本地…...

php常用数据库操作

文章目录 PHP操作1. mysqli_connect() 连接数据库2. mysqli_close() 关闭数据库3. mysqli_num_rows 查询结果集中的行数4. mysqli_select_db 选择数据库的函数5. mysqli_query 常规的插入查找等6. header( )7.防止 sql 注入 PHP操作 1. mysqli_connect() 连接数据库 2. mysql…...

判断经纬度是否在某个城市内

一、从高德获取指定城市边界经纬度信息 通过apifox操作&#xff1a; 二、引入第三方jar包&#xff1a; maven地址&#xff1a;https://mvnrepository.com/ maven依赖&#xff1a; <dependency><groupId>org.locationtech.jts</groupId><artifactId>…...

Java——数组排序和查找

一、排序介绍 1、排序的概念 排序是将多个数据按照指定的顺序进行排列的过程。 2、排序的种类 排序可以分为两大类&#xff1a;内部排序和外部排序。 3、内部排序和外部排序 1&#xff09;内部排序 内部排序是指数据在内存中进行排序&#xff0c;适用于数据量较小的情况…...

Flutter中防抖动和节流策略

什么是防抖和节流&#xff1f; 函数节流&#xff08;throttle&#xff09;与 函数防抖&#xff08;debounce&#xff09;都是为了限制函数的执行频次&#xff0c;以优化函数触发频率过高导致的响应速度跟不上触发频率&#xff0c;出现延迟&#xff0c;假死或卡顿的现象 是应对频…...

设计模式-中介者(调停者)模式(行为型)

中介者模式 中介者模式是一种行为型模式&#xff0c;又叫调停者模式&#xff0c;它是为了解决多个对象之间&#xff0c;多个类之间通信的复杂性&#xff0c;定义一个中介者对象来封装一些列对象之间的交互&#xff0c;使各个对象之间不同持有对方的引用就可以实现交互&#xf…...

HC-05蓝牙模块配置连接和使用

文章目录 1. 前期准备 2. 进入AT模式 3. 电脑串口配置 4. 配置过程 5. 主从机蓝牙连接 6. 蓝牙模块HC-05和电脑连接 1. 前期准备 首先需要准备一个USB转TTL连接器&#xff0c;电脑安装一个串口助手&#xff0c;然后按照下面的连接方式将其相连。 VCCVCCGNDGNDRXDTXDTXD…...

云上小知识:企业选择云服务的小Tips

企业在选择云服务模式时&#xff0c;应综合考虑以下几个关键因素&#xff1a; 1. 业务需求与场景 企业需要根据自身的业务特点和需求来选择合适的云服务模式。例如&#xff0c;如果企业的用户分布广泛&#xff0c;需要跨地域提供服务&#xff0c;那么公有云可能是更好的选择。…...

生成式人工智能 - Stable Diffusion 都使用了哪些技术?

一、Stable Diffusion简述 1、简述 Stable Diffusion在2022年8月开源,是由慕尼黑大学的CompVis研究团队开发的生成式人工神经网络。该项目由初创公司StabilityAI、CompVis和Runway合作开发,并得到了EleutherAI和LAION的支持。截至2022年10月,StabilityAI已筹集了1.01亿美元…...

React的useState的基础使用

import {useState} from react // 1.调用useState添加状态变量 // count 是新增的状态变量 // setCount 修改状态变量的方法 // 2.添加点击事件回调 // userState实现计数实例import {useState} from react// 使用组件 function App() {// 1.调用useState添加状态变量// coun…...

接口自动化Requests+Pytest基础实现

目录 1. 数据库以及数据库操作1.1 概念1.2 分类1.3 作用 2 python操作数据库的相关实现2.1 背景2.2 相关实现 3. pymysql基础3.1 整个流程3.2 案例3.3 Pymysql工具类封装 4 事务4.1 案例4.2 事务概念4.3 事务特征 5. requests库5.1 概念5.2 角色定位5.3 安装5.4 校验5.5 reques…...

深入解析Kafka消息传递的可靠性保证机制

深入解析Kafka消息传递的可靠性保证机制 Kafka在设计上提供了不同层次的消息传递保证&#xff0c;包括at most once&#xff08;至多一次&#xff09;、at least once&#xff08;至少一次&#xff09;和exactly once&#xff08;精确一次&#xff09;。每种保证通过不同的机制…...

jEasyUI 设置排序

jEasyUI 设置排序 jEasyUI 是一个基于 jQuery 的框架,用于轻松构建交互式的 Web 应用程序。它提供了一系列的 UI 组件,如表格(datagrid)、树(tree)、下拉列表(combobox)等,这些组件可以帮助开发者快速实现复杂的界面功能。在本文中,我们将重点讨论如何在 jEasyUI 中…...

MySQL之查询性能优化(十二)

查询性能优化 优化COUNT()查询 4.使用近似值 有时候某些业务场景并不要求完全精确的COUNT值&#xff0c;此时可以用近似值来代替。EXPLAIN出来的优化器估算的行数就是一个不错的近似值&#xff0c;执行EXPLAIN并不需要真正地去执行查询&#xff0c;所以成本很低。很多时候&am…...

7-16 二分查找

7-16 二分查找 分数 25 全屏浏览 切换布局 作者 李廷元 单位 中国民用航空飞行学院 请实现有重复数字的有序数组的二分查找。 输出在数组中第一个大于等于查找值的位置&#xff0c;如果数组中不存在这样的数&#xff0c;则输出数组长度加一。 输入格式: 输入第一行有两个…...

对Java中二维数组的深层认识

首先&#xff0c;在JAVA中&#xff0c;二维数组是一种数组的数组。它可以看作是一个矩阵&#xff0c;通常是由于表示二维数据节后&#xff0c;如表格和网格。 1.声明和初始化二维数组 声明 int[][] arr;初始化 int[][] arrnew int[3][4];或者用花括号嵌套 int[][] arr{{1,…...

C++的STL 中 set.map multiset.multimap 学习使用详细讲解(含配套OJ题练习使用详细解答)

目录 一、set 1.set的介绍 2.set的使用 2.1 set的模板参数列表 2.2 set的构造 2.3 set的迭代器 2.4 set的容量 2.5 set的修改操作 2.6 set的使用举例 二、map 1.map的介绍 2.map的使用 2.1 map的模板参数说明 2.2 map的构造 2.3 map的迭代器 2.4 map的容量与元…...

【Java笔记】第10章:接口

前言1. 接口的概念与定义2. 接口的声明与语法3. 接口的实现4. 接口的继承5. 接口的默认方法6. 接口的静态方法7. 接口的私有方法8. 接口的作用9. 接口与抽象类的区别10. 接口在Java集合中的应用结语 上期回顾:【Java笔记】第9章&#xff1a;三个修饰符 个人主页&#xff1a;C_G…...

Angular知识概览

Angular 是一个由 Google 维护的开源前端框架&#xff0c;用于构建动态网页应用。以下是对 Angular 主要概念和特性的概览&#xff1a; 1. Angular 的核心概念 - 组件 (Component)&#xff1a;Angular 应用的基本构建块。每个组件包括一个 TypeScript 类&#xff0c;用于处理数…...

经典文献阅读之--Online Monocular Lane Mapping(使用Catmull-Rom样条曲线完成在线单目车道建图)

0. 简介 对于单目摄像头完成SLAM建图这类操作&#xff0c;对于自动驾驶行业非常重要&#xff0c;《Online Monocular Lane Mapping Using Catmull-Rom Spline》介绍了一种仅依靠单个摄像头和里程计生成基于样条的在线单目车道建图方法。我们提出的技术将车道关联过程建模为一个…...

frida timed out

从Android Q(10)开始&#xff0c;Google引入了一种新的机制&#xff0c;加快了app的启动时间 Android USAP 进程启动流程 adb shell su ps -A | grep usaproot 9917 1032 6577052 13676 __skb_wait_for_more_packets 0 S usap64 root 9928 1032 6577052…...

51单片机-独立按键控制灯灯灯

目录 简介: 一. 1个独立按钮控制一个灯例子 二. 在加一个独立按键,控制第二个灯 三. 第一个开关 开灯, 第二个开关关灯 四. 点一下开灯,在点一下关灯 五. 总结 简介: 51 单片机具有强大的控制能力&#xff0c;而独立按键则提供了一种简单的输入方式。 当把独立按键与 …...

【C++】用红黑树封装map、set

用红黑树封装map、set 1. 红黑树1.1 模板参数的控制1.1.1 Value1.1.2 KeyOfValue 1.2 正向迭代器1.2.1 构造函数1.2.2 begin()end()1.2.3 operator()1.2.4 operator--()1.2.5 operator*()1.2.6 operator->()1.2.7 operator()1.2.8 operator!()1.2.9 总代码 1.3 反向迭代器1.…...

【中颖】SH79F9202 串口通信

头文件 uart.h #ifndef UART_H #define UART_H#include "SH79F9202.h" #include "LCD.h" #include "timer2.h" #include "timer5.h" #include "cpu.h" #include "key.h" #include "io.h" #include &qu…...

网站建设的规划方案/永久免费自助建站系统

菱形 程序…………………… #include<stdio.h> int main() {int i,j,k; printf("\n\n");for(i1;i<4;i) //从第一行到第四行 {for(j1;j<16-i;j) //第一行15个空格 printf(" ");for(k1;k<2*i-1;k)printf("*"); //也可将 * …...

一个做二维码问卷调查的网站/百度竞价排名怎么做

本文主要解决openssl升级到1.1.0以上版本&#xff0c;导致shadows2.8.2启动报undefined symbol: EVP_CIPHER_CTX_cleanup错误。 如果在安装完Shadows后&#xff0c;启动时报 AttributeError: /usr/local/ssl/lib/libcrypto.so.1.1: undefined symbol: EVP_CIPHER_CTX_cleanup…...

网站关键词推广哪家好/搜索引擎营销的主要方式有

2019独角兽企业重金招聘Python工程师标准>>> 一.系统目录结构 1.linux系统目录图 2.目录介绍 /bin&#xff1a;bin是Binary的缩写&#xff0c;该目录下存放的是最常用的命令。/boot&#xff1a;该目录下存放的是启动Linux时使用的一些核心文件&#xff0c;包括一些连…...

wordpress对空间的要求/小广告网页

刚来到公司&#xff0c;组里前辈就建议用 Foxmail 收发邮件&#xff0c;今天刚刚在 Foxmail 上设置如何自动添加落款签名。 由于跟百度搜索到的方法不太一样&#xff0c;可能根据电脑版本不同 Foxmail 设置方法不同&#xff0c;所以记录在博客中&#xff0c;供大家参考~ 公司…...

做门名片设计网站/google seo是什么

前言&#xff1a; js通过元素id获取元素及元素值的方法 document.getElementById("元素的id"); //找到该id元素的对象 document.getElementById("元素的id").value;的value值 下面就开始吧 一、客户端处理(即前端处理) //声明变量,用于保存异步传输对象XML…...

上海网站备案核验/怎样做自己的网站

烤瓷牙修复牙齿的种类都有哪些?烤瓷牙它的种类有很多&#xff0c;这往往就令消费者眼花撩换&#xff0c;他们不知该如何选择。接下来我们就看看烤瓷牙种类的介绍吧希望以下的介绍对大家有所帮助。 烤瓷牙修复牙齿的种类都有哪些呢?烤瓷牙修复牙齿的种类如下所示&#xff1a;…...