STM32F407 ADC简介

  • stm32f407系列有312位精度逐次趋近型ADC,每个ADC具有多达 19 个复用通道,可测量来自 16 个外部 源、两个内部源和VBATV_{BAT}VBAT​ 通道的信号。

  • 采样模式:单次、连续、扫描、不连续采样

  • 数据存储:左对齐或右对齐16位数据寄存器

  • ADC 输入范围:VREF−V_{REF-}VREF−​ <= VINV_{IN}VIN​ <= VREF+V_{REF+}VREF+​

    • 正模拟参考电压输入 VREF−V_{REF-}VREF−​
    • 负模拟参考电压输入 VREF+V_{REF+}VREF+​
  • ADC时钟ADCCLK:由APB2分频而来

  • 支持独立/双重/三重ADC模式

ADC框图

ADC电压输入范围


(开发板通过跳线帽将VREF+与VDDA相连)
(从原理图上得: VDDV_{DD}VDD​ = 3.3V)

ADC通道

每个ADC有2个通道组:规则通道组及注入通道组

规则通道组最多 16 个转换,必须在 ADC_SQRx 寄存器中选择转换序列的规则通道及其顺序

注入通道组最多 4 个转换

  • 注入通道的转换可以打断规则通道的转换(相当于中断), 在注入通道被转换完成之后,规则通道才得以继续转换

  • 触发注入

    要使用触发注入,必须将 ADC_CR1 寄存器中的 JAUTO 位清零。

    1. 通过外部触发或将 ADC_CR2 寄存器中的 SWSTART 位置 1 来启动规则通道组转换。
    2. 如果在规则通道组转换期间出现外部注入触发或者 JSWSTART 位置 1,则当前的转换会复位,并且注入通道序列会切换为单次扫描模式。
    3. 然后,规则通道组的规则转换会从上次中断的规则转换处恢复。 如果在注入转换期间出现规则事件,注入转换不会中断,但在注入序列结束时会执行规 则序列。

    注意: 使用触发注入时,必须确保触发事件之间的间隔长于注入序列。例如,如果序列长度为 30 个 ADC 时钟周期(即,采样时间为 3 个时钟周期的两次转换),则触发事件的最小间隔不能小于 31 个 ADC 时钟周期。

    自动注入

    ​ 如果将 JAUTO 位置 1,则注入组中的通道会在规则组通道之后自动转换。这可用于转换最多由 20 个转换构成的序列,这些转换在 ADC_SQRx 和 ADC_JSQR 寄存器中编程。 在此模式下,必须禁止注入通道上的外部触发。 如果 CONT 位和 JAUTO 位均已置 1,则在转换规则通道之后会继续转换注入通道。

    注意: 不能同时使用自动注入和不连续采样模式

采样时间和转换时间

  • 总转换时间 = 采样时间 + 转换时间
  • 最小采样时间:3个周期
  • 转换时间 = 12周期
    • 例如:12位ADC,ADCCLK = 36MHz;则转换时间 t=136∗106∗12t =\frac{1}{36*10^6}*12t=36∗1061​∗12

采样模式

单次转换模式

ADC仅执行一次转换

连续转换模式

ADC 结束一个转换后立即启动一个新的转换

扫描模式

此模式用于扫描一组模拟通道。

为组中的每个通道都执行一次转换。每次转换结束后,会自动转换该组中的下一 个通道

不连续采样

该模式可用于转换含有 n (n <= 8) 个转换的短序列,该短序列是在 ADC_SQRx 寄存器中选择的转换序列的一部分。可通过写入 ADC_CR1 寄存器中的 DISCNUM[2:0] 位来指定 n 的值。

出现外部触发时,将启动在 ADC_SQRx 寄存器中选择的接下来 n 个转换,直到序列中的所有转换均完成为止。

示例: n = 3,要转换的通道 = 0、1、2、3、6、7、9、10

​ 第 1 次触发:转换序列 0、1、2

​ 第 2 次触发:转换序列 3、6、7

​ 第 3 次触发:转换序列 9、10 并生成 EOC 事件

​ 第 4 次触发:转换序列 0、1、2

数据管理

使用DMA

在使能DMA模式后,每完成规则通道组中的一个通道的转换后,都会生成一个DMA请求。

进入实战

一、单通道 阻塞(轮询)模式

  • 不建议用阻塞模式进行多通道采集 通道序列可能出现问题(可打开不连续模式解决)

cubemx配置


添加代码

//main.c/* USER CODE BEGIN PV */
float ADC_Value = 0;
/* USER CODE END PV */while(1){/* USER CODE BEGIN 3 */ADC_Value  = get_adc_value_zuse(); //读取数据HAL_Delay(0);   //延时1ms
}
/* USER CODE END 3 *//* USER CODE BEGIN 4 */
float get_adc_value_zuse(void){HAL_ADC_Start(&hadc1);  //开启ADC(阻塞模式)HAL_ADC_PollForConversion(&hadc1,50);   //查看规则通道组是否完成转换if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC)){  //查看ADC状态是否为EOCreturn (float)HAL_ADC_GetValue(&hadc1)/4096.0*3.3;  //读取并处理数据}else return 0;
}
/* USER CODE END 4 */

