STM32学习笔记:ADC理解

发布者:电子设计艺术家最新更新时间:2019-03-06 来源: eefocus关键字:STM32  ADC 手机看文章 扫描二维码
随时随地手机看文章

ADC 简介

12 位 ADC 是逐次趋近型模数转换器。它具有多达 19 个复用通道,可测量来自 16 个外部 源、两个内部源和 VBAT 通道的信号。这些通道的 A/D 转换可在单次、连续、扫描或不连续 采样模式下进行。ADC 的结果存储在一个左对齐或右对齐的 16 位数据寄存器中。


ADC 主要特性


可配置 12 位、10 位、8 位或 6 位分辨率 

● 在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断 

● 单次和连续转换模式 

● 用于自动将通道 0 转换为通道“n”的扫描模式 

● 数据对齐以保持内置数据一致性 

● 可独立设置各通道采样时间 

● 外部触发器选项,可为规则转换和注入转换配置极性 

● 不连续采样模式 

● 双重/三重模式(具有 2 个或更多 ADC 的器件提供) 

● 双重/三重 ADC 模式下可配置的 DMA 数据存储 

● 双重/三重交替模式下可配置的转换间延迟 

● ADC 转换类型(参见数据手册) 

● ADC 电源要求:全速运行时为 2.4 V 到 3.6 V,慢速运行时为 1.8 V 

● ADC 输入范围:VREF—  VIN  VREF+ 

● 规则通道转换期间可产生 DMA 请求


单次转换模式

在单次转换模式下,ADC 执行一次转换。CONT 位为 0 时(单次转换模式),可通过以下方式启动此模式: 

● 将 ADC_CR2 寄存器中的 SWSTART 位置 1(仅适用于规则通道) 

● 将 JSWSTART 位置 1(适用于注入通道) 

● 外部触发(适用于规则通道或注入通道) 


完成所选通道的转换之后: 

● 如果转换了规则通道: 

— 转换数据存储在 16 位 ADC_DR 寄存器中 

— EOC(转换结束)标志置 1 

— EOCIE 位置 1 时将产生中断 

● 如果转换了注入通道: 

— 转换数据存储在 16 位 ADC_JDR1 寄存器中 

— JEOC(注入转换结束)标志置 1 

— JEOCIE 位置 1 时将产生中断 

然后,ADC 停止


连续转换模式

在连续转换模式下,ADC 结束一个转换后立即启动一个新的转换。CONT 位为 1 时(连续转换模式),可通过外部触发或将 ADC_CR2 寄存器中的 SWSTRT 位(开始转换规则通道)置 1 来启动此模式(仅适用于规则通道)。 


每次转换之后: 

● 如果转换了规则通道组: 

— 上次转换的数据存储在 16 位 ADC_DR 寄存器中 

— EOC(转换结束)标志置 1 

— EOCIE 位置 1 时将产生中断 

注意:无法连续转换注入通道。连续模式下唯一的例外情况是,注入通道配置为在规则通道之后自动转换(使用 JAUTO 位),请参见自动注入一节。


扫描模式


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

通过将 ADC_CR1 寄存器中的 SCAN 位置 1 来选择扫描模式。将此位置 1 后,ADC 会扫描 在 ADC_SQRx 寄存器(对于规则通道)或 ADC_JSQR 寄存器(对于注入通道)中选择的 所有通道。为组中的每个通道都执行一次转换。每次转换结束后,会自动转换该组中的下一个通道。如果将 CONT 位置 1(连续转换模式),规则通道转换不会在组中最后一个所选通道处停止,而是再 次从第一个所选通道继续转换。 


如果将 DMA 位置 1,则在每次规则通道转换之后,均使用直接存储器访问 (DMA) 控制器将 转换自规则通道组的数据(存储在 ADC_DR 寄存器中)传输到 SRAM。 


在以下情况下,ADC_SR 寄存器中的 EOC 位置 1: 

● 如果 EOCS 位清零,在每个规则组序列转换结束时 

● 如果 EOCS 位置 1,在每个规则通道转换结束时 

从注入通道转换的数据始终存储在 ADC_JDRx 寄存器中。


不连续采样模式

规则组

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

出现外部触发时,将启动在 ADC_SQRx 寄存器中选择的接下来 n 个转换,直到序列中的所 有转换均完成为止。通过 ADC_SQR1 寄存器中的 L[3:0] 位定义总序列长度。 

示例: 

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 

注意:在不连续采样模式下转换规则组时,不会出现翻转。 

转换完所有子组后,下一个触发信号将启动第一个子组的转换。在上述示例中,第 4 次触发 重新转换了第 1 个子组中的通道 0、1 和 2。


可独立设置各通道采样时间

ADC 会在数个 ADCCLK 周期内对输入电压进行采样,可使用 ADC_SMPR1 和 ADC_SMPR2 寄存器中的 SMP[2:0] 位修改周期数。每个通道均可以使用不同的采样时间进行采样。 

