【STM32】HAL库——ADC

2023-11-01

前期准备:

  1. STM32CubeMX
  2. STM32RCT6核心板
  3. IDE Keil(MDK-ARM)

STM32CubeMX部分

1. 配置时钟

选择STM32F103RCTx系列芯片,配置时钟的同时会自动配置IO口引脚
在这里插入图片描述
将HCLK设置为最大频率72MHz
在这里插入图片描述

2. 配置ADC

什么是ADC?

ADC即模拟数字转换器(Analog-to-digital converter)是用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。一个模拟数字转换器可以提供信号用于测量。与之相对的设备成为数字模拟转换器。

简单来说就是将看不见摸不着的数据转换成我们能直观看到感受到的数字

比如空气中的温度、湿度。
你真的知道周围空气中真实的温度和湿度吗?你了解到的温度无非是温度计、手机上看到的数字,原来人体的温度是37°37°是这么个感觉

12位ADC:

12位ADC是一种逐次逼近型模拟数字转换器。它有,3个ADC控制器,多达18个通道,可测量16个外部2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。

12位ADC, 即212 = 4096, 也就是说你希望采集到的量被分成了4096份,根据测出的ADC值即可推出实际的值

例:一节电池的最大电压为3V,现在用了一些电,我不知道还剩多少电,我用12位ADC测一下,测得的ADC值为2048。3V被分成了4096份,现在还剩2048份,也就是现在还剩1.5V

实际电压 = ( 测得的ADC / 4096 ) * 3 V

3个ADC:

STM32共有3个ADC:
ADC1
ADC2
ADC3


18个输入通道:

在这里插入图片描述
16个外部通道,2个内部通道

ADC的转换模式:

1 单次转换模式: 只执行一次转换
2 连续转换模式: 转换结束之后马上开始新的转换
3 扫描模式: 对所有所选中的通道进行转换
4 间断模式: 触发一次,转换一个通道

总结:

  1. 只有一个ADC通道,并且这个通道只转换一次,选择单次转换模式
  2. 只有一个ADC通道,需要连续转换,选择连续转换模式
  3. ADC通道多于一个,并且所有的通道只转换一次,选择单次转换模式,同时使能扫描模式
  4. ADC通道多于一个,需要连续转换,选择连续转换模式,同时使能扫描模式
  5. 假如有4个通道需要转换,设定扫描模式+连续转换,那么顺序是ch0->ch1->ch2->ch3->ch0->ch1…这个过程无法被打断。如果我希望通道之间转换有可调的时间间隔,那么就引入间断模式(有点类似中断的意思)

左/右对齐:

ADC数据是12位精度的,但是数据是存储在 16 位数据寄存器中,所以ADC的存储结果可以分为左对齐或右对齐两种方式
在这里插入图片描述

ADC输入电压范围:

因为ADC是采集的模拟信号,电压不能过大,基本上都是在 0~3.3V

注入通道,规则通道:

  1. 注入通道:
    程序正常运行的通道
  2. 规则通道:
    注入通道可以打断规则通道,如果在规则通道转换过程中,有注入通道进行转换,那么就要先转换完注入通道,等注入通道转换完成后,再回到规则通道的转换流程(类似于中断)

ADC时钟:

  • ADC模块的时钟来源是ADC预分频器的ADCCLK
  • RCC控制器为ADC时钟提供一个专用的可编程预分频器。 分频因子由RCC_CFGR的ADCPRE[1:0]配置,可配置2/4/6/8分频
  • STM32的ADC最大的转换速率为1MHz,也就是说最快转换时间为1us,为了保证ADC转换结果的准确性,ADC的时钟最好不超过14M

