OpenEdv-开源电子网

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

关于ADC实验的拓展问题

[复制链接]

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2014-3-9
在线时间
0 小时
发表于 2014-4-1 14:00:34 | 显示全部楼层 |阅读模式
我想给开发板一个三角波信号(3.3v,50Hz),然后信号经过ADC转换(开发板中自带的),转换后的数字信号我想再进行FFT运算,输出基波频率。我在网上找了段FFT程序,不知道如何加在ADC程序中?还有加进去后,程序中的一些参数该如何设置?请高人指点!谢谢
FFT程序如下:
 /*****************fft programe*********************/
/*基二FFT算法*/
#include "math.h"
#include "stdio.h"
struct compx 
{ double real;
  double imag;
} compx ;

struct compx EE(struct compx b1,struct compx b2)
{
struct compx b3;
b3.real=b1.real*b2.real-b1.imag*b2.imag;
b3.imag=b1.real*b2.imag+b1.imag*b2.real;
return(b3);
}
void FFT(struct compx *xin,int N)
{
int f,m,LH,nm,i,k,j,L;
double p , ps ;
int le,B,ip;
float pi;
struct compx v,w,t;
LH=N/2;
f=N;
for(m=1;(f=f/2)!=1;m++){;}
nm=N-2;    
j=N/2;
/*变址运算*/
for(i=1;i<=nm;i++)
{
if(i<j){t=xin[j];xin[j]=xin;xin=t;}
k=LH;
while(j>=k){j=j-k;k=k/2;}
j=j+k;
}
{
for(L=1;L<=m;L++)
{  
le=pow(2,L);
B=le/2; 
pi=3.14159;
 for(j=0;j<=B-1;j++)
  {
   p=pow(2,m-L)*j;
   ps=2*pi/N*p;
   w.real=cos(ps);
   w.imag=-sin(ps);
   for(i=j;i<=N-1;i=i+le)
     { 
      ip=i+B;
      t=EE(xin[ip],w);
      xin[ip].real=xin.real-t.real;
      xin[ip].imag=xin.imag-t.imag;
      xin.real=xin.real+t.real;
      xin.imag=xin.imag+t.imag;
     }
  }
}
}   
return ;

/*****************main programe********************/

float  result[512];
struct  compx s[512];
const int   Num=256;/*计算点数*/
const float pi=3.14159;
long int f=12800,fs=50,fv;/*f为采样频率,fs为基频,fv为fft后计算得基频,fv结果应等于fs*/
int t;/*fft后模值最大点值序号*/
float max,module;/*最大模值及信号幅值*/
float door=0.01,module_test[512],mid_m;/*door为模值的阀值*/
int kav,fv_test[512],mid_f;
/*试验时,f,fs,Num的设定要保证下面s的取值是完整的周期点数*/
main()
{
int i,j;
for(i=0;i<Num;i++)
{
s.real=4*sin(2*pi*fs*i/f)+2.6*sin(6*pi*fs*i/f);
s.imag=0;
}
FFT(s,Num);
for(i=0;i<Num;i++)
{
//printf("%.4f",s.real);
//printf("+(%.4f)j\n",s.imag);
result=sqrt(pow(s.real,2)+pow(s.imag,2));
}

/**********************************下面为一个信号是的试验部分***************************/
/*
 max=result[0];
for(i=1;i<Num;i++)
  {
    if(max<result)
{
  max=result;
  t=i;
         }
  }



module=max/(Num/2);//在此borland C 编译器中,要除以采样点数的一半(和matlab中一样)
printf("module=%f",module);

fv=f*t/Num;
printf("fv=%d",fv);

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-4-1 22:08:45 | 显示全部楼层
这你得好好研究下FFT,呵呵,结合别人现成的代码,比较容易看懂。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2014-3-9
在线时间
0 小时
 楼主| 发表于 2014-4-2 00:03:26 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,我还想问问,我单纯的用三角波(3.3v,50Hz)做ADC实验,我发现显示屏上显示的值并不是线性变化的,是采样时间设置的不好还是延时设置的不好呢?我试了好多延时参数都不理想,我想是不是延时设置的短了,变的快了看不出来,我又改了三角波的频率变大的也有变小的也有,延时200ms左右(这样能看清变化的趋势),但是还是不理想,请原子哥给个合适的参数。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-4-2 23:45:20 | 显示全部楼层
回复【3楼】小小哥小小哥:
---------------------------------
你的实测是什么效果?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2014-3-9
在线时间
0 小时
 楼主| 发表于 2014-4-4 10:39:09 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
目测着是不连续的值,还有显示0V的时候时间长,比如显示屏上每隔0.1s变换一个值,等变换到0v时就变成0.5s了,等过了0.5s后又接着每隔0.1s变换一个值,我理想是跟计时器似的那样连续递增或递减。
回复 支持 反对

使用道具 举报

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2014-3-9
在线时间
0 小时
 楼主| 发表于 2014-4-4 10:54:39 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥,还有如果求一个周期内的采样点数怎么求啊?跟12.5周期有关系吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-4-4 23:10:04 | 显示全部楼层
***回***复***【***5***楼***】*** ***小***小***哥***小***小***哥*** ***:*** ***
***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-*** ***
***根***据***你***的***周***期***,***和***A***D***C***采***样***时***间***+***转***换***时***间***,***就***确***定***了***采***样***点***数***。*** ***
***
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-12 19:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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