stm32f1频谱分析LCD显示(adc+tim+dma+fft)

stm32频谱分析(fft)

	本博客将持续更新带给大家日常生活中的简单经典的C语言小项目和生活中的电子DIY.以后会
	陆续推出讲解视频发布在b站上。所有程序和日常学习资料全都可以在群文件中免费下载.
	欢迎广大电子爱好朋友或者电子开发需求的朋友添加qq群:1039119322

最近在stm32上做了一个频谱分析仪。使用的是dsp库的fft算法。adc的获取方式使用的定时制采 样使用dma传输,然后利用fft进行处理,最后将频谱显示在正点原子屏幕上。使用stm32f4生成一个正弦波废话不多说,带大家先看一下效果。
一:运行效果图
经过测试,该系统可以进行测量频率40KHZ的信号。为了显示由另一块开发板生成的1KHZ的正弦波,故显示范围限制在10KHZ。可以自己调整
开机默认界面stm32f1频谱分析LCD显示(adc+tim+dma+fft)_第1张图片

测试引脚连接,f1的PA6为信号输入引脚,f4的PA5为1KHZ正弦信号输出引脚,然后共一下地。

stm32f1频谱分析LCD显示(adc+tim+dma+fft)_第2张图片
输入1KHZ信号由于用f4模拟的dac正弦信号,一个周期内只有32个点精度并不是很高。运行效果图
stm32f1频谱分析LCD显示(adc+tim+dma+fft)_第3张图片
二:主要代码展示
限于页幅,完整代码可以添加qq群后免费下载。只贴出关键代码。
DMA初始化
void DMA1_Init()
{
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_ConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 1024;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord ;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word ;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular ;
DMA_InitStructure.DMA_Priority = DMA_Priority_High ;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);

DMA_ITConfig(DMA1_Channel1,DMA_IT_TC, ENABLE);		

NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

DMA_Cmd(DMA1_Channel1,ENABLE);

}

void AGPIO_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //??GPIOA??
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void Adc_Init(){
ADC_InitTypeDef ADC_InitStructure;
DMA1_Init();
AGPIO_Init();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //??ADC1???
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //??ADC??
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //???
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //???
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2; //???
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //???
ADC_InitStructure.ADC_NbrOfChannel = 1; //???
ADC_Init(ADC1, &ADC_InitStructure);
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //??ADC??,?PCLK2?6??,?12Hz
ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 1, ADC_SampleTime_28Cycles5); //??ADC1??6?239.5???
ADC_DMACmd(ADC1,ENABLE);
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1); //???
while(ADC_GetResetCalibrationStatus(ADC1)); //???
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_ExternalTrigConvCmd(ADC1, ENABLE);
}
三:程序升级规划
在此代码基础上完全可以再添加新的功能
一:按键可以控制进行fft的点数
二:按键可以控制采样频率

你可能感兴趣的:(stm32f1频谱分析LCD显示(adc+tim+dma+fft))