总转换时间的计算公式如下: 

Tconv = 采样时间 + 12 个周期 

示例: 

ADCCLK = 30 MHz 且采样时间 = 3 个周期时: 

Tconv = 3 + 12 = 15 个周期 = 0.5 μs(APB2 为 60 MHz 时)


外部触发转换和触发极性

可以通过外部事件(例如,定时器捕获、EXTI 中断线)触发转换。如果 EXTEN[1:0] 控制位 (对于行规转换)或 JEXTEN[1:0] 位(对于注入转换)不等于“0b00”,则外部事件能够 以所选极性触发转换。表 50 提供了 EXTEN[1:0] 和 JEXTEN[1:0] 值与触发极性之间的对应 关系。 


 这里写图片描述 
这里写图片描述 


可通过将 ADC_CR2 寄存器中的 SWSTART(对于规则转换)或 JSWSTART(对于注入转 换)位置 1 来产生软件源触发事件。 

可通过注入触发中断规则组转换。 


注意:可以实时更改触发选择。不过,当更改触发选择时,会在 1 个 APB 时钟周期的时间范围内禁 止触发检测。这是为了避免在转换期间出现意外检测。


数据管理

使用 DMA

由于规则通道组只有一个数据寄存器,因此,对于多个规则通道的转换,使用 DMA 非常有 帮助。这样可以避免丢失在下一次写入之前还未被读出的 ADC_DR 寄存器中的数据。


在使能 DMA 模式的情况下(ADC_CR2 寄存器中的 DMA 位置 1),每完成规则通道组中的 一个通道转换后,都会生成一个 DMA 请求。这样便可将转换的数据从 ADC_DR 寄存器传输 到用软件选择的目标位置。


尽管如此,如果数据丢失(溢出),则会将 ADC_SR 寄存器中的 OVR 位置 1 并生成一个中 断(如果 OVRIE 使能位已置 1)。随后会禁止 DMA 传输并且不再接受 DMA 请求。在这种 情况下,如果生成 DMA 请求,则会中止正在进行的规则转换并忽略之后的规则触发。随后 需要将所使用的 DMA 流中的 OVR 标志和 DMAEN 位清零,并重新初始化 DMA 和 ADC, 以将需要的转换通道数据传输到正确的存储器单元。只有这样,才能恢复转换并再次使能数据传输。注入通道转换不会受到溢出错误的影响。


在 DMA 模式下,当 OVR = 1 时,传送完最后一个有效数据后会阻止 DMA 请求,这意味着 传输到 RAM 的所有数据均被视为有效。


在最后一次 DMA 传输(DMA 控制器的 DMA_SxRTR 寄存器中配置的传输次数)结束时: 

● 如果将 ADC_CR2 寄存器中的 DDS 位清零,则不会向 DMA 控制器发出新的 DMA 请求 

(这可避免产生溢出错误)。不过,硬件不会将 DMA 位清零。必须将该位写入 0 然后 

写入 1 才能启动新的传输。 

● 如果将 DDS 位置 1,则可继续生成请求。从而允许在双缓冲区循环模式下配置 DMA。


要在使用 DMA 时将 ADC 从 OVR 状态中恢复,请按以下步骤操作: 

1.重新初始化 DMA(调整目标地址和 NDTR 计数器) 

2. 将 ADC_SR 寄存器中的 ADC OVR 位清零 

3. 触发 ADC 以开始转换。 

/********************************************************************************************/ 

了解了以上的ADC的理解,对于编程来说是非常有用的。


关键字:STM32  ADC 引用地址:STM32学习笔记:ADC理解

上一篇:STM32外部晶振不起振
下一篇:STM32 Flash操作(擦写)过程中器件复位导致数据丢失问题

推荐阅读最新更新时间:2024-03-16 16:24

