STM32CubeMX教程13 ADC - 单通道转换

这篇具有很好参考价值的文章主要介绍了STM32CubeMX教程13 ADC - 单通道转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、准备材料

开发板(正点原子stm32f407探索者开发板V2.4)

STM32CubeMX软件(Version 6.10.0)

keil µVision5 IDE(MDK-Arm)

ST-LINK/V2驱动

野火DAP仿真器

XCOM V2.6串口助手

1个滑动变阻器

2、实验目标

使用STM32CubeMX软件配置STM32F407开发板的ADC实现单通道ADC采集,具体为使用ADC1_IN5通道通过软件/定时器触发采集滑动变阻器上的分压

3、ADC概述

ADC即模拟数字转换,是将模拟电压量转换为数字量的一种手段,如下图所示为STM32F407单个ADC的结构框图 (注释1)其主要包括5个部分,分别为 ① ADC电源引脚、② ADC输入引脚、③ ADC触发源、④ ADC转换规则和⑤ ADC中断触发,下面从这五个方面分别介绍STM32F407的ADC

① ADC电源引脚有VDDA、VSSA、VREF+和VREF-四个引脚,STM32的ADC采集范围为VREF- ≤ VIN ≤ VREF+,一般将ADC的负端参考电压与VSSA短接然后接地,将ADC的正端参考电压接VDDA即3.3V,这样ADC的采集范围就设置为0~3.3V,对于12位分辨率的ADC,其采集数字量范围为0-4095,这样就可以将0-3.3V的电压映射到0-4095的数字量,使其可以相互转化,ADC电源即参考电压引脚具体描述如下图所示 (注释1)

② STM32F407有三个ADC可供使用,每个ADC又拥有16个通道ADCx_IN[15:0],其中ADC1还拥有Temperature Sensor Channel、Vrefint Channel和Vbat Channel三个内部通道

  1. Temperature Sensor Channel通道用于测量芯片内部温度,范围为-40℃~125℃,精度为±1.5℃

  2. Vrefint Channel用于测量内部参考电压

  3. Vbat Channel用于测量备用电源电压的一半

ADC的转换主要依靠12位分辨率的片上模数转换器

③ 注入通道和规则通道均有16个触发源,可以选择定时器外部源触发/定时器比较捕获触发/软件常规触发,具体参看上图ADC框架中的紫色框框

④ ADC启动转换时需要按照一定通道顺序转化,该顺序由规则通道和注入通道两者共同决定,其中注入通道其数据寄存器为4*16位,因此可以同时转换四个通道

但是规则通道的数据寄存器只有一个16位的寄存器,因此必须一个通道一个通道的转换,每转换完一个通道,就需要及时将转换完成的结果从规则通道数据寄存器中读出去

其中注入通道类似ADC通道转换过程的中断,如下图所示 (注释2)

⑤ ADC的中断事件有DMA溢出、ADC转换结束、注入转换结束和模拟看门狗事件共四个事件,前三个中断和其名字表述类似,当转换结束/溢出时就会产生中断,模拟看门狗可以设置ADC转换值的上限和下限,当超出限制之后就会产生中断,可以用于警报,如下表所示 (注释1)

ADC有独立模式、二重和三重采集模式,当只有ADC1启动时只能使用独立模式,当ADC1/2启动时可以使用二重采集模式,当ADC1/2/3/全部启动时可以使用三重采集模式,本实验只介绍独立模式

4、实验流程

4.0、前提知识

本实验为ADC独立模式单通道单次转换模式,主要利用ADC1_IN5通道由软件/定时器启动ADC转换,如果是软件手动启动的ADC转换则在单次转换模式下每次转换完成一次之后均需要再次手动启动ADC转换,另外需要注意ADC在开始精确转换之前需要一段稳定时间tSTAB,如下图所示为ADC转化所经过的路径

4.1、CubeMX相关配置

4.1.0、工程基本配置

打开STM32CubeMX软件,单击ACCESS TO MCU SELECTOR选择开发板MCU(选择你使用开发板的主控MCU型号),选中MCU型号后单击页面右上角Start Project开始工程,具体如下图所示

开始工程之后在配置主页面System Core/RCC中配置HSE/LSE晶振,在System Core/SYS中配置Debug模式,具体如下图所示

