基于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)
2019-12-24 20:29 上傳
點擊文件名下載附件
|