dsp实验报告1.docx
《dsp实验报告1.docx》由会员分享,可在线阅读,更多相关《dsp实验报告1.docx(19页珍藏版)》请在冰豆网上搜索。
dsp实验报告1
DSP实验报告
小组杜筱佳0904210204
薛茜茜0904210215
学院电子工程与光电技术学院
班级0904210204
指导老师刘明
实验日期2012.11——2012.12
实验一DSP开发基础
一、实验目的
1、了解DSP开发系统的基本配置
2、掌握DSP集成开发环境(CCS)
3、掌握C语言开发的基本流程
4、熟悉代码调试的基本方法
二、实验仪器
计算机,C2000DSP教学实验箱,XDS510USB仿真器,示波器
三、实验内容
建立工程,对工程进行编译、链接,载入可执行程序,在DSP硬件平台上进行实时调试,利用代码调试工具,查看程序运行结果
四、实验要求及实验结果
1、项目的编译、链接、调试
2、dataIO()子程序入口地址0x003F81F5
processing()子程序入口地址0x003F81DB
currentBuffer.input所在存储器地址0x008480
currentBuffer.output所在存储器地址:
0x008500
3、图形方式显示数据空间currentBuffer.input和current.Buffer.output缓冲存储区的波形
currentBuffer.input:
图1.1
currentBuffer.output:
图1.2
4、.map文件中,
.text段在存储空间的地址003f8000长度0000012b;位于TMS320F2812程序存储空间,物理存储块名称H0_PM
.data段在存储空间的地址00000040长度00000001;位于TMS320F2812数据存储空间,物理存储块名称M0_RAM
.bss段在存储空间的地址00000000长度00000000;
实验二任意信号发生器
一、实验目的
1、熟悉DSP硬件开发平台
2、熟悉DSP集成开发环境(CCS)
3、熟悉TMS320F2812的存储器配置表
4、学习DMS320F2812的编程开发
5、熟悉代码调试的基本方法
二、实验仪器
计算机,C2000DSP教学实验箱,XDS510USB仿真器,示波器
三、实验内容
建立工程,编写DSP主程序,并对工程进行编译、链接,利用现有DSP平台实现任一
波的产生,通过示波器观察结果。
四、实验要求与结果
1、独立完成项目编译、链接、调试的全过程。
2、利用数码显示管,在DSP初始化子模块后调节语句或者编写自程序,使之能够显示实验日期。
添加的C语句:
#defineCHAR_00X3F
#defineCHAR_10X06
#defineCHAR_40X66
#defineCHAR_50X6D
LED初始化改为、;
/*初始化LED*/
//LED8
*LED8=CHAR_5;
//LED7
*(LED8+0x100)=CHAR_1;
//LED6
*(LED8+0x200)=CHAR_4;
//LED5
*(LED8+0x300)=CHAR_0;
//LED4
*(LED8+0x400)=CHAR_2;
//LED3
*(LED8+0x500)=CHAR_1;
//LED2
*(LED8+0x600)=CHAR_2;
//LED1
*(LED8+0x700)=CHAR_4;
//WIRTEDATATOLED
*(LEDWR)=0XFF;
这样显示屏显示结果为:
42120415
3、波形数据保存的空间地址:
RamAddr0X00100000
图形方式显示线性调频信号的波形:
图2.1
实验三DSP数据采集
1、实验目的
1、熟悉DSP的软硬件开发平台
2、掌握TMS320F2812的ADC外设的使用
3、熟悉TMS320F2812的中断的设置
4、掌握代码调试的基本方法
2、实验仪器
计算机,C2000DSP教学实验箱,XDS510USB仿真器,示波器,信号源
3、实验内容
建立工程,编写DSP的主程序,并对工程进行编译、链接,利用现有DSP平台实现数据采集、存储以及模拟还原,通过图标以及示波器观察结果。
四、实验要求与结果
1、独立完成项目编译、链接、调试的全过程
2、根据提示程序,给出ADC的采样频率计算公式,改写源程序中,修改ADC的采样频率
源程序中EvaRegs.T1CON.bit.TPS=7;//设置定时器时钟频率为HSPCLK/128;
改变后EvaRegs.T1CON.bit.TPS=6;//设置定时器时钟频率为HSPCLK/64;原来的采样率为9.3k,调整后变为20k左右。
3、波形数据保存的空间地址
由于在该实验中任意设置了一个数组存放(intdatasum[1024];),用datasum[i]=(AdcRegs.ADCRESULT0)+0x8000来存放;其空间自动分配为0x003F9040
图形方式显示采集的信号波形
图3.2
4、验证采样频率的方法
将输出端连接到示波器上,调节好波形,观察波形每个中期内的取点个数,一般来说,取多少个点就意味着多少K的采样频率。
五、实验思考
1、观察输入信号与示波器显示信号、存储器存储波形信号幅度的差异,解释差异产生的原因。
2、除了上述粗略验证ADC采样频率以外,思考其他测试采样频率的方法和手段。
3、除了中断方式,DSP内核还可以采用查询方式获取ADC外设的采样数据。
如果采样查询方式,则需要查询那些标志位。
试图编程实现。
实验三的作业
根据“DSP应用技术\实验11DSP数据采集\源程序\AD_C”中实验内容,打开程序AD.c,DSP_281x_PieCtrl.c以及相关头文件,阅读AD.c的主程序段落。
InitPieCtrl();
InitPieVectTable();
……
PieVectTable.ADCINT=&adc_isr;
EDIS;
PieCtrlRegs.PIEIER1.bit.INTx6=1;
IER=1;
1.程序执行完后,PIEIER1~12,PIEIFR1~12,PIECTRL,PIEACK,IER寄存器的数值分别是多少,用16进制表示。
PieCtrlRegs.PIEIERx.all=0;PIEIERx=0x0
PieCtrlRegs.PIEIFR1.all=0;PIEIFRx=0x0
PieCtrlRegs.PIECRTL.bit.ENPIE=1;PIECTRL=0x1
PieCtrlRegs.PIEACK.all=0xFFFF;PIEACK=0x0
PieCtrlRegs.PIEIER1.bit.INTx6=1;PIEIER1=0x20
IER=1;IER=0x1
2.上述程序执行完后,什么外设中断被使能打开?
PIEIER1.6对应了ADC中断,因此ADC中断被打开。
PieVectTable.ADCINT=&adc_isr;
指令执行后,0x00000D4A地址处内容为中断服务子程序adc_isr的地址。
实验四FIR滤波器的DSP实现
一、实验目的
1、巩固数字FIR滤波器的概念
2、理解定点DSP中数的定标、有限字长、溢出等概念
3、理解算法实现中实时的概念
4、掌握DSP开发过程以及基本调试方法
5、理解汇编以及高级语言开发DSP、实现算法的区别
二、实验仪器
计算机,C2000DSP教学实验箱,XDS510USB仿真器,示波器,信号源
三、实验内容
针对FIR算法,设计滤波器系数,完成数据的定标,查看滤波器特性曲线。
建立工程,编写DSP的主程序,并对工程进行编译、链接,利用现有DSP平台实现FIR滤波器的算法,通过信号源、示波器理解滤波器特性,验证实现与理论设计的一致性。
四、实验要求与结果
1、独立完成项目的编译、链接、调试的全过程
2、当输入信号为正弦信号时,改变正弦信号频率,观察示波器,几率各频点对应的幅度,并描点作图,与实际理论幅频曲线对比,做误差分析,指出FIR滤波器的设计参数指标。
3、记录FIR核心算法程序执行时间,以及采样时间,判断系统是否实时
五、实验思考
1、观察各种输入信号通过数字滤波器系统之后的输出波形,解释信号失真原因。
2、加载其他格式编写程序所产生的FIR滤波器程序,测量运算时间,比较分析C语言效率低的原因。
3、以该FIR滤波器系统为例,总结分析实时性的取决因素。
六具体实验过程
1、DSP实现流程:
开始
中断设置
ADC设置
EVA设置
FIR计算
保存AD结果
复位ADC
数据写DAC
等待
退出中断
DSP初始化
读取AD结果
2、算法实现流程:
3用matlab生成滤波器系数,并仿真验算正确性
FIRDesign
%
%
clc;
clear;
closeall;
N=50;
wm=0.5;
h_ft=fir1(N,wm);
q=quantizer('fixed','fixed',[16,15]);
h_fx=quantize(q,h_ft)*2^15;
[H_ft,W_ft]=freqz(h_ft);
[H_fx,W_fx]=freqz(h_fx);
A_ft=20*log10(abs(H_ft));
A_fx=20*log10(abs(H_fx));
figure,
plot(W_ft/pi,A_ft,'b',W_fx/pi,A_fx,'r');
ylabel('幅度:
dB');
xlabel('归一化频率:
×\pirad')
legend('FloatCoff','FixedCoff');
N=50,Wn=o.5并用Q15定标,采样频率20khz
得出h[N]={33,0,-43,0,68,0,-112,0,180,0,-276,0,410,0,-593,0,852,0,-1240,0,1901,0,-3361,0,10382,16368,10382,0,-3361,0,1901,0,-1240,0,852,0,-593,0,410,0,-276,0,180,0,-112,0,68,0,-43,0,33};
4、在程序中实现FIR滤波器功能,其中核心代码如下:
/***************************************************/
/*FIR数字滤波器程序*/
/*采样频率fs=29.29KHz,wn=0.5*/
#include"DSP281x_Device.h"
#defineN51
#defineCHAR_NULL0x00
#defineCHAR_L0x38
#defineCHAR_40x66
#defineCHAR_DH0x08
#defineCHAR_C0x39
#defineCHAR_F0x71
#defineCHAR_i0x10
#defineCHAR_r0x50
#defineCHAR_DOT0x80
voidConfigureGpio(void);
voidInitSystem(void);
voidInitLed(void);
interruptvoidadc_isr(void);
volatileunsignedint*DA1OUT=(volatileunsignedint*)0x002900;
unsignedintadcInput0[N];
unsignedintAdIndex=0;
intcoef[N]={33,0,-43,0,68,0,-112,0,180,0,-276,0,410,0,-593,0,852,0,-1240,0,1901,0,-3361,0,10382,16368,10382,0,-3361,0,1901,0,-1240,0,852,0,-593,0,410,0,-276,0,180,0,-112,0,68,0,-43,0,33};
inti;
unsignedlongintFirRslt;
voidmain(void)
{
InitSystem();//初始化DSP内核寄存器
InitPieCtrl();//调用PIE控制单元初始化函数
InitPieVectTable();//调用PIE向量表初始化函数
InitAdc();//调用ADC模块的基本初始化函数
InitLed();
EALLOW;
PieVectTable.ADCINT=&adc_isr;//重新设置PIE向量表中ADc的中断入口向量
EDIS;
PieCtrlRegs.PIEIER1.bit.INTx6=1;//使能PIE中断分组1中的ADC中断
IER=1;//使能和ADC中断相连的CPUINT1中断
EINT;//使能全局中断位INTM
ERTM;//使能全局实时调试中断DBGM
/*SETADC*/
AdcRegs.ADCTRL1.bit.SEQ_CASC=0;
AdcRegs.ADCTRL1.bit.CONT_RUN=0;
AdcRegs.ADCTRL1.bit.CPS=0;
AdcRegs.ADCMAXCONV.all=0x0000;//单通道转换
AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x0;//将ADCINA0设置为SEQ1的第一个转换通道
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1;//使能EVA引起的中断
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;
AdcRegs.ADCTRL3.bit.ADCCLKPS=2;//ADc模块的核心时钟频率=HSPCLK/4
/*SETEVA*/
EvaRegs.GPTCONA.bit.TCMPOE=0;//禁止比较输出
EvaRegs.GPTCONA.bit.T1PIN=0;
EvaRegs.GPTCONA.bit.T1TOADC=2;//设置周期中断标志启动ADC
EvaRegs.T1CON.bit.FREE=0;//防真挂起时,定时器1立即停止工作
EvaRegs.T1CON.bit.SOFT=0;
EvaRegs.T1CON.bit.TMODE=2;//连续增计数模式
EvaRegs.T1CON.bit.TPS=7;//设置定时器时钟频率为HSPCLK/128
EvaRegs.T1CON.bit.TENABLE=1;//允许定时器操作
EvaRegs.T1CON.bit.TCLKS10=0;//内部时钟
EvaRegs.T1CON.bit.TCLD10=0;//计数器为0时重载
EvaRegs.T1CON.bit.TECMPR=0;//禁止比较操作
EvaRegs.T1PR=62;//定时器周期寄存器
/*SETGPIO*/
EALLOW;
GpioMuxRegs.GPAMUX.all=0x0;
GpioMuxRegs.GPADIR.all=0xFFFF;
EDIS;
/*Initialisedatabuffer*/
for(AdIndex=0;AdIndexadcInput0[AdIndex]=1;
AdIndex=0;
while
(1)
{
}
}
voidInitSystem(void)
{
EALLOW;
SysCtrlRegs.WDCR=0x00E8;//禁止看门狗模块
SysCtrlRegs.PLLCR.bit.DIV=10;//将CPU的PLL倍频系数设为5
SysCtrlRegs.HISPCP.all=0x1;//高速时钟的预定标器设置成除以2
SysCtrlRegs.LOSPCP.all=0x2;//低速时钟的预定标器设置成除以4
//根据需要时能各种外设模块的时钟
SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
SysCtrlRegs.PCLKCR.bit.EVBENCLK=0;
SysCtrlRegs.PCLKCR.bit.SCIAENCLK=0;
SysCtrlRegs.PCLKCR.bit.SCIBENCLK=0;
SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0;
SysCtrlRegs.PCLKCR.bit.SPIENCLK=0;
SysCtrlRegs.PCLKCR.bit.ECANENCLK=0;
SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;
EDIS;
}
}
interruptvoidadc_isr(void)
{
EALLOW;
GpioDataRegs.GPASET.all=0xFFFF;
AdIndex=0;
adcInput0[AdIndex]=AdcRegs.ADCRESULT0>>4;
FirRslt=0;
for(i=0;iFirRslt+=(int)(adcInput0[i])*coef[i];
*DA1OUT=(FirRslt>>12)+0x8000;
for(i=N-1;i>=0;i--)
adcInput0[i+1]=adcInput0[i];
//重新初始化ADC采样序列
AdcRegs.ADCTRL2.bit.RST_SEQ1=1;//复位SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;//清除中断位INTSEQ1
PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;//清除PIE1的中断响应位
GpioDataRegs.GPACLEAR.all=0xFFFF;
EDIS;
}
说明:
FirRslt的定标:
将滤波器的结果赋值给输出的时候,要根据FirRslt的动态范围对其进行适当右移。
因为DA1OUT接受的是一个16bit数据,而y是unsignedint型,即32bit,直接赋值势必会溢出。
检验的FirRslt动态范围有多种方法,其中比较简便的方法是将FirRslt添加到变量观察窗口,在赋值语句后设置断点,动态运行,观察的动态范围,即估计FirRslt的最大与最小值,目标是保留有效数值的高16位,于是便能确定最后赋值给输出口前y需要右移的位数,经过这一步,我们确定y应右移12位。
5调试程序,验证滤波器功能:
我们设置的系统参数为:
输入型号幅度1vpp,低通FIR滤波器,wn=0.5,采样频率20khz,则截止频率fn=5kHz
改信号源频率与示波器输出波形的幅度列表:
信号频率(khz)
1
2
3
4
4.1
幅度(v)
0.36
0.35
0.35
0.348
0.342
信号频率(khz)
4.2
4.3
4.4
4.5
4.6
幅度(v)
0.340
0.32
0.29
0.25
0.21
信号频率(khz)
4.7
4.8
4.9
5.0
5.1
幅度(v)
0.16
0.12
0.08
0.04
0.02
描点绘图
6实验思考
1.以该FIR滤波器为例,总结分析系统实时性取决因素。
滤波器阶数对实时性的影响:
滤波器阶数越高,运算量越大,实时性越难满足
实时性取决为运算量和芯片速度两个方面。
而运算量又可以分为数据率和算法复杂采样频率对实时性的影响:
采样频率越高,则数据率越大,实时性越难满足程度。
语言和汇编语言实现相同算法所需时间的比较也可以看出,算法或者代码的复杂程度对实时性也有很大影响。
2.观察各种信号通过数字滤波器后的输出波形,解释信号失真原因。
采样频率为20Khz时,如果输入信号频率大于5khz,则平均一个周期采样点数小于4,造成了严重的失真现象。