【STM32】ADC的基本原理、寄存器

发布者:代码律动最新更新时间:2019-03-12 来源: eefocus关键字:STM32  ADC  寄存器 手机看文章 扫描二维码
随时随地手机看文章

STM32F1xx官方资料:


《STM32中文参考手册V10》-第11章 模拟/数字转换(ADC)


ADC的基本介绍

ADC的基本定义

Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。


典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。


ADC的主要特征

12位逐次逼近型的模拟数字转换器;

最多带3个ADC控制器,可以单独使用,也可以使用双重模式提高采样率;

最多支持23个通道,可最多测量21个外部和2个内部信号源;

支持单次和连续转换模式;

转换结束,注入转换结束,和发生模拟看门狗事件时产生中断;

通道0到通道n的自动扫描模式;

自动校准;

采样间隔可以按通道编程;

规则通道和注入通道均有外部触发选项;

转换结果支持左对齐或右对齐方式存储在16位数据寄存器;

ADC转换时间:最大转换速率 1us(最大转换速度为1MHz,在ADCCLK=14M,采样周期为1.5个ADC时钟下得到);

ADC供电要求:2.4V-3.6V;

ADC输入范围:VREF- ≤  VIN  ≤  VREF+。

STM32F10x系列芯片ADC通道和引脚对应关系



由上图中可以看出,STM32F103ZET6带3个ADC控制器,一共支持23个通道,包括21个外部和2个内部信号源;但是每个ADC控制器最多只可以有18个通道,包括16个外部和2个内部信号源。


ADC的基本原理

ADC的工作框图



ADC模块的框图看起来比较复杂,接下来会一点一点地对它进行分析。


ADC引脚

在框图中最左边的一列是ADC的各个引脚,它们的名称、信号类型和作用见下图:



一般情况下,VDD是3.3V,VSS接地,相对应的,VDDA是3.3V,VSSA也接地,模拟输入信号不要超过VDD(3.3V)。


ADC时钟配置

框图中标注的来自ADC预分频器的ADCCLK是ADC模块的时钟来源。通常,由时钟控制器提供的ADCCLK时钟和PCLK2(APB2时钟)同步。RCC控制器为ADC时钟提供一个专用的可编程预分频器。



这里需要注意一下,一般情况下:不要让ADC时钟超过14MHz,否则可能不准。


也就是说,如果按照默认设置PCLK2为72MHz,此时应为6分频或者8分频。


ADC中断

在框图中的最顶部,显示ADC的各种中断。很显然可以看出:规则和注入组转换结束时能产生中断,当模拟看门狗状态位被设置时也能产生中断。它们都有独立的中断使能位。 


注: ADC1和ADC2的中断映射在同一个中断向量上,而ADC3的中断有自己的中断向量。



ADC中断事件的具体类型有三种,具体见下图:


ADC通道选择

之前说到ADC规则组转换转换结束、注入组转换结束可以产生中断,那么什么是规则组、注入组呢?这就是框图中的中间部位。


STM32的ADC控制器有很多通道,所以模块通过内部的模拟多路开关,可以切换到不同的输入通道并进行转换。STM32特别地加入了多种成组转换的模式,可以由程序设置好之后,对多个模拟通道自动地进行逐个地采样转换。它们可以组织成两组:规则通道组和注入通道组。


例如,可以如下顺序完成转换:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。


规则通道组:最多可以安排16个通道。规则通道和它的转换顺序在ADC_SQRx寄存器中选择,规则组转换的总数应写入ADC_SQR1寄存器的L[3:0]中;

注入通道组:最多可以安排4个通道。注入组和它的转换顺序在ADC_JSQR寄存器中选择。注入组里转化的总数应写入ADC_JSQR寄存器的L[1:0]中。

在执行规则通道组扫描转换时,如有例外处理则可启用注入通道组的转换。也就是说,注入通道的转换可以打断规则通道的转换,在注入通道被转换完成之后,规则通道才可以继续转换。


