基于DSP的可调信号发生器设计.docx
《基于DSP的可调信号发生器设计.docx》由会员分享,可在线阅读,更多相关《基于DSP的可调信号发生器设计.docx(23页珍藏版)》请在冰点文库上搜索。
基于DSP的可调信号发生器设计
目录
一、设计的目的3
二、设计的内容与要求3
三、设计方案4
四、软件、硬件设计(根据设计内容适当处理,硬件设计应包括PCB5
4.1、软件设计5
4.1.1按键矩阵模块5
4.1.2波形发生模块5
4.1.3数码管显示模块5
4.1.4点阵显示模块5
图3.3点阵模块及原理图6
4.2.14*5按键矩阵6
4.2.2数码管显示7
五、设计总结8
5.1调试结果8
5.2心得体会11
六、参考文献11
七、附录12
一、设计的目的
根据已掌握的《DSP技术及应用》课程知识,完成课程设计要求的项目。
了解正弦波的产生,以及正弦波幅值和频率的调整方法,掌握信号产生的一般方法并学习使用CCS图形显示功能进行程序调试。
通过硬件设计和程序编写过程,加深对《DSP技术及应用》课程知识的理解和掌握,培养应用系统设计的能力,以及分析问题和解决问题的方法,并进一步拓宽专业知识面,培养实践应用技能和创新意识。
二、设计的内容与要求
(一)、课程设计题目:
基于DSP的可调信号发生器设计
(二)、具体设计要求如下:
1)基础设计:
在CCS中运行调试程序代码,输出正弦信号波形,并使用CCS的图像显示窗口,实时显示输出的正弦波。
2)提高设计:
使用DSPF2812的GPIO功能,读取外部手动按键的信号,相应改变正弦信号的幅值、相位、频率和偏移(幅值,采用有符号16位整型变量定义)。
3)附加设计:
使用DSPF2812的GPIO功能,读取外部手动按键的信号,相应输出正弦波、三角波、方波、锯齿波。
并分别实现四种波形的幅值和频率的调节。
4)高级设计:
用8个七段数码管,每隔一秒依次循环显示三种信息,包括:
①日期(格式为2014-06-12);②自己的学号(格式为学号的低8位,例如学号为112033101的同学,应当显示:
12033101);③当前的幅值(格式为:
AP-00000~AP-32767);
频率即每周期的离散采样点数(格式为:
PEAD-012);
当前按键坐标(格式为:
XX)。
5)终极设计:
利用点阵循环显示本人姓名。
三、
设计方案
本次课程设计是基于DSP的可调信号发生器的设计,系统设计方案框图如图3.1所示。
通过读取外部手动按键的信号,转换显示CCS窗口的波形,按键控制波形如图3.2所示;同时在数码管上动态显示幅值、频率、学号、按键坐标和日期。
图3.1系统设计方案框图
图3.2按键控制波形
四、软件、硬件设计(根据设计内容适当处理,硬件设计应包括PCB
4.1、软件设计
软件设计模块包含了按键矩阵模块、波形发生模块、数码管显示模块、点阵显示模块和综合调试显示结果。
4.1.1按键矩阵模块
使用DSPF2812的GPIO功能,判断按键是否按下keypress=1。
再用标志位flag控制选择输出波形。
4.1.2波形发生模块
通过手动按键控制CCS窗口显示波形:
正弦波、方波、三角波、锯齿波。
(1)正弦波
(2)三角波
(3)锯齿波
(4)方波
4.1.3数码管显示模块
提取幅度的数值,分别放入Amp[]数组中,调用WriteLEDs()数码管显示,在数码管上显示幅度、频率、学号、日期和按键坐标。
4.1.4点阵显示模块
利用点阵循环显示本人姓名。
图3.3点阵模块及原理图
4.2、硬件设计
硬件电路设计模块包含了矩阵按键电路、数码管显示电路,以及点阵显示电路。
4.2.14*5按键矩阵
4*5的按键矩阵,通过9个GPIO端口来扫描控制,即可判断出哪一个按键被按下。
按键左端接GPIOA11-GPIOA15,按键右端接GPIOA7-GPIOA10。
通过对GPIOA端口进行初始化,按键左端为输出口,按键右端为输入口,将GPIOA11-GPIOA15赋值0,通过对按键右端进行扫描,如果某个按键被按下,则该按键右端对应的GPIO口值为0,否则应为1。
按键矩阵模块及原理图如图4.1所示。
图4.14*5按键矩阵模块及原理图
4.2.2数码管显示
实验箱上有8只8段数码管,使用74F164芯片(串入并出芯片)对数码管进行控制。
8只数码管的控制使用串行方式,实现8只流水数码管。
其中3只电路如图4.2所示,另外5只接线相同。
图4.2数码管模块及其硬件结构
五、设计总结
5.1调试结果
本次课程设计调试结果如下所示:
数码管轮流显示:
图5.1显示当前幅值
图5.3显示每周期的离散采样点数
图5.2显示学号
图5.4显示日期
图5.5显示按键坐标
输出各种波形:
图5.3显示每周期的离散采样点数
图5.6正弦波形
图5.7三角波
图5.8方波
图5.9锯齿波
图5.10波形的幅值与周期
3.点阵显示结果
(显示名字的截图)
5.2心得体会
六、参考文献
顾卫钢.手把手教你学DSP——基于TMS320X281x.北京:
北京航空航天大学出版社,2011.4
苏奎峰,吕强等.TMS320X281xDSP原理及C程序开发北京航空航天大学出版社,2008
TMS320F281xDataSheet.TexasInstruments.
TMS320F28xControlandInterruptsReferenceGuide.TexasInstruments.
TMS320F28xEventManager(EV)ReferenceGuide.TexasInstruments.
TMS320F28xOptimizingC/C++CompilerUser’sGuide.TexasInstruments.
TMS320F28xDSPCPUandInstructionSetReferenceGuide.TexasInstruments.
七、附录
/*************源代码**************/
#include"DSP28_Device.h"
#include
#defineSIZE512
#definepi3.14
intA=1000;//正弦信号幅度
intoffset=0;//正弦信号偏移量
intf=1;//正弦信号频率
ints=0,count=1,flag=0;//正弦信号初始相位
intsine[SIZE];//正弦信号数组
unsignedintt;
intstrnum[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E};/*0~9*/
intday[]={0xDA,0x60,0xBF,0xFC,0x67,0x60,0xFC,0xDA};//显示日期
intstudentnum17[]={0xE0,0x60,0x60,0xF2,0xF2,0xFC,0xDA,0x60};//显示学号
intAnum[]={0,0,0,0,0,0x02,0xCE,0xEE};
//显示幅度
intfnum[]={0,0,0,0x02,0x7A,0xEE,0x9E,0xCE};//显示频率
intkey[]={0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60};//显示按键坐标
intch[8]={0xFE,0x60,0x60,0xF2,0xF2,0xFC,0xDA,0x60};//缓存
intch1[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
intstr1[]={0x0900,0xFD08,0x0908,0x0910,0x0920,0x7940,0x4104,0x47FE,
0x4140,0x7940,0x0920,0x0920,0x0910,0x094E,0x5184,0x2100};//名字1
intstr2[]={0x0100,0x0100,0x0104,0xFFFE,0x0100,0x0100,0x0110,0x3FF8,
0x0000,0x0200,0x1180,0x5084,0x5012,0x9012,0x0FF0,0x0000};//名字2
intstr3[]={0x0100,0x0088,0x3FFC,0x2080,0x2080,0x2088,0x3FFC,0x2080,
0x2080,0x2140,0x2140,0x2220,0x2220,0x4410,0x880E,0x3004};//名字3
unsignedint*CPLDDREG=(unsignedint*)0x2004;
unsignedint*CPLDDREGL=(unsignedint*)0x2006;
unsignedint*LEDM_LC=(unsignedint*)0x2018;//16
unsignedint*LEDM_LR=(unsignedint*)0x201A;//16
unionCPLD_DREGLMYDREGL;//
unionCPLD_DREGMYDREG;//16
unsignedintkeypress=0;
unsignedintkeyx,keyy;
voiddelay(unsignedint);
voidldelay(unsignedint);
voidFB(void);//产生方波
voidSJ(void);//产生三角波
voidJC(void);//产生锯齿波
voidZX(void);//产生正弦波
voidWriteLED(unsignedint);
voidWriteLEDs(unsignedint*);
voidTime0();
voidKeyNO(int*ch2);
voidXueHao();
voidAp();
voidPead();
voidmain(void)
{
Uint16a=0x0800;
unsignedinti,j,x,y,l,g,k;
InitSysCtrl();//初始化系统
DINT;//关中断
IER=0x0000;
IFR=0x0000;
InitPieCtrl();//初始化PIE控制寄存器
InitPieVectTable();//初始化PIE矢量表
InitGpio();//初始化GPIO
EINT;
ERTM;
MYDREG.all=0xffff;//initDREG
MYDREG.bit.BUFFER_OEn=0;//BUFFER_OEn=0
*CPLDDREG=MYDREG.all;
MYDREGL.all=0xffff;//initDREGL
//MYDREGL.bit.LEDM_CSn=0;//LEDM_CSn=0
*CPLDDREG=MYDREG.all;
while
(1)
{
a=0x0800;
/**********逐行逐列按键扫描,将按键所在位置的坐标存入KEYX和KEYY****************************/
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;}
}
if(keyx==0&&keyy==1&&keypress==1)
{keypress=0;A=A+500;
if(A>30000)A=30000;}
if(keyx==0&&keyy==0&&keypress==1)
{keypress=0;A=A-500;
if(A<0)A=500;}
if(keyx==1&&keyy==1&&keypress==1)
{keypress=0;f=f+1;}
if(keyx==1&&keyy==0&&keypress==1)
{keypress=0;f=f-1;
if(f<0)f=1;}
if(keyx==2&&keyy==1&&keypress==1)
{keypress=0;s=s+1;}
if(keyx==2&&keyy==0&&keypress==1)
{keypress=0;s=s-1;}
if(keyx==3&&keyy==1&&keypress==1)
{keypress=0;offset=offset+1;}
if(keyx==3&&keyy==0&&keypress==1)
{keypress=0;offset=offset-1;}
if(keyx==4&&keyy==0&&keypress==1)
{keypress=0;count=1;}
if(keyx==4&&keyy==1&&keypress==1)
{keypress=0;count=2;}
if(keyx==4&&keyy==2&&keypress==1)
{keypress=0;count=3;}
if(keyx==4&&keyy==3&&keypress==1)
{keypress=0;count=4;}
ch1[2]=strnum[keyx%10];ch1[4]=strnum[keyy%10];
ldelay(10);
switch(count)
{
case1:
FB();break;
case2:
SJ();break;
case3:
JC();break;
case4:
ZX();break;
}
switch(flag)
{
case0:
flag=1;Time0();break;
case1:
flag=2;Xuehao();break;
case2:
flag=3;Ap();break;
case3:
flag=4;Pead();break;
case4:
flag=0;KeyNO(ch1);break;
}
WriteLEDs(ch);
ldelay(1000);
for(i=1;i<17;i++)
{
for(j=0;j
{
l=i-j-1;
g=~(0x0001<*LEDM_LR=g;
*LEDM_LC=(str1[j]>>8)|(str1[j]<<8);
delay(12000);
}
}
ldelay
(1);
for(i=1;i<17;i++)
{
for(j=0;j
{
l=i-j-1;
g=~(0x0001<*LEDM_LR=g;
*LEDM_LC=(str2[j]>>8)|(str2[j]<<8);
delay(12000);
}
}
ldelay
(1);
for(i=1;i<17;i++)
{
for(j=0;j
{
l=i-j-1;
g=~(0x0001<*LEDM_LR=g;
*LEDM_LC=(str3[j]>>8)|(str3[j]<<8);
delay(12000);
}
}
ldelay
(1);
}
}
voidFB(void)
{
for(t=0;t{
sine[t]=A*sin(2*pi*f*t/512+s)+offset;
if(sine[t]>0)
sine[t]=A;
else
sine[t]=-A;
}
}
voidSJ(void)
{
intk,T;
T=SIZE/f/2;
k=A/T;
for(t=0;t{
if((t/T)%2==0)
sine[t]=k*(t%T)+offset;
else
sine[t]=A-k*(t%T)+offset;
}
}
voidJC(void)
{
intk,T;
T=SIZE/f;
k=A/T;
for(t=0;tsine[t]=k*(t%T)+offset;
}
voidZX(void)
{
for(t=0;tsine[t]=A*sin(2*pi*f*t/512+s)+offset;
}
voidXueHao()
{
unsignedchari;
for(i=0;i<8;i++)
ch[i]=studentnum17[i];
}
voidKeyNO(int*ch2)
{
unsignedchari;
for(i=0;i<8;i++)
ch[i]=ch2[i];
}
voidTime0()
{
unsignedchari;
for(i=0;i<8;i++)
ch[i]=day[i];
}
voidAp()
{
ch[0]=Anum[A%10];
ch[1]=Anum[(A/10)%10];
ch[2]=Anum[(A/100)%10];
ch[3]=Anum[(A/1000)%10];
ch[4]=Anum[A/10000];
ch[5]=0x03;
ch[6]=0xCE;
ch[7]=0xEE;
}
voidPead()
{
ch[0]=fnum[f/10];
ch[1]=fnum[(f%100)/10];
ch[2]=fnum[(f%1000)/100];
ch[3]=0x03;
ch[4]=0x7A;
ch[5]=0xEE;
ch[6]=0x9E;
ch[7]=0xCE;
}
voidWriteLED(unsignedintindex)
{
unsignedinti;
for(i=0;i<8;i++)
{
if(index&(0x01<
MYDREGL.bit.LEDSAB=1;
else
MYDREGL.bit.LEDSAB=0;
(*CPLDDREGL)=MYDREGL.all;
MYDREGL.bit.LEDSCLK=0;
(*CPLDDREGL)=MYDREGL.all;
MYDREGL.bit.LEDSCLK=1;
(*CPLDDREGL)=MYDREGL.all;
}
}
voidWriteLEDs(unsignedint*index)
{
unsignedinti,ii;
for(ii=0;ii<8;ii++)
for(i=0;i<8;i++)
{
if(index[ii]&(0x01<
MYDREGL.bit.LEDSAB=1;
else
MYDREGL.bit.LEDSAB=0;
(*CPLDDREGL)=MYDREGL.all;
MYDREGL.bit.LEDSCLK=0;
(*CPLDDREGL)=MYDREGL.all;
MYDREGL.bit.LEDSCLK=1;
(*CPLDDREGL)=MYDREGL.all;
}
}
voidldelay(unsignedintk)
{
while(k>0)
{
k--;
delay(5000);
}
}
voiddelay(unsignedintt)
{
while(t>0)
t--;
}