MSP430 ADC12采样分析
AD部分主要配置ADC12模块的时钟、参考源、采样通道、采样模式、存储和采样保持。 我就一个部分一个部分来 第一个是ADC12模块的时钟,这个是模块运行时的时钟,跟采样定时器是两个概念,曾经我有一段时间被迷惑住了。这个由ADC12CTL1里面的ADC12SSEL和ADC12DIV配置,可以选择ADC12OSC/ACLK/SMCLK/MCLK,TI例程里面好像都是选择的ADC12OSC,这个是5MHZ,不过频率容易受外界影响而改变。这个部分配置好了就得到了ADC12CLK。 第二个参考源,这个部分可以用单片机的参考模块控制,也可以用ADC12模块控制,REFCTL0 &= ~REFMSTR;这句就是设置ADC模块直
[单片机]
MSP430 <font color='red'>ADC</font>12采样分析
STM32入门系列-使用C语言封装寄存器
前面介绍了存储器映射、寄存器和寄存器映射,这些都是为了介绍使用 C语言封装寄存器做铺垫。这里我们通过一个实例来对 C 语言封装寄存器进行介绍。 具体实例:控制 GPIOC 端口的第 0 管脚输出一个低电平。首先我们需要知道GPIOC 端口外设是挂接在哪个总线上的,然后根据总线基地址和本身的偏移地址得到 GPIOC 外设基地址,最后通过这个外设基地址得到里面各种寄存器基地址。 总线和外设基地址封装 根据寄存器的概念,我们可以使用 C 语言中的宏定义对寄存器进行定义。具体代码如下: //定义外设基地址 #define PERIPH_BASE ((unsigned int)0x40000000) 1) //定义 APB2 总线基地址
[单片机]
STM32开发笔记23: 使用__weak修饰符
单片机型号:STM32L053R8T6 在 HAL 库中,很多回调函数前面使用__weak 修饰符。 weak 顾名思义是“弱”的意思,所以如果函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”。 加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数, 那么编译器就会执行__weak 声明的函数,并且编译器不会报错。 举个例子: 我们打开工程模板,找到并打开文件stm32f4xx_hal.c 文件,里面定义了一个函数 HAL_MspInit,定义如下: __weak void HAL_MspInit(v
[单片机]
移植STM32固件库用于HID双向通信
USB的应用中HID类是比较常见的方式。通过修改STM32 USB固件库V4.0的JOYSTICK应用,我们实现一个双向USB通信。 一、移植 使用STM32源程序为点亮LED灯程序。 首先将USB固件库中有用的函数复制到源函数中,建立LIB文件夹其中放入USB2.0协议函数 建立CFG文件夹放入USB应用函数 将两个文件夹都放到源工程目录下将文件添加进来,设置好,配置好KEIL软件设置。 二、修改文件 1、首先修改platform_config.h函数。 该文件是对于多种芯片对于USB库的支持。我们使用STM32F103ZET6芯片,所以只保留与之相关的ID项,与USB_DISCONNECT线(PG11)的配
[单片机]
STM32】串口通信基本原理(超基础、详细版)
STM32F1xx官方资料: 《STM32中文参考手册V10》-第25章通用同步异步收发器(USART) 通信接口背景知识 设备之间通信的方式 一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种。它们的区别是: 并、串行通信的区别 并行通信 串行通信 传输原理 数据各个位同时传输 数据按位顺序传输 优点 速度快 占用引脚资源少 缺点 占用引脚资源多 速度相对较慢 串行通信的分类 1、按照数据传送方向,分为: 单工:数据传输只支持数据在一个方向上传输; 半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两
[单片机]
【<font color='red'>STM32</font>】串口通信基本原理(超基础、详细版)
串行输出的12位模数转换器MAX1286–MAX1289
MAX1286–MAX1289是串行输出的12位模拟-数字转换器(ADC),具有成本低、功耗小的特点,采用小型8引脚SOT23封装和8引脚TDFN封装。MAX1286/MAX1288采用+5V单电源供电,MAX1287/MAX1289采用+3V单电源供电。这些器件具备逐次逼近ADC,自动关断,快速唤醒(1.4µs)的功能和一个高速3线接口。在150ksps最大采样速率下功耗仅为0.5mW (VDD = +2.7V)。在较低的采样速率下,转换间隙的AutoShutdown™ (0.2µA)特性能够减小功率消耗。MAX1286/MAX1287提供双通道单端工作模式,接受输入信号范围为0到基准VREF。MAX1288/MAX1289接受
[模拟电子]
串行输出的12位<font color='red'>模数转换器</font>MAX1286–MAX1289
Proteus仿真STM32实现--DS18B20和LCD1602显示
proteus仿真stm32103r6,实现18B20温度值在1602上显示,可测量正负温度。程序及仿真工程已上传附件,利用proteus仿真18b20温度为0和-0.1时返回值均为零,新手上路,请多指教。使用proteus8.8版本进行仿真。 原理图 时序 原理图 单片机部分程序如下: #include stm32f10x.h #include bsp-lcd1602.h #include delay.h #include sys.h #include ds18b20.h #include stdio.h #include math.h short tem,tem1; u8 a,b,c,t
[单片机]
Proteus仿真<font color='red'>STM32</font>实现--DS18B20和LCD1602显示
stm32单片机待机模式的设计
一 待机模式简介 在stm32的低功耗模式中,待机模式可以实现系统的最低功耗,在这种模式下,只需要2uA左右的电流。 三 待机唤醒程序分析 实验现象: 将程序下载到开发板上后,LED灯会不断地亮灭,当按下KEY2键超过3s时,LED灯灭,标志着单片机进入待机模式,再按下KEY1键,这时唤醒单片机,LED又开始不断地亮灭亮灭。 程序中用到的一些宏定义 #definemacEXTI_GPIO_CLK(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO) #definemacEXTI_GPIO_PORTGPIOC #definemacEXTI_GPIO_PINGPIO_Pin_13 #definem
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved