基于DSP的可调信号发生器设计讲解.docx

上传人:b****0 文档编号:17163455 上传时间:2023-07-22 格式:DOCX 页数:25 大小:902.65KB
下载 相关 举报
基于DSP的可调信号发生器设计讲解.docx_第1页
第1页 / 共25页
基于DSP的可调信号发生器设计讲解.docx_第2页
第2页 / 共25页
基于DSP的可调信号发生器设计讲解.docx_第3页
第3页 / 共25页
基于DSP的可调信号发生器设计讲解.docx_第4页
第4页 / 共25页
基于DSP的可调信号发生器设计讲解.docx_第5页
第5页 / 共25页
基于DSP的可调信号发生器设计讲解.docx_第6页
第6页 / 共25页
基于DSP的可调信号发生器设计讲解.docx_第7页
第7页 / 共25页
基于DSP的可调信号发生器设计讲解.docx_第8页
第8页 / 共25页
基于DSP的可调信号发生器设计讲解.docx_第9页
第9页 / 共25页
基于DSP的可调信号发生器设计讲解.docx_第10页
第10页 / 共25页
基于DSP的可调信号发生器设计讲解.docx_第11页
第11页 / 共25页
基于DSP的可调信号发生器设计讲解.docx_第12页
第12页 / 共25页
基于DSP的可调信号发生器设计讲解.docx_第13页
第13页 / 共25页
基于DSP的可调信号发生器设计讲解.docx_第14页
第14页 / 共25页
基于DSP的可调信号发生器设计讲解.docx_第15页
第15页 / 共25页
基于DSP的可调信号发生器设计讲解.docx_第16页
第16页 / 共25页
基于DSP的可调信号发生器设计讲解.docx_第17页
第17页 / 共25页
基于DSP的可调信号发生器设计讲解.docx_第18页
第18页 / 共25页
基于DSP的可调信号发生器设计讲解.docx_第19页
第19页 / 共25页
基于DSP的可调信号发生器设计讲解.docx_第20页
第20页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于DSP的可调信号发生器设计讲解.docx

《基于DSP的可调信号发生器设计讲解.docx》由会员分享,可在线阅读,更多相关《基于DSP的可调信号发生器设计讲解.docx(25页珍藏版)》请在冰点文库上搜索。

基于DSP的可调信号发生器设计讲解.docx

基于DSP的可调信号发生器设计讲解

 

DSP处理器及应用课程设计报告

(2012—2013学年第一学期)

题目基于DSP的可调信号发生器设计

 

系别电子与电气工程系

专业电子信息工程

班级0920311

学号092031101

姓名

指导教师

完成时间2013-1-6

评定成绩

 

一、设计的目的

根据已掌握的《DSP处理器及应用》课程知识,完成课程设计要求的项目。

了解正弦波的产生,以及正弦波幅值和频率的调整方法,掌握信号产生的一般方法并学习使用CCS图形显示功能进行程序调试。

通过硬件设计和程序编写过程,加深对《DSP处理器及应用》课程知识的理解和掌握,培养应用系统设计的能力,以及分析问题和解决问题的方法,并进一步拓宽专业知识面,培养实践应用技能和创新意识。

二、设计的内容与要求

1)在CCS中运行调试程序代码,输出正弦信号波形,并使用CCS的图像显示窗口,实时显示输出的正弦波。

2)使用DSPF2812的GPIO功能,读取外部手动按键的信号,相应改变正弦信号的幅值(幅值,采用有符号16位整型变量定义)。

3)使用DSPF2812的GPIO功能,读取外部手动按键的信号,相应改变正弦信号的周期(每周期的离散采样点数,采用有符号16位整型变量定义)。

4)使用DSPF2812的GPIO功能,读取外部手动按键的信号,相应输出正弦波、三角波、方波、锯齿波、梯形波。

5)用8个七段数码管,每隔一秒依次循环显示三种信息,包括:

①当前的幅值(格式为:

AP-00000~AP-32767);②每周期的离散采样点数(格式为:

tNUb-012~tNUb-512);③自己的学号(格式为学号的低8位,例如学号为092031234的同学,应当显示:

92031234)。

④显示日期(20130104)。

 

三、

显示幅值

设计方案

应用while循环语句来实现实验中所有程序的循环。

利用if语句实现波形切换与幅值、周期的改变。

应用中断switch来实现数码管循环显示幅值、周期、学号、日期。

