STM32笔记ADC篇

合集下载

STM32F4xx ADC使用心得

STM32F4xx ADC使用心得
/* Private variables ---------------------------------------------------------*/
/* You can monitor the converted value by adding the variable "ADC3ConvertedValue"
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
DMA_InitStructure.DMA_Channel = DMA_Channel_2;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC3_DR_ADDRESS;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC3ConvertedValue;
STM32F4xx ADC使用心得
使用心得
STM32F4与STM32F1在ADC方面的区别
通常
在STM32F1中需要加自动校准的程序
如下
// 使能ADC1自动校准功能
ADC_ResetCalibration(ADC1);
//检查ADC1自校准的状态位
To reconfigure the default setting of SystemInit() function, refer to

STM32之ADC(内部基准电压,参考电压)

STM32之ADC(内部基准电压,参考电压)

STM32之ADC(内部基准电压,参考电压)
转 STM32内部参照电压VREFIN的使⽤ https:///uncle_guo/article/details/50625660
每个STM32芯⽚都有⼀个内部的参照电压,相当于⼀个标准电压测量点,在芯⽚内部连接到ADC1的通道17。

根据数据⼿册中的数据,这个参照电压的典型值是1.20V,最⼩值是1.16V,最⼤值是1.24V。

这个电压基本不随外部供电电压的变化⽽变化。

不少⼈把这个参照电压与ADC的参考电压混淆。

ADC的参考电压都是通过Vref+提供的。

100脚以上的型号,Vref+引到了⽚外,引脚名称为Vref+;64脚和⼩于64脚的型号,Vref+在芯⽚内部与VCC信号线相连,没有引到⽚外,这样AD的参考电压就是VCC上的电压。

在ADC的外部参考电压波动,或因为Vref+在芯⽚内部与VCC相连⽽VCC变化的情况下,如果对于ADC测量的准确性要求不⾼时,可以使⽤这个内部参照电压得到ADC测量的电压值。

具体⽅法是在测量某个通道的电压值之前,先读出参照电压的ADC测量数值,记为ADrefint;再读出要测量通道的ADC转换数值,记为ADchx;则要测量的电压为:
Vchx = Vrefint * (ADchx/ADrefint)
其中Vrefint为参照电压=1.20V(STM32F107)。

如何⽤VDDA作为ADC参考电压,当测量信号电压超过这个范围可以⽤精密电阻分压或者放⼤器分压,或者选择合适的外部电压基准芯⽚。

stm32 adc例程

stm32 adc例程

STM32 ADC例程简介STM32是一款由STMicroelectronics公司推出的高性能32位ARM Cortex-M微控制器。

其中的模拟数字转换器(ADC)模块是其重要功能之一。

本文将介绍STM32 ADC例程的相关知识和实例代码。

什么是ADC?ADC,全称为Analog-to-Digital Converter,即模拟数字转换器。

它的作用是将连续变化的模拟信号转换为离散的数字信号,以便于数字处理。

在嵌入式系统中,ADC常用于采集外部传感器的模拟信号,并将其转换为数字形式供处理器使用。

例如,可以通过ADC采集温度传感器输出的电压值,并根据这些数据来控制系统中的其他设备。

STM32 ADC模块概述STM32系列微控制器内置了多个ADC模块,每个模块都具有多个通道。

这些通道可以用于采集不同外部信号。

STM32 ADC模块具有以下主要特点:1.多通道:每个ADC模块可用于同时采集多个不同通道的信号。

2.分辨率:支持不同分辨率配置,如12位、10位等。

3.采样速率:可配置不同采样速率以适应不同应用需求。

4.触发方式:支持多种触发方式,如软件触发、外部触发等。

5.中断功能:可通过配置中断来实现采样完成时的事件响应。

STM32 ADC例程下面是一个简单的STM32 ADC例程,用于采集一个通道的模拟信号,并将其转换为数字值输出到串口。

硬件准备在开始之前,需要准备以下硬件:1.STM32开发板(例如STM32F4 Discovery)2.电源适配器3.电压信号源(例如可调电压稳压器)软件准备在开始之前,需要准备以下软件:1.STM32CubeIDE(或其他支持STM32开发的集成开发环境)2.相应的STM32 HAL库步骤一:创建工程首先,在STM32CubeIDE中创建一个新工程。

选择适合你的开发板型号和芯片系列,并配置项目设置。

步骤二:配置ADC模块在工程中打开main.c文件,并找到MX_ADC1_Init()函数。

STM32的ADC设置步骤

STM32的ADC设置步骤

STM32的ADC设置步骤STM32的ADC(Analog-to-Digital Converter)是一种用于将模拟信号转换为数字信号的外设。

在使用STM32的ADC之前,需要进行一系列的设置和配置。

以下是STM32的ADC设置步骤的详细说明:1.硬件连接:首先,将模拟信号连接到STM32的ADC引脚。

具体连接方式取决于所使用的STM32系列和芯片型号,可以参考芯片的数据手册。

2.时钟设置:ADC外设的时钟源需要配置和使能。

首先,选择一个适合的时钟源,通常使用主时钟源或外部时钟源。

然后,配置ADC时钟分频器,以确保时钟频率适合ADC的要求。

最后,使能ADC时钟。

3.ADC基本设置:完成时钟设置后,可以开始进行ADC的基本配置,包括设置ADC模式、采样时间、分辨率等。

-ADC模式:选择一种适合应用场景的ADC模式,常见的有单次转换模式和连续转换模式,前者适用于一次性转换,后者适用于连续转换。

-采样时间:根据输入信号的特性和采样速率,选择合适的采样时间。

采样时间越长,精度越高,但转换速度会降低。

-分辨率:设定ADC的分辨率,一般有8位、10位、12位等选项。

分辨率越高,转换精度越高,但转换时间会增加。

4.通道选择:在开始进行转换之前,需要选择要转换的ADC通道。

STM32的不同型号有不同的ADC通道数量和配置,可以通过相关寄存器设置选择。

参考芯片的数据手册,确定要使用的ADC通道。

5.触发源设置:可以通过外部触发源或软件触发来启动ADC转换。

外部触发源通常为其他硬件中断或定时器,配置相关的寄存器使能外部或软件触发转换。

6.DMA设置:如果需要使用DMA(Direct Memory Access)来传输ADC转换结果,需要进行DMA的相关设置。

首先,使能DMA。

然后配置DMA通道和传输方向。

最后,启动DMA传输。

7.中断设置:8.校准:在进行转换之前,需要进行ADC的校准。

校准过程会自动由硬件完成,可以通过设定寄存器使能自动校准。

STM32多通道ADC采集详解(DMA模式和非DMA模式)

STM32多通道ADC采集详解(DMA模式和非DMA模式)

STM32多通道ADC采集详解(DMA模式和非DMA模式)在非DMA模式下,ADC采集的数据是通过CPU直接读取的,采集效率相对较低,但是编程相对简单。

首先,需要初始化ADC模块的工作模式(单通道、多通道等)和采样时间。

然后,使能ADC模块,并配置所需的通道和采样时间。

接着,设置采样序列,指定要采集的通道和相应的排列顺序。

在采集数据时,首先需要设置ADC转换模式和采样时间,然后开始转换,并等待转换完成。

转换完成后,通过读取ADC_DR寄存器可以获取转换结果。

如果需要采集多个通道的数据,可以通过设置ADCSQR中的SQx位来启动下一次转换。

在DMA模式下,ADC采集的数据是通过DMA控制器传输到指定的内存区域,采集效率较高,适合数据量较大的应用场景。

与非DMA模式相比,DMA模式下的配置需要额外设置DMA控制器的工作模式(单次传输、循环传输等)和传输数据的目的地地址。

在采集数据前,需要设置DMA传输的目的地地址,并使能DMA传输。

在开启ADC转换后,DMA控制器会根据设置的目的地地址来自动传输数据,无需CPU干预。

采集完成后,CPU可以通过检查DMA传输完成标志位来判断数据是否已传输完毕。

总结:
使用非DMA模式的ADC采集相对简单而容易上手,适用于数据量较小且对实时性要求不高的应用场景。

DMA模式下的ADC采集效率更高,适用于数据量较大且对实时性要求较高的应用场景。

无论是DMA模式还是非DMA模式,都需要根据具体的应用需求来选择合适的模式。

在使用DMA模式时,还需要注意合理设置DMA传输的目的地地址和传输模式,以充分发挥DMA的优势。

STM32F4xxADC使用心得

STM32F4xxADC使用心得

STM32F4xx ADC使用心得STM32F4xx ADC使用心得使用心得STM32F4与STM32F1在ADC方面的区别通常在STM32F1中需要加自动校准的程序如下// 使能ADC1自动校准功能ADC_ResetCalibration(ADC1);//检查ADC1自校准的状态位while(ADC_GetResetCalibrationStatus(ADC1));//启动ADC1自校准 ADC_StartCalibration(ADC1);//检查ADC1自校准是否结束while(ADC_GetCalibrationStatus(ADC1));// ADC自动校准结束---------------然而STM32F4中无需此程序给出STM32F407的ADC3和DMA方式的官方程序如下/************************************************************* ******************** @file ADC3_DMA/main.c* @author MCD Application Team* @version V1.0.0* @date 19-September-2011* @brief Main program body*********************************************************** ******************** @attention** THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.** <h2><center>&copy; COPYRIGHT 2011STMicroelectronics</center></h2>*********************************************************** ********************//* Includes------------------------------------------------------------------*/#include "stm32f4_discovery.h" #include <stdio.h>/** @addtogroup STM32F4_Discovery_Peripheral_Examples* @{*//** @addtogroup ADC_ADC3_DMA* @{*//* Private typedef-----------------------------------------------------------*//* Private define------------------------------------------------------------*/#define ADC3_DR_ADDRESS((uint32_t)0x4001224C)//ADC转换后存储内存地//址 具体在datasheet中查阅/* Private macro-------------------------------------------------------------*//* Private variables---------------------------------------------------------*/ /* You can monitor the converted value by adding the variable "ADC3ConvertedValue"to the debugger watch window */__IO uint16_t ADC3ConvertedValue= 0 ;//转换的结果 由于此例程是12的//ADC 转换结果在0 0X0FFF之间 __IO uint32_tADC3ConvertedVoltage = 0;/* Private function prototypes-----------------------------------------------*//* Private functions---------------------------------------------------------*/ void ADC3_CH12_DMA_Config(void);/*** @brief Main program* @param None* @retval None*/int main(void) {/*!< At this stage the microcontroller clock setting isalready configured,this is done through SystemInit() function which iscalled from startupfile (startup_stm32f4xx.s) before to branch toapplication main.To reconfigure the default setting of SystemInit()function, refer tosystem_stm32f4xx.c file*//* ADC3 configuration*******************************************************//* - Enable peripheral clocks *//* - DMA2_Stream0 channel2 configuration *//* - Configure ADC Channel12 pin as analog input *//* - Configure ADC3 Channel12 */ADC3_CH12_DMA_Config();/* Start ADC3 Software Conversion */ADC_SoftwareStartConv(ADC3);ADC3_CH12_DMA_Config();/* Start ADC3 Software Conversion */ADC_SoftwareStartConv(ADC3);//软件启动转换因此ADC初始化时设置成//ADC_ExternalTrigConvEdge_None;while (1){/* convert the ADC value (from 0 to 0xFFF) to a voltage value (from 0V to 3.3V)*/ADC3ConvertedVoltage = ADC3ConvertedValue *3300/0xFFF; }}/*** @brief ADC3 channel12 with DMA configuration* @param None* @retval None*/void ADC3_CH12_DMA_Config(void){ADC_InitTypeDefADC_InitStructure;ADC_CommonInitTypeDef ADC_CommonInitStructure;DMA_InitTypeDefDMA_InitStructure;GPIO_InitTypeDefGPIO_InitStructure;/* Enable ADC3, DMA2 and GPIO clocks****************************************/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 |RCC_AHB1Periph_GPIOC, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);/* DMA2 Stream0 channel0 configuration**************************************/DMA_InitStructure.DMA_Channel = DMA_Channel_2;DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t)ADC3_DR_ADDRESS;DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)&ADC3ConvertedValue;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; //设置DMA方向为外设//到内存DMA_InitStructure.DMA_BufferSize = 1;//多通道采样时 需要修改DMA_InitStructure.DMA_PeripheralInc =DMA_PeripheralInc_Disable;//外设地址不动DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; //物理地址不动DMA_InitStructure.DMA_PeripheralDataSize =DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_MemoryDataSize =DMA_MemoryDataSize_HalfWord; //半字方//式DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold =DMA_FIFOThreshold_HalfFull;DMA_InitStructure.DMA_MemoryBurst =DMA_MemoryBurst_Single;DMA_InitStructure.DMA_PeripheralBurst =DMA_PeripheralBurst_Single;DMA_Init(DMA2_Stream0, &DMA_InitStructure);DMA_Cmd(DMA2_Stream0, ENABLE);/* Configure ADC3 Channel12 pin as analog input******************************/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;GPIO_Init(GPIOC, &GPIO_InitStructure);/* ADC Common Init**********************************************************/ ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式ADC_CommonInitStructure.ADC_Prescaler =ADC_Prescaler_Div2;//2分频最后使//ADC的时钟频率低于14MADC_CommonInitStructure.ADC_DMAAccessMode =ADC_DMAAccessMode_Disabled;ADC_CommonInitStructure.ADC_TwoSamplingDelay =ADC_TwoSamplingDelay_5Cycles;ADC_CommonInit(&ADC_CommonInitStructure);/* ADC3 Init*********************************************************** *****/ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //12位转换方式ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//连续模式 ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfConversion = 1;//多通道转换时应修改此处ADC_Init(ADC3, &ADC_InitStructure);/* ADC3 regular channel12 configuration*************************************/ADC_RegularChannelConfig(ADC3, ADC_Channel_12, 1,ADC_SampleTime_3Cycles);//设置ADC常规通道序列/* Enable DMA request after last transfer (Single-ADC mode) */ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);//ADC转换完成后立即启//动DMA功能/* Enable ADC3 DMA */ADC_DMACmd(ADC3, ENABLE);/* Enable ADC3 */ADC_Cmd(ADC3, ENABLE); }#ifdefUSE_FULL_ASSERT/** * @brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval None*/ void assert_failed(uint8_t* file, uint32_t line) {/* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s online %d\r\n", file, line) *//* Infinite loop */while (1){}}#endif/*** @}*//*** @}*//******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/。

