DSP实验报告.docx

上传人:b****8 文档编号:11345458 上传时间:2023-02-28 格式:DOCX 页数:29 大小:628.06KB
下载 相关 举报
DSP实验报告.docx_第1页
第1页 / 共29页
DSP实验报告.docx_第2页
第2页 / 共29页
DSP实验报告.docx_第3页
第3页 / 共29页
DSP实验报告.docx_第4页
第4页 / 共29页
DSP实验报告.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

DSP实验报告.docx

《DSP实验报告.docx》由会员分享,可在线阅读,更多相关《DSP实验报告.docx(29页珍藏版)》请在冰豆网上搜索。

DSP实验报告.docx

DSP实验报告

一、综合实验内容和要求

1.实验目的

(1)学习掌握CCS3.3编译器的使用;

(2)通过实验学习掌握TMS320F28335的GPIO,浮点计算;

(3)学习并掌握A/D模块的使用方法;

(4)学习并掌握中断方式和查询方式的串口通信;

(5)学习并掌握28335DSP的定时器相关的设置与运用;

(6)学习信号时域分析的方法,了解相关波形参数的计算方法;

(7)了解数字滤波的一些基本方法;

(8)学习数码管的驱动及运用。

(9)学习MATLAB串口以及画图的运用。

2.实验设计内容与要求:

(1)对给定的周期波形信号采用TI公司的TMS320F28335DSP,利用试验箱上的相关资源计算出波形的周期T,波形的有效值

,平均值

其中,有效值和平均值的计算公式(数字量的离散公式)如下:

式中N为一个周期采样点数,

为采样序列中的第i个采样点。

(2)通过算法计算出波形的有效值和平均值,利用串口通信把测得的数据发送到串口助手查看,或者在MATLAB上编写上位机程序,把发送的数据在MATLAB上画出来。

(3)把测得的数据实时显示在数码管上。

二、硬件电路

图1为试验系统的硬件图,硬件电路主要包括TMS320F28335DSP实验箱,SEED-XDS510仿真器,数码管,SCI,信号发生器,电脑,串口线等。

图1硬件电路图

三、实验原理

本试验主要是通过程序去测量一个周期波形的有效值、平均值、峰值等相关参数。

计算离散数据的有效值可用公式

,平均值可用公式

所以首先需要测出波形的周期,然后确定每个周期需要采样的点数N,最后去计算平均值和有效值。

图2理想输入采样波形

如图2所示为一个正弦输入波形,

为输入波形的峰值,

是介于0~

的一个值。

A、B、C分别为

和输入波形相交的三点,则A、C两点之间为一个周期,只要测得A、C两点之间的时间就可以得到周期值,从而进行后面的计算。

本算法的主要核心是进行比较。

当A/D采样值大于

时,开启定时器,第二次A/D采样值小于

时即B点,第三次A/D采样值大于

时即C点时关闭定时器,读取定时器的值,从A-C是一个周期,这样就可以通过程序测得波形的周期T。

每次A/D采样间隔的时间一样为7.5

,这样就可以算出来一个周期需要采集的点数N=T/7.5

然后根据公式

算出平均值和有效值。

图3输入采样真实波形

如图3所示,在具体实验时遇到测周期不准的问题,后面发现是因为输入波形不是理想的,在和固定比较值比较的时候会有抖动,这样的话可能会在一个点重复比较好几次。

后面在程序里面加了防抖动的程序,有效的解决了这个问题。

在采样后与

比较一次在继续比较5个点,如果有5个点都比

大或者小才确认比较了一次,这样有效地解决了波形的抖动问题,使测得的周期准确稳定。

四、程序流程图

如图4所示,为程序的总流程图,包括DSP的初始化,A/D采样,比较通过定时器算出周期,然后根据上面所提的公式计算有效值和平均值,最后把得到的值发送到上位机上实时画图显示并且在数码管上显示出来。

图4程序流程图

五、实验结果和分析

1、试验平台

本试验实验平台为CCS3.3,主界面如图所示。

图5CCS3.3平台主界面

2、试验步骤

(1)实验准备:

给实验板加电,启动CCS,打开工程,连接目标板。

(2)通过键盘设置输入信号。

(3)编写好程序,编译并下载程序。

(4)在PC机上打开串口调试助手,在CCS中打开观察波形和一些变量的窗口,启动程序,观察相关波形和参数。

3、试验波形和结果

