基于stm32f103测试,103存储较少,自己写的fft程序不适合在103上运行,使用STM32官方的库,可以做128点、256点的fft,运算时间很短;运算所需要的官方库文件在user目录下。
单片机源程序如下:
- #include "led.h"
- #include "delay.h"
- #include "key.h"
- #include "sys.h"
- #include "lcd.h"
- #include "usart.h"
- #include "adc.h"
- #include "timer.h"
- #include "oled.h"
- #include "bmp.h"
- #include "stm32_dsp.h"
- #include "table_fft.h"
- #include "GetADValueBuffer.h"
- /*感谢大壮提供的频率采集部分程序*/
- /*************************************************************************************************** 很重要
- //#define Fs 400 //采样频率,在函数中没定义,但是出的波形和它有关,具体体现在AD采样频率上,调节AD的采样周期,
- 和采样函数GetADValueBuffer()的delay时间,可以设置其大小。数据装入MATLAB,横轴为点数,乘以频域的分辨率即可。
- Fs=1/T;Tp=NT;Fs=NF;
- 其中:
- Fs--时域采样频率;
- Tp--数据时间长度;
- T--时域采样间隔;
- N--采样点数;
- F--频域采样间隔;!!!!!!分辨率
- PS:记得#include<math.h>,不然做sqrt时会出错!并且编译器不报错!!!
- ***************************************************************************************************/
- #define NPT 256 //fft点数,即N
- extern u16 count;
- extern u16 pinlv;
- extern long lBufInArray[NPT]; //输入缓冲区
- extern long lBufOutArray[NPT/2]; //输出缓冲区
- extern long lBufMagArray[NPT/2]; //变换后缓冲区
- int main(void)
- {
- int i;
- u16 adcx;
- int gewei,shifenwei,baifenwei,qianfenwei;
- float temp;
- delay_init(); //延时函数初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
- uart_init(115200); //串口初始化为115200
-
- Adc_Init(); //ADC初始化
-
- TIM3_Int_Init(9999,7199);//改成1s
- TIM5_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数
-
- OLED_Init(); //初始化OLED
- OLED_Clear() ;
- while(1)
- {
- // adcx=Get_Adc_Average(ADC_Channel_1,10);
- GetADValueBuffer();
-
- // for(i=0;i<NPT;i++)
- // {
- // printf("%ld\r\n",lBufInArray[i]);
- // }
-
-
- cr4_fft_256_stm32(lBufOutArray, lBufInArray, NPT);
- GetPowerMag();
-
- // for(i=0;i<NPT/2;i++)
- // {
- // printf("%ld\r\n",lBufOutArray[i]);
- // }
-
- for(i=0;i<NPT/2;i++)
- {
- printf("%ld\r\n",lBufMagArray[i]);
- }
-
- printf("helloworld");
-
- // temp=(float)adcx*(3.3/4096);
- // temp=temp/10;
- //printf("v=%.3f A\r\n",temp);
- //printf("f:%d Hz\r\n",pinlv);//打印频率
-
- gewei=(int)temp;
- shifenwei=(int)(temp*10);
- baifenwei=(int)(temp*100);
- qianfenwei=(int)(temp*1000);
- //
- // OLED_ShowCHinese(0,0,0);
- // OLED_ShowCHinese(18,0,1);
- // OLED_ShowCHinese(36,0,2);
- // OLED_ShowCHinese(54,0,3);
- // OLED_ShowCHinese(72,0,4);
- // OLED_ShowCHinese(90,0,5);
- // OLED_ShowCHinese(108,0,6);//中文,不得出现校名,注释了
-
- OLED_ShowString(0,3,"Ipp:");
- OLED_ShowNum(46,3,gewei,1,16);
- OLED_ShowString(54,3,".");
- OLED_ShowNum(62,3,shifenwei,1,16);
- OLED_ShowNum(70,3,baifenwei,1,16);
- OLED_ShowNum(78,3,qianfenwei,1,16);
- OLED_ShowString(90,3,"A");//电流
-
- OLED_ShowString(0,6,"Fre:");
- OLED_ShowNum(46,6,pinlv,5,16);//最多5位数字
- OLED_ShowString(90,6,"Hz");
-
- LED0=!LED0;
- delay_ms(1000);
- }
- }
复制代码
所有资料51hei提供下载:
STM官方DSP库测试.7z
(238.55 KB, 下载次数: 145)
|