STM32F4 AD采集与FFT频谱分析示例

STM32F4 AD采集与FFT频谱分析示例

免费STM32F4频谱分析仪代码.zip项目地址:https://gitcode.com/open-source-toolkit/63437

简介

本项目基于STM32F407单片机,利用其强大的DSP库,实现了AD采集、FFT频谱分析,并将分析结果通过串口发送至电脑。无需复杂的后续处理,即可轻松获取频率分量、幅度、采样波形等信息。本示例经过实际测试,简单易用,适合初学者和开发者快速上手。

功能特点

  • AD采集:利用STM32F407的ADC模块进行模拟信号采集。
  • FFT频谱分析:通过DSP库实现快速傅里叶变换(FFT),将时域信号转换为频域信号。
  • 串口通信:将频谱分析结果通过串口发送至电脑,方便实时查看和分析。
  • 简单易用:代码结构清晰,注释详细,适合初学者学习和参考。

硬件需求

  • STM32F407开发板
  • 模拟信号源(如信号发生器)
  • USB转串口模块(用于与电脑通信)

软件需求

  • Keil uVision 或其他STM32开发环境
  • STM32CubeMX(用于初始化外设配置)
  • STM32 DSP库

使用步骤

  1. 硬件连接

    • 将模拟信号源连接至STM32F407的ADC输入引脚。
    • 将STM32F407的串口引脚连接至USB转串口模块,并通过USB连接至电脑。
  2. 软件配置

    • 使用STM32CubeMX配置ADC和串口外设。
    • 导入DSP库,并在项目中包含相关头文件和库文件。
  3. 编译与下载

    • 使用Keil uVision或其他开发工具编译项目,并将生成的二进制文件下载至STM32F407开发板。
  4. 运行与调试

    • 打开串口调试工具(如SecureCRT、Putty等),设置波特率与STM32F407配置一致。
    • 运行程序,观察串口输出,获取频谱分析结果。

示例输出

程序运行后,串口调试工具将显示如下信息:

频率分量: xxx Hz
幅度: xxx
采样波形: [波形数据]

注意事项

  • 确保ADC输入信号在STM32F407的电压范围内(通常为0-3.3V)。
  • 根据实际需求调整FFT点数和采样频率,以获得最佳的频谱分析效果。

贡献与反馈

欢迎开发者贡献代码、提出问题或建议。您可以通过提交Issue或Pull Request来参与本项目的改进。

许可证

本项目采用MIT许可证,详情请参阅LICENSE文件。


希望本项目能帮助您快速实现STM32F4的AD采集与FFT频谱分析,祝您开发顺利!

免费STM32F4频谱分析仪代码.zip项目地址:https://gitcode.com/open-source-toolkit/63437

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

Main: #include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "lcd.h" #include "usart.h" #include "adc.h" #include "stm32_dsp.h" #include /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ #define DOUBLE_COLOR 1 //ÊÇ·ñΪ˫ɫÆÁ£¬ÈôΪ˫ɫÆÁÔò¸ÄΪ1 #define NPT 64 //FFT²ÉÑùµãÊý #define GREEN_STOP_TIME 15 //ÂÌÉ«µã¶¥¶ËÍ£¶Ùʱ¼ä£¬ÖµÔ½´óʱ¼äÔ½³¤ #define GREEN_SUB_SPEED 100 //ÂÌÉ«µãÏÂÒÆËÙ¶È£¬ÖµÔ½´óËÙ¶ÈÔ½Âý #define RED_SUB_SPEED 50 //ºìɫƵÖùÏòÏÂËõ¶ÌËÙ¶È£¬ÖµÔ½´óËÙ¶ÈÔ½Âý uint32_t ADC_DataNum=0; //ADC²ÉÑùµãÊý uint32_t RedTime=0; //ºìÉ«µãÏÂÒÆÊ±¼ä±äÁ¿ #if DOUBLE_COLOR uint32_t GreenTime=0; //ÂÌÉ«µãÏÂÒÆÊ±¼ä±äÁ¿ uint32_t GreenStopTime[32]={0}; //ÂÌÉ«µã¶¥¶ËÍ£¶Ùʱ¼äÊý¾Ý #endif volatile uint8_t ADC_TimeOutFlag=1; //ADC¶¨Ê±²ÉÑùʱ¼äµ½±êÖ¾ extern __IO uint16_t ADCConvertedValue; //ADC²ÉÑùÖµ extern int LCD_COLOR; long lBUFMAG[NPT+NPT/2]; //´æ´¢ÇóÄ£ºóµÄÊý¾Ý long lBUFOUT[NPT];//FFTÊä³öÐòÁÐ long lBUFIN[NPT];//FFTÊäÈëϵÁÐ uint8_t fftHightRedBuf[NPT/2]={0}; //ºìɫƵÖù¸ß¶ÈÊý×é uint8_t DisplayRedDataBuf[32*8]={0}; //ºìÉ«ÏÔʾ»º³åÇø #if DOUBLE_COLOR uint8_t fftHightGreenBuf[NPT/2]={0}; //ÂÌɫƵµã¸ß¶ÈÊý×é uint8_t DisplayGreenDataBuf[32*8]={0}; //ÂÌÉ«ÏÔʾ»º³åÇø #endif u16 color_tab[16]={DARKBLUE,BLUE,LIGHTBLUE,GREEN,LIGHTGREEN,RED,BRED,BRRED,BLACK,YELLOW,CYAN,MAGENTA,GRAYBLUE,LGRAYBLUE,BROWN,LGRAY}; void music_fft_main(uint8_t *RedNewHeight,uint8_t *GreenNewHeight) { int BarWidth = 8; int i=0; int j=0; static uint8_t RedOldHeight[32] = {0}; static uint8_t GreenOldHeight[32] = {0}; for(i=0;iRedOldHeight[i]){//Èç¹ûµ±Ç°µÄÂÌÉ«Öù×Ӹ߶ȱÈ֮ǰµÄ´óÔò²¹ÆëÂÌÉ«Öù×Ó LCD_Fill(RedOldHeight[i],(BarWidth+2)*i,RedNewHeight[i],(BarWidth+2)*i+BarWidth,color_tab[j]); }else{//Èç¹ûµ±Ç°ÏÔʾµÄÂÌÉ«Öù×Ӹ߶ÈСÓÚ֮ǰµÄÖù×ÓÔòÐèÒª½«¶àÓàµÄÂÌÉ«Öù×ÓÓñ³¾°É«Ìî³ä LCD_Fill(RedNewHeight[i],(BarWidth+2)*i,RedOldHeight[i],(BarWidth+2)*i+BarWidth,WHITE); } //½«ÐÂÊý¾Ý±£´æ RedOldHeight[i] = RedNewHeight[i]; GreenOldHeight[i] = GreenNewHeight[i]; if(j>=15) j=0; j++; } } void powerMag(long nfill) { int32_t lX,lY; uint32_t i; for (i=0; i < nfill; i++) { lX= (lBUFOUT[i]<>16; /* sine_cosine --> cos */ lY= (lBUFOUT[i] >> 16); /* sine_cosine --> sin */ { float X= 64*((float)lX)/32768; float Y = 64*((float)lY)/32768; float Mag = sqrt(X*X+ Y*Y)/nfill; // ÏÈÆ½·½ºÍ,ÔÙ¿ª·½ lBUFMAG[i] = (long)(Mag*65536); } } } int main(void) {uint32_t i=0; delay_init(); //ÑÓʱº¯Êý³õʼ»¯ NVIC_Configuration(); //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶ uart_init(9600); //´®¿Ú³õʼ»¯Îª9600 LED_Init(); //LED¶Ë¿Ú³õʼ»¯ TIM2_Configuration(); TIM2_NVIC_Configuration(); FFT_RCC_Configuration(); FFT_GPIO_Configuration(); FFT_DMA_Init(); FFT_ADC_Init(); LCD_Init(); // BACK_COLOR=BLACK; TIM_Cmd(TIM2, ENABLE); ADC_SoftwareStartConvCmd(ADC1, DISABLE); while(1) { if(ADC_TimeOutFlag){ #if DOUBLE_COLOR GreenTime++; #endif RedTime++; ADC_TimeOutFlag=0; if(ADC_DataNumCR2 |= 0x00500000;// ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!DMA_GetFlagStatus(DMA1_FLAG_TC1)); /* Clear channel1 transfer complete flag */ DMA_ClearFlag(DMA1_FLAG_TC1); // ADC1->CR2 &= 0xFFAFFFFF;// ADC_SoftwareStartConvCmd(ADC1, DISABLE); lBUFIN[ADC_DataNum]=ADCConvertedValue<<16; ADC_DataNum++; }else{ TIM_Cmd(TIM2, DISABLE); ADC_DataNum=0; cr4_fft_64_stm32(lBUFOUT,lBUFIN,NPT);//µ÷ÓÃSTM32µÄDSP¿â×÷FFT±ä»» powerMag(NPT);//¼ÆËãÆµµã·ùÖµ //¸üкìÉ«µãµÄ¸ß¶È for(i=0;ifftHightRedBuf[i]){ fftHightRedBuf[i]=(lBUFMAG[i]); } #if DOUBLE_COLOR //Ë¢ÐÂÂÌÉ«µã¸ß¶È if(fftHightRedBuf[i]>=fftHightGreenBuf[i]){ fftHightGreenBuf[i]=fftHightRedBuf[i]; GreenStopTime[i]=GREEN_STOP_TIME;//Â̵ãÍ£¶Ùʱ¼ä if(fftHightRedBuf[i]>=235){ fftHightGreenBuf[i]=235; fftHightRedBuf[i]=235; } } #else if(fftHightRedBuf[i]>=239){ fftHightRedBuf[i]=239; } #endif } //ÏÔʾºìÉ«Öù×Ó music_fft_main(fftHightRedBuf,fftHightGreenBuf); //ÏÔʾÂÌÉ«µã #if DOUBLE_COLOR //ÂÌÉ«µãÏÂÒÆ if((GreenTime>GREEN_SUB_SPEED)){ //ÂÌÉ«µãϽµ¼ä¸ôʱ¼ä GreenTime=0; for(i=0;iRED_SUB_SPEED){ RedTime=0; for(i=0;i<NPT/2;i++){ if((fftHightRedBuf[i]!=0)){ fftHightRedBuf[i]--; } } } //ÂÌÉ«µãÍ£¶Ùʱ¼ä¼õÒ» #if DOUBLE_COLOR for(i=0;iSR = (uint16_t)~TIM_FLAG_Update; TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update); //ÇåÖÐ¶Ï ADC_TimeOutFlag=1; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阮懿同

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值