单片机——ADC采样

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 分频因子 6GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;						//模拟输入GPIO_Init(GPIOA, &GPIO_InitStructure);								//初始化 GPIOAADC_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);									//根据指定的参数初始化外设 ADCxADC_Cmd(ADC2, ENABLE);												//使能指定的 ADC2for(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); //通道1ADC_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); //通道2ADC_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.xdnf.cn/news/1540599.html

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

相关文章

动态线程池(四)

动态线程池 dtp生命周期管理 生命周期相关类图 DtpExecutor EagerEtpExecutor OrderedDtpExecutor TaskWrapper任务包装器 MdcRunnable TaskWrappers NotifyEnum NoticeManager通知管理器 InvokerChain调用链

Unborn安装CUDA Toolkit 12.2

Unborn安装CUDA Toolkit 12.2 Unborn安装CUDA Toolkit前言下载安装配置验证 Unborn安装CUDA Toolkit 前言 今天在某台Unborn系统上安装某个依赖库时&#xff0c;提示环境中缺少CUDA_HOME环境变量&#xff0c;导致在安装某些依赖时出现问题。具体异常如下&#xff1a; Lookin…

什么是大数据?一文讲清大数据的概念、演进、趋势、产业链及关键技术!

前言 数字经济浪潮下&#xff0c;数据已成为当今最为核心的资源之一&#xff0c;数据成为推动企业和社会发展、转型、创新的新型生产要素。 大数据这个词&#xff0c;不管您是不是相关行业的从业者&#xff0c;也都听过无数遍了&#xff0c;但对于大多数人来说&#xff0c;并…

共享单车轨迹数据分析:以厦门市共享单车数据为例(五)

先来聊聊啥是共享单车电子围栏&#xff1f; 共享单车电子围栏是一种基于地理位置技术的虚拟边界&#xff0c;用于管理和规范共享单车的停放和使用。这种技术通过在地图上划定特定区域&#xff0c;帮助用户了解哪些地方可以停车&#xff0c;哪些地方不能停车&#xff0c;从而减…

博导团队指导、解读实验结果、SCI论文润色

表观组&#xff1a; DAP-seq:转录因子-DNA互作研究工具 ATAC-seq :染色质开放程度研究工具 H3K4me3 ChIP-seq:组蛋白甲基化修饰工具 BS-seq :DNA甲基化研究工具 H3K27ac ChIP-seq:组蛋白乙酰化修饰研究工具 Cut&Tag:转录因子研究工具 ChIP-seq:转录因子-DNA互作工具 互作组…

HarmonyOS学习(十三)——数据管理(二) 关系型数据库

文章目录 1、基本概念2、运行机制3、默认配置与限制4、接口说明5、实战&#xff1a;开发“账本”5.1、创建RdbStore5.2、创建数据库5.3、增加数据5.4、删除数据5.5、修改数据5.6、查询数据5.7、备份数据库5.8、恢复数据库5.9、删除数据库 官方文档地址&#xff1a; 通过关系型…

IDEA配置全局的maven环境

1、关闭掉所有打开的项目&#xff0c;然后点击All settings 2、配置maven home path、user setting file、local repository。 3、配置JRE的版本 4、配置字节码版本

【RabbitMQ】死信队列、延迟队列

死信队列 死信&#xff0c;简单理解就是因为种种原因&#xff0c;无法被消费的消息。 有死信&#xff0c;自然就有死信队列。当一个消息在一个队列中变成死信消息之后&#xff0c;就会被重新发送到另一个交换器中&#xff0c;这个交换器就是DLX&#xff08;Dead Letter Excha…

对于C++继承中子类与父类对象同时定义其析构顺序的探究

思考这样一串代码的运行结果&#xff1a; #include <iostream> using namespace std; class Person { public:~Person() { cout << "~Person()" << endl; } }; class Student:public Person { public:~Student() { cout << "~Student(…

谷歌做外链的文章一定要原创吗?

在谷歌上做外链发布时&#xff0c;原创文章是必须的。虽然你可能会想到用一篇文章群发到很多网站&#xff0c;但这种做法并不会带来太大的SEO效果。谷歌非常重视内容的独特性和相关性。如果同样的文章重复发布到多个网站&#xff0c;搜索引擎很快就会识别出这种策略&#xff0c…

