STM32F10X ADC原理详解(STM32F103ZET6)

2020-07-25来源: 51hei关键字:STM32F10X  ADC原理  STM32F103ZET6

STM32ADC的工作原理

模/数转换器


STM32F10x  ADC特点

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

最多带3个ADC控制器

最多支持18个通道,可最多测量16个外部和2个内部信号源。

支持单次和连续转换模式

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

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

自动校准

采样间隔可以按通道编程

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

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

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

ADC供电要求:2.4V-3.6V

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


ADC引脚

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

由下图可见ADC1的通道0~通道17都有功能,而ADC2的通道16和通道17没有作用,ADC3的通道9、通道14~通道17也没有作用。

2.png

STM32通道组

①规则通道组:相当正常运行的程序。最多16个通道。

     规则通道和它的转换顺序在ADC_SQRx寄存器中选择,规则

     组转换的总数应写入ADC_SQR1寄存器的L[3:0]中

② 注入通道组:相当于中断。最多4个通道。

     注入组和它的转换顺序在ADC_JSQR寄存器中选择。注入组

     里转化的总数应写入ADC_JSQR寄存器的L[1:0]中

STM32F1的ADC的各通道可以单次模式执行,连续模式执行,扫描或者间断模式执行。

0.png

       规则通道组                           

含有注入通道的规则通道组


☞单次转化

单次转换模式下,ADC只执行一次转换。该模式既可通过设置ADC_CR2寄存器的ADON位(只

适用于规则通道)启动也可通过外部触发启动(适用于规则通道或注入通道),这时CONT位为0。

一旦选择通道的转换完成:

● 如果一个规则通道被转换:

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

─  EOC(转换结束)标志被设置

─  如果设置了EOCIE,则产生中断。

● 如果一个注入通道被转换:

─  转换数据被储存在16位的ADC_DRJ1寄存器中

─  JEOC(注入转换结束)标志被设置

─  如果设置了JEOCIE位,则产生中断。

☞连续转换模式

在连续转换模式中,当前面ADC转换一结束马上就启动另一次转换。(连续转换会自动开启下一次转换)此模式可通过外部触发启

动或通过设置ADC_CR2寄存器上的ADON位启动,此时CONT位是1。

每个转换后:

● 如果一个规则通道被转换:

─  转换数据被储存在16位的ADC_DR寄存器中

─  EOC(转换结束)标志被设置

─  如果设置了EOCIE,则产生中断。

● 如果一个注入通道被转换:

─  转换数据被储存在16位的ADC_DRJ1寄存器中

─  JEOC(注入转换结束)标志被设置

─  如果设置了JEOCIE位,则产生中断。


☞扫描模式

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


ADC中断

规则和注入组转换结束时能产生中断,当模拟看门狗状态位被设置时也能产生中断。它们都有

独立的中断使能位。

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

ADC_SR寄存器中有2个其他标志,但是它们没有相关联的中断:

● JSTRT(注入组通道转换的启动)

● STRT(规则组通道转换的启动)

ADC 时钟

由时钟控制器提供的ADCCLK时钟和PCLK2(APB2时钟)同步。RCC控制器为ADC时钟提供一个

专用的可编程预分频器.注:不要让ADC时钟超过14MHz,否则可能不准。


可编程的通道采样时间

ADC使用若干个ADC_CLK周期对输入电压采样,采样周期数目可以通过ADC_SMPR1和

ADC_SMPR2寄存器中的SMP[2:0]位更改。每个通道可以分别用不同的时间采样。

总转换时间如下计算:

T(CONV) = 采样时间+ 12.5个周期

例如:

当ADCCLK=14MHz,采样时间为1.5周期

T(CONV) = 1.5 + 12.5 = 14周期 = 1μs


ADC_SMPR1寄存器和ADC_SMPR2寄存器用来设置通道0~17这18个通道

ADC采样时间——可编程的采样时间

ADC_SQR1/SQR2/SQR3规则序列寄存器

ADC_JSQR注入系列寄存器

ADC_SR状态寄存器


常用库函数

void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);ADC的初始化函数

void ADC_DeInit(ADC_TypeDef* ADCx);

void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);ADC使能函数

void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);中断配置函数

void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);软件启动转换函数

void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);配置规则通道

uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);ADC获取转换结果函数


校准函数:

void ADC_ResetCalibration(ADC_TypeDef* ADCx);

FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);