详细工程建立内容读者可以阅读“STM32CubeMX教程1 工程建立”

4.1.1、时钟树配置

系统时钟使用8MHz外部高速时钟HSE,HCLK、PCLK1和PCLK2均设置为STM32F407能达到的最高时钟频率,具体如下图所示

4.1.2、外设参数配置

本实验需要需要初始化USART1作为输出信息渠道,具体配置步骤请阅读“STM32CubeMX教程9 USART/UART 异步通信”

设置TIM3通用定时器溢出时间100ms,外部触发事件选择更新事件,参数详解请阅读“STM32CubeMX教程6 TIM 通用定时器 - 生成PWM波”实验,具体配置如下图所示

在Pinout & Configuration页面左边功能分类栏目Analog中单击其中ADC1,在Mode中勾选需要使用的输入通道,本实验为单通道转换实验,因此任意勾选IN0~IN15之间的任一通道均可,笔者勾选了IN5

在Configuration中对ADC1_IN5的转换参数进行配置,下面介绍一些比较重要的参数

------------------------------------------- ADCs_Common_Settings ---------------------------------------------

Mode (模式):只启动一个ADC时只能选择独立模式,当同时启用了ADC1/2或ADC1/2/3时这里会出现多重ADC采集的模式可选

-------------------------------------------------- ADC_Settings --------------------------------------------------

Clock Prescaler (时钟分频):决定ADC转换的频率,分频越少ADC转换的频率越高,最少2分频,一个通道一次ADC转换的总时间为N+12个ADC时钟周期,其中N为设置的采样次数Cycles

Resolution (ADC转换精度):可以选择12/10/8/6位精度的转换值,精度选择不同需要的转换时钟周期也不同

Data Alignment (数据对齐):由于规则数据寄存器为16位,但是最高转换精度为12位,因此数据可以选择以右对齐/左对齐的方式放入寄存器

Scan Conversion Mode (扫描转换模式):规则通道同时只能转换一个通道,启用该参数后,当规则通道中有多个通道等待转换时其转换完当前通道会自动转换组内的下一个通道

Continuous Conversion Mode (连续转换模式):启用该参数,ADC结束一个转换立即开始一个新的转换,与参数 Scan Conversion Mode 共同启用,则组内最后一个通道转换完毕后会立即切换到第一个通道继续转换

DMA Continuous Requests (DMA请求):需要在DMA Settings中添加DMA请求后,该参数才可以使能

End Of Conversion Selection (结束转换标志):选择一个通道转换完就产生EOC标志,还是一个组内所有通道全部转换完才产生EOC标志

----------------------------------------- ADC_Regular_ConversionMode----------------------------------------

Number Of Conversion (转换通道数量):常规规则通道希望转换的通道数量,此处为单通道,因此为1

External Trigger Conversion Source (外部触发转换源):ADC启动转换需要的触发源设置,本实验使用TIM3 100ms更新事件作为ADC的触发源

External Trigger Conversion Edge (外部触发转换边沿):当TIM3 100ms更新事件触发时会产生一个上升沿,因此这里选择上升沿

Rank (规则通道排序):对常规规则通道内的所有通道ADC转换排序

----------------------------------------- ADC_Injected_ConversionMode----------------------------------------

Number Of Conversion (注入通道转换模式通道数量):注入通道希望转换的通道数量,这里不启用注入通道,因此为0

具体参数配置如下图所示

4.1.3、外设中断配置

在Pinout & Configuration页面左边System Core/NVIC中勾选ADC1/2/3全局中断,然后选择合适的中断优先级即可,步骤如下图所示

4.2、生成代码

4.2.0、配置Project Manager页面

单击进入Project Manager页面,在左边Project分栏中修改工程名称、工程目录和工具链,然后在Code Generator中勾选“Gnerate peripheral initialization as a pair of 'c/h' files per peripheral”,最后单击页面右上角GENERATE CODE生成工程,具体如下图所示

详细Project Manager配置内容读者可以阅读“STM32CubeMX教程1 工程建立”实验3.4.3小节

4.2.1、外设初始化调用流程

在生成的工程代码主函数main()中调用了MX_ADC1_Init()函数完成了对ADC1基本参数的配置,ADC常规规则通道/注入通道等参数配置

