前期准备:

  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);       //轮询模式开启ADC
• HAL_ADC_Start_IT(&hadcx);       //中断轮询模式开启ADC
• HAL_ADC_Start_DMA(&hadcx);       //DMA模式开启ADC
• HAL_ADC_Stop()                 //轮询模式关闭ADC
• HAL_ADC_Stop_IT()             //中断轮询模式关闭ADC
• HAL_ADC_Stop_DMA()            //DMA模式关闭ADC
• HAL_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);   //等待转换完成,时间为50msif(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

【STM32】HAL库——ADC相关推荐

  1. STM32 HAL库ADC+DMA(非定时器)代码和遇到的问题

    目录 一.整体说明 二.部分知识点预览 三.代码部分 四.遇到的问题及现象 (1)仿真进入错误 (2)非连续模式软件触发时adcbuf里面的数据不对 (3)HAL库的ADC DMA相关中断的嵌套实现 ...

  2. STM32 HAL库 CUBEMX配置 ADC采集

    文章目录 STM32 HAL库 CUBEMX配置 ADC采集 软硬件型号 1.单通道不定时任意时刻采集信号 CUBEMX配置 代码添加 2.单通道ADC采集+DMA传输 CUBEMX添加配置 代码添加 ...

  3. STM32 HAL库学习笔记1-HAL库简介

    STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...

  4. STM32 HAL库详解

    STM32 HAL库整体总结 STM32 之二 HAL库详解 及 手动移植 本篇博客是对以上参考资源的一个二次总结与整理. 1. HAL库文件结构 对于开发人员而言,首先要清楚 HAL 库的文件结构. ...

  5. STM32 HAL库学习笔记4-SPI

    STM32 HAL库学习笔记4-SPI 前言 一.SPI协议简介 SPI物理层 SPI协议层 1.基本通讯过程 2. 通讯的起始和停止信号 3. 数据有效性 4. CPOL/CPHA 及通讯模式 二. ...

  6. stm32+HAL库制作转速仪

    stm32+HAL库制作转速仪 前言 电机在运行过程中,需要实时检测其转速的稳定性,有效反映电机的运行情况. 本文介绍了基于stm32的转速仪的设计,可以用光电门传感器和红外对管传感器测量,可以设置选 ...

  7. STM32 HAL库和LL库的区别

    上次开发一个项目,使用一个小容量的STM32 ARM CORTEX核心的单片机,使用STM32CUBEMX自动生成配置代码,正准备编写程序的时候,发现容量竟然有6K多.这个容量在使用大容量FLASH的 ...

  8. STM32 HAL库详解 及 手动移植

    源: STM32 HAL库详解 及 手动移植

  9. STM32 HAL库、标准外设库、LL库(STM32 Embedded Software)

    STM32 Embedded Software 工作以来一直使用ST的STM32系列芯片,ST为开发者提供了非常方便的开发库.到目前为止,有标准外设库(STD库).HAL库.LL库 三种.前两者都是常 ...

  10. STM32 HAL库 串口DMA(收发)和STM32串口中断接收(接收时间管理机制)+ESP8266 wifi模组通信问题

    一.HAL库 串口 DMA+ESP8266模组通信问题 用STM32 HAL库串口的DMA发送和空闲中断接收处理数据,单片机发送AT指令给ESP8266 wifi模组问题:单片机连续几次给wifi模组 ...

最新文章

  1. 2月07日云栖精选夜读:观点 | 阿里云 MVP 唐俊飞:安全性可以认为是一种能力...
  2. AD5933不同频率下的转换结果
  3. SpringBoot(二):Web之Filter
  4. 为什么long和int都是4字节
  5. 使用VScode开发C语言程序,环境安装配置,保姆级教程
  6. request的其他细节
  7. Infragistics NetAdvantage
  8. FFPLAY的原理(二)
  9. pyhon-matplotlib包-数据图形化
  10. oracle 12c grid db 安装的的checklist
  11. 怎样用python随机生成100内的100个奇数_python怎么随机生成奇数_后端开发
  12. Tapestry5 grid
  13. 重新编译使用CMake的旧项目的问题处理
  14. Unity学习简易单人FPS开发——AI实现(部分)
  15. DFC开发平台的设计理念
  16. netflix网络错误_netflix正在改变我们对网络安全的看法
  17. 人脸检测预测年龄性别
  18. 如何解决Windows 10超级管理员账号权限受限的问题
  19. java jsonpath过滤_JSONPATH json解析工具
  20. e换电受邀参加上海电动自行车集中充电设备展示推荐会

热门文章

  1. 【资料】印度数学家拉马努金
  2. spring默认redis连接库lettuce性能优化,突破性能天花板,获得官方建议方式2倍吞吐量
  3. 关于使用RedisTemplate在主从架构下使用Lettuce的情况下如何实现读写分离
  4. Python与企业微信-3
  5. JAVA 实现《超级玛丽升级版》游戏
  6. 谢震业,离“苏神”还有多远?
  7. Rxjava:interval的使用
  8. 关于如何使用DirectX11进行编程的相关问题
  9. 达梦8初始化参数之BLANK_PAD_MODE
  10. 心率检测仪的设计与实现:stm32视频教程分享