我这是在ADC实验基础上做的程序,编译没错,但是运行到
LCD_ShowString(60,130,"ADC_CH0_VAL1:"); 这句就不运行了,因为最后屏幕上显示的是
ADC_CH0_VAL1 :(像ADC_CH0_VAL11,
ADC_CH0_VAL2等是为了验证运行的位置).
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "usart.h"
#include "wdg.h"
#include "timer.h"
#include "pwm.h"
#include "lcd.h"
#include "adc.h"
#include "math.h"
#include "stdio.h"
//ALIENTEK Mini STM32开发板范例代码13
//ADC 实验
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
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 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 ;
}
float result[200];
struct compx s[200];
const int Num=100;
const float pi=3.14159;
long int f=5000,fs=50,fv;
int t;
float max,module;
float door=0.01,module_test[200],mid_m;
int kav,fv_test[200],mid_f;
int main(void)
{
int i;
u16 adcx;
float temp;
SystemInit(); //系统时钟初始化为72M SYSCLK_FREQ_72MHz
delay_init(72); //延时初始化
NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600); //串口初始化为9600
LED_Init(); //LED端口初始化
KEY_Init(); //初始化与按键连接的硬件接口
LCD_Init();
Adc_Init();
POINT_COLOR=RED;//设置字体为红色
LCD_ShowString(60,50,"Mini STM32");
LCD_ShowString(60,70,"ADC TEST");
LCD_ShowString(60,90,"ATOM@ALIENTEK");
LCD_ShowString(60,110,"2010/12/30");
//显示提示信息
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(60,130,"ADC_CH0_VAL:");
LCD_ShowString(60,150,"ADC_CH0_VOL:0.000V");
for(i=0;i<100;i++)
{
adcx=Get_Adc(ADC_Channel_0);
LCD_ShowNum(156,130,adcx,4,16);//显示ADC的值
temp=(double)adcx*(3.3/4096);
adcx=temp;
LCD_ShowNum(156,150,adcx,1,16);//显示电压值
//temp-=adcx;
// temp*=1000;
// LCD_ShowNum(172,150,temp,3,16);
LED0=!LED0;
delay_us(200);
s.real=adcx;
s.imag=0;
}
LCD_ShowString(60,130,"ADC_CH0_VAL1:");
运行到这里就不运行了。
FFT(s,Num);
LCD_ShowString(60,130,"ADC_CH0_VAL11:");
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));
}
LCD_ShowString(60,130,"ADC_CH0_VAL2:");
max=result[0];
for(i=1;i<Num;i++)
{
if(max<result)
{
max=result;
t=i;
}
}
LCD_ShowString(60,130,"ADC_CH0_VAL3:");
module=max/(Num/2);
//printf("module=%f",module);
fv=f*t/Num;
//printf("fv=%d",fv);
LCD_ShowString(60,130,"ADC_CH0_VAL4:");
LCD_ShowNum(156,130,fv,4,16);
//LCD_ShowNum(156,150,module,1,16);
LCD_ShowString(60,130,"ADC_CH0_VAL5:");
} |