📄 main.c
字号:
#include <stdio.h>
#include <sys/unistd.h>
#include <math.h>
#include <string.h>
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#include "mydata.h"
#include "draw.h"
#include "main.h"
#include "math.h"
/*************************************************/
alt_u8 Logo_Txt[] = {"-==- 简 易 频 谱 分 析 仪 -==-"};
alt_u8 WaveGrid[GD_H][GD_W]; //频谱仪参考格子
alt_u16 OldWaveDat[WAVE_DOTS];
alt_u16 WaveDatBuff[WAVE_DOTS]; //波形缓冲区
alt_u32 Xr[WAVE_DOTS],Xi[WAVE_DOTS];
alt_u16 SampleTable[SAMPLE_RATES] = {48828,24414,9766,
4883, 2441, 977,
488, 244, 98 };
alt_u8 SampleRateTxt[] = {"分辨率:"};
alt_u8 SampleContext[SAMPLE_RATES][10] = {"1Hz/点 ", "2Hz/点 ", "5Hz/点 ",
"10Hz/点 ", "20Hz/点 ", "50Hz/点 ",
"100Hz/点", "200Hz/点", "500Hz/点"};
alt_u16 Frequence[SAMPLE_RATES] = {1, 2, 5, 10, 20, 50, 100, 200, 500};
alt_u8 ButtonTxt[] = {"按键操作说明"};
alt_u8 Operate_Txt[][15] = { "S1->增加分辨率", "S5->减小分辨率"};
alt_u8 Param_Txt[] = { "频率:"};
alt_u8 WaveTxt[][75] = { " 如果采用实验箱上的模拟信号源,请将高速ADC&DAC模块的跳线",
"放至“内”端;如果要使用外部信号源,则放至“外”段,然后从",
"ADC_IN输入信号,输入信号的峰峰值度不能超过2.5伏。"};
/*************************************************/
alt_u8 myButton;
alt_u8 Sample_Index;
alt_u8 KeyPressedFlag;
alt_u8 CalCount;
int main(void)
{
alt_u16 i;
printf("Exp24 - Simple Spectrum Analyser!\n");
DrawFillRect(0, 0, 640, 480, COLOR_BLACK);
DrawFillRect(WAVE_X - 16, WAVE_Y - 16, 432, 8, COLOR_YELLOW);
DrawFillRect(WAVE_X - 16, WAVE_Y + 328, 432, 8, COLOR_YELLOW);
DrawFillRect(WAVE_X - 17, WAVE_Y - 16, 8, 352, COLOR_YELLOW);
DrawFillRect(WAVE_X + 408, WAVE_Y - 8, 8, 336, COLOR_YELLOW);
Draw_Grid(WAVE_X, WAVE_Y); //初始化并显示示波器参考格子
//显示操作说明
DrawFillRect(HELP_X - 8, HELP_Y - 8, 144, 90, COLOR_PURPLE);
DisplayAnyString(ButtonTxt, HELP_X + 2, HELP_Y, COLOR_PURPLE, COLOR_RED);
for(i=0; i<2; i++)
DisplayAnyString(Operate_Txt[i], HELP_X + 1, HELP_Y + i*25 + 32, COLOR_PURPLE, COLOR_CYAN);
//显示标题和Logo图标
DisplayAnyString(Logo_Txt, 192, 16, COLOR_BLACK, COLOR_WHITE);
DrawFillRect(LOGO_X - 8, LOGO_Y - 8, 144, 88, COLOR_PURPLE);
Display_Pic(LOGO_X, LOGO_Y, 128, 72, mLogo, COLOR_RED);
//显示波形参数边框
DrawFillRect(PARAM_X - 8, PARAM_Y - 8, 144, 88, COLOR_PURPLE);
DisplayAnyString(Param_Txt, PARAM_X + 2, PARAM_Y + 8, COLOR_PURPLE, COLOR_YELLOW);
//初始化频谱仪频谱分辨率
Sample_Index = 3;
DisplayAnyString(SampleRateTxt, TV_X, TV_Y, COLOR_PURPLE, COLOR_YELLOW);
IOWR_ALTERA_AVALON_PIO_DATA(SAMPLE_RATE_BASE, SampleTable[Sample_Index]);
//其它说明
for(i=0; i<3; i++)
DisplayAnyString(WaveTxt[i], OTHER_X, OTHER_Y + i * 17, COLOR_BLACK, COLOR_CYAN);
for(i=0; i<GD_W; i++)
OldWaveDat[i] = 0x80;
Start_DFT_Once(); //启动一次外部数据采集和DFT变换
while(1)
{
if(IORD_ALTERA_AVALON_PIO_DATA(DFT_END_BASE))
{
Start_DFT_Once();
DFT();
Display_Wave(WAVE_X, WAVE_Y, OldWaveDat, COLOR_BLACK);
Draw_Grid(WAVE_X, WAVE_Y); //初始化并显示示波器参考格子
Display_Wave(WAVE_X, WAVE_Y, WaveDatBuff, COLOR_RED);
}
IOWR_ALTERA_AVALON_PIO_DATA(IRAM_ADDR_BASE, 0);
//计算波形参数
CalCount = (CalCount + 1) % 10;
if(CalCount == 0)
{
//----频率值
Cal_Disp_Freq(WaveDatBuff);
}
//按键处理
myButton = IORD_ALTERA_AVALON_PIO_DATA(EXT_BUTTON_BASE) & 0x03;
if(myButton != 0x03)
{
if(!KeyPressedFlag)
{
KeyPressedFlag = true;
switch(myButton)
{
case 0x02: Sample_Index = (Sample_Index + SAMPLE_RATES - 1) % SAMPLE_RATES;
break;
case 0x01: Sample_Index = (Sample_Index + 1) % SAMPLE_RATES;
break;
default: break;
}
IOWR_ALTERA_AVALON_PIO_DATA(SAMPLE_RATE_BASE, SampleTable[Sample_Index]);
}
}
else
KeyPressedFlag = false;
//显示当前时间轴信息
DisplayAnyString(SampleContext[Sample_Index], TV_X + 56, TV_Y, COLOR_PURPLE, COLOR_YELLOW);
usleep(20000);
}
return 0;
}
/*******************************************************/
void Display_Pic(alt_u16 x, alt_u8 y, alt_16 w, alt_u16 h, alt_u8 *bmp, alt_u16 color) //显示图片
{
alt_u16 i, j;
alt_u8 dot;
for(j=0; j<h; j++)
{
for(i=0; i<w; i++)
{
if(i%8 == 0)
dot = *bmp++;
if(dot & 0x80)
Draw_Pixel(x+i, y+j, color);
dot <<= 1;
}
}
}
/*******************************************************/
void Draw_Grid(alt_u16 xp, alt_u16 yp) //初始化并显示示波器参考格子
{
alt_u16 i, j;
alt_u16 grid_color = COLOR_GREEN;
//初始化格子:320*400
//边框
DrawLine(WAVE_X, WAVE_Y, WAVE_X+GD_W, WAVE_Y, grid_color);
DrawLine(WAVE_X, WAVE_Y+GD_H, WAVE_X+GD_W, WAVE_Y+GD_H, grid_color);
DrawLine(WAVE_X, WAVE_Y, WAVE_X, WAVE_Y+GD_H, grid_color);
DrawLine(WAVE_X+GD_W, WAVE_Y, WAVE_X+GD_W, WAVE_Y+GD_H, grid_color);
//内部虚线
for(j=0; j<GD_H; j+=40)
for(i=0; i<GD_W; i+=8)
Draw_Pixel(xp+i, yp+j, grid_color);
//内部虚线
for(j=0; j<GD_H; j+=8)
for(i=0; i<GD_W; i+=40)
Draw_Pixel(xp+i, yp+j, grid_color);
//加粗中心线
for(i=0; i<GD_W; i+=8)
{
Draw_Pixel(xp+i, yp+GD_H/2-1, grid_color);
Draw_Pixel(xp+i, yp+GD_H/2+1, grid_color);
}
for(i=0; i<GD_W; i+=4)
Draw_Pixel(xp+i, yp+GD_H/2, grid_color);
for(i=0; i<GD_H; i+=8)
{
Draw_Pixel(xp+GD_W/2-1, yp+i, grid_color);
Draw_Pixel(xp+GD_W/2+1, yp+i, grid_color);
}
for(i=0; i<GD_H; i+=4)
Draw_Pixel(xp+GD_W/2, yp+i, grid_color);
}
void Start_DFT_Once(void) //启动一次DFT变换
{
IOWR_ALTERA_AVALON_PIO_DATA(IRAM_ADDR_BASE, 0x3ff);
IOWR_ALTERA_AVALON_PIO_DATA(IRAM_ADDR_BASE, 0);
}
void DFT(void) //读取数据并计算幅值
{
alt_u32 i;
alt_u32 xr_temp,xi_temp,temp;
for(i=0; i<WAVE_DOTS; i++)
{
IOWR_ALTERA_AVALON_PIO_DATA(IRAM_ADDR_BASE, i);
Xr[i] = (IORD_ALTERA_AVALON_PIO_DATA(IRAM_DAT_BASE)>>15);
IOWR_ALTERA_AVALON_PIO_DATA(IRAM_ADDR_BASE, i + 0x200);
Xi[i] = (IORD_ALTERA_AVALON_PIO_DATA(IRAM_DAT_BASE)>>15);
xr_temp = Xr[i]*Xr[i];
xi_temp = Xi[i]*Xi[i];
temp = sqrt(xr_temp + xi_temp);
WaveDatBuff[i] = temp;
}
}
void Display_Wave(alt_u16 xp, alt_u16 yp, alt_u16 *wave, alt_u16 color) //显示波形
{
alt_u16 i,k;
alt_u16 m, n;
OldWaveDat[0] = *wave;
m = *wave++ + 2;
for(i=1; i<GD_W; i++)
{
OldWaveDat[i] = *wave;
n = *wave++ + 2;
for(k=m;k<=n;k++)
Draw_Pixel(xp+i, yp+GD_H-k, color);
for(k=n;k<=m;k++)
Draw_Pixel(xp+i, yp+GD_H-k, color);
m = n;
}
}
void FillBlank(alt_u8 *buff)
{
alt_u8 i=0;
while(buff[i] <= '0')
{
buff[i++] = ' ';
if(buff[i] > '0')
break;
}
}
//----频率值
void Cal_Disp_Freq(alt_u16 *buff)
{
alt_u16 i;
alt_u32 freq_rst;
alt_u16 temp;
alt_u8 freq[8] = {" KHz"};
alt_u16 max_value = 0;
alt_u16 max_pos;
for(i=WAVE_DOTS; i>0; i--)
{
if(buff[i-1] > max_value)
{
max_pos = i - 1;
max_value = buff[i-1];
}
}
freq_rst = max_pos * Frequence[Sample_Index];
if(freq_rst < 10000) //<10KHz
{
temp = 1000;
for(i=0; i<4; i++)
{
freq[i+1] = freq_rst/temp + '0';
freq_rst %= temp;
temp /= 10;
}
}
else if(freq_rst < 100000) //<100KHz)
{
freq_rst /= 100;
temp = 100;
for(i=0; i<3; i++)
{
freq[i] = freq_rst/temp + '0';
freq_rst %= temp;
temp /= 10;
}
freq[3] = freq[2];
freq[2] = '.';
}
else //>=100KHz
{
freq_rst /= 1000;
temp = 100;
for(i=0; i<3; i++)
{
freq[i+1] = freq_rst/temp + '0';
freq_rst %= temp;
temp /= 10;
}
}
FillBlank(freq);
DisplayAnyString(freq, PARAM_X + 48, PARAM_Y + 8, COLOR_PURPLE, COLOR_YELLOW);
}
/************************************************************/
alt_u8 mLogo[128*72] = {
/*-- 宽度x高度=128x72 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xF0,0x00,0x00,0x00,0x3F,0xFE,0x00,0x00,
0x00,0x7F,0xFF,0xFF,0xC0,0x00,0x07,0xFF,0xFC,0x00,0x00,0x01,0xFF,0xFF,0x80,0x00,
0x00,0x7F,0xFF,0xFF,0xF0,0x00,0x1F,0xFF,0xFE,0x00,0x00,0x07,0xFF,0xFF,0xE0,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x7F,0xFF,0xFF,0xFC,0x00,0x3F,0xFF,0xFF,0x80,0x00,0x1F,0xFF,0xFF,0xF8,0x00,
0x00,0x7F,0xFF,0xFF,0xFE,0x00,0x7F,0xFF,0xFF,0x80,0x00,0x3F,0xFF,0xFF,0xFC,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x7F,0xFF,0xFF,0xFF,0x00,0x7F,0xE1,0xFF,0x80,0x00,0x7F,0xFF,0xFF,0xFE,0x00,
0x00,0x7F,0xFF,0xFF,0xFF,0x00,0x7F,0xC0,0xFF,0x80,0x00,0xFF,0xFE,0x7F,0xFF,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x7F,0xF0,0x0F,0xFF,0x00,0x7F,0xE1,0xFF,0x80,0x00,0xFF,0xF0,0x0F,0xFF,0x00,
0x00,0x7F,0xF0,0x07,0xFF,0x00,0x7F,0xF7,0xFF,0x00,0x01,0xFF,0xE0,0x0F,0xFE,0x00,
0x00,0x7F,0xF0,0x0F,0xFF,0x00,0x3F,0xFF,0xFE,0x00,0x01,0xFF,0xE0,0x0F,0xC0,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x7F,0xFF,0xFF,0xFF,0x00,0x1F,0xFF,0xF8,0x00,0x01,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x7F,0xFF,0xFF,0xFE,0x00,0x0F,0xFF,0xE0,0x00,0x01,0xFF,0xC0,0x00,0x00,0x00,
0x00,0x7F,0xFF,0xFF,0xFE,0x00,0x3F,0xFF,0x80,0x00,0x01,0xFF,0xC0,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x7F,0xFF,0xFF,0xF8,0x01,0xFF,0xFF,0xE3,0xF0,0x01,0xFF,0xC0,0x00,0x00,0x00,
0x00,0x7F,0xFF,0xFF,0xF0,0x03,0xFF,0xFF,0xF3,0xFF,0x01,0xFF,0xC0,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x7F,0xFF,0xFF,0xE0,0x07,0xFF,0x3F,0xFF,0xFF,0x01,0xFF,0xE0,0x07,0x00,0x00,
0x00,0x7F,0xF3,0xFF,0xF0,0x0F,0xFE,0x1F,0xFF,0xFE,0x01,0xFF,0xE0,0x0F,0xF0,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x7F,0xF0,0x7F,0xFC,0x0F,0xFC,0x0F,0xFF,0xFC,0x01,0xFF,0xE0,0x0F,0xFF,0x00,
0x00,0x7F,0xF0,0x3F,0xFE,0x0F,0xFC,0x07,0xFF,0xFC,0x00,0xFF,0xF0,0x1F,0xFF,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x7F,0xF0,0x1F,0xFF,0x0F,0xFE,0x00,0xFF,0xFE,0x00,0x7F,0xFC,0xFF,0xFE,0x00,
0x00,0x7F,0xF0,0x1F,0xFF,0x0F,0xFF,0x01,0xFF,0xFF,0x80,0x7F,0xFF,0xFF,0xFE,0x00,
0x00,0x7F,0xF0,0x0F,0xFF,0x8F,0xFF,0xCF,0xFF,0xFF,0xC0,0x3F,0xFF,0xFF,0xFC,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x7F,0xF0,0x07,0xFF,0xC7,0xFF,0xFF,0xFF,0xFF,0xC0,0x1F,0xFF,0xFF,0xF8,0x00,
0x00,0x7F,0xF0,0x07,0xFF,0xC3,0xFF,0xFF,0xFF,0xFF,0x80,0x0F,0xFF,0xFF,0xF0,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x7F,0xF0,0x03,0xFF,0xE0,0x7F,0xFF,0xF0,0x7E,0x00,0x01,0xFF,0xFF,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0x80,0x1C,0x00,0x00,0x3F,0xFE,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,
0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,
0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,
0x00,0x7F,0xFE,0x00,0x00,0x7C,0x84,0x00,0x00,0x7F,0x88,0x00,0x00,0x0C,0x02,0x00,
0x00,0x01,0x00,0x00,0x00,0x10,0x44,0x00,0x00,0x00,0x3E,0x00,0x00,0x12,0x12,0x00,
0x00,0x02,0x00,0x00,0x00,0x10,0x24,0x00,0x00,0x3F,0x2A,0x00,0x00,0x11,0x12,0x00,
0x00,0x1F,0xF8,0x00,0x00,0x10,0x14,0x00,0x00,0x41,0x2A,0x00,0x00,0x20,0x92,0x00,
0x00,0x20,0x04,0x00,0x00,0x7F,0x0C,0x00,0x00,0x3F,0x2A,0x00,0x00,0xDE,0x52,0x00,
0x00,0x20,0x04,0x00,0x00,0x18,0x84,0x00,0x00,0x00,0x2A,0x00,0x00,0x21,0x12,0x00,
0x00,0x20,0x04,0x00,0x00,0x14,0x44,0x00,0x00,0x7F,0x2A,0x00,0x00,0x21,0x12,0x00,
0x00,0x20,0x04,0x00,0x00,0x34,0x24,0x00,0x00,0x52,0xAA,0x00,0x00,0x21,0x12,0x00,
0x00,0x3F,0xFC,0x00,0x00,0x32,0x04,0x00,0x00,0x54,0xAA,0x00,0x00,0x21,0x12,0x00,
0x00,0x20,0x04,0x00,0x00,0x50,0x0E,0x00,0x00,0x5E,0x9C,0x00,0x00,0x27,0x12,0x00,
0x00,0x20,0x04,0x00,0x00,0x13,0xF4,0x00,0x00,0x68,0x8C,0x00,0x00,0x20,0x52,0x00,
0x00,0x20,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x48,0x8A,0x00,0x00,0x20,0x42,0x00,
0x00,0x20,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x48,0xBE,0x00,0x00,0x20,0x42,0x00,
0x00,0x3F,0xFC,0x00,0x00,0x10,0x04,0x00,0x00,0x43,0xC1,0x00,0x00,0x1F,0x9C,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -