DSP能力培训课题报告Word下载.docx
《DSP能力培训课题报告Word下载.docx》由会员分享,可在线阅读,更多相关《DSP能力培训课题报告Word下载.docx(30页珍藏版)》请在冰豆网上搜索。
![DSP能力培训课题报告Word下载.docx](https://file1.bdocx.com/fileroot1/2023-1/25/d40fac3b-3f75-404d-93b1-70a30a587a8d/d40fac3b-3f75-404d-93b1-70a30a587a8d1.gif)
三、指导教师评语
四、成绩
指导教师(签章)
年月日
第一章DSP概述
1.1DSP简介
DSP通常指的是执行这些功能的芯片或处理器。
广义来说,数字信号处理(DigitalSignalProcessing,简称DSP)技术是指数字信号处理理论的应用实现技术,它以数字信号处理理论、硬件技术、软件技术为基础和组成,研究数字信号处理算法及其实现方法。
而DSP芯片即指能够实现数字信号处理技术的芯片。
DSP的实现方法一般有以下几种:
⑴在通用的计算机(如PC机)上用软件(如Fortran、C语言)实现;
⑵在通用计算机系统中加上专用的加速处理机实现;
⑶用通用的单片机(如MCS-51、96系列等)实现,这种方法可用于一些不太复杂的数字信号处理,如数字控制等;
⑷用通用的可编程DSP实现。
与单片机相比,DSP芯片具有更加适合于数字信号处理的软件和硬件资源,可用于复杂的数字信号处理算法;
⑸用专用的DSP芯片实现。
在一些特殊的场合,要求的信号处理速度极高,用通用DSP芯片很难实现,例如专用于FFT、数字滤波、卷积、相关等算法的DSP芯片,这种芯片将相应的信号处理算法在芯片内部用硬件实现,无需进行编程。
在上述几种方法中,第1种方法的缺点是速度较慢,一般可用于DSP算法的模拟;
第2种和第5种方法专用性强,应用受到很大的限制,第2种方法也不便于系统的独立运行;
第3种方法只适用于实现简单的DSP算法;
只有第4种方法才使数字信号处理的应用打开了新的局面。
1.2DSP芯片的分类及应用
DSP芯片的内部采用程序和数据分开的哈佛结构,具有专门的硬件乘法器,广泛采用流水线操作,提供特殊的DSP指令,可以用来快速的实现各种数字信号处理算法。
根据数字信号处理的要求,DSP芯片一般具有如下的一些主要特点:
1在一个指令周期内可完成一次乘法和一次加法;
图1-1CPU原理结构
⑵程序和数据空间分开,可以同时访问指令和数据;
⑶片内具有快速RAM,通常可通过独立的数据总线在两块中同时访问;
⑷具有低开销或无开销循环及跳转的硬件支持;
⑸快速的中断处理和硬件I/O支持;
⑹具有在单周期内操作的多个硬件地址产生器;
⑺可以并行执行多个操作;
⑻支持流水线操作,使取指、译码和执行等操作可以重叠执行,等。
与通用微处理器相比,DSP芯片的其他通用功能相对较弱些。
图1-2DSP芯片实物
图1-3DSP芯片内部结构
DSP芯片可以按照下列三种方式进行分类。
1.按基础特性分
这是根据DSP芯片的工作时钟和指令类型来分类的。
如果在某时钟频率范围内的任何时钟频率上,DSP芯片都能正常工作,除计算速度有变化外,没有性能的下降,这类DSP芯片一般称为静态DSP芯片。
例如,日本OKI电气公司的DSP芯片、TI公司的TMS320C2XX系列芯片属于这一类。
如果有两种或两种以上的DSP芯片,它们的指令集和相应的机器代码机管脚结构相互兼容,则这类DSP芯片称为一致性DSP芯片。
例如,美国TI公司的TMS320C54X就属于这一类。
2.按数据格式分
这是根据DSP芯片工作的数据格式来分类的。
数据以定点格式工作的DSP芯片称为定点DSP芯片,如TI公司的TMS320C1X/C2X、TMS320C2XX/C5X、TMS320C54X/C62XX系列,AD公司的ADSP21XX系列,AT&
T公司的DSP16/16A,Motolora公司的MC56000等。
以浮点格式工作的称为浮点DSP芯片,如TI公司的TMS320C3X/C4X/C8X,AD公司的ADSP21XXX系列,AT&
T公司的DSP32/32C,Motolora公司的MC96002等。
不同浮点DSP芯片所采用的浮点格式不完全一样,有的DSP芯片采用自定义的浮点格式,如TMS320C3X,而有的DSP芯片则采用IEEE的标准浮点格式,如Motorola公司的MC96002、FUJITSU公司的MB86232和ZORAN公司的ZR35325等。
3.按用途分
按照DSP的用途来分,可分为通用型DSP芯片和专用型DSP芯片。
通用型DSP芯片适合普通的DSP应用,如TI公司的一系列DSP芯片属于通用型DSP芯片。
专用DSP芯片是为特定的DSP运算而设计的,更适合特殊的运算,如数字滤波、卷积和FFT,如Motorola公司的DSP56200,Zoran公司的ZR34881,Inmos公司的IMSA100等就属于专用型DSP芯片
目前,DSP芯片主要应用于信号处理、图像处理、仪器、声音语言、控制、军事、通讯、医疗、家用电器等领域。
第二章CCS软件的使用
本次课题任务编程所需要的编程软件使用的是CCS4.0版本,DSP硬件仿真器为XDS100V2,TMS320F2812CPU板。
2.1工程创建
第一步:
菜单“File→New→CCSProject(中文版本:
文件→新建→CCS项目)”如下图2-1所示。
图2-1工程创建
第二步:
在“ProjectName(项目名称)”字段中,键入新项目的名称。
若选中“Usedefaultlocation(使用默认位置)”选项(默认启用),将会在工作区文件夹中创建项目。
取消选中该选项可以选择一个新位置(使用“Browse...(浏览...)”按钮)。
将项目命名为“first”。
第三步:
在“Target”菜单中选择要使用的芯片类型。
第四步:
在“Connetion”里选择调试器。
第五步:
单击“Finish(完成)”创建项目。
如图2-2所示。
图2-2工程创建
第六步:
要为项目创建文件,请在“C/C++Projects(C/C++项目)”(路径:
工具栏Window→ShowView→Other下的C/C++→C/C++Projects)视图中右键单击项目名称,并选择“New→SourceFile(新建→源文件)”。
在打开的文本框中,键入包含与源代码类型对应的有效扩展名(.c、.C、.cpp、.c++、.asm、.s64、.s55等)的文件名称。
单击“Finish(完成)”。
在创建了项目并且添加或创建了所有文件之后,需要生成项目。
只需转到菜单“Project→BuildActiveProject(项目→生成活动项目)”。
注意需要添加头文件等必要操作。
建立完成后的工程界面如图2-3所示。
图2-3工程界面
2.2仿真操作
建立一个TMS320F2812芯片和XDS100V2的配置文件,启动并连接上,然后将视图切换到“CCSEdit”下,将导入的工程的CMD文件从“2812.cmd(烧写所用CMD文件)”替换成“2812_RAM_lnk.cmd(仿真所用CMD文件)”,然后右击工程选择“BuildProject”进行编译,编译没有错误后会在Workspace(工作区间)的工程文件夹下的Debug文件夹里产生一个.out文件),加载这个“.out”文件后即可进行仿真操作,详细操作见下图2-4所示。
图2-4仿真操作
CMD文件更改过后,将视图切换到“CCSDebug”视图下进行工程的加载(步骤:
点击“工具栏Run→Load→LoadProgram”),详见下图2-5所示。
图2-5仿真操作
接着在出现的对话框里进行如下图2-6所示操作。
图2-6仿真操作
加载完成后点击运行,即可观察到开发板上的现象。
第三章CPU和EVA定时器的使用
本章将描述如何采用CPU定时器和EVA定时器控制LED灯的亮灭时间间隔,以及如何采用中断按键切换此两种模式。
3.1GPIO寄存器
DSP2812GPIO模块分为三类I/O口。
对GPIO模块的设置主要通过三类寄存器来完成,分别是:
控制寄存器、数据寄存器、中断寄存器。
1.控制寄存器
GPxCTRL;
//GPIOxControlRegister(GPIO0to31)
//设置采样窗周期T=2*GPXCTRL*Tsysclk;
GPxQSEL1;
//GPIOxQualifierSelect1Register(GPIO0to15)(32-47)
GPxQSEL2;
//GPIOxQualifierSelect2Register(GPIO16to31)(48-63)//每两位控制
//一个引脚,确定是3周期采样还是6周期采样或者不用采样
GPxMUX1;
//GPIOxMux1Register(GPIO0to15)(32-47)(64-79)
GPxMUX2;
//GPIOxMux2Register(GPIO16to31)(48-63)(80-95)
//配置各个引脚的功能,0:
I/O功能,1:
外设功能。
GPxDIR;
//GPIOxDirectionRegister(GPIO0to31)(32-63)(64-95)
//配置每个引脚是输入还是输出,0:
数字量输入;
1:
数字量输出。
GPxPUD;
//GPIOxPullUpDisableRegister(GPIO0to31)(32-63)(64-95)
//使能或禁止内部上拉0:
开启上拉,1:
禁止上拉
2.数据寄存器
GPxDAT;
//GPIODataRegister(GPIO0to31)(32-63)(64-95)
GPxSET;
//GPIODataSetRegister(GPIO0to31)(32-63)(64-95)——置位
GPxCLEAR;
//GPIODataClearRegister(GPIO0to31)(32-63)(64-95)
GPxTOGGLE;
//GPIODataToggleRegister(GPIO0to31)(32-63)(64-95)——反转
3.中断寄存器
GPIOXINT1SEL;
//XINT1GPIOInputSelection
GPIOXINT2SEL;
//XINT2GPIOInputSelection
GPIOXNMISEL;
//XNMI_Xint13GPIOInputSelection
GPIOXINT3SEL;
//XINT3GPIOInputSelection
GPIOXINT4SEL;
//XINT4GPIOInputSelection
GPIOXINT5SEL;
//XINT5GPIOInputSelection
GPIOXINT6SEL;
//XINT6GPIOInputSelection
GPIOXINT7SEL;
//XINT7GPIOInputSelection
GPIOLPMSEL;
//LowpowermodesGPI/Oinputselect
具体的详细配置在TI官方的头文件DSP2812x_Gpio.h中。
3.2CPU定时器
TMS320F2812的CPUTime有三个,分别为Timer0、Timer1和Timer2,其中Timer2是为操作系统DSP/BIOS保留的,当未移植操作系统时,可用来做普通的定时器。
这三个定时器的中断信号分别为TINT0、TINT1和TINT2,分别对应于中断向量INT1、INT13和INT14。
图3-1为定时器0的结构图,图中TIMH:
TIM为计数寄存器,PRDH:
PRD为周期寄存器,形如AH格式:
A的形式表示一个32位的寄存器,是由两个16位的寄存器构成,AH是高16位,A是低16位。
图3-1定时器0结构
CPU定时器的计数复位时,计数寄存器TIMH:
TIM加载周期寄存器PRDH:
PRD所设定的值,经历一个计数器时钟后,TIMH:
TIM内的值就减1,一直减到0,这时产生定时器周期中断事件,并重新装载PRDH:
PRD所设定的值,重新开始计数。
至于每隔多少时间,计数寄存器TIMH:
TIM的值才会减1则由预分频寄存器TPRH:
TPR来决定。
TPRH和TPR这两个寄存器由两部分组成,高8位为定时器预分频计数器PSC,低8位是定时器分频TDDR。
也即是说:
TPRH是由PSCH和TDDRH构成,而TDDR由PSC和TDDR构成。
且其工作的原理与51系列单片机定时器计数器类似,复位时,PSCH:
PSC加载TDDRH:
TDDR所设定的值,然后经过一个CPU时钟,PSCH:
PSC的值减1,当PSCH:
PSC的值减到0时,会再次装载TDDRH:
TDDR所设定的值,并且产生一个计数器时钟,TIMH:
TIM减1。
TI官方库中提供的定时器配置函数如下(头文件为DSP2833x_CpuTimers.h):
voidConfigCpuTimer(structCPUTIMER_VARS*Timer,floatFreq,floatPeriod)
{
Uint32temp;
//定时器周期参数初始化:
Timer->
CPUFreqInMHz=Freq;
//频率
PeriodInUSec=Period;
//周期
temp=(long)(Freq*Period);
RegsAddr->
PRD.all=temp;
//周期寄存器设定值为timer
//预分频寄存器初始化为1(SYSCLKOUT):
TPR.all=0;
TPRH.all=0;
//定时器控制寄存器初始化:
TCR.bit.TSS=1;
//1=停止定时器,0=启动/重启定时器
TCR.bit.TRB=1;
//1=重载计时器
TCR.bit.SOFT=1;
//定时器自由运行
TCR.bit.FREE=1;
TCR.bit.TIE=1;
//0=禁止/1=定时器中断使能
//复位中断计数器:
InterruptCount=0;
}
上述函数ConfigCpuTimer(structCPUTIMER_VARS*Timer,floatFreq,floatPeriod)中的形参Timer为第几位定时器,Freq为定时频率,Period为计时周期。
假若Freq为15,Period为1000000,则时间t=1*15*1000000/150M=0.1s(系统时钟频率为150M)。
不过这个算式的成立是有条件的,这个条件就是以下两条语句:
如果要利用定时器产生一定周期的时间中断,在主函数中设置响应的中断向量即可。
3.3EV事件管理器
事件管理器为用户提供了强大的控制功能,特别是在运动控制和电机控制领域。
TMS320F2812提供两个具有相同结构和功能的事件管理器模块EVB和EVA,可用于多电机控制。
每个事件管理器模块包含通用定时器、全比较/PWM单元、捕获单元及正交编码脉冲电路等部分,可以通过一个三相逆变桥来满足功率互补控制,同时还可以提供两个非互补的PWM信号。
每个事件管理器模块都有两个通用定时器、3个比较单元、3个捕获单元以及1个正交编码电路。
EVA包含通用定时器1和2,EVB包含通用定时器3和4。
这些定时器模块可以根据需要单独使用,如在控制系统中采样周期,为捕获单元、正交编码电路、比较单元和PWM产生电路提供时基等。
通用定时器是用来计时的,而且每个定时器还能产生1路独立的PWM波形。
比较单元主要功能就是用来生成PWM波形的,EVA具有3个比较单元,每个单元可以生成一对(两路)互补的PWM波形,生成的6路PWM波形正好可以驱动一个三相桥电路。
捕获单元的功能是捕捉外部输入脉冲波形的上升沿或者下降沿,可以统计脉冲的间隔,也可以统计脉冲的个数。
正交编码电路可以对输入的正交脉冲进行编码和计数,它和光电编码器相连可以获得旋转机械部件的位置和速率等信息。
图3-2EV事件管理器时钟模块
3.4外设中断扩展模块PIE
TMS320F2812的CPU能够支持一个不可屏蔽中断NMI和16个可屏蔽的中断INT1-INT14、RTOSINT和DLOGINT,2812的CPU为了能够及时有效的处理好各个外设的中断请求,设计了一个专门处理外设中断的扩展模块(thePeripheralInterruptExpansionblock),叫做外设中断控制器PIE,它能够对各种中断请求源(例如来自于外设或者其他外部引脚的请求)做出判断以及相应的决策。
PIE可以支持96个不同的中断,这些中断分成了12个组,每个组有8个中断,而且每个组都被反馈到CPU内核的12条中断线中的某一条上(INT1-INT12)。
PIE目前只使用了96个终端中的45个,其他的等待将来的功能扩展。
图3-3PIE内部中断分布图
PIE内部的中断8列12行,总共有96个中断,黄色部分表示已经使用的中断,例如:
查看事件管理器EVA中定时器T1的周期中断T1PINT-------T1PINT在行号为INT2,列号为INTx.4的位置,也就是说T1IPNT对应于INT2,是INT2中的第四个中断。
图3-43级中断机制
3.5控制程序
本程序既是实现分别采用CPU定时器和EVA定时器控制LED灯的亮灭时间间隔,并采用中断按键切换此两种模式的功能。
程序如下:
#include"
DSP28_Device.h"
DSP28_Globalprototypes.h"
interruptvoidISRTimer2(void);
interruptvoidExtIntISR(void);
interruptvoideva_timer1_isr(void);
voidinit_eva_timer1(void);
Uint16EVAcount=0;
Uint16LedCount=0;
Uint16Flag=0;
//记录按键所按次数
Uint16flag_change=0;
//定时器模式切换标志位
/***
***主函数
***/
voidmain(void)
InitSysCtrl();
//初始化系统
DINT;
//关中断
IER=0x0000;
IFR=0x0000;
InitPieCtrl();
//初始化PIE
InitPieVectTable();
//初始化PIE中断矢量表
InitCpuTimers();
//初始化定时器寄存器的地址指针
init_eva_timer1();
//初始化EV-A定时器1
InitGpio();
//初始化IO口
InitXIntrupt();
//初始化外部中断
EALLOW;
/***将相应的向量指向中断服务程序,中断发生时,自动跳转***/
PieVectTable.T1PINT=&
eva_timer1_isr;
//EV_A定时器中断服务程序
PieVectTable.TINT2=&
ISRTimer2;
//定时器2中断服务程序
PieVectTable.XINT1=&
ExtIntISR;
//外部中断服务程序
EDIS;
ConfigCpuTimer(&
CpuTimer2,50,100000);
//设置CPU定时器方式、频率、装载初值
StartCpuTimer2();
//起动CPU定时器2
/***开中断***/
IER|=M_INT1;
IER|=M_INT2;
IER|=M_INT14;
PieCtrl.PIEIER1.bit.INTx7=1;
PieCtrl.PIEIER1.bit.INTx4=1;
PieCtrl.PIEIER2.all=M_INT4;
//使能PIE中断INT2.4(T1PINT中断)
EINT;
//开总中断
ERTM;
//开定时器中断
GpioDataRegs.GPFDAT.bit.GPIOF14=1;
for(;
;
);
***EVA定时器1初始化函数
voidinit_eva_timer1(void)
EvaRegs.GPTCONA.all=0;
EvaRegs.T1PR=0x1200;
//Period---周期值
EvaRegs.T1CMPR=0x0000;
//CompareReg--比较值
EvaRegs.EVAIMRA.bit.T1PINT=1;
//清除周期EV-A定时器1中断位
EvaRegs.EVAIFRA.bit.T1PINT=1;
EvaRegs.T1CNT=0x0000;
//计数器初值
EvaRegs.T1CON.all=0x1042;
//递增模式,x/1分频,内部时钟,使能比较,使用自己的周期,立即启动定时器计数
***CPU定时器2中断服务函数
interruptvoidISRTimer2(void)
LedCount++;
if(flag_change==1)//按键次数为偶数时为CPU定时器中断控制
{
if(LedCount<
2)
{
GpioDataRegs.GPFDAT.bit.GPIOF14=1;
//LED灯灭
}
elseif(LedCount<
4)