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

news2024/11/15 20:26:45

目录

一、前言

二、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读取例程源码

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

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

相关文章

Linux文件系统的层次结构、每个目录的含义、文件属性以及文件中第一列的第一个字符的含义

1.Linux文件系统的层次结构 在Linux操作系统中&#xff0c;所有的文件和目录都被组织成以一个根节点“/”开始的导致的树状结构&#xff1a; 5.Linux系统的目录解析 &#xff08;1&#xff09;/bin bin是Binary的缩写&#xff0c;这个目录存放着最经常使用的命令。 &#x…

Nerf相关研究

1.Nerf相关研究 随着Luma AI的到来&#xff0c;再次将Nerf推向浪尖&#xff0c;实用性进一步得到强化。Nerf仍以极速的发展速度前行&#xff0c;越来越多的研究方向不断涌现。 4K-Nerf 4K-NeRF: High Fidelity Neural Radiance Fields at Ultra High Resolutions 论文&#…

写点东西《2024 年决心:更加以开源为中心》

写点东西《2024 年决心&#xff1a;更加以开源为中心》 简而言之1- 使用 Taipy 代替 Tableau 2- 使用 Cal.com 代替 Calendly 3- Plausible 代替 Google Analytics4- AppFlowy 代替 Notion5- Penpot 代替 Figma 6- Fonoster 代替 Twilio 7- NextCloud 替代 Dropbox 8- Jitsi 替…

想寻找Axure的替代品?我们已经试用了10+款设计工具,来看看吧!

Axure是许多产品经理和设计师进入快速原型设计的首选工具&#xff0c;但Axure的使用成本相对较高&#xff0c;学习曲线陡峭&#xff0c;许多设计师正在寻找可以取代Axure的原型设计工具&#xff0c;虽然现在有很多可选的设计工具&#xff0c;但质量不均匀&#xff0c;可以取代A…

平面光波导_三层均匀平面光波导_射线分析法

平面光波导_三层均匀平面光波导_射线分析法 三层均匀平面光波导&#xff1a; 折射率沿 x x x 方向有变化&#xff0c;沿 y y y、 z z z 方向没有变化三层&#xff1a;芯区( n 1 n_1 n1​) > > > 衬底( n 2 n_2 n2​) ≥ \geq ≥ 包层( n 3 n_3 n3​)包层通常为空…

YOLOv8-Seg改进:UNetv2多层次特征融合模块结合DualConv、GSConv

🚀🚀🚀本文改进:多层次特征融合(SDI)结合DualConv、GSConv模块等实现二次创新 🚀🚀🚀SDI 亲测在多个数据集能够实现涨点,同样适用于小目标检测 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定…

软件系统培训方案(Word)

1. 培训概述 2. 培训目的 3. 培训对象及要求 3.1. 培训对象 3.2. 培训人员基本要求 4. 培训方式 5. 培训内容 6. 培训讲师 7. 培训教材 8. 培训质量保证 8.1. 用户培训确认报告 8.2. 培训疑问解答 软件开发全文档下载&#xff1a;软件项目开发全套文档下载_软件项目文档-CSDN博…

java项目之留学生交流互动论坛(ssm)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的留学生交流互动论坛。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 管理员&#xff1a;首页、个…

电调相关英文缩写ESC、BEC、PPM、Oneshot125、Oneshot42、Multishot、DShot、ProShot

ESC ESC全称是 Electronic Speed Control 中文翻译成电子调速器&#xff0c;就是电调 BEC BEC全称是 battey elimination circuit 中文翻译成免电池电路 可以理解就是对外供电&#xff0c;BEC就是线性稳压&#xff0c;降压用的&#xff0c;给接收机飞控供电 ESC协议 ESC协议…

K8s---存储卷(动态pv和pvc)

当我要发布pvc可以生成pv&#xff0c;还可以共享服务器上直接生成挂载目录。pvc直接绑定pv。 动态pv需要两个组件 1、卷插件&#xff1a;k8s本生支持的动态pv创建不包括nfs&#xff0c;需要声明和安装一个外部插件 Provisioner: 存储分配器。动态创建pv,然后根据pvc的请求自动…

