STM32的HAL库开发---单通道ADC过采样实验

news/2025/2/24 0:14:03

一、如何用过采样和求均值的方式提高ADC的分辨率?

(1)如何确定过采样率

根据要增加的分辨率位数计算过采样频率方程:

假如ADC原来的分辨率是12位的,如果想提高为13位的,那么过采样频率就是原来采样频率的四倍,也就是说,原来一个周期采样一次,现在需要采样4次。这个分辨率是有局限性的,不可能无限提高它。

(2) 如何求均值

 举个例子:12位分辨率的ADC提高4位分辨率,采样频率就要提高256倍,即需要256次采集才能得到一次16位分辨率的数据。

然后将这256次采集结果求和,求和的结果再右移4位,就得到提高分辨率后的结果。

注意:提高N 位分辨率,需要 右移N位

二、实验介绍

1、功能描述 通过DMA读取数据

通过ADC1通道1PA1)过采样实现16位分辨率采集电压,并显示ADC转换的数字量及换算后的电压值

2、确定最小刻度

VREF+ = 3.3V ---> 0V ≤ VIN ≤  3.3V --->最小刻度 = 3.3 / 65536

3、确定转换时间

采样时间设置为最小值1.5ADC时钟周期,可以得到转换时间为1.17us * 256

4、模式组合

连续转换模式、不扫描模式

三、编程实战

通过ADC1的通道1(PA1)采集电压,16位分辨率

dma.c源程序

#include "./BSP/DMA/dma.h"
#include <string.h>

extern ADC_HandleTypeDef hadc;
DMA_HandleTypeDef hdma;
//配置ADC1的DMA1的通道1请求
void DMA_Init(void)
{
	//开启DMA1时钟
	__HAL_RCC_DMA1_CLK_ENABLE();
	
	//配置DMA1通道  因为ADC1连接在DMA1的通道1  这个在使用手册可以查找到
	hdma.Instance = DMA1_Channel1;
	
	//外设到内存
	hdma.Init.Direction = DMA_PERIPH_TO_MEMORY;
	//内存为16位
	hdma.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
	//内存递增
	hdma.Init.MemInc = DMA_MINC_ENABLE;
	//循环搬运 
	//当启动了循环模式,数据传输的数目变为0时,将会自动地被恢复成配置通道时设置的初值,DMA操作将会继续进行。
	hdma.Init.Mode = DMA_CIRCULAR;
	//外设16位
	hdma.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
	//外设地址不递增
	hdma.Init.PeriphInc = DMA_PINC_DISABLE;
	//通道1优先级为中
	hdma.Init.Priority = DMA_PRIORITY_MEDIUM;

	//配置DMA的通道1为外设到内存
	HAL_DMA_Init(&hdma);
	
	//将DMA句柄于ADC句柄连接起来 可以理解为将这个DMA句柄拷贝到ADC句柄里的DMA句柄上
	__HAL_LINKDMA(&hadc,DMA_Handle,hdma);
}

//标志DMA数据搬运完
uint8_t state = 0;
void DMA1_Channel1_IRQHandler(void)
{
	if(DMA1->ISR & (1 << 1))
	{
		state = 1;
		//清除中断标志位
		DMA1->IFCR |= (1 << 1);
	}
	DMA1->IFCR |= (1 << 0);
}

adc.c源程序

#include "./BSP/ADC/adc.h"
#include "string.h"

extern DMA_HandleTypeDef hdma;
uint16_t ADC_data[256];
ADC_HandleTypeDef hadc;
//配置ADC1的通道1 PA1进行
void ADC_Init(void)
{
	hadc.Instance = ADC1;
	//配置ADC连续转换模式 就是ADC转换完成一次后会自动下一次转换
	hadc.Init.ContinuousConvMode = ENABLE;
	//转换结果采用右对齐
	hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
	//不开启间断模式
	hadc.Init.DiscontinuousConvMode = DISABLE;
	//ADC触发选用软件触发
	hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
	//设置ADC转换数量的 SQR1的L位
	hadc.Init.NbrOfConversion = 1;
	//设置间断模式写转换一次转换数量
	hadc.Init.NbrOfDiscConversion = 0;
	//不开启扫描模式 因为就一个通道
	hadc.Init.ScanConvMode = ADC_SCAN_DISABLE;
	
	//设置ADC为软件触发转换
	HAL_ADC_Init(&hadc);
	
	//开启ADC校准
	HAL_ADCEx_Calibration_Start(&hadc);
	
	ADC_ChannelConfTypeDef sConfig;
	
	//配置通道1
	sConfig.Channel = ADC_CHANNEL_1;
	//通道1第一个转换
	sConfig.Rank = ADC_REGULAR_RANK_1;
	//采样周期采用1.5
	sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
	
	//配置ADC通道一为第一个转换
	HAL_ADC_ConfigChannel(&hadc, &sConfig);
	
	memset((void*)ADC_data,0,256);
	
	//这句话最好写 不然下面那个会把半传输中断也开开  这里就会开一个中断 因为下面那个函数回把ADC半传输回调函数复制 
	//这句话不写也行 但是中断里边要清除所有位  不然卡在中断
	HAL_DMA_Start_IT(&hdma, (uint32_t)&ADC1->DR, (uint32_t)ADC_data, 256);
	
	//开启DMA传输 这个函数里边会把中断都打开
	HAL_ADC_Start_DMA(&hadc, (uint32_t* )ADC_data, 256);
}