开发谷歌插件之GA埋点

目录 一、背景 二、踩坑 三、谷歌插件开发的GA埋点的实现方式 一、背景 开发了一个谷歌插件&#xff0c;领导需要对用户的一些行为进行分析&#xff0c;于是让我在代码里面加上GA埋点。由于我们的PC端的项目一直都有进行GA埋点&#xff0c;当时就想着&#xff0c;这不就是把…

页面关键路径渲染详解

关键路径渲染 浏览器不会等待全部资源都下载完后才进行渲染&#xff0c;而是采用渐进式的渲染方式&#xff0c;本文就介绍一下这种渐进式的渲染方式。 当浏览器获取到用于呈现网页的资源后&#xff0c;通常就会开始渲染网页。那么究竟是在什么时候就会开始渲染&#xff1f; …

LeetCode讲解篇之220. 存在重复元素 III

文章目录 题目描述题解思路题解代码 题目描述 题解思路 我们可以考虑存储数组中连续indexDiff个数字&#xff0c;这样我们只需要在这连续的indexDiff个数字中查找相差小于等于valueDiff的两个数字的问题 对于该查找问题&#xff0c;我们可以考虑使用以valueDiff大小为一个桶&a…

大厂程序员的健身之路

大厂程序员的健身之路 基本信息饮食正餐营养补剂 睡眠训练计划 基本信息 健身时间&#xff1a;2023.03 -> 2024.09体重变化&#xff1a;52kg -> 67kg 饮食 正餐 早餐&#xff1a;不吃午餐&#xff1a;两碗米饭 鱼/鸡肉 蔬菜 酸奶晚餐&#xff1a;两碗米饭 鱼/鸡肉…

简单题35-搜索插入位置(Java and Python)20240919

问题描述&#xff1a; Java&#xff1a; class Solution {public int searchInsert(int[] nums, int target) {int k 0;int i 0;while(i<nums.length){if(nums[i]target){return i;}if(nums[i]<target){k i1;}i;}return k;}}class Solution(object):def searchInsert(…

6.C_数据结构_查询_哈希表

概述 哈希表的查询是通过计算的方式获取数据的地址&#xff0c;而不是依次比较。在哈希表中&#xff0c;有一个键值key&#xff0c;通过一些函数转换为哈希表的索引值。 其中&#xff1a;这个函数被称为哈希函数、散列函数、杂凑函数&#xff0c;记为&#xff1a;H(key) 哈希…

NFT Insider #148:The Sandbox 推出 SHIBUYA Y3K 时尚系列,Azuki 进军动漫 NFT 领域

市场数据 加密艺术及收藏品新闻 Infinex 新推 NFT 系列首四日销售额破4000万美元 尽管顶级 NFT 系列表现不佳&#xff0c;Infinex 的最新 NFT 系列在首四日内销售额已超过 4000 万美元。Infinex 是一个非托管平台&#xff0c;提供轻松访问链上协议和 dApp。 Infinex Core 的…

189 轮转数组

解题思路&#xff1a; \qquad 首先要理解轮转的含义&#xff0c;轮转 将数组末尾元素移动至首位。轮转k不为负数&#xff0c;那如果k大于数组长度时会发生什么&#xff1f;定义n为数组长度&#xff0c;当k n时&#xff0c;数组元素的顺序又恢复成初始状态&#xff0c;下一次…

翻唱技巧:AU和Cubase翻唱录制对轨技巧

分享和记录一下个人翻唱的经验和技巧&#xff01;防止后续自己忘了&#xff01;同时如果有大佬看到&#xff0c;希望可以帮我指出其中的错误&#xff01;个人推荐用Cubase12录制翻唱&#xff0c;因为Cubase12可以做乐段的标记&#xff0c;翻唱时有助于学习一些歌曲的层次设计。…

opengl-redbook环境搭建(静态库)

所需库下载 gl3w(github地址)https://github.com/skaslev/gl3w 使用python3执行根目录下的gen脚本&#xff0c;会生成头文件include文件夹和src下gl3w.c文件。 glfw(github地址)https://github.com/glfw/glfw 本文项目结构 本文如红宝书一致&#xff0c;将glfw和gl3w引入…