买服务器做网站主机/软文是什么意思
一、ADC的介绍
1.1什么是ADC
ADC(Analogto-Digital Converter)模拟数字转换器,是将模拟信号转换成数字信号的一种外设。比如某一个电阻两端的是一个模拟信号,单片机无法直接采集,此时需要ADC先将短租两端的电压这个模拟信号转化成数字信号,单片机才能够进行处理。
1.2 ADC的用途
ADC具有将模拟信号转换成数字信号的能力,比如将模拟的电压转换成数字信号,单片机进行处理。可以用作温度监测或者电流监测等方面,用途极广。
1.3 STM32F1系列的ADC介绍
STM32F1的ADC为12位ADC,是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部 信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右 对齐方式存储在16位数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。 ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。
STM32的ADC其转换时间为1us。
二、STM32的ADC时钟介绍
下图是截取的时钟树关于ADC部分,至于时钟树可以在编程参考手册的56页找到或者直接搜索时钟树就可以找到了。
可以看见其时钟来源于APB2总线,其频率最大可以达到72MHz,而ADC的时钟最大只能为14MHz,故先经过ADC预分频器经行6分频得到12MHz的时钟。
三、ADC框图介绍:
对于ADC的框图,下图以经把各个功能模块以及分好了,见下图:
3.1 ADC的18个通道介绍
首先其16个外部通道接口对应着某些GPIO口,至于哪些就不介绍了,可以查看引脚定义。
而内部通道一个为内部温度传感器,可以用于查看CPU温度,另一个则是内部参考电压了,为一个1.2V左右的基准电压(不会随外部供电电压变化而变化)。有没有想过为什么ADC初始化需要校准呢?假如你芯片的供电电压不是标准的3.3V,那测量外部引脚的电压就可能不对,这时就可以读取这个基准电压经行校准,就能得到正确的电压值了,这就是校准的作用。
3.2 ADC转换单元的介绍
规则组和注入组两个转换单元,在图中可以看见注入组最多四个通道,而规则组最多16个通道。如何选择这两种转换单元呢?下面我来说明这两种的区别:
首先是通道数:规则组可以包含最多16个转换,而注入组最多只能有4个转换。这意味着规则组适用于更多的通道同时进行转换,而注入组则更适合于顺序执行的单次转换。注:注入通道虽然只有4个通道,但是每一个通道都有自己的数据寄存器,即注入组有四个数据寄存器。而规则组虽然有16个转换通道,但只有一个数据寄存器。
使用场景:规则组通常用于大规模的连续转换条件下,而注入组则多用于执行单次的转换,仅在需要时进行转换。
触发方式:注入组可以打断规则组的转换,具有更高的优先级。具体来说,如果注入组在规则组转换期间被触发,当前规则组的转换会被中断,并开始执行注入组的转换。注入组转换完成后,规则组的转换会继续。此外,注入组可以在规则通道之后自动进行转换,这种模式允许最多20个转换序列的组合,其中规则通道在前,注入通道在后。
综上所述,规则组和注入组的选择取决于具体的应用需求和场景。规则组适合于需要连续、大规模数据采集的场景,而注入组则适用于需要快速响应、单次数据采集的情况。
3.3 模拟看门狗的介绍
模拟看门狗检测输入电压范围:用于检测ADC值,当检测值低于或高于某个阈值时,用来执行某些操作(也就相当于报警,而监测不需要人为去看守,不需要自己手动读值再用if判断,相当于家里养了狗,有陌生人来了狗就会叫,而这个陌生人代指超阈值)。
3.4 ADC触发源的介绍
其触发源可以来自定时器、外部引脚以及软件控制位来触发。即两种触发源:软件触发以及外部触发(内部定时器、外部中断)。
3.4.1 定时器触发:
ADC在平常使用过程中经常需要过一个固定时间转换一次,比如每个1ms转换一次,正常思路是在定时器中断中用软件控制位来控制触发。但是这样频繁进入中断对主程序是有一定影响的,当你有很多中断时由于优先级不同也会导致某些中断不能及时得到响应,还是有很大影响,所以对于这种需要频繁进入中断且在中断只完成简单工作的情况的一般都有硬件的支持。在这里便可以这样使用:先给定时器设置定时时间,并把定时器更新事件选择为TRGO输出,然后在ADC这里选择开始触发信号为定时器的TRGO,这样定时器的更新事件就能自动触发ADC转换了且无需进入中断,节省了中断资源。
3.4.2 外部中断触发
外部中断可以产生一个触发脉冲,触发Adc转换。先设置EXTTRIG控制位,则外部事件就能够触发转换。
3.4.3 软件自动触发
软件控制位触发
3.5 ADC时钟介绍
上文有介绍到其时钟最大不超过14MHz,那么为什么有这个规定呢?
我们可以看到其ADC的转换时间为1us,如果其频率超过了14MHz,会导致转换时间少于1us,也就导致其采样不精确。ADC的总转换时间如下:
Tconv = 采样时间 + 12.5个周期;
例如:当其频率ADCCLK = 14MHz,采样时间为1.5个周期(最小为1.5个周期)见下图:
那么此时转换时间为 :Tconv = 1.5 + 12.5 = 14个周期,而频率为14MHz,则时间T = 14 * (单个周期时间)1/14MHz = 1MHz,也就是1us。这下你应该明白了吧?
四、ADC转换模式的介绍
在ADC的配置过程中会遇到配置两个参数,即是否使用连续转换(ADC_ContinuousConvMode)以及是否启用扫描模式(ADC_ScanConvMode),而这两个配置也就产生了四种结果:单次转换非扫描、连续转换非扫描、单次转换扫描、连续转换扫描模式。
单次转换: 只执行转换一次
连续转换: 转换一次后立马进行下一次转换。
非扫描模式: 只转换ADC_SQRx或ADC_JSQR选中的第一个通道。
扫描模式: 一次性转换所有被选中的通道
下面介绍ADC的几种转换模式:
4.1 单次转换非扫描模式
即一次只转换选中的某一个通道,且只转换一次。其转换结果放在数据寄存器里面,给EOC标志位置1表示转换完成。想获取转换结果只需要判断EOC标志位,为1时便可以读取数据了。如果还想继续转换,就得重新再触发一次。
如果想换一个通道转换就在转换之前将第一个位置的通道改成其他通再启动转换。
4.2 连续转换非扫描模式
一次只转换选中的某一个通道,开始时只需要触发一次便可以一直转换。与上面的区别就是不需要你再次触发了,且读取AD值直接去数据寄存器里面取,无需判断转换是否结束。
4.3 单次转换、扫描模式
即触发转换后只转换一次,每触发一次转换结束后就会停下来,再次转换得重新触发一次。单和单次转换非扫描模式的区别就是一次可以转换多个指定的通道,即按你指定的顺序依次转换并放入到数据寄存器中。但数据寄存器只有一个,所以为了防止覆盖需要及时将数据挪走(不及时木挪走读取到的便是被后面通道所覆盖的数据)。当转换完成也会产生一个EOC信号,即转换结束。
4.4 连续转换扫描模式
讲到这里你应该已经明白了,无非是单次转换扫描模式换成连续扫描而已。即一次转换完成继续下一次转换且可以转换多个通道而已。
五、ADC的对齐模式:
由于此芯片的ADC为12位的,而数据寄存器为16位的,如果选择左对齐也就是相当于往左位移了4位,也就是扩大了AD采集结果。二进制特点就是数据左移一次就等效于把这个数据乘2,而左移4次也就是扩大了16倍了。
而数据右对齐则没有这种情况,且平常都是使用右对齐。
六、ADC配置流程
1. GPIO的初始化(开启时钟包括ADC的时钟,配置为模拟输入)
2. 选择ADC的预分频系数(很重要!)
3. ADC的初始化:ADC的模式(ADC_Mode:选择是否独立模式)、
数据对齐(ADC_DataAlign:左对齐或右对齐)、
外部触发转换选择(ADC_ExternalTrigConv:三种触发源)、
是否为连续转换模式(ADC_ContinuousConvMode)、
是否为扫描模式(ADC_ScanConvMode)、
通道数目(ADC_NbrOfChannel)。最后初始化ADC_Init();
4. ADC通道配置: 选择通道以及采样时间
5. ADC使能以及校准:ADC_Cmd(ADCx,ENABLE);
6. 使能或者失能指定的ADC的软件转换启动功能
七、ADC的代码例程展示
/**==============================================================================*函数名称:ADC1_Init*函数功能:初始化ADCx*输入参数:无*返回值:无*备 注:无*==============================================================================*/
void ADC1_Init(void)
{// 结构体定义GPIO_InitTypeDef GPIO_InitStructure;ADC_InitTypeDef ADC_InitStructure;// 开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1,ENABLE);// 设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14MRCC_ADCCLKConfig(RCC_PCLK2_Div6);// GPIO配置GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1; //ADC1通道1GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; // 模拟输入GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);// ADC参数配置ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 独立模式ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 非扫描模式 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // 关闭连续转换ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 禁止触发检测,使用软件触发ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; // 1个转换在规则序列中 也就是只转换规则序列1 ADC_Init(ADC1, &ADC_InitStructure); // ADC初始化ADC_RegularChannelConfig(ADC1,ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 );ADC_Cmd(ADC1, ENABLE); // 开启AD转换器// ADC校准ADC_ResetCalibration(ADC1); // 重置指定的ADC的校准寄存器while(ADC_GetResetCalibrationStatus(ADC1)); // 获取ADC重置校准寄存器的状态ADC_StartCalibration(ADC1); // 开始指定ADC的校准状态while(ADC_GetCalibrationStatus(ADC1)); // 获取指定ADC的校准程序ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 使能或者失能指定的ADC的软件转换启动功能
}uint16_t AD_GetValue(void)
{ADC_SoftwareStartConvCmd(ADC1, ENABLE);//开启转换while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//等待转换完成标志位return ADC_GetConversionValue(ADC1);// 返回获取转换结果
}
这里附上一张ADC库函数图:
由于扫描模式得配合DMA使用,否则数据来不及移走导致清空,所以这里先不介绍,在下篇DMA的文章中将会介绍。
相关文章:

STM32——ADC篇(ADC的使用)
一、ADC的介绍 1.1什么是ADC ADC(Analogto-Digital Converter)模拟数字转换器,是将模拟信号转换成数字信号的一种外设。比如某一个电阻两端的是一个模拟信号,单片机无法直接采集,此时需要ADC先将短租两端的电…...

(文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
参考文献: [1]潘虹锦,高红均,杨艳红,等.基于主从博弈的售电商多元零售套餐设计与多级市场购电策略[J].中国电机工程学报,2022,42(13):4785-4800. 1.摘要 随着电力市场改革的发展,如何制定吸引用户选择的多类型零售套餐成为提升售电商利润的研究重点。为…...

深度评价GPT-4o:探索人工智能的新里程碑
在人工智能领域,OpenAI的GPT系列自推出以来就备受瞩目。GPT-4o作为该系列的最新版本,无疑是迄今为止最为强大的一代。它不仅在技术性能上有了质的飞跃,而且在应用的广泛性和深度上都展现出了惊人的潜力。本文将从版本对比、技术能力、使用体验…...

Linux命令篇(六):vi/vim专项
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝您生活愉快! 文章目录 一、什么是vim二…...

Java 还能不能继续搞了?
金三银四招聘季已落幕,虽说行情不是很乐观,但真正的强者从不抱怨。 在此期间,我收到众多小伙伴的宝贵反馈,整理出132道面试题,从基础到高级,有八股文,也有对某个知识点的深度解析。包括以下几部…...

【日记】遇到了一个很奇怪的大爷(845 字)
正文 花了昨天和今天两天时间,把数据转移完了。这块 2T 的硬盘可以光荣退休了。目前是没什么存储焦虑了。 农发行净开发一些垃圾系统。今天没什么业务,但跟 ActiveX 斗智斗勇了一整天,最后实在搞不过 IE 浏览器。我也懒得管了,又不…...

Python 机器学习 基础 之 处理文本数据 【处理文本数据/用字符串表示数据类型/将文本数据表示为词袋】的简单说明
Python 机器学习 基础 之 处理文本数据 【处理文本数据/用字符串表示数据类型/将文本数据表示为词袋】的简单说明 目录 Python 机器学习 基础 之 处理文本数据 【处理文本数据/用字符串表示数据类型/将文本数据表示为词袋】的简单说明 一、简单介绍 二、处理文本数据 三、用…...

GAT1399协议分析(10)--视频定义及解析
一、官方定义 二、字段解析 VideoID 类型BasicObjectID 解析参考GAT1399协议分析(8)--ImageInfo字段详解-CSDN博客 InfoKind 采集类型...

【C语言】学生管理系统:完整模拟与实现
🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C笔记专栏: C笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 🔥引言 本篇文章为修改了在校期间实训报告,使用C…...

pypi 发布自己的包
注册pypi个人用户 网址:https://pypi.org 目录结构dingtalk_utils 必须-pkgs- __init__.py .gitignore LICENSE 必须 README.md 必须 requirements.txt setup.py 必须安装依赖 pip install setuptools wheel安装上传工具 pip install twinesetup.py i…...

关闭windows11磁盘地址栏上的历史记录
关闭windows11的磁盘地址栏上的历史记录 windows11打开磁盘后访问某一个磁盘路径后会记录这个磁盘路径,而且有时候会卡住这个地址栏(关都关不掉),非常麻烦。 如下图所示: 关闭地址栏历史记录 按下windows键打开开…...

DDS自动化测试落地方案 | 怿星科技携最新技术亮相是德科技年度盛会
5月28日,怿星科技作为是德科技的重要合作伙伴亮相Keysight World Tech Day 2024。在此次科技盛会上,怿星科技不仅展示了领先的DDS自动化测试解决方案等前沿技术,还分享了在“周期短、任务重”的情况下,如何做好软件开发和测试验证…...

新品!和芯星通全系统全频高精度板卡UB9A0首发
6月6日,和芯星通发布了UB9A0全系统全频高精度GNSS板卡,主要应用于CORS站、便携基站、GNSS全球监测跟踪站等。延续了上一代产品高质量原始观测量的特点,UB9A0在性能和稳定性方面均表现出众。 UB9A0基于射频基带及高精度算法一体化的GNSS SoC芯…...

Cognita RAG:模块化、易用与可扩展的开源框架
Cognita RAG是一个开源框架,它通过模块化设计、用户友好的界面和可扩展性,简化了将领域特定知识整合到通用预训练语言模型中的过程。本文介绍了Cognita的特点、优势、应用场景以及如何帮助开发者构建适合生产环境的RAG应用程序。 文章目录 Cognita RAG介…...

linux虚拟机免密登录配置
1、假设A服务器要免密登录B服务器 2、在A服务器上执行命令: cd /root/.ssh/ ssh-keygen -t rsa #这里会生成两个文件 一个是id_rsa私钥和公钥rsa.pub2、我们把公钥的内容复制粘贴到B服务器的/root/.ssh/authorized_keys文件下 #在A服务器上执行命令记录内容 cat …...

Qt_C++ RFID网络读卡器Socket Udp通讯示例源码
本示例使用的设备: WIFI/TCP/UDP/HTTP协议RFID液显网络读卡器可二次开发语音播报POE-淘宝网 (taobao.com) #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QHostInfo> #include <QNetworkInterface> #include <…...

C++ 实现Python 列表list 的两种方法
1、vector里面放多种参数。在C中,如果你想要在std::vector中存储不同类型的参数,你可以使用std::any(C17及以上)或std::variant(C17以前的版本需要使用Boost库或者C17及以上标准)。以下是使用std::vector&l…...

vue3+ elementPlus PC端开发 遇到页面已进入就form校验了的问题
form表单一进页面就校验了 rules里配置的 require 提示语 如图所示代码是这样的 最后发现是form表单下面的一个按钮的展示规则 会导致规则校验 canAddInsured 这个字段的变化会导致form表单校验 这个字段是computed maxInsureds 也是个computed监听 maxInsured.value >1 就…...

transformers DataCollator介绍
本博客主要介绍 transformers DataCollator的使用 from transformers import AutoTokenizer, AutoModel, \DataCollatorForSeq2Seq, DataCollatorWithPadding, \DataCollatorForTokenClassification, DefaultDataCollator, DataCollatorForLanguageModelingPRETRAIN_MODEL &qu…...

rust学习(字节数组转string)
最新在写数据传输相关的操作,发现string一个有趣的现象,代码如下: fn main() {let mut data:[u8;32] [0;32];data[0] a as u8;let my_str1 String::from_utf8_lossy(&data);let my_str my_str1.trim();println!("my_str len is…...

Docker:技术架构演进
文章目录 基本概念架构演进单机架构应用数据分离架构应用服务集群架构读写分离/主从分离架构冷热分离架构垂直分库微服务容器编排架构 本篇开始进行对于Docker的学习,Docker是一个陌生的词汇,那么本篇开始就先从技术架构的角度出发,先对于技术…...

汽车MCU虚拟化--对中断虚拟化的思考(2)
目录 1.引入 2.TC4xx如何实现中断虚拟化 3.小结 1.引入 其实不管内核怎么变,针对中断虚拟化无非就是上面两种,要么透传给VM,要么由Hypervisor统一分发。汽车MCU虚拟化--对中断虚拟化的思考(1)-CSDN博客 那么,作为车规MCU龙头…...

python的继承
本章正式开始之前,先让我们回顾一下什么是 对象 ? 什么是 类 ? 小贝 喜欢 猫咪,今年领养了一只名叫 Kitty 的 布偶猫。则下列哪项是 对象 呢? A. 猫咪 B. Kitty C. 布偶猫 相比之下,闻闻 更喜欢 犬科 动…...

组件的注册和引用
在Vue中,开发者可以将页面中独立的、可重用的部分封装成组件,对组件的结构,样式和行为进行设置。组件是 Vue 的基本结构单元,组件之间可以相互引用。 一.注册组件 当在Vue项目中定义了一个新的组件后,要想在其他组件中…...

诊所如何赢得患者?做好这两点很关键!
大家都知道,社区周边的诊所原本是居民看病的第一选择,方便又快捷。但现在很多诊所服务都差不多,没有自己的特色,这就让患者有点难选择了。那诊所怎么做才能更吸引患者呢?其实,关键是要抓住患者的心…...

Qwen2本地部署的实战教程
大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...

html+CSS+js部分基础运用15
1、完成输入框内容的实时反向输出。 2、银行账户余额变动自动通知项目。 设计要求:单击按钮后,余额按照输入框的数额减少,同时将按钮式的提示信息(金额)同步改变。利用侦听属性实现余额发生变化时发出提示信息&#x…...

从零开始学JAVA
一、编写Hello world程序 public class JavaMain1 {//主程序执行入口,main方法public static void main(String[] args){System.out.println("Hello world!");} } 运行结果 Hello world! java编写主程序常见错误: 1、System ---首字母没有…...

MySQL(四)查询
1、MySQL限性约束 —非空、唯一(自增)、主外键、检查(MySQL存在但是不能用)。 约束主要完成对数据的校验,保证数据库数据的完整性;如果有相互依赖数据,保证该数据不被删除。 1)常用五类约束 not null :非空约束,指定某列不为空。 unique:唯一约束,指定某列和几列组…...

嵌入式学习——网络编程(TCP)——day31
1. TCP和UDP的区别 TCP(Transmission Control Protocol,传输控制协议) UDP(User Datagram Protocol,用户数据报协议) 1.1 连接方式 TCP 是面向连接的协议,它在数据传输前需要通过三次握手建立…...