DSP实验报告Word下载.docx
《DSP实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《DSP实验报告Word下载.docx(29页珍藏版)》请在冰点文库上搜索。
是介于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
DSP2833x_Examples.h"
//DSP2833xExamplesIncludeFile
math.h"
//#include"
#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
#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
//Step4.InitializealltheDevicePeripherals:
//ThisfunctionisfoundinDSP2833x_InitPeripherals.c
//InitPeripherals();
//Notrequiredforthisexample
#ifSCI
scib_fifo_init();
//InitSCI-B
scic_fifo_init();
//InitSCI-C
//Step5.Userspecificcode,enableinterrupts:
#ifUART_INT
//Enableinterruptsrequiredforthisexample
PieCtrlRegs.PIECTRL.bit.ENPIE=1;
//EnablethePIEblock
PieCtrlRegs.PIEIER9.bit.INTx3=1;
//PIEGroup9,INT3RE
PieCtrlRegs.PIEIER9.bit.INTx4=1;
//PIEGroup9,INT4TX
IER=0x100;
//EnableCPUINT
PieCtrlRegs.PIEIER8.bit.INTx5=1;
//PIEGroup8,int5RE
PieCtrlRegs.PIEIER8.bit.INTx6=1;
//PIEGroup8,INT6TX
IER=0x080;
EINT;
//ThisisneededtowritetoEALLOWprotectedregister
PieVectTable.ADCINT=&
adc_isr;
PieVectTable.TINT2=&
ISRTimer2;
InitXintf();
InitAdc();
//Forthisexample,inittheADC
InitCpuTimers();
ConfigCpuTimer(&
CpuTimer2,150,1000000);
StopCpuTimer2();
//StartCpuTimer2();
CpuTimer2Regs.TCR.all=0x4001;
//Usewrite-onlyinstructiontosetTSSbit=0
//CpuTimer2Regs.TIM.all=0;
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;
//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
//LoopCount=sqrt(199);
for(;
;
)
{
if(startflag==1)
jifen=0;
startflag=0;
for(i=0;
i<
plotnum;
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);
+a/100%10;
+a/10%10;
+a%10;
'
}*/
voidtxnum(inta)
ScibRegs.SCITXBUF=a>
>
8;
while(ScibRegs.SCIFFTX.bit.TXFFS