OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9854|回复: 7

是我的操作有误,还是stm32的速度本来不够?

[复制链接]

25

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2012-8-7
在线时间
1 小时
发表于 2012-8-7 18:58:02 | 显示全部楼层 |阅读模式

#include <stm32f10x_lib.h>
#include<math.h>

#include "sys.h"
#include "delay.h" 
#include "led.h"
#include "lcd.h"   
#include "adc.h"
#include  "fft.h"

#define FFT_N 128                                                   //定义福利叶变换的点数
#define PI 3.1415926535897932384626433832795028841971            //定义圆周率值

struct compx {float real,imag;};      //定义一个复数结构
struct compx s[FFT_N];           //FFT输入和输出:从S[0]开始存放,根据大小自己定义
float SIN_TAB[FFT_N/2];         //定义正弦表的存放空间



float mod[FFT_N];   //用于存放fft结果的模值
u16 adc_buffer[FFT_N];
u8 hight[32];   //用于存放矩形柱的高度值


//此函数的功能是将ADC转换来的整数值转换为电压值,然后存放到FFT缓存区s数组中

void adc_to_s()
{
u16 i;

 for(i=0;i<FFT_N;i++)                        //给结构体赋值
  {
     s.real= (float)(adc_buffer*(3.3/4096));
     s.imag=0;                             //虚部为0
  }
}


//此函数的功能是将fft运算结果的模值转换成矩形柱的高度,用32个矩形柱来等间隔显示128点DFT值
void mod_hight()
{
 u8 i;
 for(i=0;i<32;i++)
    hight=(u8)(mod[4*i]*100);
}


//显示矩形柱的高度
void display()
{
u8 i;
for(i=0;i<32;i++)
 Show_rctgl(i, hight);   //此函数是填充矩形柱,自定义
}


int main(void)
{  
 u16 adcx;
 u16 num=0,i=0;

 create_sin_tab(SIN_TAB);//创建正弦表

 Stm32_Clock_Init(9);//系统时钟设置
 delay_init(72);  //延时初始化
 
 LED_Init(); 
 LCD_Init();   
 Adc_Init(); 

 LCD_Clear(GBLUE);//清屏,每次清屏等效于设置背景色
 OINT_COLOR=BROWN;//设置字体为红色

 while(1)
 {
  delay_us(5);
  adcx=Get_Adc(ADC_CH0);
  adc_buffer[num]=adcx;
  num++;  //每采样一次,num值自加一次,知道采样满128点  
  if(num==FFT_N)
   {
   num=0;
   
   adc_to_s();//将ADC的值转换为电压值 存放到s的实部
   FT(s);//做fft运算

   for(i=0;i<FFT_N;i++)                     //求变换后结果的模值,存放于mod数组中
      mod=sqrt(s.real*s.real+s.imag*s.imag);
  
   mod_hight();//将傅里叶变换后的幅度模值转换为彩色立柱的高度
   
   LCD_Clear(GBLUE);//清屏,每次清屏等效于设置背景色
   display();//显示矩形柱
   delay_ms(100);
   LED0=!LED0;
   
   }
    
  }
}

 

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

25

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2012-8-7
在线时间
1 小时
 楼主| 发表于 2012-8-7 18:59:34 | 显示全部楼层
这是我的代码,就在mini开发板上用LCD显示频谱,发现屏幕闪得特厉害,而且,板子上led等明显闪的很慢,也就是说fft的代码部分执行需要很长的时间
回复 支持 反对

使用道具 举报

25

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2012-8-7
在线时间
1 小时
 楼主| 发表于 2012-8-7 19:02:04 | 显示全部楼层
我的采样是定时采样,在主函数中每隔5us采样一次,所以led闪烁的效果完全取决于if(num==FFT_N)条件满足后所执行的语句,也就是和延时5us的关系不大,那么就说明led闪烁的越慢,fft执行的速度就越慢
回复 支持 反对

使用道具 举报

25

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2012-8-7
在线时间
1 小时
 楼主| 发表于 2012-8-7 19:03:45 | 显示全部楼层
难道stm32就连个简单的频谱显示都应付不了吗?lcd闪屏真的很严重!
还是,我的操作有误?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-7 19:27:59 | 显示全部楼层
说明你的算法效率太低了.
另外,你哪个延时100ms,该去掉.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

25

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2012-8-7
在线时间
1 小时
 楼主| 发表于 2012-8-8 09:04:11 | 显示全部楼层
回复【5楼】正点原子:

---------------------------------
原子哥,100ms级的延时根本就没有什么影响,我把那个延时函数注释掉led灯的闪烁频率几乎没什么改变
回复 支持 反对

使用道具 举报

25

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2012-8-7
在线时间
1 小时
 楼主| 发表于 2012-8-8 09:07:10 | 显示全部楼层
回复【6楼】草尼玛:

---------------------------------
另外,fft运算,我是参照论坛上面的,应该不会有什么问题
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-8 09:15:07 | 显示全部楼层
回复【7楼】草尼玛:
---------------------------------
仿真看看哪个函数占用时间最久吧.我估计就是你的fft算法里面,可能用了很多浮点计算,导致速度慢.
另外,你这种清屏重画的做法,不可取,必定导致闪屏.
最好就是一个个柱子单独处理,不要清屏重画.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 04:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表