单片机——ADC采样

news2024/9/25 20:13:26

1、什么是ADC采样?

        ADC是指将模拟信号转换成数字信号的过程。通俗理解ADC采样就是采集电路中的电压,通过数值的方式表现出来。以STM32F103系列为例,它可以反应0~4095,换句话说,它采集的电压数值上表现为0~4095,也就是12位ADC(2^12)。

2、如何理解采集的数值?

        以STM32F103芯片为例,供电电压是3.3V,它能检测的电压也是0~3.3V。这就好理解了,0~3.3V电压对应的是0~4095数值。通俗理解为把3.3V分成了4096份,采集上来多少份占3.3V的比例。

        采集电压=(采集数值/4095)*3.3V

3、ADC采样具体知识和步骤

3.1、步骤

(1)使能用于ADC检测的引脚对应的GPIO口,使能ADC2通道时钟(ADC1也可以,这款芯片有俩个ADC外设)

(2)时钟分频

(3)初始化GPIO引脚并配置成输入模式

(4)配置ADC的工作模式

(5)使能指定的ADC

(6)开启复位校准

注:ADC的输入时钟不得超过14MHZ,它是由PCLK2经分频产生。

3.2、 ADC知识讲解

3.2.1、通道选择

         每个 ADC有 18 个通道,其中有16个外部通道(不同引脚数的STM32外部通道数可能有所差异),其余两个是内部通道。

        ADC通道和引脚对应关系如下(STM32F103C8T6为例):

  3.2.2、单次转换和连续转换

  3.2.3、独立模式和多重模式

        独立模式即所有ADC转换器(ADC1、ADC2和ADC3)均独立地工作,互不影响。

        多重模式即多个ADC(如果存在)根据通用寄存器中的设置,按照指定的方式协同工作。

3.2.4、数据对齐

        比如说AD转换后数字量保存在ADCH,ADCL两个寄存器中
        左对齐就是AD值的最高位就是ADCH的最高位了,ADCL的低位就会有的用不到,读出来为0
        右对齐就是AD值的最低位是ADCL的最低位,而ADCH的高位就会有的用不到,读出来也为0
        左对齐:11111111 11110000
        MSB LSB
        右对齐:00001111 11111111
        MSB LSB

3.2.5、注入组和规则组

注:

(1)当完成所有注入通道转换,下个触发启动第 1 个注入通道的转换。在上述例子中,第四个
触发重新转换第 1 个注入通道 1
(2)不能同时使用自动注入和间断模式。
(3)必须避免同时为规则和注入组设置间断模式。间断模式只能作用于一组转换。

3.2.6、 ADC校准

3.3、代码示例

3.3.1、初始化

void Adc_Init(void)
{ 
	u8 i;
	ADC_InitTypeDef ADC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC2, ENABLE ); //使能 ADC2 通道时钟

	RCC_ADCCLKConfig(RCC_PCLK2_Div4); 									//设置 ADC 分频因子 6

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;						//模拟输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);								//初始化 GPIOA
	
	ADC_DeInit(ADC2);

	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;					//ADC 独立模式
	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 数据右对齐
	ADC_InitStructure.ADC_NbrOfChannel = 1;								//顺序进行规则转换的ADC通道的数目
	ADC_Init(ADC2, &ADC_InitStructure);									//根据指定的参数初始化外设 ADCx
	
	ADC_Cmd(ADC2, ENABLE);												//使能指定的 ADC2
	for(i=0;i<100;i++);

	ADC_ResetCalibration(ADC2); 											//开启复位校准
	while(ADC_GetResetCalibrationStatus(ADC2));							//等待复位校准结束
	ADC_StartCalibration(ADC2);											//开启 AD 校准
	while(ADC_GetCalibrationStatus(ADC2));								//等待校准结束
}

3.3.2、获取ADC数值

u16 Get_Adc1(void)
{
	ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5); //通道1
	ADC_SoftwareStartConvCmd(ADC2, ENABLE);							//使能指定的 ADC2 的软件转换功能
	while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC ));					//等待转换结束
	return ADC_GetConversionValue(ADC2);							//返回最近一次 ADC2 规则组的转换结果
}