运行效果

在开发板上用杜邦线将PB0与输出3.3V的I/O口相连

使用ST-Link调试,查看ADC_Value的值

二、多通道 ADC模式

多通道必须使用扫描模式

cubemx配置

添加代码

main.c
/* USER CODE BEGIN PV */
uint16_t adc_value[40];
float ad_voltage[40];
/* USER CODE END PV *//* USER CODE BEGIN 2 */HAL_ADC_Start_DMA(&hadc1,(uint32_t *)adc_value,40);  //开启ADC(DMA模式)/* USER CODE END 2 *//* USER CODE BEGIN 3 */uint16_t i;for(i = 0;i<40;i++){ad_voltage[i] = (float)adc_value[i]/4096.0*3.3;  //转换为实际电压HAL_Delay(0);/* USER CODE END 3 */

运行效果

使用ST-Link调试,查看ad_voltage数组的值

后记

感谢大家的阅读 如有不当或错误之处,欢迎指出

STM32F407 HAL库 ADC笔记相关推荐

  1. STM32F407霸天虎HAL库学习笔记——使用ADC采集MQ135的数据并通过OLED显示

    STM32F407霸天虎HAL库学习笔记--使用ADC采集MQ135的数据并通过OLED显示 一.软件准备 二.硬件准备 三.CubeMX配置 四.Keil MQ135.c MQ135.h main函 ...

  2. STM32F407霸天虎HAL库学习笔记——串口发送

    STM32F407霸天虎HAL库学习笔记--串口收发 一.软件准备 二.硬件准备 三.CubeMX配置 四.Keil printf重写 main函数 五.实验效果 一.软件准备 软件准备 二.硬件准备 ...

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

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

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

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

  5. STM32 HAL库学习笔记2 HAL库介绍

    STM32 HAL库学习笔记2 HAL库介绍 CMSIS标准 一.再次认识HAL库 HAL库设计思想 HAL库实现方式 以GPIO模块为例 GPIO外设数据类型 GPIO外设接口函数 二.使用HAL库 ...

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

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

  7. STM32F407 HAL库外扩SRAM作为默认RAM使用

    项目使用STM32F407ZET6开发,但自带的RAM空间不够,所以需要外扩SRAM作为默认的RAM来使用,使用的SRAM是IS62WV51216BLL,19条地址线,16条数据线,使用的库为HAL库 ...

  8. STM32cubemx——HAL库学习笔记 六、IWDG独立看门狗的配置

    一.配置STM32cubeMX工程 在配置好时钟和调试设备以后进行一下操作即可以使用 看门狗的溢出时间公式为 Tout= 分频系数/ 时钟 * 重装载值 二.IWDG的技术讲解 可以到看,看门狗相对于 ...

  9. HAL库学习笔记ADC篇----ADC多通道连续转换+DMA方式

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.Cube配置(F407VET6) 二.使用步骤 1. 代码总览 2.代码注意事项以及解析 总结 前言 第一次写,无 ...

最新文章

  1. java实体 和 xml相互转换
  2. py脚本得到Python的版本
  3. 「offer来了」进程线程有啥关系?10个知识点带你巩固操作系统基础知识
  4. python mac读取 文件属性_从Python获取和设置mac文件和文件夹查找器标签
  5. MATLAB中median函数的用法
  6. BeautifulSoup 用法总结
  7. 萝卜源码前后端源码 附打包APP的教程
  8. list复制到另一个list_一文总结saltstack的十一个常用模块,附实例讲解
  9. BZOJ3591 最长上升子序列(状压dp)
  10. C语言学习编程软件推荐
  11. 类案检索功能优化建议(一)——开发路径辨析
  12. 学数据结构堆襸_如何编拼音输入的程序!(300分)
  13. python实现英文新闻摘要自动提取_“关键字”法完成新闻摘要提取
  14. Qt Charts入门
  15. 010-win10任务栏假死—重启“Windows资源管理器”。
  16. 加快深度学习模型训练速度@tf.function
  17. 我励志成为芸芸阿里云大使中的佼佼者 云大使社区
  18. 20180102下结构体
  19. Android安装App出现:“该文件包与具有同一名称的现有文件包存在冲突”的解决方法
  20. java安装安卓模拟器下载安装_Android模拟器安装及其安装APK方法

热门文章

  1. 快准全!极光iAPP在手,APP动态全都有
  2. 雷军与小米:上扬的微笑与下行的隐忧
  3. 水晶报表制作6*4cm的打印纸标签,预览时数据是一页,打印出来却多了一页空白?
  4. 【人工智能 AI】什么是人工智能? What is Artificial Intelligence
  5. 学习国家颁布的三部信息安全领域法律,理解当前工作中的信息安全合规要求
  6. selenium翻页获取京东图书名称和价格
  7. android涂鸦板保存功能,Android 使用Path实现涂鸦功能
  8. div完成田字格布局
  9. RC串、并联选频网络特性的硬件分析与详解
  10. stderr/stdout用法