ADC采样——fft运算的前提

1、基本介绍

ADC采样——fft运算的前提_第1张图片

 2、ADC引脚输入一般控制在0~3.3V,超过3.3V可能回烧掉。

ADC采样——fft运算的前提_第2张图片

ADC采样——fft运算的前提_第3张图片

 ADC采样——fft运算的前提_第4张图片

 VSSA= Vref- =GND     2.4V<= Vref+ <=VDDA=3.3V

3、注入通道 和 规则通道

ADC采样——fft运算的前提_第5张图片

如果只有规则通道就按照通道排序进行运行,但是若是在规则通道中添加了注入通道,此时运行到插入注入通道的位置时,必须先执行注入通道,注入通道执行结束后再回到之前执行后面的规则通道。如下所示,

 ADC采样——fft运算的前提_第6张图片

 4、注意1:STM32F1的ADC是支持单次,连续,扫描或者间断模式执行的。

 单次转换模式:ADC只执行一次转换,可以通过ADC_CR2寄存器的ADON位(此方法只适用于规则通道),还可以通过  外部触发启动,此时CONT位为0(第二种方法适用于规则/注入通道)。

ADC采样——fft运算的前提_第7张图片

扫描模式(位8):通过设置ADC_CR1寄存器的SCAN位选择,ADC扫描转换由ADC_SQRx或ADC_JSQRx寄存器选中的通道,每个组的每个通道上执行单次转换。在所有通道的转换结束后才能产生中断。

一般情况下,扫描是通过DMA来读的,DMA控制器将规则组通道的转换数据传输到SRAM中,但是注入通道的转换数据总是储存在ADC_JDRx寄存器中。

 ADC采样——fft运算的前提_第8张图片

5、ADC中的中断、时钟、寄存器、采样时间

 ADC采样——fft运算的前提_第9张图片

 ADC时钟,给ADC转换器提供时钟使能信号

ADC采样——fft运算的前提_第10张图片

ADC采样——fft运算的前提_第11张图片

ADC采样——fft运算的前提_第12张图片

 ADC采样——fft运算的前提_第13张图片

 ADC采样——fft运算的前提_第14张图片

 ADC采样——fft运算的前提_第15张图片

 ADC采样——fft运算的前提_第16张图片

 ADC采样——fft运算的前提_第17张图片

 此时最小转换时间是1us(ADC时钟=14MHz,采样周期为1.5周期)

 ADC采样——fft运算的前提_第18张图片

 ADC采样——fft运算的前提_第19张图片

6、ADC采样需要用到的函数

ADC采样——fft运算的前提_第20张图片

 ADC采样——fft运算的前提_第21张图片

 ADC采样——fft运算的前提_第22张图片

 例程实验:

ADC采样——fft运算的前提_第23张图片

 

//作用:void Adc_Init(void);
//1、开启PA口时钟和ADC1时钟,设置PA1为模拟输入
//2、复位ADC1,同时设置ADC1分频因子
//3、初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息
//4、使能ADC并校准

void Adc_Init(void)
{
	//1、开启PA口时钟和ADC1时钟,设置PA1为模拟输入
	//设置PA1为模拟输入
	GPIO_InitTypeDef  GPIO_InitStructure;
	
	ADC_InitTypeDef ADC_InitStruct;//ADC_Init()函数初始化结构体
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;				 //LED0-->PA1 端口配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; 		 //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
    GPIO_Init(GPIOA, &GPIO_InitStructure);					 //根据设定参数初始化GPIO PA1
	//启PA口时钟和ADC1时钟,
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);
	
	//2、复位ADC1,同时设置ADC1分频因子
	//配置ADC时钟为6分频
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	//复位ADC1
	ADC_DeInit(ADC1);
	
	//3、初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息
	//
	ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;
	ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;
	ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
	ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;
	ADC_InitStruct.ADC_NbrOfChannel=1;
	ADC_InitStruct.ADC_ScanConvMode=DISABLE;
	
	ADC_Init(ADC1,&ADC_InitStruct);
	ADC_Cmd(ADC1,ENABLE);//使能ADC1
	
	//4、校准
	ADC_ResetCalibration(ADC1);//使能复位校准
	while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准结束
	ADC_StartCalibration(ADC1);//开启AD校准
	while(ADC_GetCalibrationStatus(ADC1));//等待校准结束
}


//u16 Get_Add(u8 ch);
//获取某一个通道的转换结果
//5、配置规则通道参数
//6、开启软件转换
//7、等待转换完成,读取ADC值
u16 Get_Adc(u8 ch)
{

	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);
	
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);
	while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
	
	return ADC_GetConversionValue(ADC1);
}



//多次读取u16 Get_Add(u8 ch)这个通道的值,取平均值
u16 Get_Adc_Average(u8 ch,u8 times)
{
	u32 temp_val=0;
	u8 t;
	for(t=0;t

你可能感兴趣的:(stm32,stm32)