48脚STM32内部基准电压校准ADC的一些心得记录

48脚STM32内部基准电压校准ADC的一些心得记录

48脚STM32内部基准电压校准ADC的一些心得记录在进行STM32内部基准电压校准ADC的过程中,我积累了一些心得和经验。

在此记录下来,分享给大家。

首先,基准电压是ADC精度的关键,因此校准过程十分重要。

基准电压在STM32系列芯片中默认为3V,但实际上可能存在差异。

因此,我们需要通过校准过程来提高ADC的测量精度。

校准前,我们需要做一些准备工作。

首先,确定使用的电压参考源,常用的有外部参考电压和内部基准电压两种。

相比于外部参考电压,内部基准电压的供电更加稳定和可靠。

接下来,我们需要配置ADC的工作模式和精度。

根据实际应用情况,选择合适的采样速率和转换模式。

在校准过程中,一般选择单次转换模式。

校准的关键在于获取两组参考电压值:理论值和测量值。

理论值是指校准前,我们已知的基准电压值。

测量值是指通过ADC测量得到的实际电压值。

首先,我们需要获取理论值。

根据STM32芯片的技术手册,可以查找到基准电压的精确数值。

然后,我们需要通过参考电压源提供一个已知电压,并将其连接到芯片的ADC通道上。