void ADC_StartCalibration(ADC_TypeDef* ADCx);

FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);

例如:

ADC_ResetCalibration(ADC1);    //使能复位校准  

while(ADC_GetResetCalibrationStatus(ADC1));    //等待复位校准结束

ADC_StartCalibration(ADC1);     //开启AD校准

while(ADC_GetCalibrationStatus(ADC1));     //等待校准结束


typedef struct

{   

uint32_t ADC_Mode;//ADC模式:配置ADC_CR1寄存器的位[19:16]  :DUALMODE[3:0]位   

FunctionalState ADC_ScanConvMode; //是否使用扫描模式。ADC_CR1位8:SCAN位   

FunctionalState ADC_ContinuousConvMode; //单次转换OR连续转换:ADC_CR2的位1:CONT   uint32_t ADC_ExternalTrigConv;  //触发方式:ADC_CR2的位[19:17] :EXTSEL[2:0]                   

uint32_t ADC_DataAlign;   //对齐方式:左对齐还是右对齐:ADC_CR2的位11:ALIGN           

uint8_t ADC_NbrOfChannel;//规则通道序列长度:ADC_SQR1的位[23:20]: L[3:0]        

}ADC_InitTypeDef;

例:

void ADC_Init(ADC_TypeDef*ADCx,ADC_InitTypeDef*ADC_InitStruct)

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式

ADC_InitStructure.ADC_ScanConvMode = DISABLE; //不开启扫描

ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //单次转换模式

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //触发软件

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐

ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目


ADC使能函数ADC_Cmd()

例如:ADC_Cmd(ADC1,ENABLE);//使能指定的ADC1

ADC使能软件转换函数ADC void ADC_SoftwareStartConvCmd();

例如:ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能ADC1的软件转换启动

ADC规则通道配置函数voidADC_RegularChannelConfig()

例如:ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);//在ADC1的通道1,规则序列中的第1个转换,采样时间。ADC_RegularChannelConfig(用哪个ADC,哪个通道, 通道在规则序列中的序号, 采样时间);

ADC获取转换结果函数ADC_GetConversionValue();如ADC_GetConversionValue(ADC1);//获取ADC1转换结果


实验一:ADC1的通道1(PA1)进行单次转换

目的:使用库函数的函数来设定使用ADC1的通道1进行A/D转换。

ADC的配置过程如下:

①开启PA口时钟和ADC1时钟,设置PA1为模拟输入。     

GPIO_Init();            

APB2PeriphClockCmd();

② 复位ADC1,同时设置ADC1分频因子。      

RCC_ADCCLKConfig(RCC_PCLK2_Div6);      

ADC_DeInit(ADC1);

③ 初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息。     

void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);

④ 使能ADC并校准。         

ADC_Cmd(ADC1, ENABLE); //ADC使能函数

校准使用校准函数

⑤ 配置规则通道参数:      

ADC_RegularChannelConfig();

ADC1的通道1的配置方法:ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5)

⑥开启软件转换:

ADC_SoftwareStartConvCmd(ADC1);

⑦等待转换完成,读取ADC值。   

ADC_GetConversionValue(ADC1);//获取ADC1的转换结果

将上面七个步骤的功能代码写在两个函数中即可实现功能,分别是函数void Adc_Init(void);和函数u16  Get_Adc(u8 ch);

将上面步骤一到步骤四的程序功能代码写在void Adc_Init(void);函数中。

获取转换结果即将实现步骤五到步骤七的功能代码写在u16  Get_Adc(u8 ch);函数中

多次调用u16  Get_Adc(u8 ch)函数读取ADC1的转换结果,再求平均值,将功能代码写在u16 Get_Adc_Average(u8 ch,u8 times)函数中


STM32实现对12V电压的检测

我们现在需要用STM32对12V电压进行检测,判断其是否正确上电。我打算利用STM32的ADC功能,但12V超过了STM32能承受的范围,我们可以用电阻简单分压成3.3V,然后用STM32的ADC引脚直接采样,判断。