void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
	//开启ADC1时钟
	__HAL_RCC_ADC1_CLK_ENABLE();
	
	//开启GPIOA时钟
	__HAL_RCC_GPIOA_CLK_ENABLE();
	
	GPIO_InitTypeDef GPIO_Init;
	
	GPIO_Init.Mode = GPIO_MODE_ANALOG;
	GPIO_Init.Pin = GPIO_PIN_1;
	GPIO_Init.Pull = GPIO_NOPULL;
	
	//设置PA1为模拟输入模式
	HAL_GPIO_Init(GPIOA,&GPIO_Init);
	
	//使能DMA1通道1中断
	HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
	
	//设置中断优先级
	HAL_NVIC_SetPriority(DMA1_Channel1_IRQn,2,2);
}


http://www.niftyadmin.cn/n/5863878.html

相关文章

一文讲解Redis中的集群数据分区相关问题

在 Redis 集群中&#xff0c;数据分区是通过将数据分散到不同的节点来实现的&#xff0c;常见的数据分区规则有三种&#xff1a;节点取余分区、一致性哈希分区、虚拟槽分区。 说说节点取余分区 节点取余分区是一种简单的分区策略&#xff0c;其中数据项通过对某个值&#xff0…

深度学习之自然语言处理CBOW预测及模型的保存

自然语言处理CBOW预测及模型的保存 目录 自然语言处理CBOW预测及模型的保存1 自然语言处理1.1 概念1.2 词向量1.2.1 one-hot编码1.2.2 词嵌入1.2.3 常见的词嵌入模型 2 CBOW预测模型搭建2.1 数据及模型确定2.1.1 数据2.1.2 CBOW模型2.1.3 词嵌入降维 2.2 数据预处理2.3 模型搭建…

《CentOS 7 镜像源失效终极解决方案(2024年更新)》——生命周期终止后的镜像修复与替代方案

错误信息提示&#xff1a; yum install -y yum-utils \ > device-mapper-persistent-data \ > lvm2 --skip-broken 已加载插件&#xff1a;fastestmirror, langpacks Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.cento…

GIS地图、轨道交通与智能驾驶UI设计:未来交通的智能化探索

随着科技的飞速发展&#xff0c;我们正迎来一个高度智能化的未来。在这个时代背景下&#xff0c;GIS&#xff08;地理信息系统&#xff09;、轨道交通以及智能驾驶UI设计正逐步成为推动交通行业变革的重要力量。本文将深入探讨这三者之间的内在联系及其在未来交通系统中的应用前…

idea添加web工程

1.idea添加web工程 web工程表示里面既可以写java代码也可以放置页面资源 创建一个项目点击项目&#xff0c;右键——>添加框架支持——>web 1.1 web工程部署到本地的tomcat服务器中 添加配置——>tomcat server[本地]部署启动服务器 localhost本地服务器的地址 80…

【用deepseek和chatgpt做算法竞赛】——还得DeepSeek来 -Minimum Cost Trees_5

往期 【用deepseek和chatgpt做算法竞赛】——华为算法精英实战营第十九期-Minimum Cost Trees_0&#xff1a;介绍了题目和背景【用deepseek和chatgpt做算法竞赛】——华为算法精英实战营第十九期-Minimum Cost Trees_1&#xff1a;题目输入的格式说明&#xff0c;选择了邻接表…

智能自动化新纪元:AI与UiPath RPA的协同应用场景与技术实践

智能自动化新纪元&#xff1a;AI与UiPath RPA的协同应用场景与技术实践 引言 在数字化转型的浪潮中&#xff0c;企业对于自动化技术的需求已从简单的任务执行转向更复杂的智能决策。传统RPA&#xff08;Robotic Process Automation&#xff09;通过模拟人类操作处理重复性任务…

Spring的过滤器获取请求体中JSON参数,同时解决Controller获取不到请求体参数的问题。

Spring的过滤器获取请求体中JSON参数&#xff0c;同时解决Controller获取不到请求体参数的问题。 文章目录 前言一、需求场景描述二、原因解析三、自定义 HttpServletRequestWrapper 来保存数据解决Controller获取不到的问题。四、案例(要注意的点) 前言 Spring的过滤器获取请…