📄 fft_240128.c
字号:
/********16位ad函数*************
sclk 接PD2
DOUT 接PD1
CONV 接PD3
EOC 接PD0
cs 接PD4
*******************************/
#define uint unsigned int
#define uchar unsigned char
#include <avr/io.h>
#include <util/delay.h> //头文件
#include <avr/pgmspace.h> //空间分配定义头文件
#include "240128.h"
#include "ffft.h"
union _my_complex_t {
complex_t bfly_buff[FFT_N];
uint8_t lcd_buff[FFT_N * 4];
} my_complex_t ;
int16_t capture[FFT_N]; /* Wave captureing buffer */
//complex_t bfly_buff[FFT_N]; /* FFT buffer */
uint16_t spektrum[FFT_N/2]; /* Spectrum output buffer */
/*-----------------------------------------------------------------------
延时函数
系统时钟:8M
-----------------------------------------------------------------------*/
void delay_1us(void) //1us延时函数
{
asm("nop");
asm("nop");
}
void delay_nus(unsigned int n) //N us延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1us();
}
void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for (i=0;i<1140;i++);
}
void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1ms();
}
/**********位操作函数*********/
void set_sclk(uchar i)//clk 接PA2
{
if(i)
PORTD|=0x04;
else
PORTD&=0xfb;
}
void set_conv(uchar i)
{
if(i)
PORTD|=0x08;
else
PORTD&=0xf7;
}
void set_cs(uchar i)
{
if(i)
PORTD|=0x10;
else
PORTD&=0xEF;
}
/*********m16初始化**********/
void m16_init(void)
{
DDRD|=0Xfc;
DDRD&=0Xfc;//定义pa1 pa2 为输入,其他引脚为输出
DDRE=0Xff;
DDRF=0Xff;
DDRG=0Xff;
DDRB=0Xff;
DDRC=0Xff;
DDRA=0Xff;//端口初始化
//PORTD|=0X03;//定义pa1 pa2为带上拉输入
//CLI();//关中断
}
/********max195初始化********/
void max195_inital(void)
{
set_cs(1);
set_sclk(0);
}
/**********************
max195转换开始
**********************/
void max195_start(void)
{
set_conv(0);//,启动转换
delay_nus(100);
set_conv(1);
}
/***********************/
uint max195_read(void)
{ uint num2=0;
uchar num1=0,k;
while((PIND&0x01)==0x01);
set_cs(0);
for(k=0;k<16;k++)
{
set_sclk(1);
delay_1us();
if((PIND&0x02)==0x02)//判断pa1是否为1
{
num1=1;
//PORTA|=0x20;
}
else
{
num1=0;
//PORTA&=0xdf;
}
num2=num2*2+num1;
set_sclk(0);//下降沿锁存下一位
delay_nus(3);
}
return num2;
}
static void avr_init(void);
/***************************************************/
void capture_wave (int16_t *buffer, uint16_t count)
{
uint16_t dat=0;
do {
max195_start();
delay_nus(5);//必须加一段延时
dat=max195_read();
*buffer++ = dat;//vref是avcc
} while(--count);
ADCSRA = 0;
// sei();
}
int main(void)
{
uint average_dat[128]={0};
uchar i=0,j=0,k=0;
float average=0.0;
volatile float v=0.0;
m16_init();
avr_init();
max195_inital();
while(1)
{
capture_wave(capture, FFT_N);
fft_input(capture, my_complex_t.bfly_buff);
fft_execute(my_complex_t.bfly_buff);
fft_output(my_complex_t.bfly_buff, spektrum);
for(i=0;i<240;i++)
{
k=spektrum[i]/512;
glcd_pixel(i,k,1);
}
//glcd_show(testbmp,0,127);
//delay_nms(1000);
glcd_clear_ram();
}
}
static void avr_init(void)
{
glcd_setup();
glcd_init();
glcd_clear_ram();
glcd_clear_text();
glcd_clear_graph();
return;
}
//************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -