STM32的ADC介绍

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

1、ADC简介

ADC 即模拟数字转换器,英文详称 Analog-to-digital converter,可以将外部的模拟信号转换为数字信号。 STM32F103 系列芯片拥有 3 个ADC(C8T6 只有 2 个),这些ADC可以独立使用,其中ADC1和ADC2还可以组成双重模式(提高采样率)。 

STM32 的 ADC 是 12 位逐次逼近型的模拟数字转换器。它有18个通道,可测量16个外部和2个内部信号源,其中ADC3根据CPU引脚的不同其通道数也不同,一般有8个外部通道。ADC 中的各个通道的 A/D 转换可以单次、 连续、扫描或间断模式执行。ADC的结果可以以左对齐或者右对齐存储在 16 位数据寄存器中。

2、ADC的重要名词介绍

ADC输入电压:要求在ADC供电电压的正负极之间变化(0~3.3V)。

ADC的分辨率:用位数表示,位数越高,量化结果越精细,对应分辨率就越高。如:12位的AD值量化结果的范围:0~2^12-1(0~4095)。(电压范围:0~3.3v,实际电压值与量化结果成正比)

转换频率/转换时间:如:1MHz/1us(STM32的最快转换时间)

ADC的通道数:ADC1/2有18个通道,18个通道:16个外部通道,2个内部通道(一个接内部温度传感器(可测量CPU的温度),一个是内部参考电压(1.2V左右的基准电压,不随外部电压的变化而变化。作用:如果你的芯片供电电压不是标准的3.3V,测量外部引脚的电压可能不准,就可以读取基准电压来校准,就能得到正确的电压值了)) ADC3根据CPU引脚的不同其通道数也不同,一般有8个外部通道。

规则组与注入组:ADC可以一次性转换一个组,转换完结束。

模拟看门狗:自动检测输入电压范围,可用于当某模拟量(如光照/电压)大于某阈值时,就执行一些操作,当AD值高于/低于设定的阈值时,它就会申请中断。

3、STM32的ADC框图

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

STM32可选择多个通道:一般的ADC(如之前讲解的ADC0809芯片), 多路开关只能选一个通道,开始转换,等待转换完成,取出结果。而对应STM32的ADC可以同时选多个通道,还分成了两个组(规则组和注入组),规则组一次性最多可以选16个通道,注入组一次性可选择4个通道。规则组只有一个数据寄存器,当ADC有多个通道需要转换时,每个通道转换完成后,可以用DMA及时将数据转运到其他存储器上,防止数据被覆盖。注入组有4个数据寄存器,注入组不需要担心数据覆盖的问题。

左下角的开始触发与ADC0809的START类似

触发ADC开始转换的信号有两种

1.软件触发  

