dsp课程设计报告Word文档格式.docx
《dsp课程设计报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《dsp课程设计报告Word文档格式.docx(38页珍藏版)》请在冰豆网上搜索。
以此加强了对DSP功能的认识,复习了AltiumDesigner软件的使用方法。
并在此基础上利用CCS软件编程实现A/D采集,FFT变换处理,低通滤波,显示滤波成分等功能的完整的小型数字处理系统。
二系统分析
1.1设计要求
(1)硬件设计要求
设计一个功能完备的,能够独立运行的精简DSP硬件系统,使用AltiumDesigner绘制出系统原理图和PCB图。
(2)软件设计要求
利用实验箱的模拟信号产生单元产生不同频率的信号,或者产生两个频率的信号叠加。
在DSP中采集信号,并且对信号进行频谱分析,滤波等。
通过串口命令选择算法功能,将计算的信号频率或者滤波后的信号频率在LCD上显示。
1.2主要任务
(1)DSP硬件系统设计
设计DSP基本结构并绘制单片机最小系统原理图和PCB图。
(2)数据采集处理和控制系统设计
利用CCS软件编程实现数据采集x(n)→对数据FFT处理、分析频率成分→根据频率成
分设计FIR低通滤波器h(n)→卷积x(n)*h(n)=y(n)得到滤波之后的信号→分析滤波之后y(n)的频率成分→LCD显示高频,低频和滤波器的截止频率。
三硬件设计
3.1硬件总体结构
1
图1硬件总体结构
本次实验使用TMS320VC5416芯片作为主芯片。
外围电路包括:
电源、复位电路、时钟发生器(外接晶振或外接晶体)、、外部存储器FLASH、仿真接口电路JTAG、外部中断(不用:
上拉)、I/O(不用:
输出悬空,输入上拉)与主机通信的并行接口HPI(不用:
悬空)。
(1)原理图设计
图2单片机最小系统原理图
(2)PCB板设计
图3PCB图
(1)
图4PCB图
(2)
如图所示,由于其右上部分地址线和数据线较多,铺铜不方便,所以Vcore层分布在TM320VC5416芯片的左下部分。
+3.3V为顶层红色部分,GND为底层蓝色部分。
3.2DSP模块设计
图5 DSP模块
(1)
上图为TMS320VC5416芯片的设计,该芯片不用的输入引脚要拉高,输出引脚悬空。
①本设计用到了该芯片的数据信号线,初始化、中断和复位线,部分存储器控制信号线,部分振荡器/定时信号线,串口信号线,电源引脚线和JTAG测试引脚线。
②主CPU每个电源管脚旁边都有一个0.1uF的去耦电容,去耦电容可以提供较稳定的电源,同时也可以降低元件耦合到电源端的噪声,间接可以减少其他元件受此元件噪声的影响。
③CLKMOD1、CLKMOD2、CLKMOD3分别接1、1、0,表示锁相环一倍频
图6DSP模块
(2)
图6DSP模块(3)
3.3电源模块设计
图7电源模块
73HD316为DC-DC转换芯片,将+5V电压转换成Vcore和+3.3V电压,电源和地之间要接滤波电容。
Vcore为内核电压,+3.3V为外设电压,这样可以减小功耗。
3.4时钟模块设计
图8时钟模块
10MHZ晶振的输出接到TM320VC5416芯片的X2/CLKIN管脚,芯片的X1悬空,即使用外部晶振。
3.5存储器模块设计
图9存储器模块
存储器的数据线和地址线分别接CPU的数据线和地址线。
DSP控制信号R/W_L接FLASH的WE_L和OE表示DSP向FLASH写和从FLASH读有效。
当DSP从FLASH读时,DSP输出高电平,但FLASH的OE为低有效,应接一个非门。
3.6复位电路设计
图10复位电路
如图所示有两种复位方法:
(1)上电复位,利用RC的延迟特性,刚开始上电,由于电容电压不能突变,RESET处为低,直到电容充电完毕,变高,实现复位;
(2)手动复位,S1闭合,电容放电,电平变低,断开,电容充电过程与上电复位相同,实现复位。
发光二极管用来表示DSP的工作状态三个电源是否正常工作。
3.7仿真接口电路设计
图11仿真接口电路
JTAG仿真接口,用于将外部的程序、数据导入DSP内部,完成运算处理。
是外部存储器与DSP的一个媒介。
四软件设计
4.1软件总体流程
4.2核心模块及实现代码
(1)主要代码
//------------------头文件--------------------------------------
#include"
DspRegDefine.h"
//VC5402寄存器定义
stdio.h"
//输入输出接口定义
math.h"
//数学计算定义
//---------------------------------------------------------------
/*******************宏定义***************
************************************************************
*/
#defineUCHARunsignedchar
#defineUINT16unsignedint
#defineUINT32unsignedlong
#defineTRUE1
#defineFALSE0
#defineLength256//FFT的点数
//---------------LCD指令-----------------------------
//基本指令集RE=0
#defineCLEAR0x0001//清除显示
#defineRESAC0x0002//位址歸位
#defineSETPOINT0x0006//進入點設定,游標右移,DDRAM位址計數器(AC)加1
#defineCURSOR0x000F//整體顯示,游標顯示,游標位置反白
#defineMCURSOR0x0014//游標向右移動,AC=AC+1
#defineFUCSET0x0030//功能設定,BITMPU控制界面,基本指令集,默认设置
#defineCGRAMAC0x0040//設定CGRAM位址
#defineDDRAMAC0x0080//設定DDRAM位址
//第一行AC範圍為80H..8FH
//第二行AC範圍為90H..9FH
//第三行AC範圍為A0H..AFH
//第四行AC範圍為B0H..BFH
//#defineREADBFRS=0,RW=1,DB7,DB6,DB5,DB4,DB3,DB2,DB1,DB0
//BFAC6AC5AC4AC3AC2AC1AC0
//讀取忙碌旗標(BF)和位址
//就是读取指令寄存器,PORT8006,BF=1,表示LCD忙碌
//#defineWRITERAMRS=1,RW=0,DB7,DB6,DB5,DB4,DB3,DB2,DB1,DB0
//D7D6D5D4D3D2D1D0
//寫入資料到RAM
//就是写数据寄存器:
PORT8005
//#defineREADRAMRS=1,RW=1,DB7,DB6,DB5,DB4,DB3,DB2,DB1,DB0
//讀取RAM的值
//就是从数据寄存器讀取資料,PORT8007
//擴充指令集RE=1
#defineIDLE0x01//待命模式
#defineCGRAMSET0x02//捲動位址或RAM位址選擇
#defineREVERSE0x04//反白選擇
#defineSLEEP0x0c//脫離睡眠模式
#defineEFUCSET0x66//擴充功能設定,8BITMPU控制界面,為擴充指令集動作,繪圖顯示ON
#defineSISA0x40//設定IRAM位址或捲動位址
#defineSETGDRAM0x80//設定繪圖RAM位址
//---------------------------------------------------------
/*端口定义*/
ioportUINT16port8002;
//定义输出AD端口为0x8002;
ioportUINT16port8004;
//写指令寄存器
ioportUINT16port8005;
//写数据寄存器
ioportUINT16port8006;
//读指令寄存器
ioportUINT16port8007;
//读数据寄存器
//----------------------------------------------------------
/*全局变量定义*/
intin_x[Length];
//数据缓冲数组Length
inti=0;
ints,m=0;
intintnum=0;
intflag=0;
//采集Length点的标志
doublexavg;
doublex[Length],mo[Length],mo2[Length],pr[Length],pi[Length];
intn,l,il;
intk=8;
//k为Length相对于2的幂次
doubledata_kfft[Length];
//数据缓冲256个数组
doubledata_re[Length];
doubledata_im[Length];
doubledata_buffim[Length];
doubledata_out[256];
doubledata_temp[256];
doubledata_out1[256];
doubleh[51];
intx1=0;
intx2=0;
doublefhz=0;
doublef1;
doublef2;
doublewc=0;
inti;
UINT16temp;
UCHARdata_buff1[10]="
低频:
"
;
UCHARdata_buff2[10]="
高频:
UCHARdata_buff3[10]="
滤波:
UCHARdata_buff4[16]="
liru12052203"
UCHARnum[11]="
0123456789."
inta;
intb;
intc;
intd;
/*
**********************************************************************
***************所使用的函数原型*****************
voidcpu_init(void);
//初始化CPU
voidDelay(UINT16numbers);
//延迟
voidxint2_init(void);
//外部中断2初始化子程序
voidkfft(doublepr[Length],doublepi[Length],intn,intk,doublefr[Length],doublefi[Length],intl,intil);
//基2快速傅立叶变换子程序
interruptvoidExtInt2();
//中断2中断子程序
voidfirdes(doublenpass);
//fir
voidConvolveok(//卷积函数
double*x,//原始输入数据
double*h,//冲击响应
double*y,//卷积输出结果
UINT16length,//序列长度
UINT16fLen
);
externvoiddelay_100us(void);
//100us延迟--指令之间的延迟
externvoiddelay_1us(void);
//1us延迟--时钟之间的延迟
voiddelay_50ms(void);
//50ms延迟--复位延迟
voiddelay_20ms(void);
//20ms延迟--清屏延迟
voidSendByte(UCHARdat);
//串行发送一字节数据
voidSendCMD(UCHARdat);
//写指令寄存器
voidSendDat(UCHARdat);
//写显示数据或单字节字符
voidDisplay(UCHARx_add,UCHARdat1,UCHARdat2);
//写汉字到LCD指定的位置
voidInitlcm(void);
//初始化LCM
//-------------------------------------------------------------------
************************************************************************
***********************函数定义******************
//--------------------------------------------------------------------
//函数名称:
voidcpu_init(void)
//函数说明:
初始化CPU
//输入参数:
无
//输出参数:
voidcpu_init(void)
{
asm("
nop"
//-------------------------------------------------------------------
//--------------------------------------------------------------------
*(unsignedint*)CLKMD=0x0;
//switchtoDIVmodeclkout=1/2clkin
while(((*(unsignedint*)CLKMD)&
01)!
=0);
*(unsignedint*)CLKMD=0x77ff;
//switchtoPLLX3mode
/*---------------------------------------------------------------------*/
*(unsignedint*)PMST=0x3FF2;
//---------------------------------------------------------------------
/*--------------------------------------------------------------------*/
*(unsignedint*)SWWSR=0x7fff;
*(unsignedint*)SWCR=0x0001;
*(unsignedint*)BSCR=0xf800;
ssbxintm"
//Disableallmaskinterrupts
*(unsignedint*)IMR=0x0;
/*--------------------------------------------------------------------*/
*(unsignedint*)IFR=0xffff;
}
***********************************************************
-函数名称:
voidDelay(intnumbers)
-函数说明:
延时
-输入参数:
numbers
-输出参数:
voidDelay(UINT16numbers)
UINT16i,j;
for(i=0;
i<
4000;
i++)
for(j=0;
j<
numbers;
j++);
}
//---------------------------------------------------