当然,需要注意的是:如果ADC_SQRx或ADC_JSQR寄存器在转换期间被更改,当前的转换被清除,一个新的启动脉冲将发送到ADC以转换新选择的组。


可能单从字面上还是不是很了解?我们可以通过图形来更直观地认知:



一个不太恰当的比喻是:规则通道组的转换好比是程序的正常执行,而注入通道组的转换则好比是程序正常执行之外的一个中断处理程序。


ADC转换方式

STM32的ADC的各通道可以组成规则通道组或注入通道组,但是在转换方式还可以有单次转换、连续转换、扫描转换模式。


单次转换模式


单次转换模式下,ADC只执行一次转换。该模式既可通过设置ADC_CR2寄存器的ADON位(只适用于规则通道)启动也可通过外部触发启动(适用于规则通道或注入通道),这时CONT位为0。



连续转换模式


在连续转换模式中,当前面ADC转换一结束马上就启动另一次转换。此模式可通过外部触发启动或通过设置ADC_CR2寄存器上的ADON位启动,此时CONT位是1。



扫描模式

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


扫描模式可通过设置ADC_CR1寄存器的SCAN位来选择。一旦这个位被设置,ADC扫描所有被ADC_SQRX寄存器(对规则通道)或ADC_JSQR(对注入通道)选中的所有通道。在每个组的每个通道上执行单次转换。在每个转换结束时,同一组的下一个通道被自动转换。如果设置了CONT位,转换不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换。



这里需要注意的是:如果在使用扫描模式的情况下使用中断,会在最后一个通道转换完毕后才会产生中断。而连续转换,是在每次转换后,都会产生中断。


如果设置了DMA位,在每次EOC后,DMA控制器把规则组通道的转换数据传输到SRAM中。而注入通道转换的数据总是存储在ADC_JDRx寄存器中。


模拟看门狗

ADC中断的产生方式除了规则组转换完成、注入组转换完成之外,还有模拟看门狗事件。


如果被ADC转换的模拟电压低于低阀值或高于高阀值,AWD模拟看门狗状态位被设置。阀值位于ADC_HTR和ADC_LTR寄存器的最低12个有效位中。通过设置ADC_CR1寄存器的AWDIE位以允许产生相应中断。


需要注意的是:阀值独立于由ADC_CR2寄存器上的ALIGN位选择的数据对齐模式。比较是在对齐之前完成的。也就是说,在数据保存到数据寄存器之前,就已经完成了比较(数据对齐在下文中有讲解)!


通过配置ADC_CR1寄存器,模拟看门狗可以作用于1个或多个通道:



外部触发转换

在框图的下方,显示了规则转换、注入转换可以由外部事件触发(比如定时器捕捉、EXTI线)。如果设置了EXTTRIG控制位,则外部事件就能够触发转换。EXTSEL[2:0]和JEXTSEL2:0]控制位允许应用程序选择8个可能的事件中的某一个,可以触发规则和注入组的采样。


注意: 当外部触发信号被选为ADC规则或注入转换时,只有它的上升沿可以启动转换。


自动校准

校准ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。在校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差。


通过设置ADC_CR2寄存器的CAL位启动校准。一旦校准结束,CAL位被硬件复位,可以开始正常转换。建议在上电时执行一次ADC校准。校准阶段结束后,校准码储存在ADC_DR中。



注意:建议在每次上电后执行一次校准。同时启动校准前,ADC必须处于关电状态(ADON=0)超过至少两个ADC时钟周期。


数据对齐

由于STM32的ADC是12位逐次逼近型的模拟数字转换器,而数据保存在16位寄存器中。所以,ADC_CR2寄存器中的ALIGN位选择转换后数据储存的对齐方式。数据可以左对齐或右对齐,如下图所示:



注入组通道转换的数据值已经减去了在ADC_JOFRx寄存器中定义的偏移量,因此结果可以是一个负值。SEXT位是扩展的符号值。 

对于规则组通道,不需减去偏移值,因此只有12个位有效。

通道采样时间

ADC使用若干个ADC_CLK周期对输入电压采样,采样周期数目可以通过ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位更改。每个通道可以分别用不同的时间采样。