u16 Get_Adc2(void)
{
	ADC_RegularChannelConfig(ADC2, ADC_Channel_2, 1, ADC_SampleTime_239Cycles5); //通道2
	ADC_SoftwareStartConvCmd(ADC2, ENABLE);							//使能指定的 ADC2 的软件转换功能
	while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC ));					//等待转换结束
	return ADC_GetConversionValue(ADC2);							//返回最近一次 ADC2 规则组的转换结果
}

3.3.3、主函数

u8 Val;
u8 ADC;
int main(void)
{

   	Adc_Init();                        //ADC初始化
	while (1)
	{	
        ADC = Get_Adc1();                //将1通道检测的数值传给ADC变量
        Val = (ADC*3.3)/4095             //计算得到1通道检测的电压
	}
	
}

注:上述配置下, 多通道采集时,俩个通道采集之间要有一定的间隔。

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

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

相关文章

文心快码获2024北京信息通信行业网络安全产品优秀应用

日前&#xff0c;2024北京互联网大会在京举办。在“网络安全与数据保护”分论坛上&#xff0c;百度智能代码助手文心快码Baidu Comate荣获北京信息通信行业网络安全产品优秀应用案例。 &#xfeff; 本场论坛聚焦“共筑安全底座 服务社会民生”主题&#xff0c;共商北京数字经…

江科大51单片机

文章目录 led灯led点亮led闪烁流水灯 独立按键按键点灯按键消抖按键实现二进制流水灯按键实现流水灯 数码管静态数码管显示动态数码管显示 矩阵键盘定时器/中断串口通信led点阵屏DS1302实时时钟蜂鸣器AT24C02DS18B20LCD1602直流电机驱动AD/DA红外遥控 led灯 创建项目&#xff…

2024自学网络安全的三个必经阶段(含路线图)

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等 一系列政策/法规/标准的持续落地 &#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏…

CoT让Transformer打破推理极限的讨论

论文简要 题目&#xff1a;Chain of Thought Empowers Transformers to Solve Inherently Serial Problems Denny Zhou等人提出的中间推理token&#xff0c;跟o1的核心技术CoT非常相似。 传统的Transformer模型的致命弱点&#xff0c;就是擅长并行计算&#xff0c;但不擅长串…

动物关键点数据集-yolov8 pose动物关键点识别-动物姿态估计-keypoints(代码+数据集)

跨域适应于动物姿态估计 概览 本文介绍了一个专门用于动物姿态估计的数据集&#xff0c;该数据集包含了五个不同种类的动物&#xff1a;狗、猫、牛、马和羊。整个数据集中共包含超过6000个实例&#xff0c;分布在4000多张图像上。此外&#xff0c;数据集还为另外七种动物提供…

QT创建线程,QT多线程的创建和使用,QT线程池

一、在Qt中创建多线程的原因和优势 1. **UI响应性&#xff1a;** - 在单线程模型中&#xff0c;如果需要执行长时间运行的任务&#xff08;如网络请求、文件I/O、计算密集型操作等&#xff09;&#xff0c;这将会阻塞主线程&#xff0c;导致UI无响应。通过在单独的线程中执…

分布式框架 - ZooKeeper

一、什么是微服务架构 1、单体架构 顾名思义一个软件系统只部署在一台服务器上。 ​ 在高并发场景中&#xff0c;比如电商项目&#xff0c;单台服务器往往难以支撑短时间内的大量请求&#xff0c;聪明的架构师想出了一个办法提高并发量&#xff1a;一台服务器不够就加一台&am…

Bottleneck、CSP、DP结构详细介绍

文章目录 前言一、BottleneckDarknetBottleneck 二、CSPCSP思想pp-picodet中的CSPLayer DP卷积 前言 本篇文章详细介绍了三种神经网络中常见的结构&#xff0c;bottleneck、CSP、DP&#xff0c;并附上了代码加深理解。 一、Bottleneck Bottleneck出现在ResNet50/101/152这种…

矩阵特征值怎么求?矩阵特征值计算器来帮你

大家好&#xff0c;这里是效率办公指南&#xff01; &#x1f4da;今天我们要探讨一个数学和编程领域中经常遇到的问题——矩阵特征值的计算方式&#xff0c;以及如何计算一个2x2矩阵的特征值。无论你是数学爱好者&#xff0c;还是编程高手&#xff0c;这个主题都可能对你有所…

29 C 语言中的随机数实现:rand 与 srand

