STM32--ADC模数转换
文章目录
- ADC简介
- 逐次逼近型ADC
- ADC框图
- 转换模式
- 数据对齐
- 转换时间
- 校准
- ADC基本结构
- ADC单通道工程
- 代码:
ADC简介
STM32的ADC(Analog-Digital Converter)模拟-数字转换器,是一种逐次逼近型模拟数字转换器,可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。拥有18个输入通道,可测量16个外部通道和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。 ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。
模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。
输入电压范围:0-3.3V,转换结果范围:0~4095
在STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道
逐次逼近型ADC
这个一个经典的逐次逼近型ADC,有8个输入通道,会在通道选择开关进行选择,通过地址锁存和译码进行锁定要输出的信号。利用ADDA,ADDB,ADDC进行锁存,ALE进行译码。
接着到比较器,它将输入信号与DAC(数值模拟转换器)的输出进行比较,在开始转换之前,DAC会输出一个初始值,然后与输入信号进行比较,比较结果会被送到一个控制逻辑电路上,控制逻辑电路根据比较结果调整ADC的输出值,这个过程会重复进行,直到ADC的输出与输入信号精度足够接近。每次调整DAC的输出,都使其更加接近于输入信号的值。当DAC的输出与输入信号的差异在可接受范围内时,转换结束。
逐次逼近型寄存器就是将调整DAC输出的值,通过二分查找的方法,找到接近输入信号的值。
最后将最终值放入三态锁存寄存器,就可以进行输出了。
上面的CLOCK是ADC的时钟,通过它可以控制ADC的运行速度和转换精度。由于转换需要一定时间,可通过它控制转换速度。还可以实现与外部时钟同步。
START是运行控制位,EOC是转换结束标志位。
ADC框图
我们先从输入口看,大体上与传统的逐次逼近型ADC无差异,这里有16个外部通道和两个内部资源通道。接着会通过数据选择器,可以到注入通道或者规则通道。
注入通道最多可以有4个输入通道涌入,而规则通道可以有16个输入通道涌入。
这里的模拟数字转换器原理就是逐次逼近型ADC的原理。
对于规则通道寄存器,只能存储一个结果,所以如果有多个通道进行转换的话,那么先存储的结果会被后来的结果覆盖过去,这有可能造成结果丢失;这里的DMA请求就会解决这种后果,通过对寄存器地址的移动,让数据存储在不同的地址,这样就不会数据丢失,具体下一章讲解。
那注入通道就是一次可以存储4个结果,注入通道还有一些具体的内容,这里不展开叙述。
ADCCLK就是时钟,可控制采样时间和转换时间;
最后汇集到地址数据总线上,进行输出。
左下角是触发转换的部分,对应逐次逼近型的START信号;对于STM32,有两种触发方式,一种是软件触发,通过在程序中进行编写代码,进行启动;另一种是硬件触发,就是图中的触发源;有定时器各个通道和定时器主模式的输出,还有外部中断引脚触发转换。
模拟看门狗会根据比较的结果,在一定范围内进行判断,一旦超出所在范围,那么将会产生看门狗事件;
转换结束后,规则通道的信号和注入通道的信号都会产生标志位,标志位可以触发中断使能,使其中断;
转换模式
在ADC中,有两种转换模式,可以搭配扫描模式一同使用;
单次转换模式下, ADC只执行一次转换。连续转换模式中,当前面ADC转换一结束马上就启动另一次转换。扫描模式用来扫描一组模拟通道。
单转换,非扫描模式:
每一次转换都需要进行一次触发,转换结束后会置出一个结束标志位;当进行下一次转换时,又需要进行重新触发和置出结束标志位。
连续转换,非扫描模式:
连续转换,只需要在一开始进行转换触发,那么接下来的每一次转换都不需要进行转换触发;
且转换一次后,会迅速进入下一次转换,每一次EOC会被标志,这里可以理解为转换完成后EOC自动标志了。
单次转换,扫描模式:
扫描模式会对所选通道都进行扫描,由于是单次转换,后来的通道内容会将前面的通道内容进行覆盖,所以如图中所示,到最后只有通道6的内容进行输出;
连续转换,扫描模式:
同样的道理,到最后只有通道6的内容会进行输出;
所以扫描模式都会与DMA进行搭配,让数据不产生丢失的情况;
数据对齐
对于规则通道来说,输出结果只有12位有效,而数据存储器有16位,所以这里就会产生两种方式进行存储;
右对齐:数据高位补0,这是我们常用的方式;
左对齐:数据低位补0,这样操作会使数据扩大16倍;
转换时间
AD转换的步骤:采样,保持,量化,编码
STM32 ADC的总转换时间为:
TCONV = 采样时间 + 12.5个ADC周期
例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期
TCONV = 1.5 + 12.5 = 14个ADC周期 = 1μs
校准
ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。在
校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换
中每个电容器上产生的误差。
建议在每次上电后执行一次校准;
启动校准前, ADC必须处于关电状态超过至少两个ADC时钟周期。
ADC基本结构
通过输入端口到AD转换器,AD转换器需要触发控制和时钟进行初始化。转换结束后会产生标志位;接着将数据结果储存到AD数据寄存器中。该结构需要开关进行控制启动。
ADC单通道工程
接线方式:
通过对电位器的旋转,在OLED显示屏上显示数字转换后的结果。
代码:
OLED代码所取处
AD.h
#ifndef __AD_H__
#define __AD_H__void AD_Init();
uint16_t AD_GetValue();#endif
AD.c
#include "stm32f10x.h" // Device headervoid AD_Init()
{//开启外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//配置ADC时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 72M/6=12MHz//引脚初始化GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; //模拟输入GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//为所选ADC规则通道配置其序列器对应等级和采样时间ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);//ADC结构体成员ADC_InitTypeDef ADC_InitStructure;ADC_InitStructure.ADC_ContinuousConvMode=DISABLE; //指定通道模式为连续转换或者单转换ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right; //数据对齐方式ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; //启动规则通道模拟电压到数字转换的外部触发器ADC_InitStructure.ADC_Mode=ADC_Mode_Independent; //配置ADC为独立模式或者双模式ADC_InitStructure.ADC_NbrOfChannel=1;ADC_InitStructure.ADC_ScanConvMode=DISABLE; //选择是否为扫描模式ADC_Init(ADC1,&ADC_InitStructure);//ADC运行控制ADC_Cmd(ADC1,ENABLE);//重置所选ADC校准寄存器ADC_ResetCalibration(ADC1);//获取ADC复位状态,复位后为0while(ADC_GetResetCalibrationStatus(ADC1));//开始校准ADC_StartCalibration(ADC1);//获取ADC所选标准位状态,校准需要时间,校准好后置0while(ADC_GetCalibrationStatus(ADC1));
}uint16_t AD_GetValue()
{//启动ADC软件转换,触发方式ADC_SoftwareStartConvCmd(ADC1,ENABLE);//检查ADC是否已有标志位,还没有就为SET,有为RESET(EOC)while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);//返回一个转换结果return ADC_GetConversionValue(ADC1);
}
main.c
#include "stm32f10x.h" // Device header
#include "OLED.h"
#include "AD.h"float V;
int main()
{OLED_Init();AD_Init();OLED_ShowString(1,1,"Value:");//显示电压OLED_ShowString(2,1,"Volatge:0.00");while(1){V=(float)(AD_GetValue()/4095*3.3);OLED_ShowNum(1,7,AD_GetValue(),4);OLED_ShowNum(2,9,V,1);OLED_ShowNum(2,11,(uint16_t)(V*100)%100,2);}
}
数字范围:0-4095
电压范围:0-3.3V
对于显示屏上的波动效果,是正常效果。由于转换总时间在1/12*(55.5+12.5)=5.6微妙;
转换速度是非常快的,而我们又在一个循环中不断显示结果,每次输出结果是由逐次逼近型ADC进行比较输出的,所以不可能每次比较值都非常精准,多多少少会有些误差的波动。
相关文章:

STM32--ADC模数转换
文章目录 ADC简介逐次逼近型ADCADC框图转换模式数据对齐转换时间校准ADC基本结构ADC单通道工程代码: ADC简介 STM32的ADC(Analog-Digital Converter)模拟-数字转换器,是一种逐次逼近型模拟数字转换器,可以将引脚上连续…...

陕西科技大学改考408!附考情分析
改考信息 8月14日,陕西科技大学公布了2024年硕士研究生招生目录(初稿),其中不难发现083500软件工程初试专业课由819数据结构改为408计算机学科专业基础 图片:陕西科技大学24专业目录-软件工程学硕 https://yjszs.sus…...
02.有监督算法——朴素贝叶斯
1.朴素贝叶斯 1.1条件概率 如果两个事件A和B不是相互独立,并且知道事件B已经发生,A在B中的条件概率: P ( A ∣ B ) P ( A B ) P ( B ) P(A|B) {P(AB) \over P(B)} P(A∣B)P(B)P(AB) 先验概率: 根据以往经验和分析得到的概…...

前端新手学习路线
文章目录 前端学习路线!特点符号表大纲前言 - 学编程需要的特质一、前端入门⭐️ 开发工具浏览器编辑器文档笔记 ⭐️ HTML⭐️ CSS⭐️ JavaScript✅ ES6 特性 二、巩固基础前端基础知识计算机基础✅ 算法和数据结构✅ 计算机网络✅ 操作系统 软件开发基础✅ 设计模…...