通过键盘设置信号发生器输出的波形形状、幅值和频率,然后去观察测得的周期值,有效值和平均值来检测算法的正确性和通用性。

如图6所示输入1000Hz/1000mV的正弦波的采样波形,数码管有效值显示,watchwindow相关变量值的照片如下所示。

图61000Hz/1000mV正弦波波形及参数

如图7所示输入1000Hz/2000mV的正弦波的采样波形,数码管有效值显示,watchwindow相关变量值的照片如下所示。

图71000Hz/2000mV正弦波波形及参数

如图8所示输入2000Hz/1000mV的正弦波的采样波形,数码管有效值显示,watchwindow相关变量值的照片如下所示。

图82000Hz/1000mV正弦波波形及参数

如图9所示输入1000Hz/1000mV的方波的采样波形,数码管有效值显示,watchwindow相关变量值的照片如下所示。

图91000Hz/1000mV方波波形及参数

如图10所示输入1000Hz/1000mV的三角波的采样波形,数码管有效值显示,watchwindow相关变量值的照片如下所示。

图101000Hz/1000mV三角波波形及参数

如图11所示为通过串口把有效值发送到串口助手的截图,可以看出DSP可以成功的通过SCI把测得的数据发送到上位机上。

同时也可以把发送的数据用MATLAB画出来。

图11串口发送有效值显示

4、试验结果分析

通过实验可以看出可以看出A/D采样显示正常,所用的程序可以较好的测得正弦波、方波、三角波的周期值、平均值。

另外可以通过串口把需要测得的参数发送到串口助手上,或者自己编写的MATLAB上位机实时显示波形。

通过键盘修改输入波形的频率和周期也可以很稳定的测得波形的周期、有效值、平均值,从而验证了算法正确性。

5、试验中的问题及解决

(1)实验板加电后第二次烧写程序后,总是进不了A/D采样中断程序,每次运行一次都要重启一下实验板。

经过分析应该是程序在运行一次后,让程序停止后A/D中断的一些中断标志位没有清零。

所以我在程序的一开始加上了清A/D中断标志位的程序,有效的解决了这个问题。

(2)在想好测量周期算法后,写好程序验证时发现,测得的周期值很不稳定。

经过观察波形分析,是因为实际采样波形会有波动。

加了防抖动算法后有效解决了这个问题。

(3)在编写MATLAB上位机实时显示波形时,发现由于串口一次只能发送一个字节,最大只能到255,而需要发送的参数值大于255。

经过查询资料,我把每个参数分高八位和低八位发送,然后在上位机上再把这两个八位数据合并成一个十六位数据。

(4)开始程序计算波形周期、有效值、平均值算法都放在A/D中断里面,结果发现会影响A/D的采样,经过分析发现,因为算法计算量挺大,在中断里面算不完。

所以我在A/D中断里面设置了一个标志位,当采样完一个周期以后置位,然后在main函数的for循环里面判断计算,提高了CPU的计算效率。

六、实验总结

通过这段时间的DSP的学习和实验,让我对TMS320F28335各个模块有了一定深度的理解和认识,让我更好的把握了这款DSP的相关知识,同时也让我对其他DSP的学习打好基础。

通过这次实验,也遇到了很多问题,自己和同学仔细去分析,一步一步去解决问题,锻炼了我们分析DSP相关问题的能力。

另外结合上学期学习的MATLAB知识,自己查询资料,在MATLAB里面写了串口的程序,把发送过来的数据通过画图画出来。

感觉学习狠多。

另外非常感谢崔江老师和沈乐同学的指导和帮助。

七、DSPMAIN函数源程序清单(双栏)

#include"DSP2833x_Device.h"//DSP2833xHeaderfileIncludeFile

#include"DSP2833x_Examples.h"//DSP2833xExamplesIncludeFile

#include"math.h"

//#include"math.h"

#defineSCI1

#defineUART_INT0

//Prototypestatementsforfunctionsfoundwithinthisfile.

interruptvoidadc_isr(void);

interruptvoidISRTimer2(void);

interruptvoidscicTxFifoIsr(void);

interruptvoidscicRxFifoIsr(void);

interruptvoidscibTxFifoIsr(void);

interruptvoidscibRxFifoIsr(void);

 

voidscib_fifo_init();

voidscic_fifo_init();

voiderror(void);

 

#if(CPU_FRQ_150MHZ)//Default-150MHzSYSCLKOUT