触发转换:

  • 外部触发:ADC_CR2 的ADON控制 ;定时器捕获;EXIT
  • 中断触发:规则 / 注入通道转换结束(转换完一次即进入中断);模拟看门狗状态位被设置(当转换的模拟电压值低于低阈值或高于高阈值时,便会产生中断。阈值的高低值由ADC_LTR和ADC_HTR配置)
  • DMA触发:规则 / 注入通道转换结束后会产生DMA请求(只有ADC1和ADC3可以)

下面就以ADC1_IN3 PA3 引脚为例

选择PA3的ADC1_IN3,然后才可以设置ADC的时钟
在这里插入图片描述

在这里插入图片描述
ADC时钟超过14M会报错
在这里插入图片描述
然后配置ADC参数

在这里插入图片描述

  • ADCs_Common_Settings(ADC模式设置): ADC_Mode_Independent(独立模式):
    不需要ADC同步或者只是用了一个ADC的时候,设成独立模式,多个ADC同时使用时会有其他模式,如双重ADC同步模式,两个ADC同时采集一个或多个通道,可以提高采样率
  • Data Alignment (数据对齐方式): 右对齐
  • Scan Conversion Mode( 扫描模式 ) : DISABLE
  • Continuous Conversion Mode(连续转换模式): ENABLE
  • Discontinuous Conversion Mode(间断模式): DISABLE

在这里插入图片描述

  • Enable Regular Conversions (启用常规转换模式): ENABLE
  • Number OF Conversion(转换通道数):1(用到几个通道就设置为几)
  • Extenal Trigger Conversion Source (外部触发转换源)
    Regular Conversion launched by software(规则的软件触发,调用函数触发即可)
    Timer X Capture Compare X event (外部引脚触发)
    Timer X Trigger Out event (定时器通道输出触发)
  • Rank(转换顺序):
    可以修改通道采样时间、每个通道的转换顺序(多个通道时),这里默认即可

ADC转换时间 = 采样时间 + 12.5个周期
例:ADCCLK(ADC时钟)=14MHz(最大),采样时间为1.5Cycles(最快),ADC转换时间 = 1.5 + 12.5 = 14周期 = 1us

在这里插入图片描述

  • ADC注入通道设置: 与规则通道一致
  • Enable Analog WatchDog Mode(使能模拟看门狗中断): 不勾选

3. 配置USART

配置USART有讲过,这里和下面涉及USART的知识点快进不再讲解,不了解的具体请看
【STM32】HAL库 CubeMX例程三—串口中断通信(2)(附工程源码)

在这里插入图片描述
在这里插入图片描述

4. 工程生成

在这里插入图片描述

在这里插入图片描述
工程管理依旧是这几个选项,然后GENERATE CODE,STM32CubeMX部分完成。



MDK 5部分

//ADC函数HAL_ADC_Start(&hadcx);       //轮询模式开启ADCHAL_ADC_Start_IT(&hadcx);       //中断轮询模式开启ADCHAL_ADC_Start_DMA(&hadcx);       //DMA模式开启ADCHAL_ADC_Stop()                 //轮询模式关闭ADCHAL_ADC_Stop_IT()             //中断轮询模式关闭ADCHAL_ADC_Stop_DMA()            //DMA模式关闭ADCHAL_ADCEx_Calibration_Start(&hadcx);//ADC校准函数HAL_ADC_GetValue()          //读取ADC转换值HAL_ADC_PollForConversion(&hadc1, 50);  //等待转换结束函数,50为等待时间(ms)HAL_ADC_ConvCpltCallback()  //ADC中断回调函数,转换完成后回调,DMA模式下DMA传输完成后调用HAL_ADC_ConfigChannel()    //配置规则组通道HAL_ADC_AnalogWDGConfig(//看门狗配置

首先在stm32f1xx_hal.c中重写fgetc和fputc函数

/* Includes ------------------------------------------------------------------*/
#include "stm32f1xx_hal.h"
#include <stdio.h>
extern UART_HandleTypeDef huart1;  
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

int fgetc(FILE *f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
  return ch;
}

接着在main.c文件定义一个变量

