?? 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 + -