[1] [2]
关键字:STM32F10X  ADC原理  STM32F103ZET6 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic504420.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32控制步进电机程序
下一篇:STM32Cube生态系统增添新功能,让用户更轻松筛选软件

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32F10x 学习笔记之USART实现串口通讯 DMA 方式
STM32F10x 的USART 支持DMA 方式,并且在DMA完成后可以产生中断。这对于需要接收或发送大量数据的应用情景是很有帮助的。在普通的8位或16位单片机中很少有包含DMA控制器的,所以可能许多嵌入式程序员对DMA方式并不熟悉。简单的说,直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。由于无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。STM32F10x 上具有两个DMA控制器,共有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器
发表于 2020-07-04
<font color='red'>STM32F10x</font> 学习笔记之USART实现串口通讯 DMA 方式
STM32启动文件初探之startup_stm32f10x_hd.s(Reset_Handler函数)
用别处的地址进行链接,如果其它地方没有定义,编译器也不报错,以此处地址进行链接。第四行和第五行IMPORT 说明SystemInit 和__main 这两个标号在其他文件,在链接的时候需要到其他文件去寻找。SystemInit在库文件system_stm32f10x.c 实现,用来初始化STM32的一系列时钟,把系统时钟设置为72MHZ。STM32的时钟比51 单片机复杂,需要经过一系列的配置才能达到稳定运行的状态。__main 其实不是我们定义的,当编译器编译时,只要遇到这个标号就会定义这个函数,该函数的主要功能是:负责初始化栈、堆,配置系统境,并在最后跳转到用户自定义的main函数,从此来到C的世界。第六行把SystemInit
发表于 2020-03-24
STM32F10x 利用环形缓冲区的串口驱动程序
;**/    #include "stm32f10x_usart.h"  #include "com_buffered.h"    #define OS_ENTER_CRITICAL()     __set_PRIMASK(1)  #define OS_EXIT_CRITICAL()      __set_PRIMASK(0)           
发表于 2020-01-19
<font color='red'>STM32F10x</font> 利用环形缓冲区的串口驱动程序
STM32F10x_硬件I2C读写EEPROM(标准外设库版本)
Ⅰ、写在前面上一篇文章是“STM32F10x_模拟I2C读写EEPROM”,讲述使用IO口模拟I2C总线通信,对EEPROM(AT24Xxx)进行读写操作的过程。上一篇文章主要内容:I2C协议、模拟I2C底层驱动、EEPROM(AT24Xxx)单字节读写操作。本文主要内容:STM32硬件I2C详细配置、EEPROM(AT24Xxx)多字节读写操作、ST官方I2C存在问题。实例实验效果:1、多字节读写:任意地址(66), 写入任意长度(129)、读取并打印出来2、单字节读写:任意地址(0),写入1字节数据、 读取并打印出来实验说明:1.多字节读写实验为什么是从66地址写? 为什么是写入129字节?答案:验证对EEPROM多字
发表于 2020-01-09
<font color='red'>STM32F10x</font>_硬件I2C读写EEPROM(标准外设库版本)
keil5中加入STM32F10X_HD,USE_STDPERIPH_DRIVER的原因
  初学STM32,在RealView MDK 环境中使用STM32固件库建立工程时,初学者可能会遇到编译不通过的问题。出现如下警告或错误提示:  warning: #223-D: function "assert_param" declared implicitly;assert_param(IS_GPIO_ALL_PERIPH(GPIOx));  这时候我们需要在“Target Options”中的“C/C++”选项卡中如图-2所示红框中添加USE_STDPERIPH_DRIVER、STM32F10X_HD。这样才能使编顺利通过。图-2  知其然了,我们还得知其所以然。下面就听Herison给大家一一道来
发表于 2020-01-02
keil5中加入<font color='red'>STM32F10X</font>_HD,USE_STDPERIPH_DRIVER的原因
技术文章—交织型采样ADC基本原理解析
交织。 图1.两个交织型100 MSPS ADC—基本原理图。 此概念还可以另一种方式表达,如图2所示。通过将这两个100 MSPS ADC以交织方式组合,采样速率便能增加至200 MSPS。这样每个奈奎斯特区可以从50 MHz扩展到100 MHz,使工作时的可用带宽翻倍。增加的工作带宽可为多个市场领域的应用带来诸多优势。无线电系统可以增加其支持的频段数;雷达系统可以增加空间分辨率;而测量设备可以实现更高的模拟输入带宽。图2.两个交织型100 MSPS ADC—时钟和样本。 交织的优势 交织结构的优势可惠及多个细分市场。交织型ADC最大好处是增加了带宽,因为ADC的奈奎斯特带宽更宽了。同样
发表于 2020-06-09
技术文章—交织型采样<font color='red'>ADC</font>基本<font color='red'>原理</font>解析
小广播
何立民专栏 单片机及嵌入式宝典

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

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