STM32L051使用HAL库操作实例(14)- ADC采集电压

目录

一、前言

二、ADC外设简要说明

三、STM32CubeMX配置(本文使用的STM32CubeMX版本为6.1.2)

1.MCU选型

2.时钟使能

3.外部时钟配置

4.串口配置

5.ADC引脚配置

6.配置STM32CubeMX生成工程文件

7.点击GENERATE CODE生成工程文件

四、工程源码

五、运行状态


一、前言

本文主要介绍通过HAL库搭建工程及如何通过STM32L051的ADC外设读取外部电压;

1.MCU:STM32L051C8T6

2.软件平台:KEIL V5.27、STM32CubeMX V6.1.2

3.库类型:HAL

二、ADC外设简要说明

1.STM32L051这款MCU不像F1系列大容量版本的MCU有外置Vref引脚,所以在使用这款单片机时,如果采用外部的3.3V电源电压作为基准,那么在外部电压发生波动时就会影响ADC测量数据的准确性。这里有两种方法:一种是可采用在外部使用如TL431搭建基准电源电路,需要使用2路ADC通道,在ADC进行读取时先使用一路通道进行TL431基准电压的读取进行比较,然后在读取另一外部输入的通道;第二种是采用MCU内部的基准电压作为基准,在ADC进行读取时先获取内部的基准电压值,然后在读取另一外部输入的通道,这里例程采用的是第二种方法。

2.查看datasheet得知,STM32的mcu有一个寄存器VREFINT_CAL的值为厂家存放的基准电压,该值的环境:在温度为25°C时获取的原始VDD = 3V,由下图说明VREFINT内部基准电源为ADC和比较器提供稳定的电压输出。VREFINT内部连接ADC_IN17输入通道,它可以准确的监测VDD值。

3.查看STM32L051参考手册可找到厂家已给出相应的计算公式,如下图:

我们可以看到,手册中已说明,对于不知道VDDA值的应用,必须使用内部参考电压,内部参考电压Vdda=3V,ADC读取电压的计算公式也列出了。那么我们在使用ADC时就需要读取两个通道的值,首先为ADC_IN17的值(即VREFINT_DATA),ADC_DATA是外部ADC引脚通道上测量的值,VREFINT_CAL为内部参考电压校准值,可以直接地址读取。我们使用的这款STM32L051C8T6芯片VREFINT_CAL地址为:0X1FF80078。使用公式直接读取VREFINT_CAL = *(__IO uint16_t *)(0X1FF80078);FULL_SCALE是根据我们设置的ADC分辨率而定,12位ADC分辨率值:2^12 - 1 = 4096 - 1。

三、STM32CubeMX配置(本文使用的STM32CubeMX版本为6.1.2)

思路:使用PA0引脚(ADC_IN0通道)读取外部电压(通过电位器调节),读取后将读出的数值通过串口一打印出来。

1.MCU选型

例程使用的为STM32L051C8T6型号;

2.时钟使能

使用外部时钟

3.外部时钟配置

将时钟选用外部HSE时钟,频率采用32M

4.串口配置

启用USART1,模式为异步通讯模式。波特率采用9600,数据长度8为,无校验,1个停止位。

5.ADC引脚配置

选择使用PA0引脚作为ADC输入端,

ADC参数配置

6.配置STM32CubeMX生成工程文件

1.编辑好文件名称,保存路径,输出工程文件类型。

7.点击GENERATE CODE生成工程文件

四、工程源码

int main(void)
{
  /* USER CODE BEGIN 1 */
	uint16_t i;
	uint32_t SUM[3];
	uint16_t ADC_DATA[101];
	uint16_t VREFINT_DATA[101];
	ADC_ChannelConfTypeDef sConfig;
	uint16_t VREFCAL = 0;
	float V_CHANNEL = 0;
	int16_t ADC_value;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	/*获取内部校准电压参考值*/
	VREFCAL = *(__IO uint16_t *)(0x1FF80078);
	printf("\r\nSTM32L051C8T6 开发板ADC读取实验\r\n");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		SUM[0] = 0;
		SUM[1] = 0;
		for(i=0; i<100; i++)
		{
			/*获取PA0引脚电压值*/
			ADC_DATA[i] = 0;
			/*开启ADC校准,使用的为单端校准模式*/
			HAL_ADCEx_Calibration_Start(&hadc,ADC_SINGLE_ENDED);
			/*寄存器数据清零*/
			hadc.Instance->CHSELR=0;
			/*转换通道配置*/
			sConfig.Channel = ADC_CHANNEL_0;
			/*配置所选通道*/
			HAL_ADC_ConfigChannel(&hadc, &sConfig);
			/*启动转换*/
			HAL_ADC_Start(&hadc);
			/*等待转换结束,1000为times*/
			HAL_ADC_PollForConversion(&hadc,1000);
			/*读取结果*/
			ADC_DATA[i] = HAL_ADC_GetValue(&hadc);
			/*停止ADC读取*/
			HAL_ADC_Stop(&hadc);
			SUM[0] += ADC_DATA[i];
			
			/*获取内部基准电压值*/
			VREFINT_DATA[i] = 0;
			HAL_ADCEx_Calibration_Start(&hadc,ADC_SINGLE_ENDED);
			/*寄存器数据清零*/
			hadc.Instance->CHSELR=0;
			/*转换通道配置*/
			sConfig.Channel = ADC_CHANNEL_VREFINT;
			/*配置所选通道*/
			HAL_ADC_ConfigChannel(&hadc, &sConfig);
			/*启动转换*/
			HAL_ADC_Start(&hadc);
			/*等待转换结束*/
			HAL_ADC_PollForConversion(&hadc,1000);
			/*读取结果*/
			VREFINT_DATA[i] = HAL_ADC_GetValue(&hadc);
			/*停止ADC读取*/
			HAL_ADC_Stop(&hadc);
			SUM[1] += VREFINT_DATA[i];
		}
		/*计算外部输入电压平均值*/
		ADC_DATA[100] = SUM[0] / 100;
		/*计算内部基准电压平均值*/
		VREFINT_DATA[100] = SUM[1] / 100;
		/*计算公式V_channelx = 3V *VREFINT_CAL*ADC_DATAx/(VREFINT_DATA*FULL_SCALE)*/
		/*V_channel为计算后的值,VREFCAL为内部基准值、FULL_SCALE为12位分辨率即4096-1*/
		/*ADC_DATA为外部采集电压值,VREFINT_DATA为通道17采集的值*/
		/*计算校准后的电压值*/
		V_CHANNEL = (float)(3*VREFCAL*ADC_DATA[100])/(VREFINT_DATA[100]*4095);
		/*电压值放大1000倍*/
		ADC_value = V_CHANNEL * 1000;
		/*通过打印ADC_value值*/
		printf("ADC数据:%dmv",ADC_value);
		/*延时*/
		HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

五、运行状态

运行状态如下,ADC读取数据还是蛮准的。

万用表读取数据,ADC读取数据与万用表基本差不多。

工程源码链接:STM32L051C8T6_ADC读取例程源码

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

20240112让移远mini-PCIE接口的4G模块EC20在Firefly的AIO-3399J开发板的Android11下跑通【DTS部分】

20240112让移远mini-PCIE接口的4G模块EC20在Firefly的AIO-3399J开发板的Android11下跑通【DTS部分】 2024/1/12 16:20 https://blog.csdn.net/u010164190/article/details/79096345 [Android6.0][RK3399] PCIe 接口 4G模块 EC20 调试记录 https://blog.csdn.net/hnjztyx/artic…

vue3+ts+vite+elementPlus后台管理系统学习总结01

vue3tsviteelementPlus后台管理系统学习总结01 一&#xff1a;运行源代码一&#xff1a;按照博客一步步操作1.ts中引入path模块出错&#xff1a;Cannot find module path or its corresponding type declarations.2.安装最新版本的pnpm:3.配置自动导入时&#xff0c;遇到.eslin…

web网页首页布局

效果展示&#xff1a; html代码&#xff1a; <!doctype html> <html> <head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"> <meta name"viewport" content&qu…

CSS3简单运用过渡元素(transition)

CSS3过渡 概念&#xff1a;在CSS3中&#xff0c;我们可以使用transition属性将元素的某一个属性从“一个属性值”在指定的时间内平滑地过渡到“另一个属性值”&#xff0c;从而实现动画效果。 CSS3变形&#xff08;transform)呈现的仅仅是一个结果&#xff0c;而CSS过渡&…

AdaM: An Adaptive Fine-Grained Scheme for Distributed Metadata Management——泛读论文

ICPP 2019 Paper 分布式元数据论文汇总 问题 为了同时解决元数据局部性和元数据服务器的负载均衡。 现有方法缺陷 基于哈希的方法&#xff1a;zFS [16]&#xff0c;CalvinFS [21]&#xff0c;DROP [24]&#xff0c;AngleCut [8] 静态子树划分&#xff1a;HDFS [6], NFS [14…

2024年【电工(初级)】最新解析及电工(初级)模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 电工&#xff08;初级&#xff09;最新解析根据新电工&#xff08;初级&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将电工&#xff08;初级&#xff09;模拟考试试题进行汇编&#xff0c;组成一套电…

Java十大经典算法——贪心算法

算法概念&#xff1a; 贪婪算法(贪心算法)是指在对问题进行求解时&#xff0c;在每一步选择中都采取最好或者最优(即最有利)的选择&#xff0c;从而希望能够导致结果是最好或者最优的算法&#xff1b;贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解)&#xff0c;但…

世微AP5125 输入14-80V 输出12V5A LED灯降压恒流电源驱动方案 SOT23-6

这是一款60WLED驱动方案,线路图BOM表如下 ​ 祥单表&#xff1a; 实物图&#xff1a; 产品描述 AP5125 是一款外围电路简单的 Buck 型平均电流检测模式的 LED 恒流驱动器&#xff0c;适用于 8-100V 电压范围的非隔离式大功率恒流 LED 驱动领域。芯片采用固定频率 140kHz 的 …

Springboot3+EasyExcel由浅入深

环境介绍 技术栈 springboot3easyexcel 软件 版本 IDEA IntelliJ IDEA 2022.2.1 JDK 17 Spring Boot 3 EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。 他能让你在不用考虑性能、内存的等因素的情况下&#xff0c;快速完成Excel的读、…

Mr_HJ / form-generator项目文档学习与记录(续2)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/n…

vue3打包后页面空白解决方法

vue3打包后页面空白解决方法 问题解决方法 问题 最近写一个小项目 没有打包的时候一切正常 技术栈用的vue3 vite 我用的是npm创建的项目 npm init vuelatest问题一 &#xff1a;打包后页面空白&#xff0c;什么都没有 问题二&#xff1a;刷新页面后找不到资源 把url的inde…

(超详细)5-YOLOV5改进-添加A2Attention注意力机制

1、在yolov5/models下面新建一个A2Attention.py文件&#xff0c;在里面放入下面的代码 代码如下&#xff1a; import numpy as np import torch from torch import nn from torch.nn import init from torch.nn import functional as Fclass DoubleAttention(nn.Module):def …

自研OS,手机厂商的「私心」与软件厂商的「灾难」

作者 | 辰纹 来源 | 洞见新研社 在卷完了配置参数&#xff0c;影像跑分&#xff0c;屏幕快充、存储影像、续航折叠……手机还能怎么卷&#xff1f; 过去的2023年&#xff0c;手机厂商们不约而同的将目标瞄准了自研系统。 站在民族情感层面&#xff0c;中国手机“去安卓化”…

PHP在线考试平台管理系统源码带文字搭建教程和操作手册

PHP在线考试平台管理系统源码带文字搭建教程和操作手册 技术架构 PHP7.2 Thinkphp6 React UmiJs nginx mysql5.7 cnetos7以上 宝塔面板 系统功能特性与介绍 采用PHP7强类型&#xff08;严格模式&#xff09;。 题库管理 支持多种试题类型和录题方式。 考生管理 快速导入考…

Paddle模型转ONNX

深度学习模型在硬件加速器上的部署常常要用到ONNX&#xff08;Open Neural Network Exchange&#xff0c;开放神经网络交换&#xff09;格式&#xff0c;也可以通过ONNX实现不同AI框架&#xff08;如Pytorch、TensorFlow、Caffe2、PaddlePaddle等&#xff09;之间的模型转换。 …

python:for循环 实现FizzBuzz

python&#xff1a;for循环 实现FizzBuzz 要求&#xff1a;输入一个数字&#xff0c;程序遍历从1到输入的数字之间的所有数字&#xff0c;如果该数能被3整除&#xff0c;打印Fizz&#xff1b;如果该数能被5整除&#xff0c;打印Buzz&#xff1b;如果能同时被3和5整除&#xff…

Docker安装Redis 配置文件映射以及密码设置

安装直接docker pull redis即可&#xff0c;默认redis最新版 设置两个配置文件路径 mkdir -p /root/docker/redis/data mkdir -p /root/docker/redis/conf touch redis.conf // 容器挂载用conf配置文件 bind 0.0.0.0 protected-mode yes port 6379 tcp-backlog 511 timeout…

蓝桥杯单片机组备赛——LED指示灯的基本控制

&#x1f388;教程介绍&#xff1a;博客依据b站小蜜蜂老师的教程进行编写&#xff0c;文中会对老师传授的知识进行总结并加入自己的一些理解。教程链接 文章目录 一、点灯介绍二、相关数字芯片介绍2.1 74HC138介绍2.2 74HC573介绍2.3 74HC02介绍 三、代码设计思路四、代码编写…

【C#】当重复使用一段代码倒计时时,使用普通类和静态方法,实现简单的封装性、可扩展性、可维护性

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…