什么是金融RPA?金融RPA解决什么问题?金融RPA实施难点在哪里?

什么是金融RPA&#xff1f;金融RPA&#xff0c;即金融领域的机器人流程自动化&#xff0c;是一种利用软件机器人来代替人工完成重复性劳动任务的技术。它能够通过模仿最终用户在电脑上的手动操作方式&#xff0c;实现自动化处理大量重复、规则明确的业务流程&#xff0c;如账务…

uniapp 制作 wgt 包(用于 app 的热更新)

升级版本号 修改 manifest.json 的配置&#xff0c;应用版本名称和应用版本号 必须高于上一版的值。 制作 wgt 包 发布 wgt 包 打开 uni-admin 项目的升级中心 上传后会自动生成下载链接 app 的静默热更新 发布新版后&#xff0c;用户打开app&#xff0c;后台会自动下载 wgt…

基于JavaWeb+BS架构+SpringBoot+Vue电影订票系统系统的设计和实现

基于JavaWebBS架构SpringBootVue电影订票系统系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 1 绪 论 3 1.1研究背景和意义 3 1.2拟解决的问题及特性 3 1.3论文的结构 …

记录一下Canal的错误,主要是top.javatool.canal.client.util下的StringConvertUtil引起的

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 由于数据库的一个localdatetime字段是空的&#xff0c; 然后修改数据库数据同步canal的时候报了这个错误&#xff1a; Caused by: java.lang.IllegalArgumentException: Can not set java.time.LocalD…

Vue入门五(Vue-CLI项目搭建|vue项目目录介绍|vue项目开发规范|es6导入导出语法)

文章目录 一、Vue-CLI 项目搭建介绍node环境搭建1) 下载与安装2&#xff09;测试是否安装成功 安装vue-cli安装vue脚手架 创建Vue项目1&#xff09;使用命令创建项目2&#xff09;使用图形化界面创建项目 二、vue项目目录介绍1.命令行运行vue项目2.Pycharm中运行项目3.目录结构…

SQL SERVER 19安装 SQL Prompt 10.02版本

SQL Prompt最新版官网下载地址&#xff1a;https://download.red-gate.com/SQLPromptDownload.exe 下载完成后&#xff0c;断开网络&#xff0c;全部点下一步。 注册机会报毒&#xff0c;安装前请先关闭杀毒软件&#xff01; 下载好附件之后解压&#xff0c;打开SQLPrompt_7…

io.lettuce.core.RedisCommandExecutionException: NOAUTH Authentication required.

报错信息&#xff1a; 浏览器中的报错信息 IDEA中的报错信息 报错原因&#xff1a; SpringBoot整合Redis使用的默认配置&#xff0c;但是我们设置了Redis的密码&#xff0c;而默认配置中密码是为空的&#xff0c;导致不能够连接 浏览器中的报错信息 There was an unexpected …

视频转为序列图的软件,让视频批量转为序列图

你是否曾经遇到过这样的困境&#xff1a;需要将一段视频转为一系列的图片&#xff0c;但却没有合适的工具来完成&#xff1f;或许你曾经手动截图&#xff0c;或者用其他方式&#xff0c;但结果往往不尽如人意&#xff0c;图片质量差、色彩失真、画面不清晰。现在&#xff0c;让…

创建一个简单鸿蒙app项目

文章目录 前言TypeScript 基础类型创建一个鸿蒙app总结 一、前言 鸿蒙系统上的开发已经是趋势了&#xff0c;必须紧跟时代的潮流。先简单了解下鸿蒙系统中&#xff0c;我们开发一个app需要用到的语言&#xff0c;那么就是TypeScript。这篇文章主要讲的就是一些基础的语法。最…

RPA流程自动化能为企业带来多大效益?

机器人流程自动化&#xff08;RPA&#xff09;备受各行各业青睐的最重要原因之一就是软件的高度通用性&#xff0c;随着企业对于降本增效的需求越来越旺盛&#xff0c;RPA应用案例的数量和多样性也在不断增加。 因为RPA所适用的行业很多&#xff0c;所以其对企业的效益也是有不…