2.硬件触发(ADC框图的左下角,上面是注入组触发,下面是规则组触发,定时器可以通向DAC或ADC用于触发转换。

实际问题:ADC需要经常过一段时间转换一次,例如隔1ms转换一次。

①.使用中断:用定时器,每隔1ms申请中断一次,在中断里手动开启一次转换。 用中断会影响主程序的执行,并且不同中断之间优先级不同,有时会导致一些中断不能及时响应,如果触发ADC的中断不能及时响应,那ADC的转换频率就会受到影响。

②.使用硬件触发:对于这些需要频繁进中断,而只在中断中只做一些简单工作的,一般都有硬件的支持(触发输出使ADC开始工作,不需要中断),对于上面的实际问题就可以使用硬件触发的方法。

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

注入组和ADC3的外部触发详见参考手册

例如:用TIM3定时1ms,并选择TIM3的更新事件选择为TRGO输出,然后在ADC这里选择开始触发信号为TIM3的TRGO,这样TIM3的更新事件就可以通过硬件来触发ADC开始转换了。也可以用外部中断引脚来触发转换。

VREF+/VREF-:DAC的参考电压,DAC的参考电压也决定了ADC的输入电压范围,所以他也是ADC的参考电压

VDDA(3.3V)与VSSA(0V):内部模拟部分(ADC、RC震荡器、锁相环等)的电源,一般情况下VDDA接VREF+,VSSA接VREF-。

ADCCLK:ADC的时钟,ADC预分频器是来自RCC的,一般我们设置 PCLK2 为 72MHz。为了不超过 ADC 的最大输入时钟频率 14MHz,我们设置 ADC 的预分频器分频系数为 6,就可以得到 ADC 的输入时钟频率为 72MHz/6,即12MHz。 

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

中断相关

如果开启了模拟看门狗,并指定了看门狗的通道,那么看门狗就会关注这个通道,一旦超过阈值范围,就会申请模拟看门狗的中断,最后通向NVIC。

对于规则组与注入组转换完成之后也会产生一个EOC/JEOC转换完成的信号,这两个信号会在状态寄存器置一个标志位,读取这个标志位就可以知道是否转换完成了,这两个标志位也可以去NVIC申请中断,如果开启了NVIC相应通道就可以触发中断。

总结ADC的基本结构

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

图片选自B站江科大STM入门教学PPT

4、ADC的输入通道与引脚对应关系

原理图上的引脚PA0上的ADC12_IN0说明ADC1和ADC2的外部输入引脚IN0都在PA0上,ADC1/ADC2的输入引脚在同一个引脚上可用于开启双ADC模式 。

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

图片选自B站江科大STM入门教学PPT

5、规则组的四种转换模式

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

图片选自B站江科大STM入门教学PPT

小结

非扫描模式和扫描模式:是否要扫描多个ADC通道,若只有一个通道,就可以使用非扫描模式。若有多个通道模拟值需要采集,就可以使用扫描模式。扫描模式相当于有多个ADC通道需要转换,非扫描模式就默认只有一个通道。

单次转换模式和连续转换模式:若有1个通道,单次转换就是ADC转换一次这个通道就停下来。连续转换就是ADC转换一次这个通道后,继续将最新的通道值转换出来(模拟量转数字量,转换频率由ADC转换频率决定,可以设置ADC采样时间)。若有多个ADC通道,单次转换就是ADC转换一次这多个通道(按照一定的顺序,可以设置)就停下来。连续转换就是ADC转换一次这多个通道后,继续将最新的多个通道值转换出来,继续按照之前设置好的通道顺序进行转换。

6、ADC的数据对齐

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

图片选自B站江科大STM入门教学PPT

ADC数据的左对齐与右对齐

数据寄存器是16位的,而ADC的转换结果是12位,那么数据就有左对齐和右对齐(常用)。

二进制数的特点:左移n位,数据增大2^n倍  左对齐直接读的话会比实际值大16倍。

左对齐的用途:如果你不想要这么高的分辨率,可以选择左对齐,然后把高八位取出来,这样就舍弃了后面4位精度。

7、ADC的转换时间

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

图片选自B站江科大STM入门教学PPT

量化编码:就是逐次比较的过程,位数越多花的时间越长。

采样保持电路:量化编码是需要一小段时间的,这段时间输入电压不允许变化,故需要一个电容来收集采样后外部的电压,收集完之后再关闭采样与电容之间的通道。

ADC的采样时间是可以设置的,ADC周期可通过设置ADCCLK(通过RCC设置分频系数)来设置,而STM32 ADC的转换时间=采样时间+12.5个ADC周期,故可通过程序设置采样时间和ADCCLK来设置实际需要的ADC转换时间。

8、具体实验总结

ADC使用一般步骤:

校准-->通道配置-->启动ADC --> 等待 ADC 转换完成--> 获取转换值

①单通道ADC采集实验(HAL库)

ADC:非扫描模式,单次转换模式,由软件触发。

1.实验相关寄存器

ADC_CR1寄存器(模式选择寄存器):

模式选择:双模式选择(此实验单通道选择独立模式)和扫描模式(此实验选择非扫描模式)

ADC_CR2寄存器

EXTSEL[2:0]位用于选择规则组启动转换的外部事件触发源,本实验使用的是软件触发(SWSTART),所以这三个位置为 111。EXTTRIG 位必须置 1,EXTSEL[2:0]位才能选择软件触发(SWSTART),别漏了这步,否则设置软件触发会不成功。SWSTART 位用于启动一次规则组通道的转换。

ADC 采样事件寄存器x:

一般每个要转换的通道,采样时间建议尽量长一点,以获得较高的准确度,但是这样会降低 ADC 的转换速率。

2.重要结构体和函数

1.用于初始化 ADC

HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef *hadc);

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

typedef struct { uint32_t DataAlign;                                     /* 设置数据的对齐方式 */

                         uint32_t ScanConvMode;                           /* 扫描模式 */

                         FunctionalState ContinuousConvMode;    /* 开启连续转换模式/单次转换模式 */

                         uint32_t NbrOfConversion;                         /* 设置转换通道数目 */

                         FunctionalState DiscontinuousConvMode; /* 是否使用规则通道组间断模式 */

                         uint32_t NbrOfDiscConversion;                  /* 配置间断模式的规则通道个数 */

                         uint32_t ExternalTrigConv;                          /* ADC 外部触发源选择 */ 、

  } ADC_InitTypeDef;

1) DataAlign:用于设置数据的对齐方式,这里可以选择右对齐或者是左对齐,该参数可选为: ADC_DATAALIGN_RIGHT 和 ADC_DATAALIGN_LEFT。

2) ScanConvMode:配置是否使用扫描。如果是单通道转换使用 ADC_SCAN_DISABLE,如果是多通道转换使用 ADC_SCAN_ENABLE。

3) ContinuousConvMode:可选参数为 ENABLE 和 DISABLE,配置自动连续转换还是单次转换。 使用 ENABLE 配置为使能自动连续转换;使用 DISABLE 配置为单次转换,转换一次后停止 需要手动控制才重新启动转换。

4) NbrOfConversion:指定规则组转换通道数目,范围是:1~16。

5) DiscontinuousConvMode:配置是否使用规则通道组间断模式,比如要转换的通道有 1、2、 5、7、8、9,那么第一次触发会进行通道 1 和 2,下次触发就是转换通道 5 和 7,这样不连续的转换,依次类推。此参数只有将 ScanConvMode 使能,还有 ContinuousConvMode 失能的情况下才有效,不可同时使能。

6) NbrOfDiscConversion:配置间断模式的通道个数,禁止规则通道组间断模式后,此参数忽略。

7) ExternalTrigConv:外部触发方式的选择,如果使用软件触发,那么外部触发会关闭。  本实验就使用软件触发的方式

2.首先调用 HAL_ADC_Init 函数配置了相关的功能后,再调用此函数进行 ADC 自校准功能

HAL_StatusTypeDef HAL_ADCEx_Calibration_Start(ADC_HandleTypeDef *hadc);

3.调用了 HAL_ADC_Init 函数配置了相关的功能后,就可以调用此函数配置 ADC 具体通道。

HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef *hadc, ADC_ChannelConfTypeDef *sConfig);

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

4.当配置好 ADC 的基础的功能后,就调用此函数启动 ADC。

HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef *hadc);

5.一般先调用 HAL_ADC_Start 函数启动转换,再调用该函数等待转换完成,然后再调用 HAL_ADC_GetValue 函数来获取当前的转换值。

HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef *hadc, uint32_t Timeout);

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

6.一般先调用 HAL_ADC_Start 函数启动转换,再调用 HAL_ADC_PollForConversion 函数等 待转换完成,然后再调用 HAL_ADC_GetValue 函数来获取当前的转换值

uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef *hadc);

3.单通道ADC采集实验基本步骤

ADC句柄、ADC时钟结构体(用于设置ADC时钟)、GPIO句柄声明

1.开启ADCx时钟、开启GPIO(模拟量输入引脚)时钟

2.设置ADC时钟,GPIO引脚初始化(1.Pin 2.模拟模式)

3.ADC初始化

4.ADC校准

5.ADC通道配置(可自己写一个函数)

6.开启ADC、等待转换结束、获取转换结果

7.编写通道 ch 的转换值的平均函数

②单通道 ADC 采集(DMA 读取)实验

ADC:非扫描模式,连续转换模式,由软件触发。

DMA:正常模式,由软件触发。