四、软件、硬件设计

4.1软件调试

1、波形的显示

正弦波:

for(j=0;j

sineTable[j]=sin(2*3.1416/sine_size*j)*gain+offset;

 

锯齿波:

float_temp=100;

Updownflag=0;

for(j=1;j

{if(float_temp<=100&&Updownflag==1)float_temp=float_temp-200.0/sine_size;elseif(float_temp>=100&&Updownflag==0)float_temp=100;

if(float_temp>=100){Updownflag=1;float_temp=90;}

if(float_temp<=0){Updownflag=0;float_temp=100;}

sineTable[j]=float_temp*gain/100-offset;}

方波:

float_temp=0;

Updownflag=0;

temp=0;

for(j=1;j

{if(temp<=(sine_size/2)&&Updownflag==0){float_temp=1;temp++;}

elseif(temp>=(sine_size/2)&&Updownflag==1){float_temp=0;temp++;}

if(temp>=(sine_size/2))Updownflag=1;

if(temp>=sine_size){Updownflag=0;temp=0;}

sineTable[j]=float_temp*gain+offset;}

三角波:

float_temp=0;

Updownflag=0;

for(j=1;j

{if(float_temp<=100&&Updownflag==0)

float_temp=float_temp+200.0/sine_size;

else

if(float_temp>=0&&Updownflag==1)

float_temp=float_temp-200.0/sine_size;

if(float_temp>=100)Updownflag=1;

if(float_temp<=0)Updownflag=0;

sineTable[j]=float_temp*gain/100+offset;

梯形波:

max1(unsignedintx1)

{if(x3>x1)x3=x3;

elsex3=x1;

returnx3;}

float_temp=0;

Updownflag=0;

for(j=1;j

{if(float_temp<=100&&Updownflag==0)

float_temp=float_temp+200.0/sine_size;

else

if(float_temp>=0&&Updownflag==1)

float_temp=float_temp-200.0/sine_size;

if(float_temp>=100)Updownflag=1;

if(float_temp<=0)Updownflag=0;

sineTable[j]=float_temp*gain/100+offset;

x2=max1(sineTable[j]);

if(sineTable[j]>=x2*0.8+offset)

sineTable[j]=0.8*x2+offset;

if(sineTable[j]<=x2*0.2+offset)

sineTable[j]=x2*0.2+offset;

}

 

 

2、按键切换波形

if((keyx==4)&&(keyy==3))选择正弦波

{signaltype=0;}

if((keyx==4)&&(keyy==2))选择三角波

{signaltype=4;}

if((keyx==4)&&(keyy==1))选择锯齿波

{signaltype=2;}

if((keyx==3)&&(keyy==3))选择方波

{signaltype=3;}

if((keyx==3)&&(keyy==2))选择tixing

{signaltype=1;}

 

3、按键改变幅值与周期

if((keyx==0)&&(keyy==3))增加幅值

{gain=gain+500;

if(gain>30000)gain=30000;}

if((keyx==0)&&(keyy==1))减小幅值

{gain=gain-500;

if(gain<0)gain=0;}

if((keyx==1)&&(keyy==0))减小周期

{sine_size=sine_size-2;

if(sine_size<12)sine_size=12;}

if((keyx==4)&&(keyy==0))增大周期

{sine_size=sine_size+2;

if(sine_size>512)sine_size=512;}

 

4、数码管显示

幅值:

//显示当前的幅值(格式为:

AP-00000~AP-32767)

//8个七段数码管赋初值0,全部灭

AmpResult[7]=0xEE;//显示A

AmpResult[6]=0xCE;//显示p

AmpResult[5]=0x02;//显示-

AmpResult[4]=LedCode[(gain/10000)%10];//显示幅值的万位

AmpResult[3]=LedCode[(gain/1000)%10];//显示幅值的千位

AmpResult[2]=LedCode[(gain/100)%10];//显示幅值的百位

AmpResult[1]=LedCode[(gain/10)%10];//显示幅值十位

AmpResult[0]=LedCode[gain%10];//显示幅值的个位

周期:

//显示每周期的离散采样点数(格式为:

tNUb-012~tNUb-512)

sizeResult[7]=0x1E;//显示t

sizeResult[6]=0xEC;//显示N

sizeResult[5]=0x7C;//显示U

sizeResult[4]=0x3E;//显示b

sizeResult[3]=0x02;//显示-

sizeResult[2]=LedCode[(sine_size/100)%10];//显示离散采样点数的百位

sizeResult[1]=LedCode[(sine_size/10)%10];//显示离散采样点数的十位

sizeResult[0]=LedCode[sine_size%10];//显示离散采样点数的个位

学号:

StudentNUM[8]={0x60,0xFC,0x60,0x60,0xF2,0xFC,0xDA,0xF6};//92031101

日期:

DAYTIME[8]={0x66,0xFC,0x60,0xFC,0xF2,0x60,0xFC,0xDA};//20130104

利用中断程序执行显示:

interruptvoidTINT0_ISR(void)//CPU-Timer0

{CpuTimer0Regs.TCR.bit.TIF=1;//清除定时器的中断标志位

PieCtrl.PIEACK.bit.ACK1=1;

//写1,清楚中断中断应答位,以响应CPU定时器T0的同组(第一组INT1)其他中断

switch(flag)

{case0:

{flag++;

//显示按键的列号keyx、行号keyy

WriteLEDs(KeyResult);};break;

case1:

{flag++;

//显示当前的幅值

//(格式为:

AP-00000~AP-32767)

WriteLEDs(AmpResult);};break;

case2:

{flag++;

//显示每周期的离散采样点数

//(格式为:

tNUb-012~tNUb-512)

WriteLEDs(sizeResult);};break;

case3:

{flag++;

//显示日期

//(格式为:

20130104)

WriteLEDs(DAYTIME);};break;

case4:

{flag++;

//显示学号:

92031101

WriteLEDs(StudentNUM);};break;

case5:

{flag=0;

//显示日期:

20130104

WriteLEDs(DAYTIME);};break;

default:

flag=0;;break;}}

4.2硬件调试

按键功能定义,如下:

4.3主程序

#include"DSP28_Device.h"

#include

#include

#definebuffer_size200

unsignedintsine_size=20;

unsignedinttemp;

intcurrent[buffer_size];

floatfloat_temp;

intgain=10000;

intoffset=0;

intflag=0;

intUpdownflag=0;

intsignaltype=0;

unsignedint*CPLDDREG=(unsignedint*)0x2004;

unsignedint*CPLDDREGL=(unsignedint*)0x2006;

unionCPLD_DREGLMYDREGL;

unsignedintlednum[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0xEC,0xCE,0x7C,0x3E,0x1E};

unsignedintDateNUM[8]={0x66,0xFC,0x60,0xFC,0xF2,0x60,0xFC,0xDA};

unsignedintStudentNUM[8]={0x60,0xFC,0x60,0x60,0xF2,0xFC,0xDA,0xF6};

unsignedintKeyResult[8];

unsignedintAmpResult[8];

unsignedintsizeResult[8];

unsignedintcount;

unsignedintkeypress=0;

unsignedintx2,x3=0;

unsignedintkeyx=0,keyy=0;

unsignedintkeyx_temp=0,keyy_temp=0;

voiddelay(unsignedint);

voidldelay(unsignedint);

voidWriteLED(unsignedint);

voidWriteLEDs(unsignedint*);

voidResultCon(void);

voidDelay(Uint16);

max1(intx1)

{if(x1>x3)

x3=x1;

returnx3;}

voidmain(void)

{Uint16a=0x0800;

unsignedinti,j;

InitSysCtrl();

DINT;

IER=0x0000;

IFR=0x0000;

InitPieCtrl();

InitPieVectTable();

InitGpio();

InitCpuTimers();

PieCtrl.PIEIER1.bit.INTx7=1;

IER|=M_INT1;

EINT;ERTM;

ConfigCpuTimer(&CpuTimer0,150,400000);

StartCpuTimer0();

for(i=0;i<8;i++)

KeyResult[i]=0x00;

WriteLEDs(KeyResult);

while

(1)

{GpioDataRegs.GPADAT.all=0x07FF;

temp=GpioDataRegs.GPADAT.all&0x0780;

if(temp!

=0x0780)

{delay(2000);

GpioDataRegs.GPADAT.all=0x07FF;

temp=GpioDataRegs.GPADAT.all&0x0780;

if(temp!

=0x0780)

{delay(2000);

flag=0;a=0x0800;

for(i=0;i<5;i++)

{GpioDataRegs.GPADAT.all=0xffff;

GpioDataRegs.GPADAT.all=GpioDataRegs.GPADAT.all&(~(a<

delay(500);

if(GpioDataRegs.GPADAT.bit.GPIOA10==0)

{keypress=1;keyx=i;

keyy=0;

break;}

elseif(GpioDataRegs.GPADAT.bit.GPIOA9==0)

{keypress=1;

keyx=i;

keyy=1;

break;}

elseif(GpioDataRegs.GPADAT.bit.GPIOA8==0)

{keypress=1;

keyx=i;

keyy=2;

break;}

elseif(GpioDataRegs.GPADAT.bit.GPIOA7==0)

{keypress=1;keyx=i;

keyy=3;break;}}delay(2000);GpioDataRegs.GPADAT.all=0x07FF;temp=GpioDataRegs.GPADAT.all&0x0780;

while(temp!

=0x0780)

{GpioDataRegs.GPADAT.all=0x07FF;

temp=GpioDataRegs.GPADAT.all&0x0780;

delay(500);x3=0;}

for(i=0;i<8;i++)KeyResult[i]=0x00;

KeyResult[7]=lednum[keyx];

KeyResult[5]=lednum[keyy];

if((keyx==0)&&(keyy==3))

{gain=gain+500;

if(gain>30000)gain=30000;}

if((keyx==0)&&(keyy==1))

{gain=gain-500;

if(gain<0)gain=0;}

if((keyx==1)&&(keyy==0))

{sine_size=sine_size-2;

if(sine_size<12)sine_size=12;}

if((keyx==4)&&(keyy==0))

{sine_size=sine_size+2;

if(sine_size>512)sine_size=512;}

if((keyx==4)&&(keyy==3))

{signaltype=0;}

if((keyx==4)&&(keyy==2))

{signaltype=1;}

if((keyx==4)&&(keyy==1))

{signaltype=2;}

if((keyx==3)&&(keyy==3))

{signaltype=3;}

if((keyx==3)&&(keyy==2))

{signaltype=4;}

for(j=0;j

current[j]=0;

switch(signaltype)

{case0:

{for(j=0;j

current[j]=cos(2*3.1416/sine_size*j)*gain+offset;};

break;

case1:

{float_temp=0;

Updownflag=0;

for(j=1;j

{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;

elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;

if(float_temp>=100)Updownflag=1;

if(float_temp<=0)Updownflag=0;

current[j]=float_temp*gain/100+offset;}};

break;case2:

{float_temp=0;

Updownflag=0;

for(j=buffer_size;j>0;j--)

{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;

elseif(float_temp>=0&&Updownflag==1)float_temp=0;

if(float_temp>=100)Updownflag=1;

if(float_temp<=0)Updownflag=0;

current[j]=float_temp*gain/100+offset;}};

break;

case3:

{float_temp=0;

Updownflag=0;

temp=0;

for(j=1;j

{if(temp<=(sine_size/2)&&Updownflag==0){float_temp=1;temp++;}

elseif(temp>=(sine_size/2)&&Updownflag==1){float_temp=0;temp++;}

if(temp>=(sine_size/2))Updownflag=1;

if(temp>=sine_size){Updownflag=0;temp=0;}

current[j]=float_temp*gain+offset;}};

break;case4:

{float_temp=0;

Updownflag=0;

for(j=1;j

{if(float_temp<=100&&Updownflag==0)float_temp=float_temp+200.0/sine_size;

elseif(float_temp>=0&&Updownflag==1)float_temp=float_temp-200.0/sine_size;

if(float_temp>=100)Updownflag=1;

if(float_temp<=0)Updownflag=0;

current[j]=float_temp*gain/100+offset;

x2=max1(current[j]);

current[j]=current[j]-0.2*x2;

if(current[j]>=0.6*x2)

current[j]=0.6*x2;

if(current[j]<=0)

current[j]=0;}};

break;

default:

signaltype=0;;break;}

keyx_temp=keyx;

keyy_temp=keyy;

keyx=0;

keyy=0;

AmpResult[7]=0xEE;

AmpResult[6]=0xCE;

AmpResult[5]=0x02;

AmpResult[4]=lednum[(gain/10000)%10];

AmpResult[3]=lednum[(gain/1000)%10];

AmpResult[2]=lednum[(gain/100)%10];

AmpResult[1]=lednum[(gain/10)%10];

AmpResult[0]=lednum[gain%10];

sizeResult[7]=0x1E;

sizeResult[6]

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

当前位置:首页 > 总结汇报 > 工作总结汇报

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2