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

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

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

相关文章

Python基础知识:整理13 利用pyecharts生成折线图

首先需要安装第三方包pyecharts 1 基础折线图 # 导包&#xff0c;导入Line功能构建折线图对象 from pyecharts.charts import Line # 折线图 from pyecharts.options import TitleOpts # 标题 from pyecharts.options import LegendOpts # 图例 from pyecharts.options im…

mp4文件全部转换为mp3

问题 今天突发奇想&#xff0c;想把mp4视频转换为mp3来收听&#xff0c;于是想到了ffmpeg工具 步骤 安装ffmpeg环境 要在 Windows 上配置 FFmpeg 环境&#xff0c;你可以按照以下步骤进行操作&#xff1a; 下载 FFmpeg&#xff1a; 首先&#xff0c;你需要下载 FFmpeg 的 W…

一个成功的camera案例:ros2+gazebo+摄像头

各位看&#xff1a;随着大物体的移动&#xff0c;在涉嫌头的位置也发生了改变-----右上角那个/camera的位置也变了 右上角那个是摄像头图案&#xff0c;以下是仓库链接&#xff1a; ros-ign-gazebo-camera: https://github.com/arashsm79/ros-ign-gazebo-camera.git一个ros2摄…

初识物联网

1&#xff1a;什么是IOT&#xff1a; 物联网的英文名称是Internet of Things。IoT则是Internet of Things的缩写。因此, 物联网 IoT。 通俗地说&#xff0c;物联网是互联网的一种拓展。我们知道互联网是由无数的计算机和智能手机交错连接而编织成的一张网。而正是有了像NodeM…

Spring Cloud + Vue前后端分离-第12章 通用权限设计

源代码在GitHub - 629y/course: Spring Cloud Vue前后端分离-在线课程 Spring Cloud Vue前后端分离-第12章 通用权限设计 这一章我们不依赖第三方框架&#xff0c;我会从权限相关表的设计&#xff0c;到权限的配置&#xff0c;到权限的拦截&#xff0c;带大家一步一步的做出…

代码随想录算法训练营第十六天 | 110. 平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

题目链接&#xff1a;leetcode 110. 平衡二叉树 文章讲解&#xff1a;代码随想录 110. 平衡二叉树讲解 视频讲解&#xff1a;后序遍历求高度&#xff0c;高度判断是否平衡 | LeetCode&#xff1a;110.平衡二叉树 思路和解法 题目&#xff1a; 给定一个二叉树&#xff0c;判…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑新能源配网三相不平衡治理的电动汽车充电策略》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这个标题表明研究着重于开发一种电动汽车充电策略&#xff0c;该策略考虑了在新能源配电网络中存在的三相不平衡问题。解读如下&#xff1a; 电动汽车充…

Typora上传图片失败PicGo

起初我是在Typora中点击一键上传图片&#xff0c;结果如下&#xff0c;报错。可是我找了半天也没错啊。 最后发现原来是一个图片的命名问题&#xff0c;名字太过于复杂&#xff0c;PicGo识别不出&#xff0c;一个图片报错导致其它也上传不了。 我把它复制到其它文件夹之后&…

【QUARTZ】springboot+quartz动态配置定时任务

Quartz 介绍 Quartz 定时任务可分为Trigger&#xff08;触发器&#xff09;、Job&#xff08;任务&#xff09;和Scheduler&#xff08;调度器&#xff09;&#xff0c;定时任务的逻辑大体为&#xff1a;创建触发器和任务&#xff0c;并将其加入到调度器中&#xff0c;如下图所…

webpack原理和逆向实战

文章目录 什么是webpackwebpack基本原理webpack代码分析webpack代码抠取webpack全模块自吐webpack自动扣取总结 什么是webpack webpack是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)&#xff0c;负责分析翻译压缩打包代码。 上面的官网的一张示例图。 web…

大数据实时抓取软件:Maxwell学习网站的高效框架!

介绍&#xff1a;Maxwell是由美国Zendesk开源的&#xff0c;使用Java编写的MySQL实时抓取软件。它能够实时读取MySQL的二进制日志&#xff08;Binlog&#xff09;&#xff0c;并将这些信息生成为JSON格式的消息。进一步地&#xff0c;Maxwell将这些消息作为生产者发送给Kafka、…

Springboot项目Nacos做配置中心

Springboot项目Nacos做配置中心 说明安装2.Springboot整合使用Nacos3.问题处理 说明 文档参考 Nacos Spring Boot 安装 查看nacos镜像 docker search nacos 下载镜像 docker pull nacos/nacos-server启动naocs镜像 docker run --env MODEstandalone --name nacos -d -p 8…

Abaqus2023安装下载教程

用钢铁意志&#xff0c;成就不平凡的人生。 今天博主整理了一下Abaqus2023安装下载教程&#xff0c;希望大家学习。 安装之前请关闭电脑所有杀毒软件和防火墙&#xff0c;并保证计算机名不是中文&#xff01;&#xff01;&#xff01;&#xff01; 1.首先创建一个用于Abaqus…

MySQL夯实之路-MVCC机制深入浅出

多版本并发控制&#xff08;MVCC&#xff0c;multiversion concurrency control&#xff09; MVCC用更加灵活的方式处理并发&#xff0c;实现了读不加锁&#xff0c;读写不冲突。保证了事务的隔离性&#xff08;可重复读&#xff09;&#xff0c;避免了不可重复读问题。 数据…

go中拷贝文件操作

一. 拷贝文件内容到另一个文件位置 // 拷贝文件内容到另一个文件里面 func copyContent() {filepath1 : "d:/abc.txt"filepath2 : "e:/eee.txt"// 读取内容data, err : os.ReadFile(filepath1) // 使用os.ReadFile函数读取指定路径的文件内容if err ! nil…

MyBatis面试题及高级用法

问题1: 请介绍一下MyBatis&#xff0c;以及它的主要特点是什么&#xff1f; 答案1: MyBatis是一个Java持久层框架&#xff0c;通过将SQL语句映射到对象&#xff0c;简化了数据库访问。它的主要特点包括动态SQL生成、自动参数映射和复杂映射支持。 问题2: MyBatis和其他ORM框架…

HTML常用标签

基本 <html>…</html> 定义 HTML 文档 <head>…</head> 文档的信息 <meta> HTML 文档的元信息 <title>…</title> 文档的标题 <link> 文档与外部资源的关系 <styl…

【Linux】进程程序替换

👑作者主页:@安 度 因 🏠学习社区:安度因 📖专栏链接:Linux 文章目录 简单看看程序替换原理(单进程)多进程进程程序替换补充exec 系列进程创建时有两个目标: 执行父进程的部分代码,由自己编写的,通过 if else 分流,让子进程执行的对应任务。执行和父进程完全不同…

Linux上如何一键安装软件?yum源是什么?Linux如何配置yum源?

这几个问题是Linux操作的入门问题&#xff0c;但是确实也会让刚上手Linux小伙伴头疼一阵&#xff0c;故特有此文&#xff0c;希望能对刚入门的小伙伴有一些帮助~ 众所周知 在linux上在线安装软件需要用到yum命令&#xff0c;经常下述命令来安装 yum install [-y] 包名 #-y的…

Hive基础知识(十二):Hive的基本查询

1. 全表和特定列查询 0&#xff09;数据准备 原始数据 dept: 10 ACCOUNTING 1700 20 RESEARCH 1800 30 SALES 1900 40 OPERATIONS 1700 emp&#xff1a; 7369 SMITH CLERK 7902 1980-12-17 800.00 20 7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30 7521 WARD SALESM…