#defineADC_MODCLK0x3//HSPCLK=SYSCLKOUT/2*ADC_MODCLK2=150/(2*3)=25.0MHz

#endif

#if(CPU_FRQ_100MHZ)

#defineADC_MODCLK0x2//HSPCLK=SYSCLKOUT/2*ADC_MODCLK2=100/(2*2)=25.0MHz

#endif

#defineADC_CKPS0x1//ADCmoduleclock=HSPCLK/2*ADC_CKPS=25.0MHz/(1*2)=12.5MHz

#defineADC_SHCLK0xf//S/HwidthinADCmoduleperiods=16ADCclocks

#defineAVG1000//Averagesamplelimit

#defineZOFFSET0x00//AverageZerooffset

#defineBUF_SIZE160//Samplebuffersize

//Globalvariablesusedinthisexample:

//Globalvariables

Uint16dataC;//ReceiveddataforSCI-A

Uint16dataB;//RceiveddataforSCI-A

Uint16ConversionCount=0;

Uint16Voltage1[1024];

Uint32jifen=0;

Uint32vrms=0;

Uint32vavg=0;

Uint32voltage=0;

Uint16cnt=0;

Uint32Vdc;

Uint32ACpeak;

Uint32peak[10];

intLed_Flag;

intComp_Flag=0;

Uint32Period=0;

Uint32Freq=0;

Uint32fangdoucnt=0;

Uint32fangdou1cnt=0;

Uint32plotnum=200;

intstartflag=0;

intjifencnt=0;

inti=0;

voidwrite();

voidtxnum(inta);

main()