1.单通道ADC采集(DMA读取)实验基本步骤

ADC、GPIO、DMA句柄声明

1.开启ADCx时钟、开启GPIO(模拟量输入引脚)时钟、DMA时钟

2.设置ADC时钟,GPIO引脚初始化(1.Pin 2.模拟模式)

3.DMA初始化  将DMA与外设连接起来(软件层面)

__HAL_LINKDMA(&g_adc_dma_handle, DMA_Handle, g_dma_adc_handle);

4.ADC初始化

5.ADC校准

6.ADC通道配置

7.设置ADC中断优先级(配置DMA数据流请求中断优先级,ADC_ADCX_DMACx_IRQn表示DMA1通道1的中断,如下面第一张图)

8.开启ADC和DMA(设置传输个数为0,实际开启由adc_dma_enable用寄存器开启),开启DMA中断(如下图)

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

9.使能一次DMA传输函数(用寄存器操作)

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

10.中断服务子函数的编写

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

DMA1通道1传输完成后产生中断,中断标志由相关寄存器判断,如上第二张图。本实验采用判断标志位(传输指定个数数据后DMA中断)的方式,即DMA转运完成一次(传输ADC_DMA_BUF_SIZE个数据到目的数组g_adc_dma_buf[ADC_DMA_BUF_SIZE]中去,传输完成后产生中断,标记g_adc_dma_sta为1),再对原始数据进行平均,显示,再清零标志位g_adc_dma_sta = 0,再次开启DMA转运,循环往复。

使用DMA采集与没有使用DMA采集的区别:

没有使用DMA而采用函数获取转换值,每次获取(获取之前已经设置好了ADC_initADC校准)都要设置ADC通道开启ADC等待ADC转换结束获取转换值(如下图)。 根本区别在于不使用DMA转运每次要等待ADC转换结束后才可以用HAL_ADC_GetValue(&g_adc_handle)来获取ADC转换值,而使用DMA转运数据,ADC_DMA初始化(包括DMA_initDMA与ADC连接ADC_initADC校准设置ADC通道开启ADC开启DMA)之后,ADC每转换完成一次就触发一次DMA转运,不需要考虑ADC是否已经转换完成。

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

③多通道ADC采集(DMA读取)实验

ADC:扫描模式(有多个通道),连续转换模式,由软件触发。

DMA:正常模式,由软件触发。

DMA和ADC的配置:

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

与单通道ADC采集(DMA读取)实验的差别

1.因为是ADC多组通道,ADC模式是扫描模式。

2.DMA目的数组元素个数均为要采集通道数的整数倍。

实验其他注意点

1.DMA的传输计数器个数是通过对函数adc_dma_enable()传递参数cndtr来实现的      adc_dma_enable():使能一次ADC DMA传输。回顾一下DMA启动传输的条件:DMA_ENABLE,传输计数器不为0,有触发源。

2.DMA只使用了一个通道,ADC使用了6个通道。

3.DMA的数据源地址与目的地址是通过HAL_DMA_Start_IT()函数传递的。

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

4.该DMA传输是软件触发的(没有通过硬件触发),ADC启停同步,保证数据的正确性。

④标准库相关实验

江科大ADC+DMA具体实验步骤:

AD多通道DMA配合转运数据

1.

ADC:扫描模式,单次转换,由软件触发

DMA:正常模式(非循环模式),触发源为ADC1,DMA的通道不能任意选择(由相应硬件决定)

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

ADC启动之前就将DMA初始化以及将DMA的硬件触发通道打开,ADC转运完成一次就触发DMA一次

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

调用该函数,ADC开始转换,连续扫描4个通道,DMA也同步开始转运,转换数据依次存放在ADvalue数组。

主函数:

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

2.

ADC:扫描模式,连续转换,软件触发

DMA:循环模式,触发源为ADC1的硬件触发

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

ADC触发之后,ADC连续转换,DMA循环转运,两者一直工作,始终把最新的转换结果,刷新到SRAM数组里。

主函数:

stm32 一次adc时间,STM32,stm32,嵌入式硬件,单片机

本实验HAL库版本代码已更新。

3.

完全硬件自动化

定时器触发ADC--->ADC触发DMA转运。

欢迎提问讨论,共同进步,望诸君共勉!文章来源地址https://www.toymoban.com/news/detail-765361.html

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

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

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

相关文章

  • 【嵌入式】STM32进阶-OLED显示时间+温度和湿度

    0.前言 在本次实验中,我们将学习如何使用STM32微控制器和OLED显示屏,实现显示时间、温度和湿度的功能。这个应用场景在很多项目中都非常常见,例如室内温湿度监测、气象站等。 在现代生活中,对时间、温度和湿度的监测和显示具有重要的意义。无论是在家庭、办公室还

    2024年02月03日
    浏览(55)
  • 嵌入式学习笔记——STM32的USART相关寄存器介绍及其配置

    上一篇中,对串口做了个概述,主要是介绍了串口通信的特征,异步串行全双工通信,然后就是结合串口的框图梳理了一下STM32中USART的配置流程以及发送接收数据的流程,本文将接着上篇的内容,对串口的寄存器做个介绍,然后实现一个简单的收发实验。 根据之前GPIO的经验

    2024年02月05日
    浏览(54)
  • STM32 MCU ADC详解(1)--初识ADC

    ADC中文全称 模拟数字转换器 ,其主要功能是将模拟信号(通常是连续变化的电压/电流信号)转换成数字信号,提供给程序进行处理。这个转换有什么作用呢?举个例子,当我们在淋浴的时候,感觉到水温过高了,会伸手对开关进行一个调节,这是因为我们大脑对皮肤神经末

    2024年01月23日
    浏览(38)
  • STM32 | STM32CubeMX基础之ADC

    一、ADC框图 ADC输入电源 2. 输入通道 这16个通道对应着不同的IO口,此外 ADC1 的通道 16 连接到了芯片内部的温度传感器,通道 17连接到了VRefInt(内部参照电压)。 3. 规则通道与注入通道 a)规则通道组: i)相当正常运行的程序。最多16个通道。规则通道和它的转换顺序在AD

    2024年02月06日
    浏览(41)
  • 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日
    浏览(59)
  • STM32 ADC采样

    目录 1.基础概念 2.原理:ADC采样过程分为四步:采样、保持、量化、编码。 3.采样定理 4.采样保持放大器(SHA) 5.ADC电压值转换 6.ADC轮询采样 1.基础概念 ADC 全称:Analog-to-Digital Converter,指模拟/数字转换器,就是将模拟信号转换成数字信号 ①模拟信号:是连续变化的,具有电

    2024年02月04日
    浏览(44)
  • stm32-ADC转换

    ADC(Analog-Digital Converter)为模拟-数字转换器,可以将引脚上连续变化的电压值等效为数字变量。 12位为其分辨率0~2^12-1,将能够检测到的电压范围通过线性等效为0-4095其中的一个数字变量,分辨率越高越精确。 1us为转换时间 实现原理: 通过通道选择开关选择输入引脚,然后通

    2024年02月22日
    浏览(36)
  • STM32之ADC

    ADC全称: Analog-to-Digital Converter,指模拟/数字转换器,是指将连续变化的模拟信号转换为 离散的数字信号。 量程: 能测量的电压范围。 分辨率: ADC能辨别的最小模拟量,通常以输出二进制数的位数表示,比如:8、10、12、16位等。位数越多,分辨率越高,一般来说分辨率越高,

    2024年02月05日
    浏览(65)
  • STM32——ADC采集

    目录 ADC简介 ADC主要特征 ADC功能框图 ADC引脚 电压输入范围 通道选择 单次转换模式 连续转换模式 转换顺序 规则序列  注入序列 触发源 转换时间 中断 转换结束中断 模拟看门狗中断 DMA请求 代码讲解 宏定义: ADC简介 12位ADC是一种逐次逼近型模拟数字转换器,它有多达18个通

    2023年04月08日
    浏览(28)
  • STM32 (九)ADC

    什么是ADC? Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。 典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。也就是模数转换,即将模拟量转换为数字量。 简单地说就是

    2024年02月05日
    浏览(21)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包