总转换时间如下计算:


TCONV = 采样时间+ 12.5个周期


例如:当ADCCLK=14MHz,采样时间为1.5周期时,TCONV =1.5+12.5=14周期=1μs。


故而,ADC的最小采样时间1us(ADC时钟=14MHz,采样周期为1.5周期下得到)。


ADC相关配置寄存器

ADC控制寄存器1(ADC_CR1)



作用:设置扫描模式、中断允许(转换结束、注入转换结束、模拟看门狗)、双模式选择(一般选用独立模式)等。


注意:在扫描模式下,由ADC_SQRx或者ADC_JSQRx寄存器选中的通道被转换。如果设置了EOCIE或者JEOCIE,在最后一个通道转换完毕后才会产生EOC或者JEOC中断。


ADC控制寄存器2(ADC_CR2)



作用:设置数据对齐方式、连续转换位、ADC启动位、外部触发转换(一般选用软件转换SWSTART、JSWSTART)。


ADC采样时间寄存器x(ADC_SMPRx)



作用:设置ADC各通道的采样时间。


ADC注入通道数据偏移寄存器x (ADC_JOFRx)



作用:设置ADC注入通道数据偏移。


ADC看门狗高/低阀值寄存器(ADC_HTR、ADC_LRT)



作用:设置ADC模拟看门狗的高低阈值。


ADC规则序列寄存器x(ADC_SQRx)



作用:设置规则通道序列长度、对应序列中各个转换的通道编号(最多16个)。


ADC注入序列寄存器(ADC_JSQR)



作用:设置注入通道序列长度、对应序列中各个转换的通道编号(最多4个)。


ADC注入数据寄存器x(ADC_JDRx)



作用:存放ADC注入转换的数据。


ADC规则数据寄存器(ADC_DR)



作用:存放ADC规则转换的数据。


ADC状态寄存器(ADC_SR)



作用:存放ADC转换过程中的各种状态位。

关键字:STM32  ADC  寄存器 引用地址:【STM32】ADC的基本原理、寄存器

上一篇:【STM32】ADC库函数、一般步骤详解 实例:内部温度传感器
下一篇:【STM32】电源控制、低功耗模式(实例:待机模式)

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