接下来,我们需要获取测量值。

通过ADC测量参考电压源的输出电压,并将结果保存在寄存器中。

在单次转换模式下,可以直接通过读取ADC_DR寄存器来获取测量值。

获取了理论值和测量值后,我们就可以计算出校准系数。

校准系数是理论值与测量值之间的比例关系。

通过将测量值除以理论值,即可得到校准系数。

然后,我们可以在程序中使用这个校准系数来校准ADC转换结果。

通过上述步骤,我们可以提高ADC的精度和准确性。

但需要注意的是,校准系数是基于当前环境和条件下得到的。

如果环境和条件发生变化,可能会导致校准系数失效。

因此,我们需要定期进行校准,以保证ADC的准确性。

总结一下,进行STM32内部基准电压校准ADC需要做以下几个步骤:确定使用的电压参考源、配置ADC的工作模式和精度、获取理论值和测量值、计算校准系数和使用校准系数来校准ADC转换结果。

STM32F103的ADC总结

STM32F103的ADC总结

STM32的ADC采样难点:如何确定采样周期?如何配置相关寄存器?转换时间里的12.5是怎么来的?一、基本概念:ADC转换就是输入模拟的信号量,单片机转换成数字量。

读取数字量必须等转换完成后,完成一个通道的读取叫做采样周期。

采样周期一般来说=转换时间+读取时间。

而转换时间=采样时间+12.5个时钟周期。

采样时间是你通过寄存器告诉stm32采样模拟量的时间,设置越长越精确。

STM32的ADC模块各个通道对应的IO(注意:STM32F103系列最少都拥有2个ADC,STM32F103ZET6包含有3个ADC,STM32F103ZET6内部集成了12位的逐次逼近型模拟数字转换器,它有多大18个通道,可测量16个外部和2个内部信号源。

)二、规则组和注入组STM32的ADC通道分为规则组和注入组。

因为ADC转换模块只有一个ADC功能核心,它能够支持这么多通道的数据转换,用的是分时复用的方法。