目录 1 为什么需要随机数&#xff1f; 1.1 背景介绍 1.2 应用场景 2 C 语言实现随机数 2.1 rand() 函数 2.1.1 函数原型 2.1.2 功能说明 2.1.3 案例演示 2.2 srand() 函数 2.2.1 函数原型 2.2.2 功能说明 2.2.3 案例演示 2.3 指定范围的随机数 2.3.1 获…

为什么 qt 成为 c++ 界面编程的第一选择?

一、前言 为什么现在QT越来越成为界面编程的第一选择&#xff0c;笔者从事qt界面编程已经有接近8年&#xff0c;在这之前我做C界面都是基于MFC&#xff0c;也做过5年左右。当时为什么会从MFC转到QT&#xff0c;主要原因是MFC开发界面想做得好看一些十分困难&#xff0c;引用第…

hexo github部署,通过域名访问你的博客

hexo github部署&#xff0c;通过域名访问你的博客 hexo 常用命令hexo github 部署 在部署之前&#xff0c;了解一下hexo的常用命令 hexo 常用命令 hexo new "My New Post" # 新建文章 hexo n "My New Post"hexo generate # 生成静态文件 hexo ghexo serv…

【CTF】Nginx日志注入

Nginx日志注入&#xff1a; 日志包含漏洞的成因还是服务器没有进行严格的过滤 &#xff0c;导致用户可以进行任意文件读取&#xff0c;但是前提是服务器需要开启了记录日志的功能才可以利用这个漏洞。 对于Apache&#xff0c;日志存放路径&#xff1a;/var/log/apache/access.l…

【论文阅读】FedBABU:TOWARD ENHANCED REPRESENTATION FOR FEDERATED IMAGE CLASSIFICATION

算法流程&#xff1a; 训练过程中冻结客户端的头部参数&#xff0c;只训练主体参数。训练完之后再在客户端本地跑几个epoch微调一下&#xff08;文章推荐5个&#xff09;。 由于该算法与FedPer思路过于相似&#xff0c;故读完后跑了个实验。 FedPer:训练过程中只聚合主体参数。…

Redis --- redis事务和分布式事务锁

redis事务基本实现 Redis 可以通过 MULTI&#xff0c;EXEC&#xff0c;DISCARD 和 WATCH 等命令来实现事务(transaction)功能。 > MULTI OK > SET USER "Guide哥" QUEUED > GET USER QUEUED > EXEC 1) OK 2) "Guide哥"使用 MULTI命令后可以输入…

Linux应用开发实验班——JSON-RPC

目录 前言 1.是什么JSON-RPC 2.常用的JSON函数 1.创建JSON 2.根据名字获取JSON 3.获取JSON的值 4.删除JSON 3.如何进行远程调用 服务器 客户端 4.基于JSON-RPC进行硬件操作 课程链接 前言 学习的课程是百问网韦东山老师的课程&#xff0c;对更详细步骤感兴趣的同学…

LINUX网络编程:Tcp(2)

目录 1.Tcp流量控制 2.滑动窗口 2.1滑动窗口的更新 2.2滑动窗口的丢包问题 1.报文丢失的情况 2.ACK丢失的情况 3.拥塞控制 3.1慢启动 3.2拥塞窗口的增长 1.Tcp流量控制 为什会有流量控制&#xff1f; 1.在网络通信中&#xff0c;假如发送方的发送能力特别的强&#xff0…

支付宝沙箱环境 支付

一 什么是沙箱&#xff1a; 沙箱环境是支付宝开放平台为开发者提供的安全低门槛的测试环境 支付宝正式和沙箱环境的区别 &#xff1a; AI&#xff1a; 从沙箱到正式环境&#xff1a; 当应用程序开发完成后&#xff0c;需要将应用程序从沙箱环境迁移到正式环境。 这通常涉及…

opencv图像增强十四:opencv两种白平衡介绍及实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、白平衡介绍二、灰度世界法三、完美反射法 前言 在摄影与影像领域&#xff0c;白平衡是一个至关重要的概念。它直接影响着画面的色彩表现&#xff0c;关系到…

构建网络遇到的问题-AlexNet

1.对模型进行初始化采用的一般代码 def _initialize_weights(self):for m in self.modules(): # 遍历模型每一层if isinstance(m, nn.Conv2d): # 判定m层是否属于nn.Conv2d类型nn.init.kaiming_normal_(m.weight, modefan_out, nonlinearityrelu)if m.bias is not None:nn.in…