然后在ADC初始化函数HAL_ADC_Init()函数中调用了HAL_ADC_MspInit()函数对ADC1时钟和中断进行了使能,对中断优先级进行了配置,对ADC1_IN5输入引脚做了复用操作

如下图所示为ADC1单通道初始化的具体函数调用流程

4.2.2、外设中断调用流程

使能ADC1/2/3全局中断后在stm32f4xx_it.c中自动生成了TIM4的中断处理函数ADC_IRQHandler()

ADC_IRQHandler()调用了HAL库的ADC中断处理函数HAL_ADC_IRQHandler(),该函数处理所有的ADC中断事件

在ADC转换完成之后最终调用了ADC转换完成中断回调函数HAL_ADC_ConvCpltCallback(),该函数为虚函数

如下图所示为ADC1单通道转换中断回调的具体函数调用流程

4.2.3、添加其他必要代码

在adc.c中重新实现ADC转换完成中断回调函数HAL_ADC_ConvCpltCallback(),在该函数中获取ADC的转换值,然后将其计算为电压值*1000,并将这两个值通过串口输出,具体代码如下图所示

源代码如下

/*转换完成中断回调*/
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
    /*定时器中断启动单通道转换*/
    if(hadc->Instance == ADC1)
    {
        uint32_t val=HAL_ADC_GetValue(&hadc1);
        uint32_t Volt=(3300*val)>>12;
        printf("val:%d, Volt:%d\r\n",val,Volt);
    }
}

在主函数中以中断方式启动ADC转换,然后启动ADC的触发源TIM3定时器,具体代码如下图所示

5、常用函数

/*启动ADC转换*/
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef *hadc)
 
/*停止ADC转换*/
HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef *hadc)
 
/*以中断方式启动ADC转换*/
HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef *hadc)
 
/*停止ADC转换*/
HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef *hadc)
 
/*轮询ADC是否转换完毕*/
HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef *hadc, uint32_t Timeout)
 
/*获取ADC转换值*/
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef *hadc)
 
/*ADC转换完成中断回调函数*/
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)

6、烧录验证

烧录程序,上电后打开串口,串口会每100ms传来一次ADC采集的数据,旋转滑动变阻器从一端到另一端,可以看到ADC采集到的值从0逐渐变为最大值4095

7、软件触发ADC采集

如果你希望不采用定时器触发中断采集的方式,而是想使用软件手动触发轮询采集的方式,需要先将ADC规则转换模式中触发源修改为软件触发,然后按照下述步骤操作

  1. 使用HAL_ADC_Start()启动转换
  2. 使用HAL_ADC_PollForConversion()轮询检测是否转换完成
  3. 转换完成后使用可以HAL_ADC_GetValue()获取转换后的ADC值

具体参考如下图所示

源代码如下

HAL_ADC_Start(&hadc1);
if(HAL_ADC_PollForConversion(&hadc1,200)==HAL_OK)
{
    uint32_t val=HAL_ADC_GetValue(&hadc1);
    uint32_t Volt=(3300*val)>>12;
    printf("val:%d, Volt:%d\r\n",val,Volt);
}
HAL_Delay(500);

8、注释详解

注释1:图片来自STM32F4xx中文参考手册 RM0090

注释2:图片来自【STM32】HAL库 STM32CubeMX教程九---ADC_cubemx adc-CSDN博客

参考资料

STM32Cube高效开发教程(基础篇)文章来源地址https://www.toymoban.com/news/detail-783406.html

到了这里,关于STM32CubeMX教程13 ADC - 单通道转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32-单通道ADC采集(DMA读取)实验

    关于ADC的一些原理和实验我们已经有了2篇笔记,链接如下: 关于ADC的笔记1_Mr_rustylake的博客-CSDN博客 STM32-ADC单通道采集实验_Mr_rustylake的博客-CSDN博客 实验要求:通过ADC1通道1(PA1)采集电位器的电压,并显示ADC转换的数字量和换算后的电压值。 我们通过下表可以知道DMA1通道

    2024年02月16日
    浏览(42)
  • STM32 hal库使用笔记(五)ADC—单通道/双通道DMA传输

    实现目的:利用ADC采集光敏传感器/烟雾传感器的值,并利用串口打印 实验平台:正点原子精英版 一、简介 1.DMA的介绍 参考:STM32 hal库使用笔记(四)DMA—内存到内存/内存到外设_乱码小伙的博客-CSDN博客 2.ADC简介      ADC(Analog-Digital Converter)模拟-数字转换器 ADC可以将引脚

    2024年02月03日
    浏览(49)
  • 【正点原子STM32连载】第三十三章 单通道ADC采集实验 摘自【正点原子】APM32E103最小系统板使用指南

    1)实验平台:正点原子APM32E103最小系统板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban 本章介绍使用APM32E103模数转换器(ADC)进行带通道的电压采集。通过本章的学习,读者将学习到单通

    2024年02月19日
    浏览(48)
  • STM32自学☞AD单通道

      程序的最终运行成果: 当转动电位器时,数值和电压值发生变化 #include \\\"stm32f10x.h\\\" #include \\\"stm32f10x_adc.h\\\" #include \\\"ad.h\\\" #include \\\"stdint.h\\\" void ad_Init(void) {  /*  初始化步骤:  1.开启GPIO时钟和ADC时钟,配置ADCCLK  2.配置GPIO,模拟输入模式  3.配置多路开关  4.配置ADC转换器  5.开启

    2024年03月21日
    浏览(39)
  • 实验(六):ADC应用:独立模式单通道采集实验

    实验目的: 1. 学习对ADC基础功能的使用; 2. 掌握KEIL5的仿真与调试。 任务: 1.   根据要求编写程序,并写出原理性注释; 2. 将检查程序运行的结果,分析一下是否正确; 3. 完成所建工程的验证调试。 贴片滑动变阻器的动触点通过连接至STM32 芯片的ADC 通道引脚。当我们使

    2024年02月15日
    浏览(42)
  • HAL库配置ADC_1_单通道配置

    💦在使用ADC外设前,先查看下芯片手册,看下ADC的特点。 💦ADC的使用,一定是有参考电压的,在使用时要注意,芯片手册上关于ADC参考电压的范围。 通常正参考电压VREF+连接到VCC,负参考电压VREF-连接到GND 💦通过框图可以了解ADC的工作流程。   下面是ADC比较常用的参数说

    2024年02月04日
    浏览(33)
  • 基于 VITA57.4 标准的单通道 6GSPS 12 位采样 ADC,单通道 6GSPS 16 位采样 DAC 子卡模块

    概述 FMC147 是一款单通道 6.4GSPS(或者配置成 2 通道 3.2GSPS)采样率的 12 位 AD 采集、单通道 6GSPS(或配置成 2 通道 3GSPS) 采样率 16 位 DA 输出子卡模块,该板卡为 FMC+标准,符合 VITA57.4 规范,该模块可以作为一个理想的 IO 单元耦合至 FPGA 前端,ADC 数字端通过 16lane 通道的 JE

    2023年04月16日
    浏览(43)
  • OpenCV 将单通道转换为三通道

    项目有个需求:图片传至图像算法库处理完成后需要返回结果图像进行再加工。 目前的情况是相机拍下来的图像是灰度图 传送图像指针给算法处理,算法处理完后将检测结果(eg. ok,ng)写入一张三通道图,只有这样才可以显示彩色文字 然后现在需要回传此三通道图片的指针

    2024年02月11日
    浏览(33)
  • STM32CubeMX教程15 ADC - 多重ADC转换

    开发板(正点原子stm32f407探索者开发板V2.4) STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 野火DAP仿真器 XCOM V2.6串口助手 3个滑动变阻器 使用STM32CubeMX软件配置STM32F407开发板的 ADC实现多重ADC采集 ,具体为使用ADC1_IN5、ADC2_IN6实现二重ADC采集,使用ADC1_IN5、

    2024年01月16日
    浏览(52)
  • STM32CubeMX配置-ADC多通道配置(DMA) (STM32G070)

    一、写在前面         ADC通道采集数据的两种方式:         1)ADC轮询采集数据直接放到数组中;         2)采用中断方式,ADC采集完成进入中断,中断关闭ADC采集,取数据之后再打开ADC采集。 以下按第一种方式实现: 二、ADC多通道配置 1)配置通道及参数     如果要控

    2024年02月05日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包