分组的目的是为了赋予特定的ADC通道优先权。

比如,ADCx_IN2被分配到规则组,ADCx_IN3被分配到注入组,在IN2通道进行数据转换的过程中,外部信号触发了IN3通道的转换,则ADC功能核心将暂停IN2的转换,转去执行IN3的转换,完成转换后在回来执行IN2的转换。

由此可知,注入组的通道具有优先转换权,可以打断规则组通道正在进行的转换。

三、STM32 ADC 采样频率的确定①、可编程的通道采样时间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转换时间里的12.5是怎么来的?原子哥告诉我,ST固定死了的,咱们不用关心。

stm32之ADC--光敏电阻

stm32之ADC--光敏电阻

stm32之ADC--光敏电阻外部通道ADCx_IN0--ADCx_IN15--通道选择取决于硬件选择是哪个通道,然后根据框架图,经过GPIO⼝--模拟输⼊ADC是12位,存储在16位数据寄存器⾥#include "main.h"/**************************函数名称:LDR_Init()函数功能:光敏电阻初始化函数参数:⽆函数返回值:⽆备注:PA3--模拟输⼊ADC1-IN3--通道3****************************/void LDR_Init(void){#if reg_progream ---寄存器//1.使能时钟PA3 ADC1--ADCCLK时钟RCC->APB2ENR|=(1<<2)|(1<<9);//2.配置ADC1时钟,设置分频因⼦72M 分频后不能超过14M--6分频RCC->CFGR |=(2<<14);//3.PA3 --模拟输⼊GPIOA->CRL &=~(0xf<<(3*4));//4.配置ADC1:1.规则通道转换总数 2.转换顺序 3.采样时间ADC1->SQR1 &=~(0xf<<20);//只有⼀个光敏电阻--⼀个通道,转换⼀个ADC1->SQR3 |=(3<<0);//IN3通道3放在规则组中第⼀个转换ADC1->SMPR2 |=(0x7<<(3*3));//通道3采样时间--239.5周期//5.独⽴模式:000、禁⽤间断模式,不扫描模式ADC1->CR1 =0;//ADC1->CR1 |=(1<<8);//扫描模式ADC1->CR2 &=~(1<<1);//单次转换ADC1->CR2 &=~(1<<11);//右对齐--11位为0ADC1->CR2 |=(1<<20);//使⽤外部事件启动转换ADC1->CR2 |=(0x7<<17);//软件触发--SWSTARTADC1->CR2 |=(1<<23);//启⽤温度传感器//开启A/D转换ADC1->CR2 |=(1<<0);//复位校准ADC1->CR2 |=(1<<3);//等待校准寄存器被初始化while(ADC1->CR2 &(1<<3));//初始化校准完成,⾃动为0,退出whiile//A/D校准ADC1->CR2 |=(1<<2);//等待校准完成while(ADC1->CR2&(1<<2));#else --库函数ADC_InitTypeDef ADC_InitStruct;GPIO_InitTypeDef GPIO_InitStruct;//1.使能时钟PA3 ADC1--ADCCLK时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);//2.配置ADC1时钟,设置分频因⼦72M 分频后不能超过14M--6分频RCC_ADCCLKConfig(RCC_PCLK2_Div6); //ADC1两个时钟配置:1.RCC_ADCCLKConfig()2.RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//RCC_ADCCLKConfig(RCC_CFGR_ADCPRE_DIV6);//3.PA3 --模拟输⼊GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3 ;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AIN;//4.配置ADC1:1.规则通道转换总数 2.转换顺序 3.采样时间//只有⼀个光敏电阻--⼀个通道,转换⼀个//IN3通道3放在规则组中第⼀个转换//通道3采样时间--239.5周期+通道16--内部温度传感器(不使⽤可以不⽤配置)ADC_RegularChannelConfig(ADC1, ADC_Channel_3|ADC_Channel_6,1, ADC_SampleTime_239Cycles5);//5.独⽴模式:000、禁⽤间断模式,不扫描模式ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;ADC_InitStruct.ADC_ScanConvMode= ENABLE;//扫描模式ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;//单次转换ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right ;//右对齐--11位为0ADC_InitStruct.ADC_NbrOfChannel=1;//规则组中ADC转换通道数⽬--待转换的通道数ADC_InitStruct.ADC_ExternalTrigConv= ADC_ExternalTrigConv_None ;//库函数⾥不⽤再单独配置外部触发了直接配置软件触发--SWSTART即可ADC_Init(ADC1,&ADC_InitStruct);//开启A/D转换ADC_Cmd(ADC1, ENABLE);//复位校准ADC_ResetCalibration(ADC1);//等待校准寄存器被初始化while(ADC_GetResetCalibrationStatus(ADC1));//初始化校准完成,⾃动为0,退出whiile//A/D校准ADC_StartCalibration(ADC1);//等待校准完成while(ADC_GetCalibrationStatus(ADC1));//使能内部温度传感器------若不使⽤可以不⽤配置ADC_TempSensorVrefintCmd(ENABLE);#endif}void GZ_ADCValue(void){#if reg_progreamu16 gz_value;//光照的值//启动规则通道转换ADC1->CR2 |=(1<<22);//等待转换完成while((ADC1->SR &(1<<1))==0);gz_value=ADC1->DR;printf("gz_value=%d\r\n",gz_value);#elseu16 gz_value;//光照的值//启动规则通道转换ADC_SoftwareStartConvCmd(ADC1,ENABLE);//等待转换完成while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);gz_value= ADC_GetConversionValue(ADC1);printf("gz_value=%d\r\n",gz_value);#endif}//求内部温度传感器的值u16 Get_Adc(u8 ch){u16 gz_value;//光照的值//启动规则通道转换ADC_SoftwareStartConvCmd(ADC1,ENABLE);//等待转换完成while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);gz_value= ADC_GetConversionValue(ADC1);return gz_value;//把转换的AD值返回回去。

STM32的ADC编程方法总结

STM32的ADC编程方法总结
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //内存传输数据单元---半字16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //循环模式---2个数据依次循环接收从外设ADC1传输过来的ADC值---
//------------ADC模式配置------------------------
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式----还有很多模式---这个比较常见
ADC_InitStructure.ADC_ScanConvMode = ENABLE ; //扫描模式---采集多通道使用----本程序采集2通道---所以扫描模式
//下面这个函数比较重要----配置ADC的通道与采样周期---前面说的PC0与PC1对应的ADC通道分别是--10与11。采集周期也有几种。
ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTIme_55Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_11,2,ADC_SampleTIme_55Cycles5);
STM32的ADC编程方法总结
这里的ADC转换也来使用DMA---这个也是STM32的ADC转换最常见的方式。
第一步是了解STM32的ADC对应的GPIO口如下图不用记住,可以查询,我是将它剪下来粘贴到书本的相应章节!
第二步是配置相应ADC转换的GPIO口这里使用PC0--PC1
static void ADC1_GPIO_Config(void)

STM32F4之ADC

STM32F4之ADC

STM32F4之ADC【ADC试验1实验说明】1、这个实验仅仅是初始化⼀个ADC,对其输⼊进⾏采样。

2、使⽤STM32F4的ADC1进⾏采样,采样值不输出之在编译器⾥边观察。

3、使⽤ST外设库进⾏实验4、本实验只为采集到数据,采样周期、采样间隔设置为最⼤。

【ADC试验1实验结果】成功采集到了ADC1,通道1引脚PA1上的输⼊。

数据稳定不跳变。

【ADC试验1实验步骤】1、⾸先怀疑是⼯程中使⽤的USART、EXTI什么的影响了ADC的。

重建⼯程,加⼊ST外设库,添加引⽤位置。

这⼀步就不说了。

2、开启GPIOA、ADC时钟。

因为使⽤ADC1的通道1,对应的PA1引脚作为输⼊。

ADC挂接在APB2时钟上,GPIOA挂接在AHB1时钟上。

所以要开启这两个时钟。

代码如下:RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);3、输⼊引脚配置输⼊端⼝PA,引脚1.模拟输⼊,引脚时钟100M//PA1 PA2 PA3,模拟输⼊GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin = GPIO_PinSource1 | GPIO_PinSource2 | GPIO_PinSource3;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);4、ADC通⽤的初始化这是F4系列新出来的东西,与F1不同。

这⾥通过库函数配置⼀个新增的寄存器ADC_CCR,这个配置将影响⽚上所有的ADC。

stm32相关笔记——ADC部分

stm32相关笔记——ADC部分

stm32相关笔记——ADC部分我们在学习⼀门技术的时候,应该对它的理论部分有所了解,然后才能在实践中进⼀步加深理解,进⽽掌握。

对于stm32来说,我认为学习的时候应该先仔细阅读相关的参考⼿册,然后再动⼿实践,这样才能理解得更加透彻,掌握得更加牢固!今天记录⼀下我学习stm32的ADC部分的了解。

1.介绍⼩结:stm32的ADC有18个通道(16个外部通道+2个内部通道),有单次、连续、扫描和间断四种模式,ADC的结果可以左对齐和右对齐的⽅式存储在16位的数据寄存器中(⼀般我们都是使⽤右对齐的⽅式)2、特征3、框图框图应该是最重要的部分了,理解了框图,对这个外设的理解就⽐较透彻了。

①模拟⾄数字转换器中有两个通道,⼀个是注⼊通道,⼀个是规则通道,对应的转换结果也是存储到注⼊通道数据寄存器和规则通道数据寄存器中(都是16位的);②注⼊通道数据寄存器有4个,规则通道数据寄存器只有1个,规则通道最多可以转化16个通道的数据,⽽结果都是存储在⼀个规则通道数据寄存器中,为了避免数据丢失,可以采⽤DMA搬运数据,提⾼效率。

③触发注⼊通道开始转化的外部触发信号有8种,如图所⽰,其中TIM8_CH4及其重映射只存在于⼤容量的产品中。

④类似于注⼊通道,触发规则通道的外部触发信号也有8种,如图所⽰,其中TIM8_TRGO及其重映射也只存在于⼤容量产品中。

⑤以上的两点只针对ADC1和ADC2,ADC3的触发信号有所不同,如图所⽰:⑥转换的过程如图,ADCx_IN0~ADCx_IN15共16个外部通道,通过GPIO端⼝将模拟量传达到模拟⾄数字转化器中的注⼊通道或者规则通道,另外还有两个内部通道温度传感器和V REFINT,同样也可以将模拟量传送到模拟⾄数字转化器中的注⼊通道或者规则通道,注⼊通道最多可以转换4个通道的模拟量,转换结果存储到注⼊通道数据寄存器中,转换完成后会产⽣JEOC标志位,规则通道最多可以转换16个通道,转换结果存储到规则通道数据寄存器中,转换完成后会产⽣EOC标志位。

记STM32F030多通道ADCDMA读取乱序问题

记STM32F030多通道ADCDMA读取乱序问题

记STM32F030多通道ADCDMA读取乱序问题问题描述通过 uint16_t ConvData[8]保存DMA搬运的ADC转换数值,但是这个数组数值的顺序总是和ADC不是顺序对应的。

⽐如⽤7个通道的ADC,当设置ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward,是对应顺序是:0->0,1->7,2->6…7->1 ;当设置ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward,是对应顺序是:0->7,1->0,2->1…7->6 。

问题原因F0的ADC在使⽤之前需要校准。

这个7位的校准值也是放在ADC_DR中的,它也会触发DMA请求。

可以参照F0的ADC-DMA例程,先做ADC校准、然后再设置DMA,再使能ADC的DMA。

实例代码void ADC1_DMA_Init(void){GPIO_InitTypeDef GPIO_InitStructure;DMA_InitTypeDef DMA_InitStructure;ADC_InitTypeDef ADC_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = 0x00ff;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOA, &GPIO_InitStructure);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);ADC_DeInit(ADC1); //ADC恢复默认设置ADC_StructInit(&ADC_InitStructure); //初始化ADC结构ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //12位精度ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //规定模式装换⼯作在连续模式ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据对其为右对齐ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward; // ADC_ScanDirection_Backward; //ADC的扫描⽅向ADC_Init(ADC1, &ADC_InitStructure);ADC_ChannelConfig(ADC1, ADC_Channel_0, ADC_SampleTime_239_5Cycles); /* Convert the ADC1 Channel 11 with 239.5 Cycles as sampling time */ADC_ChannelConfig(ADC1, ADC_Channel_1, ADC_SampleTime_239_5Cycles); /* Convert the ADC1 Channel 11 with 239.5 Cycles as sampling time */ADC_ChannelConfig(ADC1, ADC_Channel_2, ADC_SampleTime_239_5Cycles); /* Convert the ADC1 Channel 11 with 239.5 Cycles as sampling time */ADC_ChannelConfig(ADC1, ADC_Channel_3, ADC_SampleTime_239_5Cycles); /* Convert the ADC1 Channel 11 with 239.5 Cycles as sampling time */ADC_ChannelConfig(ADC1, ADC_Channel_4, ADC_SampleTime_239_5Cycles); /* Convert the ADC1 Channel 11 with 239.5 Cycles as sampling time */ADC_ChannelConfig(ADC1, ADC_Channel_5, ADC_SampleTime_239_5Cycles); /* Convert the ADC1 Channel 11 with 239.5 Cycles as sampling time */ADC_ChannelConfig(ADC1, ADC_Channel_6, ADC_SampleTime_239_5Cycles); /* Convert the ADC1 Channel 11 with 239.5 Cycles as sampling time */ADC_ChannelConfig(ADC1, ADC_Channel_7, ADC_SampleTime_239_5Cycles); /* Convert the ADC1 Channel 11 with 239.5 Cycles as sampling time */ADC_GetCalibrationFactor(ADC1); /* ADC Calibration */ADC_Cmd(ADC1, ENABLE); /* Enable ADCperipheral[PerIdx] */while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY)); /* Wait the ADCEN falg *///设置DMA要在校准ADC之后DMA_DeInit(DMA1_Channel1); /* DMA1 Channel1 Config */DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) 0x40012440; //ADC1->DR; //外设地址DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) RegularConvData_Tab; //内存地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //外设作为数据传输的来源DMA_InitStructure.DMA_BufferSize = 8; //DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器不变DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //数据宽度为16位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //数据宽度为16位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //DMA_Mode_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA_Priority设定DMA通道x的软件优先级DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输DMA_Init(DMA1_Channel1, &DMA_InitStructure);DMA_Cmd(DMA1_Channel1, ENABLE);/* DMA1 Channel1 enable */DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular); /* Enable ADC_DMA */ADC_DMACmd(ADC1, ENABLE);ADC_StartOfConversion(ADC1); /* ADC1 regular Software Start Conv */}。

如何提高STM32微控制器内置的ADC的精度

如何提高STM32微控制器内置的ADC的精度
请注意,本应用笔记提供的数据仅供参考。除非特别指出,测量条件皆为实验室典型条件而 非生产环境。
表 1 列出了本应用笔记涉及的微控制器。
类型 微控制器
表 1. 适用产品
部件编号
STM32F2xx (STM32F20x, STM32F21x) STM32F4xx (STM32F405, STM32F407, STM32F415, STM32F417, STM32F42x, STM32F43x)
4/31
DocID022945 Rev 5
AN4073
图片索引
图片索引
图 1. 图 2. 图 3. 图 4. 图 5. 图 6. 图 7. 图 8. 图 9. 图 10. 图 11. 图 12. 图 13. 图 14.
平均技巧的图形表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 N 个采样平均算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 平均 N-X 个 ADC 采样算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 柱状图图形表示与编码的离散度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 当 ART 为 ON, VIN = 0.3 V 时的 ADC 编码分布 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 当 ART 为 OFF, VIN = 1.65 V 时的 ADC 编码分布 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 当 (D+I)缓存 ON + 预取 OFF VIN = 0.3 V 时的 ADC 编码分布 . . . . . . . . . . . . . . . . . . . . 15 当 (D+I)缓存 ON + 预取 OFF VIN = 1.65 V 时的 ADC 编码分布 . . . . . . . . . . . . . . . . . . . 16 当 (D+I)缓存 ON + 预取 OFF VIN = 3 V 时的 ADC 编码分布 . . . . . . . . . . . . . . . . . . . . . 16 当 ART 为 ON, VIN = 0.3 V 时的 ADC 编码分布 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 当 ART 为 OFF, VIN = 1.65 V 时的 ADC 编码分布 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 当 (D+I)缓存 ON + 预取 OFF VIN = 0.3 V 时的 ADC 编码分布 . . . . . . . . . . . . . . . . . . . . 22 当 (D+I)缓存 ON + 预取 OFF VIN = 1.65V 时的 ADC 编码分布 . . . . . . . . . . . . . . . . . . . 23 当 (D+I)缓存 ON + 预取 OFF VIN = 3 V 时的 ADC 编码分布 . . . . . . . . . . . . . . . . . . . . . 23

STM32之ADC配置

STM32之ADC配置

STM32之ADC配置对于STM32,在使用ADC的时候需要配置几个参数。

(1) 第一个参数是ADC_Mode,这里设置为独立模式:ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;在这个模式下,双ADC不能同步,每个ADC接口独立工作。

所以如果不需要ADC同步或者只是用了一个ADC的时候,就应该设成独立模式了。

(2) 第二个参数是ADC_ScanConvMode,这里设置为DISABLE。

ADC_InitStructure.ADC_ScanConvMode = DISABLE;如果只是用了一个通道的话,DISABLE就可以了,如果使用了多个通道的话,则必须将其设置为ENABLE。

(3) 第三个参数是ADC_ContinuousConvMode,这里设置为ENABLE,即连续转换。

如果设置为DISABLE,则是单次转换。

两者的区别在于连续转换直到所有的数据转换完成后才停止转换,而单次转换则只转换一次数据就停止,要再次触发转换才可以。

所以如果需要一次性采集1024个数据或者更多,则采用连续转换。

(4) 第四个参数是ADC_ExternalTrigConv,即选择外部触发模式。

这里只讲三种:1、第一种是最简单的软件触发,参数为ADC_ExternalTrigConv_None。

设置好后还要记得调用库函数:ADC_SoftwareStartConvCmd(ADC1, ENABLE);这样触发才会启动。

2、第二种是定时器通道输出触发。

共有这几种:ADC_ExternalTrigConv_T1_CC1、ADC_ExternalTrigConv_T1_CC2、ADC_ExternalTrigConv_T2_CC2、ADC_ExternalTrigConv_T3_T以及ADC_ExternalTrigConv_T4_CC4。

定时器输出触发比较麻烦,还需要设置相应的定时器。

STM32 ADC DMA 使用心得

STM32 ADC DMA 使用心得

(二)ADC循环采集六路电压,使用DMA.这次实验真的很郁闷,对DMA的不了解让我深陷误区,明白之后,让我更加佩服DMA的强大。

误区就是:从实验的目标我们知道这次是用DMA把ADC转换的数据传送到内存中的一个数组里存起来,因为是采集6个通道,这里使能了ADC的扫描模式。

一旦启动ADC,就会按顺序转换SQRX里选中的通道,问题就是我一开始以为ADC与DMA并不会协调工做,也就是ADC自己转自己的,DMA自己传自己的,这样的话内存里的数组就不是我想要的了,后来着实的研究了很长时间,在群里的一位兄弟的提醒下,我才知道,可能我想的复杂了,也许就可以在ADC转一次,然后DMA把数据传一次,Ok,经过实验得知,这个想法是正确的。

好了,说了这么多废话,开始进入正题。

这里使用了ADC1的六个规则通道分别是:CH0、CH1、CH2、CH3、CH14、CH15,分别对应的引脚为PA0、PA1、PA2、PA3、PC4、PC5。

关于ADC的配置:启动了ADC1的扫描模式,还有连续转换模式,独立工作模式(只用1个ADC),因为用的了DMA,所以也要使能DMA位,使用外部触发(SWSTART),数据为右对齐。

还有SQRX等等就不说了,这里不需要ADC中断的。

中断在DMA里。

关于DMA的配置:因为ADC请求规定在DMA1的第一个通道,所以这里使用DMA_CH1,外设地址为ADC唯一的数据寄存器(u32)&ADC1->DR,存储器地址为(u32)SendBuff数组,这个数组可以存放6个元素。

这里还有使能传输完中断(TCIF),选择从外设读取,循环模式,外设地址非增量模式,存储器地址增量模式,外设数据宽度16位,存储器地址16位,非存储器到存储器模式。

关于DMA中断函数:当DMA传输完6次数据时,TCIF位自动置位,程序进入中断服务函数,首先先关闭ADC的连续转换,我们把数组的处理都放在了这里,处理完发送到串口,通过电脑的超级终端可以看到不停变化的6个引脚电压的数据。

stm32之ADC(规则通道)

stm32之ADC(规则通道)

stm32之ADC(规则通道)1.ADC是12位的⼀种逐次型模拟数字转换器,所以进⾏存储时只能存储在16位数据寄存器中,不能低于12位。

其中有16个外部信号源(ADCx_IN0--ADCx_IN15)和2个内部信号源(温度传感器、)2.ADC时钟--由时钟控制器提供的ADCCLK时钟(RCC_CFGR寄存器设置ADC时钟分频)和PCLK2(APB2时钟)同步。

3.每个通道可以分别⽤不同的时间采样。

总转换时间如下计算: TCONV = 采样时间+ 12.5个周期 当ADCCLK=14MHz,采样时间为1.5周期 TCONV = 1.5 + 12.5 = 14周期 = 1µs4.转换可以由外部事件触发(例如定时器捕获, EXTI线)。

如果设置了EXTTRIG控制位,则外部事件就能够触发转换。

5.ADC寄存器 (1)ADC_CR2 控制寄存器位23 位22 位20TSVREFE:温度传感器和VREFINT使能SWSTART:开始转换规则通道EXTTRIG:规则通道的外部触发转换模式位19:17 EXTSEL[2:0]:选择启动规则通道组转换的外部事件位11 位3 位2 位1 位0ALIGN:数据对齐RSTCAL:复位校准 (Reset calibration) CAL: A/D校准 (A/D Calibration) CONT:连续转换ADON:开/关A/D转换器 (2)采样时间寄存器 ADC_SMPRx --1,2分别是通道1和通道2的。

(3)ADC规则序列寄存器ADC_SQRx--查找数据⼿册:进⾏设置通道转换数⽬:ADC_SQR1的位23:20位,进⾏设置进⾏转换顺序即第⼏个转换:ADC_SQR1-ADC_SQR3。

L[3:0]:规则通道序列长度 (Regular channel sequence length)这些位由软件定义在规则通道转换序列中的通道数⽬。

0000: 1个转换0001: 2个转换……1111: 16个转换6.ADC的⼀般配置过程: 1)开启 PA ⼝时钟,设置 PA3为模拟输⼊。

STM32单片机的ADC配置详解

STM32单片机的ADC配置详解

STM32单片机的ADC配置详解一、ADC定义将模拟量转换为数字量的过程称为模式(A/D)转换,完成这一转换的工具就是模数转换器(简称ADC),用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。

例如:把芯片的引脚上的电压读出来,把芯片集成的上的温度传感器的温度读出来!二、ADC要点1-独立模式-单通道-中断读取①、初始化ADC用到的GPIO;②、设置ADC的工作参数并初始化;③、配置ADC时钟;④、设置ADC转换通道顺序及采样时间;⑤、配置使能ADC转换完成中断,在中断内读取转换完的数据;⑥、使能ADC;⑦使能软件触发ADC转换。