vactor中迭代器失效问题
目录 什么是迭代器失效导致迭代器失效的操作VS和g环境下对与迭代器失效的态度 什么是迭代器失效 迭代器的底层其实就是一个指针,或者对指针进行了封装 vector的迭代器就是一个指针T* 一个迭代器指向某一个空间,此时这块空间被释放了,这个迭…...
电子商务防火墙的作用
1.作为网络安全的屏障 只有经过精心选择的应用协议才能通过防火墙,可使网络环境变得更安全。如 防火墙可以禁止 NFS 协议进出受保护的网络,这样外部的攻击者就不可能利用这些 脆弱的协议来攻击内部网络。防火墙同时可以保护网络免受基于路由的攻击&am…...

「UG/NX」Block UI 选择特征SelectFeature
✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#...

【数据分享】2006-2021年我国城市级别的节约用水相关指标(免费获取\20多项指标)
《中国城市建设统计年鉴》中细致地统计了我国城市市政公用设施建设与发展情况,在之前的文章中,我们分享过基于2006-2021年《中国城市建设统计年鉴》整理的2006—2021年我国城市级别的市政设施水平相关指标、2006-2021年我国城市级别的各类建设用地面积数…...

Azure不可变Blob存储
文章目录 Azure不可变Blob存储介绍Azure不可变性策略实战演练 Azure不可变Blob存储介绍 不可变的存储是一种用于存储业务关键型 Blob 数据的存储方式。与可变存储相反,不可变存储的特点是一旦数据被写入后,便无法再对其进行修改或删除。这种存储方式提供…...

No mapping found for HTTP request with URI
参考: 参考地址 说明 ssm老项目,接过来别人的项目 临时建了一个Controller方便测试用的,结果访问掉不通,报: No mapping found for HTTP request with URIxxxx 这样的错误 解决办法 看了下web,xml配置 在 webmvc-config.xml 配置文件里面添加了几行配置 说明: com.iph.h…...

