DSP课程设计报告论文.docx
《DSP课程设计报告论文.docx》由会员分享,可在线阅读,更多相关《DSP课程设计报告论文.docx(30页珍藏版)》请在冰豆网上搜索。
DSP课程设计报告论文
基于DSP实验箱的DSP实验整合
摘要
21世纪是数字化的时代,随着信息处理技术的飞速发展,DSP(数字信号处理器)技术逐渐发展成为一门主流技术,它在电子信息、通信、软件无线电、自动控制、仪表技术、信息家电等高科技领域得到了越来越广泛的应用。
相对于模拟滤波器,数字滤波器没有漂移,能够处理低频信号,频率响应特性可做成非常接近于理想的特性,且精度可以达到很高,容易集成等,这些优势决定了数字滤波器的应用越来越广泛,工程上常用它来做信号处理、数据传送和抑制干扰等。
。
同时DSP的出现和迅速发展也促进了数字滤波器的发展,并为数字滤波器的硬件实现提供了更多的选择。
本课题主要应用应用DSP集成开发环境—CCS调试C程序,用TMS320C5402来实现实验箱上的直流电机、步进电机、交通灯及液晶显示等所有模块整合。
关键字:
DSP、直流电机、步进电机、交通灯、液晶显示
目录
第一章设计任务及要求4
1.1设计任务4
1.2设计要求4
第二章设计思路及流程4
2.1设计思路4
2.2设计流程5
2.3程序流程图5
第三章实验结果及分析9
3.1模式一的运行结果9
3.2模式二的运行结果9
3.3模式三的运行结果10
3.4模式四的运行结果11
第四章实验中的问题及解决方案11
4.1数码管的序号选择11
4.2实现交通灯时间可调问题11
4.3按键消斗12
4.4LCD的显示问题:
13
第五章心得体会14
参考文献15
实验部分主要源程序:
16
第一章设计任务及要求
1.1设计任务
基于DSP实验箱的DSP实验整合,编程实现在现有实验箱上整合步进电机、直流电机、交通灯等实验项目。
1.2设计要求
一、三个实验可以通过键盘进行模式选择来切换(1步进电机控制,2直流电机控制,3交通灯控制,4三个实验同时进行),并在LED左数第一位上显示模式。
二、步进电机和直流电机的正反转、加减速在键盘上进行控制,并在LED上显示步进电机和直流电机的运行状态。
三、交通灯控制时应在LED上显示时间的变化。
交通灯东西、南北的时间可通过键盘设定。
四、三个实验同时进行时只显示模式,各实验的参数都可通过键盘设置。
第二章设计思路及流程
2.1设计思路
由于整合任务有四个模式状态,则可以定义一个全局变量state来存储模式标号,通过主函数循环扫描对DSP实验箱键盘按下的键值进行判断。
例如当按下1号键时,state=1,表明这时已进入模式一,然后数码管显示、步进电机方向速度设置、交通灯状态变化及时间设置等各子函数中通过switch(state)、case语句执行相应的功能。
以此类推当按下2、3、4号键时state的值也相应改变为2、3、4。
并跳到其他模式去执行相应的功能。
这样即可完成本次设计的预期效果。
2.2设计流程
一、对DSP进行初始化,给定时器0和定时器1装载初值以便电机的速度和交通灯的定时使用。
二、程序执行到主函数的循环体内反复调判断state的值执行相应的状态。
三、若检测到有1、2、3、4其中一按键按下,就跳到模式1、2、3、4其中一状态执行。
四、在选定的某一模式下去调用LED显示和状态设置子函数,在这些子函数中也有开关语句对全局变量state的值判断后再执行相应的程序。
五、最后程序指针又回到键盘扫描子函数处开始下一轮循环。
2.3程序流程图
当state=1时,主函数通过开关语句选通模式一步进电机。
同时状态变换和LED子函数也通过开关语句选通与步进电机对应的程序段。
在步进电机的模式下如果按下5键步进电机为正转,如果按下6键步进电机则为反转,如果按下7键步进电机减速,如果按下8键步进电机则为加速。
LED同步显示步进电机的控制代码。
最后程序指针又回状态模式判断处判断后又开始下一轮循环。
当state=2时,主函数通过开关语句选通模式二直流电机。
同时状态变换和LED子函数也通过开关语句选通与直流电机对应的程序段。
在直流电机的模式下如果按下5键直流电机为正转,如果按下6键直流电机则为反转,如果按下7键直流电机减速,如果按下8键直流电机则为加速。
LED同步显示直流电机的控制代码。
最后程序指针又回状态模式判断处判断后又开始下一轮循环。
当state=3时,主函数通过开关语句选通模式三交通灯。
同时状态变换和LED子函数也通过开关语句选通与交通灯对应的程序段。
在交通灯的模式下如果按下5键交通灯南北定时时间减一秒,如果按下6键交通灯南北定时时间加一秒,如果按下7键交通灯东西定时时间减一秒,如果按下8键交通灯东西定时时间加一秒。
LED同步显示交通灯的定时时间、时间调整、倒计时等状态。
最后程序指针又回状态模式判断处判断后又开始下一轮循环。
交通灯东西南北的时间设置可以开辟两个储存单元分别来存放东西定时时间和南北定时时间,然后通过按键的操作直接对这两个单元的数据进行加减就可以实现定时时间的设置。
按下0号键确认时间设置,同时将东西、南北的定时单元内的数值转换为秒赋给东西、南北倒计时单元。
在traffic子函数中设置东西、南北通行的标志位flag,若为南北通行flag置0,若为东西通行flag置1。
在中断服务程序中借助t_traffic计数器的数值和100取余,即每一秒钟判断一次flag的值,若为0则南北方向倒计时缓存单元(scount)的值减一并送LED显示。
若为1则东西方向倒计时缓存单元(wcount)的值减一并送LED显示。
显示的时间是以倒计时的方式显示,且是有选择性的显示。
这样有便于交通路口通行的行人随时能知道还剩下多少时间可以通行,等待的行人也能知道还需要等待多少时间才可以通行以便做好准备!
程序流程图如下:
当state=4时,主函数通过开关语句选通模式四。
同时状态变换和LED子函数也通过开关语句选通与模式四对应的程序段。
在组合模式下如果按下5键直流电机和步进电机为正转,如果按下6键直流电机和步进电机则为反转,如果按下7键直流电机和步进电机减速,如果按下8键直流电机和步进电机则为加速。
LED同步显示交通灯倒计时时间变化。
最后程序指针又回状态模式判断处判断后又开始下一轮循环。
第三章实验结果及分析
除了实现给定的实验设计的所有要求及功能之外,我还新增了倒计时和LCD显示等功能。
3.1模式一的运行结果
当按下1键时只有步进电机和数码管工作。
第一个数码管显示模式,第四个数码管显示正反转状态,“0”表示此时电机正转,“1”表示此时电机反转。
第六个数码管显示步进电机的的代码(图1中电机处于高速状态数码管显示太快所以相机拍到一个不应该出现的“8”)。
方向可以通过5、6键改变,速度可以通过7、8键改变。
3.2模式二的运行结果
(图一)
(图二)
当按下2键时只有直流电机和数码管工作。
同样第一个数码管显示模式,第四个数码管显示正反转状态,“0”表示此时电机正转,“1”表示此时电机反转。
第六个数码管显示步进电机的的代码(图中电机处于低速状态数码管显示太快所以相机拍到的总是“00”,如果电机处于高速状态当电机正转时数码管显示“01”,当电机正转时数码管显示“10”。
)。
方向可以通过5、6键改变,速度可以通过7、8键改变。
3.3模式三的运行结果
当按下3键时只有交通灯和数码管工作。
同样第一个数码管显示模式,第二个数码管显示通行状态,“0”表示此时南北绿灯东西红灯,“1”表示南北红灯东西绿灯。
图一图二中的第三、四个数码管显南北的通行时间(或等待时间)。
第五、六个数码管显东西的通行时间(或等待时间)。
也就是三、四和五、六数码管显示内容一样但是代表不同的意思,当三、四显示的是南北通行剩余时间时,五、六显示东西的等待剩余时间,反之亦然。
图三图四为交通灯时间设置状态,这时按下键盘上的5、6、7、8键时可以看到对应的时间在改变。
设定好后按下0键确认设置程序会回复到交通灯状态工作。
3.4模式四的运行结果
当按下4键时进入组合模式。
同样第一个数码管显示模式,第二个数码管显示交通灯通行状态,“0”表示此时南北绿灯东西红灯,“1”表示南北红灯东西绿灯。
图一图二中的第三、四个数码管显南北的通行时间(或等待时间)。
第五、六个数码管显东西的通行时间(或等待时间)。
步进电机和直流电机方向可以通过5、6键同时改变,步进电机和直流电机速度可以通过7、8键同时改变。
第四章实验中的问题及解决方案
4.1数码管的序号选择
刚开始时不知道怎样把代码送到指定的数码管上显示,后来经过对以前做过的实验程序仔细解读和运行观察才发现,原来程序里面的那些数码管显示代码的最后一位数就是控制选择在哪一个数码管上显示的。
因此找到这个关键点后我就自己编写了一个LED显示子程序可以灵活调用从而解决了这个问题。
4.2实现交通灯时间可调问题
由于要实现时间可调,也就是说东西、南北的时间不是一个定值而是一个可以通过键盘来改变的变量。
我就想到了用两个变量来存储这个可以变化的时间值,但是不知道交通灯的各个状态的持续时间以及定时器的定时中断时间,也就是不知道源程序里面的这些数字代表多长时间。
后来仔细的观察运行状态交通灯的闪烁间给时间和traffic这个函数发现,函数里面的最大数值除上100等于20刚好和交通的循环周期20s吻合。
所以将t_traffic计数器内的值除上100就可以换算成秒,再结合实际需要将源程序和修改后的程序对应如下:
源程序
修改后的程序
在修改后的程序中最后一行赋值语句是交通灯模式的时间能否正确循环显示的关键。
如果没有最后一行或者该语句不是加在这个位置,则会出现这样的现象,在时间设置好后交通灯只能正确的执行一次设定的时间,后面就不在按照设置的时间进行倒计时而是采用程序的初始给定值进行倒计时。
4.3按键消斗
在步进电机和直流电机模式下,当按下7号键减速时会发现电机的速度一下就减到了最小了,同样当按下8号键减速时会发现电机的速度一下就加到了最大。
交通灯模式下在进行时间设置的时候也是如此,即时间要么一下减到最小要么一下就加到最大,根本无法完成时间的精确设置。
为此、刚开始我用了消斗语句进行消斗发现也无济于事。
后来想到在键盘中断里设置一个标志为keyflag若有按键按下则keyflag++,在按键子函数里面只要判断keyflag的值是否大于某个数当然这个数越大意味着键盘越不灵敏越小越灵敏,判断完后立即将keyflag清0,这样就解决了这个问题。
4.4LCD的显示问题:
虽然不要求使用LCD液晶显示器,但是我在率先实现基本要求的同时也想尝试一下LCD液晶显示和使用。
我通过在网上查到一些12864的资料,因为每一款液晶的型号不一样他的使用方法也各有差异,而且我不知道实验箱上的液晶是什么型号的,在这样的情况下我只有通过用Protues和Keil仿真单片机来调试出一个正确的程序然后修改再加到DSP的程序里面调试,在仿真里面我完全能灵活的运用12864液晶屏但是实验箱上的我怎么也弄不出来,连一个纯字符都没显示出来,但是当我运行程序的时候我可以隐约看到文字的影子!
有时候能清晰的看到汉字的上半部分和下半部分,但是怎么调也不能使之合成一个字最终以失败而告终。
仿真效果及实验箱的显示效果如下:
第五章心得体会
首先,做课程设计真的很不容易。
在这期间,我一次又一次的告诉自己,不管多难,一定要坚持,这是一个锻炼自己动手能力的好机会,一定要把握并充分利用,这两周以来每天都是对着电脑在编程,在实验室反复的打开实验箱下载代码,回寝室有时候还弄到深夜。
不过对课程设计很感兴趣的,正是因为如此才激励着我解决了这过程中遇到的种种问题和困难,收获了很多的知识。
深知书上得来终觉浅才知此事要躬行。
此外、更令我的创造性思维得到拓展。
希望今后类似这样课程设计、类似这样的锻炼机会能更多一些。
总的来说,这次课程设计确实学到很多,而且也锻炼了我遇到问题解决问题的勇气和能力,以及遇到挫折不达目的不罢休的韧性,这在以后的工作与学习中将会非常重要。
参考文献
[1]TMS320C54xDSPReferenceSet,Volume1:
CPUandPeripherals(LiteratureNumberSPRU131G).TexasInstrumentsIn.2001
[2]李利,DSP原理及应用,北京:
中国水利水电出版社2011
实验部分主要源程序:
/**********************************************/
/*********作者:
王永志*********/
/*********单位:
黄冈师范学院物电系*********/
/*********时间:
2012年6月*********/
/**********************************************/
/*******main_func.c****/
#include"reg_define.h"
#include"system_init.h"/*通过system_init();调用*/
#include"IOport_init.h"/*包含后可直接使用所定义的IO端口*/
#include"Timer0_init.h"/*通过Timer0_init(unsignedintTmer0_VAL);调用*/
#include"Timer1_init.h"/*通过Timer1_init(unsignedintTmer0_VAL);调用*/
#include"Interrupt_server.h"#include"traffic.h"
#include"hanziku.h"
#include"LCD.h"
#include"LEDKEYNO.h"
#include
unsignedintBJ_code[]={0x07,0x0b,0x0d,0x0e};
unsignedintbjcode,dj_code,state=0,snt=1000,wet=2000;
externunsignedintkey_code;
#definedtime1000;
voiddelay(unsignedintd_t)
{inti,j;
for(i=0;i{for(j=0;j<1;j++){}}
}
main()
{lcd_init();
system_init();
Timer0_init(0x6fff);/*Tmer0_VAL为TINT0的定时时间常数*/
Timer1_init(0x0ffff);/*Tmer0_VAL为TINT1的定时时间常数*/
scount=snt/100;wcount=(wet-snt)/100;
LCDmoshiyi();
delay(100);
while
(1)
{LED_display();
Key_Process();
switch(state)
{
case1:
BJ_ADDR=BJ_code[bjcode];/**模式一为步进电机***/
delay(500);
break;
case2:
DJ_ADDR=dj_code;/**模式二为直流电机***/
delay(500);
break;
case3:
traffic();/**模式三为交通灯***/
delay(500);
break;
case4:
BJ_ADDR=BJ_code[bjcode];/**模式四为组合模式***/
delay(500);
DJ_ADDR=dj_code;
delay(500);
traffic();
delay(500);
break;
case5:
LED_display();break;
default:
state=0;break;
}
}
}
/***********INT_serv.h***************/
/***********中断服务程序***************/
#include"IOport_init.h"
externunsignedintbjcode,dj_code,t_traffic;
externunsignedintscount,wcount,flag,state;
externvoiddelay(unsignedintd_t);
unsignedintt0,t1,key_code,bj_derect=0,bj_speed=20,derecta=1,derectb=0;
unsignedintt0_dj,dj_speed=5,dj_period=20,dj_derect=0,count=0,keyflag=0;
#definepositive0x0100;
#definenegative0x0200;
#definestop0x0000;
/***TINT0中断服务程序***/
interruptvoidTINT0_ISR()
{
asm("NOP");
asm("NOP");
t0++;
t0_dj++;
t_traffic++;
if(t_traffic%100==0)
{if(flag==0)
{scount--;
count=scount;
}
else
{wcount--;
count=wcount;
}
}
if(t0>=bj_speed)
{
t0=0;
t1++;
bjcode=t1%4;
if(bj_derect)bjcode=3-bjcode;
}/**请在此处编写TINT0中断服务程序**/
if(t0_dj{
dj_code=positive;derecta=1;derectb=0;
if(dj_derect){dj_code=negative;derecta=0;derectb=1;}
}
if(t0_dj>=dj_speed&&t0_djif(t0_dj>=dj_period)t0_dj=0;
return;
}
/***INT0中断服务程序***/
interruptvoidINT0_ISR()
{
asm("NOP");
asm("NOP");
traffic_ADDR=0x0f000;
delay(50000);
delay(50000);
delay(50000);
delay(50000);
delay(50000);
delay(50000);
delay(50000);
delay(50000);
return;
}
/***INT2中断服务程序***/
interruptvoidINT2_ISR()
{keyflag++;
asm("NOP");
asm("NOP");
key_code=KEY_ADDR;
key_code&=0x001f;
key_code=key_code-1;
switch(key_code)
{case1:
state=1;break;/**在初始状态的时候通过键值的判断跳到相应的模式***/
case2:
state=2;break;
case3:
state=3;break;
case4:
state=4;break;
default:
state=0;break;
}
}
/*******traffic.h*******/
unsignedintt_traffic=0,flag=0,scount=0,wcount=0;
externunsignedintwet,snt;
externvoiddelay(unsignedintd_t);
voidtraffic()
{/***北西南东:
北西南东*/
/***红红红红绿绿绿绿*/
/**将调设置好的东西、南北定时时间换算成秒赋给倒计时单元***/
if(t_traffic<(snt-500))
{flag=0;traffic_ADDR=0x5a00;/*东西红,南北绿。
且标志位置0说明现在为南北通行状态*/
delay(50);
}
if(t_traffic>=(snt-500)&&t_traffic<(snt-450))
{traffic_ADDR=0x5000;/*南北闪烁*/
delay(50);
}
if(t_traffic>=(snt-450)&&t_traffic<(snt-400))
{traffic_ADDR=0x5a00;/*南北闪烁*/
delay(50);
}
if(t_traffic>=(snt-400)&&t_traffic<(snt-350))
{traffic_ADDR=0x5000;/*南北闪烁*/
delay(50);
}
if(t_traffic>=(snt-350)&&t_traffic<(snt-300))
{traffic_ADDR=0x5a00;/*南北闪烁*/
delay(50);
}
if(t_traffic>=(snt-300)&&t_traffic<(snt-250))
{traffic_ADDR=0x5000;/*南北闪烁*/
delay(50);
}
if(t_traffic>=(snt-250)&&t_traffic{traffic_ADDR=0x0fa00;/*南北黄灯*/
delay(50);
}
/***北西南东:
北西南东*/
/***红红红红绿绿绿绿*/
if(t_traffic>=snt&&t_traffic<(wet-500))
{flag=1;traffic_ADDR=0xa500;/*东西绿,南北红。
且标志位置1说明现在为东西通行状态*/
delay(50);
}
if(t_traffic>=(wet-500)&&t_traffic<(wet-450))
{traffic_ADDR=0xa000;/*东西闪烁*/
delay(50);
}
if(t_traffic>=(wet-450)&&t_traffic<(wet-400))
{traffic_ADDR=0xa500;/*东西闪烁*/
delay(50);
}
if(t_traffic>=(wet-400)&&t_traffic<(wet-350))
{traffic_ADDR=0xa000;/*东西闪烁*/
delay(50);
}
if(t_traffic>=(wet-350)&&t_traffic<(wet-300))