{

//Step1.InitializeSystemControl:

//PLL,WatchDog,enablePeripheralClocks

//ThisexamplefunctionisfoundintheDSP2833x_SysCtrl.cfile.

InitSysCtrl();

//Step2.InitializeGPIO:

//ThisexamplefunctionisfoundintheDSP2833x_Gpio.cfileand

//illustrateshowtosettheGPIOtoit'sdefaultstate.

InitGpio();//Skippedforthisexample

InitSciGpio();

//Step3.ClearallinterruptsandinitializePIEvectortable:

//DisableCPUinterrupts

DINT;

//InitializethePIEcontrolregisterstotheirdefaultstate.

//ThedefaultstateisallPIEinterruptsdisabledandflags

//arecleared.

//ThisfunctionisfoundintheDSP2833x_PieCtrl.cfile.

InitPieCtrl();

//DisableCPUinterruptsandclearallCPUinterruptflags:

IER=0x0000;

IFR=0x0000;

//InitializethePIEvectortablewithpointerstotheshellInterrupt

//ServiceRoutines(ISR).

//Thiswillpopulatetheentiretable,eveniftheinterrupt

//isnotusedinthisexample.Thisisusefulfordebugpurposes.

//TheshellISRroutinesarefoundinDSP2833x_DefaultIsr.c.

//ThisfunctionisfoundinDSP2833x_PieVect.c.

InitPieVectTable();

#ifUART_INT

//Interruptsthatareusedinthisexamplearere-mappedto

//ISRfunctionsfoundwithinthisfile.

EALLOW;//ThisisneededtowritetoEALLOWprotectedregisters

#ifSCI

PieVectTable.SCIRXINTB=&scibRxFifoIsr;

PieVectTable.SCITXINTB=&scibTxFifoIsr;

#else

PieVectTable.SCIRXINTC=&scicRxFifoIsr;

PieVectTable.SCITXINTC=&scicTxFifoIsr;

#endif

EDIS;//ThisisneededtodisablewritetoEALLOWprotectedregisters

#endif

//Step4.InitializealltheDevicePeripherals:

//ThisfunctionisfoundinDSP2833x_InitPeripherals.c

//InitPeripherals();//Notrequiredforthisexample

#ifSCI

scib_fifo_init();//InitSCI-B

#else

scic_fifo_init();//InitSCI-C

#endif

//Step5.Userspecificcode,enableinterrupts:

#ifUART_INT

//Enableinterruptsrequiredforthisexample

PieCtrlRegs.PIECTRL.bit.ENPIE=1;//EnablethePIEblock

#ifSCI

PieCtrlRegs.PIEIER9.bit.INTx3=1;//PIEGroup9,INT3RE

PieCtrlRegs.PIEIER9.bit.INTx4=1;//PIEGroup9,INT4TX

IFR=0x0000;

IER=0x100;//EnableCPUINT

#else

PieCtrlRegs.PIEIER8.bit.INTx5=1;//PIEGroup8,int5RE

PieCtrlRegs.PIEIER8.bit.INTx6=1;//PIEGroup8,INT6TX

IFR=0x0000;

IER=0x080;//EnableCPUINT

#endif

EINT;

#endif

//Interruptsthatareusedinthisexamplearere-mappedto

//ISRfunctionsfoundwithinthisfile.

EALLOW;//ThisisneededtowritetoEALLOWprotectedregister

PieVectTable.ADCINT=&adc_isr;

PieVectTable.TINT2=&ISRTimer2;

EDIS;//ThisisneededtodisablewritetoEALLOWprotectedregisters

//Step4.InitializealltheDevicePeripherals:

//ThisfunctionisfoundinDSP2833x_InitPeripherals.c

//InitPeripherals();//Notrequiredforthisexample

InitXintf();

InitAdc();//Forthisexample,inittheADC

InitCpuTimers();

ConfigCpuTimer(&CpuTimer2,150,1000000);

StopCpuTimer2();

//StartCpuTimer2();

CpuTimer2Regs.TCR.all=0x4001;//Usewrite-onlyinstructiontosetTSSbit=0

//CpuTimer2Regs.TIM.all=0;

//Step5.Userspecificcode,enableinterrupts:

max7219_data_send(0x090f);//设置译码方式寄存器,

max7219_data_send(0x0a05);//设置亮度调整寄存器

max7219_data_send(0x0b03);//设置扫描控制寄存器

max7219_data_send(0x0c01);//设置掉电模式寄存器

max7219_data_send(0x0f00);

DELAY_US(1000);

//EnableADCINTinPIE

PieCtrlRegs.PIEIER1.bit.INTx6=1;

PieCtrlRegs.PIEIER1.bit.INTx7=1;

IER|=M_INT1;//EnableCPUInterrupt1

IER|=M_INT14;

EINT;//EnableGlobalinterruptINTM

ERTM;//EnableGlobalrealtimeinterruptDBGM

LoopCount=0;

ConversionCount=0;

AdcRegs.ADCTRL1.bit.ACQ_PS=ADC_SHCLK;

AdcRegs.ADCTRL3.bit.ADCCLKPS=ADC_CKPS;

AdcRegs.ADCTRL1.bit.SEQ_CASC=1;//0Non-CascadedMode;1CascadedMode

AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=0x1;

AdcRegs.ADCTRL2.bit.RST_SEQ1=0x1;

AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x6;

AdcRegs.ADCMAXCONV.bit.MAX_CONV1=15;

AdcRegs.ADCTRL2.bit.SOC_SEQ1=0x1;

//write(1234);

//WaitforADCinterrupt

AdcRegs.ADCTRL2.bit.RST_SEQ1=1;//ResetSEQ1

AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;//ClearINTSEQ1bit

PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;//AcknowledgeinterrupttoPIE

AdcRegs.ADCTRL2.bit.SOC_SEQ1=0x1;

//LoopCount=sqrt(199);

for(;;)

{

if(startflag==1)

{

jifen=0;

startflag=0;

for(i=0;i

{

voltage=Voltage1[i]*3/4;

vavg=vavg+voltage;

jifen+=voltage*voltage;

}

vrms=jifen/plotnum;

vrms=sqrt(vrms);

vavg=vavg/plotnum;

txnum(vrms);

write(vrms);

}

}

}

/*voidtxnum(inta)//串口发送

{

ScibRegs.SCITXBUF='0'+a/1000;

while(ScibRegs.SCIFFTX.bit.TXFFST!

=0);

ScibRegs.SCITXBUF='0'+a/100%10;

while(ScibRegs.SCIFFTX.bit.TXFFST!

=0);

ScibRegs.SCITXBUF='0'+a/10%10;

while(ScibRegs.SCIFFTX.bit.TXFFST!

=0);

ScibRegs.SCITXBUF='0'+a%10;

while(ScibRegs.SCIFFTX.bit.TXFFST!

=0);

ScibRegs.SCITXBUF=',';

while(ScibRegs.SCIFFTX.bit.TXFFST!

=0);

}*/

voidtxnum(inta)

{

ScibRegs.SCITXBUF=a>>8;

while(ScibRegs.SCIFFTX.bit.TXFFS

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1