三、ADC内容1)ADC数量:STM32有3个ADC,每个ADC最多有16个外部通道,ADC1和ADC2都有16个外部通道,而ADC3随CPU引脚的不同通道数也不同,一般都有8个外部通道。

2)ADC精度:ADC为12位,即模拟电压经过ADC转换后是一个12位的数字量;一般情况下ADC的输入电压范围是:0~3.3V,因此最小精度为:3.3/2^12,当数字量为X时,则有模拟量Y = (3.3 / 2^12)*X。

3)电压输入范围:ADC 输入范围为:VREF- ≤VIN ≤VREF+。

由VREF- 、VREF+ 、VDDA 、VSSA 、这四个外部引脚决定。

一般把VSSA 和VREF- 接地,把VREF+ 和VDDA 接3V3,得到ADC的输入电压范围为:0~3.3V。

4)输入通道:ADC的信号输入就是通过通道来实现的,信号通过通道输入到单片机中,单片机经过转换后,将模拟信号输出为数字信号;STM32F103的ADC多达18个通道,在F103ZET6中ADC1的通道16连接到了芯片内部的温度传感器,Vrefint (内部参照电压)连接到了通道17,ADC2 的模拟通道16 和17 连接到了内部的VSS(地)。

外部的16 个通道在转换的时候又分为规则通道和注入通道,其中规则通道最多有16路,注入通道最多有4 路。

STM32学习笔记,定时器,PWM,ADC,UART,DMA

STM32学习笔记,定时器,PWM,ADC,UART,DMA
TIM_ClearITPendingBit(TIM1, TIM_IT_CC1 ); capture = TIM_GetCapture1(TIM1); TIM_SetCompare1(TIM1, capture + 2000); //这里解释下: //将 TIM1_CCR1 的值增加 2000,使得下一个 TIM 事件也需要 2000 个脉冲, //另一种方式是清零脉冲计数器 //TIM_SetCounter(TIM2,0x0000); }
RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,\ ENABLE); //启动 AFIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //启动 TIM1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
//Step2. GPIO 做相应设置,为 AF 输出 //PA.8/9 口设置为 TIM1 的 OC1 输出口 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);
}
关于 TIM 的操作,要注意的是 STM32 处理器因为低功耗的需要,各模块需要分别独立开启时钟,所以, 一定不要忘记给用到的模块和管脚使能时钟,因为这个原因,浪费了我好多时间阿~~!
STM32 笔记(二)TIM 模块产生 PWM 这个是 STM32 的 PWM 输出模式,STM32 的 TIM1 模块是增强型的定时器模块,天生就是为电机控制而生,可 以产生 3 组 6 路 PWM,同时每组 2 路 PWM 为互补,并可以带有死区,可以用来驱动 H 桥。

如何在STM32中得到最佳的ADC精度

如何在STM32中得到最佳的ADC精度

如何在STM32中得到最佳的ADC精度
 STM32家族中的所有芯片都内置了逐次逼近寄存器型ADC模块.内部大致框架如下:
 每次ADC转换先进行采样保持,然后分多步执行比较输出,步数等于ADC的位数,每个ADC时钟产生一个数据位。

说到这里,用过STM32 ADC的人是不是想到了参考手册中关于12位ADC转换时间的公式:
 ST官方就如何保障或改善ADC精度写了一篇应用笔记AN2834。

该应用笔记旨在帮助用户了解ADC误差的产生以及如何提高ADC的精度。

主要介绍了与ADC设计的相关内容,比如外部硬件设计参数,不同类型的ADC误差来源分析等,并提出了一些如何减小误差的设计上建议。

 当我们在做STM32的ADC应用遇到转换结果不如意时,常有人提醒或建议你对采样时间或外部采样电路做调整。

这里调整的最终目的就是让信号进入ADC模块的充电时间与内部采样时间匹配,保证采得的电压尽量真实,最终得到符合精度要求的转换结果。

下面就聊聊相关话题。

 一、模拟信号源阻抗的影响。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32笔记 ADC篇
一、总转换时间的问题:
总转换时间TCONV = 采样时间+ 转换时间(转换时间=12.5个周期)
其中,采样时间是指完成一次转换到开始下一次转换的时间间隔,不包括转换时间;转换时间是固定的12.5个周期。

采样时间有几个固定值可以选择设定。

二、ADON:开/关A/D转换器
该位由软件设置和清除。

当该位为0时,写入1将把ADC从断电模式下唤醒。

当该位为1时,写入1将启动转换。

在转换器上电至转换开始有一个延迟时间tSTAB。

函数void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);虽然描述说是使能失能ADC,其实就是对ADON的操作,也就是说,当ADON为0时,该函数为唤醒ADC,当ADON为1时,为启动转换。

三、ADC开始转换的问题
芯片资料有以下两段话:
&ldquo;单次转换模式下,ADC只执行一次转换。

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

&ldquo;在连续转换模式中,当前面ADC转换一结束马上就启动另一次转换。

此模式可通过外部触发启动或通过设置ADC_CR2寄存器上的ADON位启动,此时CONT 位是1。

&rdquo;
此处的关键点是:单次模式下,注入通道只能用软件启动,不能用ADON启动。

但连续模式则可以用这两个方式启动。

四、中断的问题
JEOC:该位由硬件在所有注入通道组转换结束时设置,由软件清除
EOC:该位由硬件在(规则或注入)通道组转换结束时设置,由软件清除或由读取ADC_DR时清除
注意点:a、规则和注入都可以产生EOC标志,而JEOC标志只有注入组产生。

b、规则和注入都可以产生EOC中断,而JEOC中断只能由注入组产生。

c、JEOC只能软件清除,硬件不会自动清除,但是
EOC在读取ADC_DR规则数据寄存器时,硬件会自动清除。

(这条一定要注意,浪费我半天的时间才找到原因。

)。

相关文档
最新文档