STM32的基本知识
首先,在学习Cortex-M3时,我们必须要知道必要的缩略语。 整理如下: AMBA:先进单片机总线架构 ADK:AMBA设计套件 AHB:先进高性能总线 AHB-AP:AHB访问端口 APB:先进外设总线 ARM ARM:ARM架构参考手册 ASIC:行业领域专用集成电路 ATB :先进跟踪总线 BE8:字节不变式大端模式 CPI:每条指令的周期数 DAP:调试访问端口 DSP:数字信号处理(器) DWT:数据观察点及跟踪 ETM:嵌入式跟踪宏单元 FPB:闪存地址重载及断点 FSR:fault状态寄存器 HTM:Core Sight AHB跟踪宏单元 ICE:在线仿真器 IDE:集成开发环境 IRQ:中断请求(通常是外中断
[单片机]
<font color='red'>STM32</font>的基本知识
STM32ADC模块速度配置问题
简介:本文介绍了STM32单片机时钟配置问题以及精度和速度之间的关系 STM32F103xx系列称为增强型产品,增强型产品的最高时钟频率可以达到72MHz。增强型产品的英文名称为Performance Line。 STM32F101xx系列称为基本型产品,基本型产品的最高时钟频率可以达到36MHz。基本型产品的英文名称为Access Line。 根据设计,当ADC模块的频率为14MHz时,可以达到ADC的最快采样转换速度。 要得到14MHz的ADC频率,就要求SYSCLK的频率是14MHz的倍数,即14MHz、28MHz、42MHz、56MHz、70MHz、84MHz等;对于基本型产品14MHz和28MHz处于它的
[单片机]
STM32 HAL I2C库读指定寄存器的数据
Support for repeated start in STM32 HAL I2C library Q: I am working with a slave I2C device (Kionix KX022 acccelerometer) which uses a repeated start mechanism to send data requested by the master (STM32F405), e.g. to read two bytes of data (from register N and register N+1) the following sequence Master Slav
[单片机]
<font color='red'>STM32</font> HAL I2C库读指定<font color='red'>寄存器</font>的数据
STM32的时钟树与配置方法
时钟信号推动单片机内各个部分执行相应的指令,时钟就像人的心跳一样。 STM32本身十分复杂,外设非常多,任何外设都需要时钟才能启动,但并不是所有的外设都需要系统时钟那么高的频率,如果都用高速时钟势必造成浪费。同一个电路,时钟越快功耗越大、抗电磁干扰能力越弱。复杂的MCU采用多时钟源的方法来解决这些问题。如下图,是STM32的时钟系统框图。 如上图左边的部分,看到STM32有4个独立时钟源,HSI、HSE、LSI、LSE。 HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。 HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 LSI是低速内部时钟,RC振荡器,频率为40k
[单片机]
<font color='red'>STM32</font>的时钟树与配置方法
stm32控制mpu9250九轴传感器
1.hardware mpu mpu9250 同时新增加一个DMP文件夹 2.hallib 无 3.设置 记得要define,同时屏蔽部分代码,不然报错。同时上位机的波特率要设置好,同时关掉数据校验。 4.main #include mpu.h #include mpu9250.h #include inv_mpu.h #include inv_mpu_dmp_motion_driver.h u8 t1=0,report=1; //默认开启上报 u8 key1; float pitch,roll,yaw; //欧拉角 short aacx,aacy,aacz; //加速度传感
[单片机]
<font color='red'>stm32</font>控制mpu9250九轴传感器
STM32 FreeModbus RTU从机移植以及UART配置
FreeModbus的具体介绍就不提了。至于为什么要移植,大概就是因为移植比较快,而且比较稳定,可以减少因为自己编写出现的漏洞。 但是FreeModbus 1.5版本是没有主机的,因此移植的时候只可以做从机。网上有几个关于Modbus主机的源代码,回头等我弄好了再更新。 ================================== 理论上来说,此处我移植了全部,但是只调试了RTU部分,因此其他部分不做赘述。 移植过程: 1.将modbus目录下所有文件拷贝加入工程。 2.对modbus中的include下的mbconfig.h进行编辑,裁剪其中需要的模块。(此处我没有进行裁剪,因此选项都是默认) 3.将
[单片机]
<font color='red'>STM32</font> FreeModbus RTU从机移植以及UART配置
stm32控制DS1302
在ds1302.h文件中: #ifndef _STM32F103_DS1302_H_ #define _STM32F103_DS1302_H_ //*****************DS1302控制命令******************* #define RdSec 0x81 #define RdMin 0x83 #define RdHour 0x85 #define RdDate 0x87 #define RdMonth 0x89 #define RdWeek 0x8b #define RdYear 0x8d #define RdControl 0x8f #define RdTrickleCharge 0x91 #d
[单片机]
一文全面掌握stm32的GPIO知识
1 初学者重要提示 本文主要是以stm32H7系列为主。 对于不使用的引脚,推荐设置为模拟模式,悬空即可。 GPIO的速度等级高的时候,最好使能IO补偿单元。 2 GPIO功能简介 STM32H7的GPIO特性如下: 输出状态:开漏/推挽 + 上拉/下拉电阻。 通过输出数据寄存器(GPIOx_ODR)或者外设(GPIO设置为复用模式时)输出数据。 GPIO速度等级设置。 输入状态:浮空,上拉/下拉,模拟。 通过输入数据寄存器(GPIOx_IDR)或者外设(GPIO设置为复用模式)输入数据。 通过寄存器GPIOx_BSRR实现对寄存器GPIOx_ODR的位操作。 通过配置寄存器GPIOx_LCKR的锁机制,实现冻结IO口配置。
[单片机]
一文全面掌握<font color='red'>stm32</font>的GPIO知识
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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