/* USER CODE BEGIN PTD */
uint16_t ADC_Value;  //ADC值
/* USER CODE END PTD */

在ADC初始化之后加上AD校准函数

  MX_ADC1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	HAL_ADCEx_Calibration_Start(&hadc1);    //AD校准
  /* USER CODE END 2 */

接着在while里写

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		 HAL_ADC_Start(&hadc1);     //启动ADC转换
		 HAL_ADC_PollForConversion(&hadc1, 50);   //等待转换完成,时间为50ms
 
		 if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
		 {
				ADC_Value = HAL_ADC_GetValue(&hadc1);   //获取AD值

				printf("ADC1 读取 : %d \r\n",ADC_Value);
				printf("PA3 实时电压 : %.4f \r\n",ADC_Value*3.3f/4096);
		 }
		 HAL_Delay(1500);
  }
  /* USER CODE END 3 */

编译下载时需要选择相对应的下载器,勾选以下
在这里插入图片描述
运行即可

在这里插入图片描述
当我旋转PA3脚的电位器(旋转即改变电压)
在这里插入图片描述
在这里插入图片描述

本期工程文档——>Gitee

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【STM32】HAL库——ADC 的相关文章

随机推荐

  • 【react】createRef

    createRef 1 React createRef调用后可以返回一个容器 该容器可以存储被ref所标识的节点 2 该容器是 专人专用 的 因为后放进去的节点会把前面的节点覆盖掉 3 除非再调用一次createRef
  • k8s笔记8--快速部署k8s集群 v1.19.4--calico网络

    k8s笔记8 快速部署k8s集群 v1 19 4 calico网络 1 介绍 2 搭建集群 4 注意事项 3 说明 1 介绍 k8s 部署的时候可以选择多种cni插件 每种插件都有其对应的特殊 最经典的的莫过于 Flannel 和 Cali
  • signature=571b6507b6fff101f4546f0b0a3f3860,Contribution of fishery discards to the diet of the Black...

    Abraham ER Pierre JP Middleton DAJ Cleal J Walker NA Waugh SM 2009 Effectiveness of fish waste management strategies in
  • 真诚不等于坦诚

    有趣的问题及答案 https www zhihu com question 343898658 这个问题背后可以影射很多社会现象 人家没问的 我自认为可能是减分项的 暂时就先不说 人家问了的 我可以不完全说清楚 说一半留一半 不对 这件事情
  • url重定向

    不安全的url跳转 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方 如果后端采用了前端传进来的 可能是用户传参 或者之前预埋在前端页面的url地址 参数作为了跳转的目的地 而又没有做判断的话 就可能发生 跳错对象 的问题 u
  • 大数据基础之Hbase——Hbase的shell基本操作

    目录 一 简介 二 Hbase重要概念 Hbase的表结构 表Table 命名空间namespace 行键Row Key 区域region 列簇column family 修饰符 列限定符 三 Hbase shell基本操作 1 创建简单表
  • linux的apache安装在哪个目录,在linux系统下apache的默认安装路径怎么看

    在linux系统下apache的默认安装路径怎么看 发布时间 2020 11 06 10 38 18 来源 亿速云 阅读 127 作者 小新 这篇文章将为大家详细讲解有关在linux系统下apache的默认安装路径怎么看 小编觉得挺实用的
  • Docker教程(三) - Docker 网络(上)- 桥接 Bridge

    本文章翻译自Docker的官方教程 有兴趣的同学可以上Docker官网进行play with docker学习 Docker的安装教程请参考这里 未定义 本文翻译自Docker官方教程Doing More With Docker Image
  • 【Unity项目实战】手把手教学:飞翔的小鸟(5)背景滚动

    承接上一篇 Unity项目实战 手把手教学 飞翔的小鸟 4 文本添加 我们已经使得主角小鸟接触到地面后跳转到Game Over状态 接下来我们将继续往下 讲解得分机制 一 重新进入游戏 根据上篇最后的描述 我们小鸟掉到草地就会立马被判断为游
  • 项目中Swagger2、lombok(小辣椒)、以及短信API的调用 简单介绍

    一 使用Swagger2实时生成接口文档 分布式系统使用 Swagger 是一个规范和完整的框架 用于生成 描述 调用和可视化 RESTful 风格的 Web 服务 总体目标是使客户端和文件系统作为服务器以同样的速度来更新 文件的方法 参数
  • 2021-05-27

    k8s 根据CPU利用率实现pod的弹性伸缩 一 概念 1 弹性伸缩的作用 让集群的配置可以根据计算需求 自动增加或者自动减少 在服务器访问量突然增多 算力吃紧的情况下增加节点配置数量 直到访问量下降 计算后减少节点数 保证业务平稳健康运行
  • 使用BP神经网络预测锂电池健康状态(附Matlab源码)

    使用BP神经网络预测锂电池健康状态 附Matlab源码 随着电动汽车的普及 电池技术得到了广泛的关注 其中 锂电池因其能量密度高 环保等优点被广泛应用于电动汽车和储能系统中 然而 锂电池的寿命问题一直是制约其应用和发展的重要因素之一 针对这
  • jQuery+Ajax+js请求json格式数据并渲染到html页面

    1 先给json格式的数据 id 1 name stan id 2 name jack id 3 name lucy id 4 name mary id 5 name jerry id 6 name tom 2 通过访问html页面 获取并
  • 虚幻4学习笔记(3)地形工具和植被

    地形工具和植被 地貌编辑器 生成斜坡 雕刻工具 编辑样条曲线 光照进行构建解决方法 导入灰度图 植被工具使用 植被碰撞 B站UP谌嘉诚课程 https www bilibili com video BV164411Y732 地貌编辑器 生成
  • 分布式一致性算法的重要原理:鸽巢原理

    在分布式BASE理论 数据一致性模型有哪些 中 我们谈到了BASE理论的最终一致性 以及简单介绍了数据一致性模型 但我们都是站在一个使用者的角度 在发出数据更新的请求给分布式系统之后 观察返回的数据是否更新 为了更好使用 理解分布式系统 不
  • C#入门学习-----制作AVI播放器

    本实例主要用到了Microsoft Animation Control Version 6 0 组件 该组件可以一帧一帧地播放AVI文件 用到该组件 必须将Microsoft Animation Control Version 6 0组件添
  • 如何在宝塔面板后的阿里云服务器运行Flask项目并公网可以访问?

    在你的服务器安装宝塔面板 宝塔面板是服务器运维管理系统 使用宝塔前 手工输入命令安装各类软件 操作起来费时费力并且容易出错 而且需要记住很多Linux的命令 非常复杂 使用宝塔后 2分钟装好面板 一键管理服务器 鼠标点几下就能替代以前的复杂
  • JVM类加载过程和编译器优化

    文章目录 1 加载 2 链接 2 1 验证 2 2 准备 2 3 解析 3 初始化 3 1 类初始化练习 3 2 懒汉式单例练习 4 类加载器 4 1 启动类加载器 4 2 扩展类加载器 4 3 双亲委派模式 4 4 线程上下文类加载器 4
  • PCL——VTK读取、保存.ply模型数据

    目录 一 读取 ply文件 1 代码示例 2 结果展示 一 保存 ply文件 1 代码示例 2 结果展示 一 读取 ply文件 ReadPLY 是VTK内置的mesh模型读取函数 该函数仅支持 ply格式的mesh网格数据不支持读取 ply
  • 【STM32】HAL库——ADC

    前期准备 STM32CubeMX STM32RCT6核心板 IDE Keil MDK ARM STM32CubeMX部分 1 配置时钟 选择STM32F103RCTx系列芯片 配置时钟的同时会自动配置IO口引脚 将HCLK设置为最大频率72