STM32 ADC采样详解

Content

  • 0x00 前言
  • 0x01 ADC配置
  • 0x02 滤波处理

0x00 前言

在单片机开发过程中,常常涉及到ADC的使用,市面上大部分便宜的传感器都是采用的ADC来获取其数据,如MQ-2 烟雾传感器、光敏传感器等等。
在这里插入图片描述
在这里插入图片描述

此类传感器工作原理为根据所采集到的数据变化,造成其电阻率、电导率等参数变化,从而改变输出电压的大小。而我们通过采集传感器模块的输出电压,即可分析到所需要的信息,这个过程是由模拟信号(因为数据并不是直接以数字体现,而是以电压形式给出,所以称模拟)转化为数字信号(我们需要的是一个数值:浓度,强度),所以这个外设被称为ADC(Anology to Digital),其中C表示的Convert,为转换器的意思。

那么通俗的来说,ADC就是将模拟信号转换为数字信号的一个外设。通过ADC,可以获取到以电压形式体现的信息。还是以烟雾传感器传感器为例,假设烟雾传感器的电压输出范围是0-5v,其中显而易见0代表的是烟雾浓度为0%,5v代表的是烟雾浓度为100%,2.5v代表的烟雾浓度为50%。

我们为获取当前环境的烟雾传感器浓度,只需要采集到 烟雾传感器输出的电压即可。

0x01 ADC配置

现在需要确定一下你的引脚选择,既然是要使用ADC,那么所选择的引脚必须是具有ADC功能才对,现在可以在以下表中选择ADC引脚,例如我选择PA1引脚,那么我接下来应该配置ADC1的通道1。
在这里插入图片描述

具体的配置参数细节都已经在注释之中了:

void ADC_Init()
{ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;// 使能ADC1外设时钟,以及将PA1引脚设置为模拟输入模式。RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE );// 设置ADC的时钟频率,也就是STM32的主频 72M/分频因子6 = 12M, 不能超过14M,否则会造成ADC采样精度下降RCC_ADCCLKConfig(RCC_PCLK2_Div6);// 配置为模拟输入模式 Anology Input                    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOA, &GPIO_InitStructure);ADC_DeInit(ADC1);  //复位ADC1 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	//ADC工作模式:ADC1和ADC2工作在独立模式// 开启扫描模式,则会依次扫描通道,例如你有多个烟雾传感器连接在通道1,通道2,通道3 ,通道4ADC_InitStructure.ADC_ScanConvMode = DISABLE;	//模数转换工作在单通道模式// 单次转换模式或连续转换模式,如果开启了连续转换模式就会自动连续进行转换,否则需要自己需要的时候开启转换// 使用DMA时开启自动转换也会更加方便ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;	//模数转换工作在单次转换模式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//转换由软件而不是外部触发启动//左对齐,数据范围0-65535,右对齐,数据范围0-4065(精度一样都是12位,只是12位数据以不同的对齐方式放在了uint16_t变量中)ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Left;	//ADC数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 1;//顺序进行规则转换的ADC通道的数目ADC_Init(ADC1, &ADC_InitStructure);	//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器// 注意这两个函数是不一样的,先复位校准再进行初始校准ADC_Cmd(ADC1, ENABLE);	//使能指定的ADC1ADC_ResetCalibration(ADC1);	//使能复位校准  while(ADC_GetResetCalibrationStatus(ADC1));	//等待复位校准ADC_StartCalibration(ADC1);	 //开启AD校准while(ADC_GetCalibrationStatus(ADC1));	 //等待初始校准
}

至此ADC校准就结束了,此时就可以编写ADC的单次转换函数了

uint16_t GetAdcValue(u8 ch)   
{// 对ADC1的通道1 进行单次转换ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );//使能指定的ADC1的软件转换启动功能	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束return (ADC_GetConversionValue(ADC1));	// 返回ADC采样值
}

0x02 滤波处理

一般由于ADC采样到的值是不稳定的,并且电压变化的速率以及大于了ADC的采样速率,并且现实中也会有各种的干扰情况发生,所以单次采样的值并不能代表实际采样的值。

为减少这种情况的发生,所以就要进行一定的滤波处理了。

初中老师以及教过,对于化学、物理、生物实验,为了避免实验的偶然性,应当多做实验。ADC 采样也不例外,可以多次测量,取平均值,在短时间内进行多次ADC采样,取得平均值结果。那么这个就是叫做平均值滤波。这个一般只是一个很简单的处理,通常也是误差比较大的,因为加入你采到了一个非常离谱的数据,贸然取平均值便会导致整体采样值偏移。

如图,以下是由180个采样点,插入一些随机的噪声,贸然取平均值得到的数据,整体大致偏移了2000,这算是很大的误差了

在这里插入图片描述

那么还有一个方法是参考其他的采样数据,从而剔除不合理的数据,例如采用方差
等数据剔除不合理的数据,筛选一遍过后,计算得到平滑数据,如下:
在这里插入图片描述
当然,并非只有一种滤波算法可选,也可以选择一套动态的滤波算法如FFT,适用且可以应用于大多数场景。

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

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

相关文章

大模型入门 ch01:大模型概述

本文是github上的大模型教程LLMs-from-scratch的学习笔记,教程地址:教程链接 STAGE 1: BUILDING 1. 数据准备与采样 LLM的预测过程,是一个不断预测下一个词(准确的说是token)的过程,每次根据输…

【C++八股题整理】内存布局、堆和栈、内存泄露、函数调用栈

C八股题整理 内存布局C中的内存分配情况堆和栈的内存有什么区别? 堆堆内存分配慢如何优化?内存池内存溢出和内存泄漏是什么?如何避免?内存碎片是什么?怎么解决? 栈为什么栈的访问效率比堆高?函数…

UI自动化测试 —— web端元素获取元素等待实践!

前言 Web UI自动化测试是一种软件测试方法,通过模拟用户行为,自动执行Web界面的各种操作,并验证操作结果是否符合预期,从而提高测试效率和准确性。 目的: 确保Web应用程序的界面在不同环境(如不同浏览器、操作系统)下…

【前缀和算法】--- 进阶题目赏析

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 算法Journey 本篇我们来赏析前缀和算法的进阶题目。 🏠 和可被K整除的子数组 📌 题目解析 和可被k整除的子数组 📌 …

记一次ssh伪终端修改为shell

问题 用户ssh进行连接后,默认为伪终端。 解决办法,可以先拿到终端shell,查看用户是否为/bin/bash: 不是/bin/bash,使用如下命令进行修改: chsh -s /bin/bash rootservice sshd restart

量化投资策略与技术学习PART1.1:量化选股之再谈多因子模型(二)

在上一个多因子模型中,我手动对各个因子进行了回测,但是数据结果并不是十分理想,难道基本面指标真的和股票走势关系不大么? 这里我还是准备再测试一下,策略如下: (1)首先我获取了一下…

codeforces Round 970 (Div. 3)(A-F)

文章目录 [Codeforces Round 970 (Div. 3)](https://codeforces.com/contest/2008)A-[Sakurakos Exam](https://codeforces.com/contest/2008/problem/A)B-[Square or Not](https://codeforces.com/contest/2008/problem/B)C-[Longest Good Array](https://codeforces.com/cont…

Ubuntu上安装配置(jdk/tomcat/ufw防火墙/mysql)+mysql卸载

jdk安装 1.上传jdk压缩包 详情: 下载rz服务(lrzsz):sudo apt install lrzsz(在主用户root就不用sudo)下载压缩包:rz 2.解压jdk压缩包 : 详情: 在压缩包所在位置(解压压缩使用看Li…

测试人如何高效地设计自动化测试框架?

关于测试框架的好处,比如快速回归提高测试效率,提高测试覆盖率等这里就不讨论了。这里主要讨论自动化框架包含哪些内容,以及如何去设计一个测试框架。 什么是自动化测试框架? 它是由一个或多个自动化测试基础模块、自动化测试管…

Qt22双缓冲机制

Qt22双缓冲机制 知识点drawwidgetdrawwidget.hdrawwidget.cpp mainwindowmainwindow.hmainwindow.cpp main.cpp运行图 知识点 双缓冲就是在内存区申请一块缓存;然后显卡直接从这块内存读取数据.。 这样就不用鼠标边画,经过IO来读取这个环节;…

EasyExcel实现复杂Excel的导入

最近项目中遇到一个复杂的Excel的导入,并且数据量较大。因为数据不规则,所以只能使用POI进行自定义读取,但是发现数据量大之后,读取数据非常耗时。后面换成EasyExcel,性能起飞。 1. Excel样板 如上图,需要…

【C++】汇编分析,函数是如何调用,传参,返回

传参 有的是用寄存器传参,有的用push传参 我在MSVC编译测出来的是PUSH传参(debug模式),具体过程如下 long func(long a, long b, long c, long d,long e, long f, long g, long h) {long sum;sum (a b c d e f g h);ret…

VMware安装windows虚拟机详细过程

目录 准备工作配置虚拟机为虚拟机设置操作系统镜像安装windows10 准备工作 安装好VMware软件并激活,激活码自行查找 准备好系统镜像文件,可以在MSDN中下载,地址:https://next.itellyou.cn/ 配置虚拟机 选择自定义 默认 选择稍后…

骨灵冷火!Solon Cloud Gateway 照面发布

骨灵冷火,是练药的好火哟。极冷,又极热。在冰冻中被烧死:) 1、认识 Solon Cloud Gateway Solon Cloud Gateway 是基于 Solon Cloud、Vert.X 和 Solon Rx(reactive-streams) 接口实现。小特点: 纯响应式的接口体验流…

[Linux]:基本指令(上)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 与Windows环境不同,我们在linux环境下需要通过指令进行各操作&…

13.DataLoader 的使用

DataLoader 的使用 dataset:告诉程序中数据集的位置,数据集中索引,数据集中有多少数据(想象成一叠扑克牌)dataloader:加载器,将数据加载到神经网络中,每次从dataset中取数据&#x…

Zynq7000系列FPGA中的DDRC纠错码(ECC)

仅在半总线宽度(16位)数据宽度配置中提供可选的ECC支持。这种配置下,外部DRAM DDR设备需要26位,其中16位用于数据,10位用于ECC。每个数据字节使用独立的5位ECC字段,这种模式提供了单错误纠正和双错误检测的…

UE5蓝图 抽卡出货概率

SSR概率0.1 SR概率0.2 R概率0.7 ps:数组内相加为1。且从小到大排序。

C练手题--Two Oldest Ages 【7 kyu】

一、原题 链接:Training on Two Oldest Ages | Codewars The two oldest ages function/method needs to be completed. It should take an array of numbers as its argument and return the two highest numbers within the array. The returned value should b…

网络-多路io

了 fcntl 函数来操作文件描述符的状态标志,其中主要是为了设置非阻塞模式。下面是对 fcntl 函数及其参数的详细解释: fcntl 函数 fcntl 是一个用于操作文件描述符的系统调用,可以用来设置或获取文件描述符的各种属性。其原型如下&#xff1…