视频转云存的痛点
现在整个运营商体系里面,有大量的视频转云存储的需求,但是视频云存储有一个比较大的痛点,就是成本! 成本一:存储成本; 我们以1000路2M视频转云存,存储时间为90天为例(B端存储时间有…...

3D医学教学虚拟仿真系统:身临其境感受人体结构和功能
3D医学教学虚拟仿真系统是一种基于虚拟现实技术的教学工具,它可以帮助学生更好地理解和掌握医学知识。这种课件通常包括人体解剖学、生理学、病理学等方面的教学内容,通过三维立体的图像和动画展示,让学生更加直观地了解人体结构和功能。 与传…...

【.net】本地调试运行只能用localhost的问题
【.net】本地调试运行只能用localhost的问题 解决方案 找到到项目目录下 隐藏文件夹 .vs /项目名称/config/applicationhost.config <bindings><binding protocol"http" bindingInformation"*:1738:localhost" /></bindings> 再加一条你…...

营销数字化|企业级 AIGC 工具的「iPhone 时刻」
2007 年,乔布斯发布了第一款 iPhone,从此彻底改变了手机行业的市场走向。iPhone 成功的背后,一个很重要的原因是:它让用户以更简单、更符合直觉的方式来使用手机。 如今,AIGC 工具也在等待它的「iPhone 时刻」…...

Zookeeper集群单节点启动成功但未同步其他节点数据
首先排查节点启动是否正常: 在zookeeper的bin目录下执行:sh zkServer.sh status 判断当前节点数据leader 还是follower 节点都启动正常,但某一个zookeeper集群节点(下面简称“异常节点”)不同步其他节点数据…...

回归预测 | MATLAB实现TSO-LSSVM金枪鱼群算法优化最小二乘支持向量机多输入单输出回归预测(多指标,多图)
回归预测 | MATLAB实现TSO-LSSVM金枪鱼群算法优化最小二乘支持向量机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现TSO-LSSVM金枪鱼群算法优化最小二乘支持向量机多输入单输出回归预测(多指标,多图&a…...

第5步---MySQL的DQL查询语句
第5步---MySQL的DQL查询语句 DQL 数据库查询语言 1.基本的查询语句 1.完整得查询得语句 简化版的查询语句 select * from 表名 where 条件; 2.创建用于测试的表 1.创建测试数据 -- DQL -- 创建测试表 DROP TABLE IF EXISTS product; CREATE TABLE IF NOT EXISTS product( pi…...

ChatGpt开源项目完美运行配置-ChatGml2
(以下所有软件均可免费在网盘获取。) 任务描述 本节任务是安装和配置chatgpt项目所需的软件以及chatgpt项目所需要的python库包,同时编写python代码来完成chatgpt项目的人机对话功能。 实验工具 显卡GTX1070(专用内存需要大于等…...

微服务-GateWay(网关)
所谓网关是什么意思? 相当于就是你们小区家的保安,进出小区都得获得保安的同意,守护你们小区的生命财产健康,网关也是如此,对每个请求都严格把关,将合法的或者是获得权限的请求进入服务器 网关的功能&…...

基于X86六轮差速移动机器人运动控制器设计与实现(一)软件与硬件架构
本文研究的六轮差速移动机器人 (Six-Wheeled Differential Mobile Robot , SWDMR) 为了满足资源站到资源站点对点的物资运输,对机器人的跨越障碍能力 有较高的要求。对比传统的四轮移动机器人,六轮移动机器人能够提供更强的驱动 力&#…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...
智能体革命:企业如何构建自主决策的AI代理?
OpenAI智能代理构建实用指南详解 随着大型语言模型(LLM)在推理、多模态理解和工具调用能力上的进步,智能代理(Agents)成为自动化领域的新突破。与传统软件仅帮助用户自动化流程不同,智能代理能够自主执行工…...
linux设备重启后时间与网络时间不同步怎么解决?
linux设备重启后时间与网络时间不同步怎么解决? 设备只要一重启,时间又错了/偏了,明明刚刚对时还是对的! 这在物联网、嵌入式开发环境特别常见,尤其是开发板、树莓派、rk3588 这类设备。 解决方法: 加硬件…...
记一次spark在docker本地启动报错
1,背景 在docker中部署spark服务和调用spark服务的微服务,微服务之间通过fegin调用 2,问题,docker容器中服务器来后,注册中心都有,调用服务也正常,但是调用spark启动任务后报错,报错…...
关于疲劳分析的各种方法
疲劳寿命预测方法很多。按疲劳裂纹形成寿命预测的基本假定和控制参数,可分为名义应力法、局部应力一应变法、能量法、场强法等。 1名义应力法 名义应力法是以结构的名义应力为试验和寿命估算的基础,采用雨流法取出一个个相互独立、互不相关的应力循环&…...
迁移科技3D视觉系统:重塑纸箱拆垛场景的智能革命
一、传统拆垛场景的困局与破局之道 在汽车零部件仓库中,每天有超过2万只异形纸箱需要拆垛分拣。传统人工拆垛面临三大挑战: 效率瓶颈:工人每小时仅能处理200-300件,且存在间歇性疲劳安全隐患:20kg以上重箱搬运导致年…...