《DSP课程设计基于三知DSP实验箱的DSP实验整合.doc》由会员分享,可在线阅读,更多相关《DSP课程设计基于三知DSP实验箱的DSP实验整合.doc(25页珍藏版)》请在三一办公上搜索。
1、 DSP课程设计题 目 基于三知DSP实验箱的DSP实验整合院 系 专业班级 姓 名 学 号 指导老师 2012年6 月2日目 录一、 绪论.3二、 设计的任务.3三、 设计的要求.4四、 设计方案.44.1 直流电机的控制.4 4.1.1 直流电机的原理.4 4.1.2 直流电机的控制程序框图.44.2 步进电机的控制.6 4.2.1 步进电机的原理.6 4.2.2 步进电机的控制程序框图.74.3 交通灯的控制.7 4.3.1 交通灯的原理.8 4.3.2 步交通灯的控制程序框图.8五、系统调试与分析.10六、总结和心得.11七、参考文献.12八、附录.12一、绪论DSP数字信号处理(Di
2、gital Signal Processing ,简称DSP)是一门涉及许多科学而又广泛应用于许多领域的新学领域。数字信号处理是一种通过使用数学技巧执行转换或提取信息,来处理现实信号的方法,这些信号由数字序列表示。本次设计的是基于DSP原理设计的直流电机,步进电机,交通灯控制软硬件系统。直流电机定义为输出或输入为直流电能的旋转电机,它是能实现直流电能和机械能互相转换的电机。当它作电动机运行时是直流电动机,将电能转换为机械能;作发电机运行时是直流发电机,将机械能转换为电能。步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。它的调速一般是改变输入步进电机的脉冲的频率来实现步进电机的调速,因
3、为步进电机每给一个脉冲就转动一个固定的角度,这样就可以通过控制步进电机的一个脉冲到下一个脉冲的时间间隔来改变脉冲的频率,延时的长短来具体控制步进角来改变电机的转速,从而实现步进电机的调速。交通灯是利用发光二极管亮灭模拟交通信号,数码管现实时间,利用TMS320VS5420 DSP片上定时器产生时钟计数,设计模拟实际生活中十字路口交通灯。二、设计的任务1. 编程实现在现有实验箱上整合步进电机、直流电机、交通灯等实验项目。2. 三个实验可以通过键盘进行模式选择来切换(1步进电机控制,2直流电机控制,3交通灯控制,4三个实验同时进行),并在LED左数第一位上显示模式。3. 步进电机和直流电机的正反转
4、、加减速在键盘上进行控制,并在LED上显示步进电机和直流电机的运行状态。4. 交通灯控制时应在LED上显示时间的变化。交通灯东西、南北的时间可通过键盘设定。5. 三个实验同时进行时只显示模式,各实验的参数都可通过键盘设置。三、设计的要求1利用DSP的I/O操作编制程序输出一串脉冲控制电机的正转、反转、加速、减速、停止。2.通过DSP的I/O控制能对步进电机调速。3.利用TMS320VC5402的片内定时器中断,通过键盘直流电机和步进电机的正转、反转、加速、减速。并将送往步进电机的代码显示到LED上。4.能够正确的模拟交通灯,能响应硬件中断和定时中断5.运用C语言编程。四、设计方案4.1 直流电
5、机的控制利用DSP的I/O操作编制程序输出一串脉冲控制电机的正转、反转、加速、减速、停止 。编写定时器初始化程序(用于测速)、外部硬件中断服务程序,根据占空比速度=常数的原则进行调速。4.1.1 直流电机的原理导体受力的方向用左手定则确定。这一对电磁力形成了作用于电枢一个力矩,这个力矩在旋转电机里称为电磁转矩,转矩的方向是逆时针方向,企图使电枢逆时针方向转动。如果此电磁转矩能够克服电枢上的阻转矩(例如由摩擦引起的阻转矩以及其它负载转矩),电枢就能按逆时针方向旋转起来。 当电枢转了180后,导体 cd转到 N极下,导体ab转到S极下时,由于直流电源供给的电流方向不变,仍从电刷 A流入,经导体cd
6、 、ab 后,从电刷B流出。这时导体cd 受力方向变为从右向左,导体ab 受力方向是从左向右,产生的电磁转矩的方向仍为逆时针方向。 4.1.2 直流电机的控制框图 a.直流电机的方向控制: b.直流电机的速度控制:当相配对的开关闭合时,直流电机加速运行;当开关断开时,直流电机惯性运行(由于摩擦而减速运行),所以,要控制直流电动机的速度即是控制开关闭合的时间,在一段时间内(定义一个固定周期T),开关持续闭合时间越长(定义这个时间为t,tT),直流电机的速度就越快,那么,要想给直流电机加速,即是增加这个闭合时间,要想给直流电机减速,即是减少这个闭合时间,想迅速的减慢速度,也可通反向电流更好的达到效
7、果。 直流电机的程序框图如下: 4.2 步进电机的控制通过DSP的I/O控制能对步进电机调速。在了解步进电机工作原理前提下,掌握DSP I/O总线控制方法,按照步进电机工作原理编写步进电机的驱动程序。使电机旋转,改变脉冲信号的频率对电机调速。4.2.1 步进电机的原理步进电机的调速一般是改变输入步进电机的脉冲的频率来实现步进电机的调速,因为步进电机每给一个脉冲就转动一个固定的角度,这样就可以通过控制步进电机的一个脉冲到下一个脉冲的时间间隔来改变脉冲的频率,延时的长短来具体控制步进角来改变电机的转速,从而实现步进电的调速。具体的延时时间可以通过软件来实现。这就需要采用单片机对步进电机进行加减速控
8、制,实际上就是改变输出脉冲的时间间隔,单片机控制步进电机加减法运转可实现的方法有软件和硬件两种 ,软件方法指的是依靠延时程序来改变脉冲输出的频率,其中延时的长短是动态的,软件法在电机控制中, 要不停地产生控制脉冲, 占用了大量的CPU 时间,使单片机无法同时进行其他工作;硬件方法是依靠单片机内部的定时器来实现的,在每次进入定时中断后,改变定时常数,从而升速时使脉冲频率逐渐增大,减速时使脉冲频率逐渐减小,这种方法占用CPU 时间较少,在各种单片机中都能实现,是一种比较实用的调速方法。4.2.2 步进电机的控制程序框图 4.3 交通灯的控制用定时器定时,用I/O口控制红绿黄灯的开关,用硬件外部中断
9、模拟急救车的到达。有急救车到达时,两向为全红,以便让急救车通过。急救车通过后,交通灯恢复硬件中断前的状态。本实验以触发开关(红色按纽)为中断申请,表示有急救车通过。 4.3.1 交通灯的原理一个十字路口的交通一般分为两个方向,每个方向具有红灯,绿灯和黄灯3种,另外每个方向还具有左转灯,因此每个方向具有四个灯。交通灯为每一个灯的状态设计了倒计时数码管显示功能。可以为每一个灯的状态设置一个初始值,灯状态改变后,开始按照这个初始值倒计时。倒计时归零后,灯的状态将会改变至下一个状态。值得注意的是,交通灯两个方向的灯的状态是相关的。也就是说,每个方向的灯的状态影响着另外一个方向的灯的状态,这样才能够协调
10、两个方向的车流。如果每个方向的灯是独立变化的,那么交通灯就没有了意义。4.3.2 交通灯的控制框图I/O端口地址为:5008h红绿红绿红绿红绿y1y2y3y4ABCDy1y2y3y4373组合逻辑C5402D0D15D0D3D4D4A0A15A3A14A12使能输入使能输出使能交通灯的示意框图 交通灯的控制程序框图:五系统调试与分析调试结果如下:本次设计,完成了直流电机和步进电机转运,并可以通过键盘按键来控制改变转速的快慢和正反转,以及交通灯的显示。小键盘上的0表示在数码管上显示是1,以此类推。1时表示直流电机运转;2时表示步进电机运转;3时表示交通灯工作;4时表示直流电机,步进电机,交通灯同
11、时工作。5,6表示改变电机的正反转;7,8表示改变电机的转速。首先,要正确连接DSP实验机箱与电脑的连接,实验前确认机箱良好,打开电脑桌面上的CCS5.0软件,在my project文件夹中正确添加以编好的程序,生成.out文件,然后装载到DSP实验机箱上面。其次,运行程序,观察直流电机与步进电机的运行情况。按DSP实验箱上的键盘,观察不同按键对直流电机和步进电机的运行影响并记录,最后与预期要达到的人物要求作对比,看是否达到设计要求。程序中各模块的地址如下:六、总结与心得 通过这次课程设计,是我将所学理论知识很好地运用到实际工程当中,学到了很多东西,锻炼了自己的各方面的能力,具体有以下几点:1
12、. 在DSP控制知识学习方面,此次设计使我对课本上学到的知识有了进一步巩固,而且对课本上没有设计的知识也作了了解,例如TMS320VC5402的硬件结构和芯片资源的掌握,这里很感谢雷老师上实验课时耐心的讲解,使我们丰富了自己的知识。2. 查资料能力方面,通过这次课程设计,我进一步认识到了查工具书及网络资源的重要性,因为课本上的知识是有限的,通过查工具书能使我们广泛地吸取知识,补充自己知识系统的不足。3. 实用软件能力及编程能力方面,通过本次课程设计,我对以前做DSP实验时用到的CCS5.0软件有了更熟练的掌握,之前对DSP的C语言编程不太了解,通过本次设计们我学习并基本掌握了一些特殊指令的用法
13、,而且也学习了DSP汇编语言和标准C语言混合编程的方法。七、参考文献 1、邹彦,DSP原理与应用 电子工业出版社 2005年2、张勇,CC+语言硬件程序设计西安电子科技大学出版社 2003年3、刘和平 DSP原理及电机控制应用 北京航空航天大学出版社 2006.104、 唐介 电机与拖动 高等教育出版社 2003.75、 王海生 微型计算机控制技术 清华大学出版社 2007.4八、附录:源代码主程序:/*main_func.c*/ #include reg_define.h#include system_init.h /*通过system_init();调用*/#include IOport_
14、init.h /*包含后可直接使用所定义的IO端口*/#include Timer0_init.h /*通过Timer0_init(unsigned int Tmer0_VAL);调用*/#include Timer1_init.h /*通过Timer1_init(unsigned int Tmer0_VAL);调用*/#include Interrupt_server.h /*包含后可直接到所对应的中断服务程序中编中断服务程序*/#include LED_display_6.h /*通过LED_display_6(unsigned int 显示数据);调用*/ #include LED_di
15、splay_1.h #include LED_display_2.h#include LED_display_34.h #include LED_display_56.h #include traffic.h#include unsigned int BJ_code=0x07,0x0b,0x0d,0x0e; unsigned int bjcode,dj_code;#define dtime 1000 ; void delay(unsigned int d_t);main() system_init(); Timer0_init(0x6fff); /*Tmer0_VAL为TINT0的定时时间常数
16、*/ Timer1_init(0x0ffff); /*Tmer0_VAL为TINT1的定时时间常数*/ while(1) switch(mode)case 1: BJ_ADDR=BJ_codebjcode; delay(100); LED_display_1(key_code+1); LED_display_2(BJ_codebjcode); delay(100); break; case 2: DJ_ADDR=dj_code; delay(100); LED_display_1(key_code+1); delay(100); break; case 3: traffic(); delay(
17、100); LED_display_1(key_code+1); LED_display_34(key_code); delay(100); break; case 4: BJ_ADDR=BJ_codebjcode; delay(1000); DJ_ADDR=dj_code; delay(100); traffic(); delay(100); LED_display_1(key_code+1); delay(100); default : break; void delay(unsigned int d_t) int i,j;for(i=0;id_t;i+)for(j=0;j=bj_spee
18、d) t0=0;t1+;bjcode=t1%4; if(bj_derect) bjcode=3-bjcode; /*请在此处编写TINT0中断服务程序*/ if(t0_dj=dj_speed&t0_dj=dj_period) t0_dj=0;return; /*TINT1中断服务程序*/interrupt void TINT1_ISR() asm( NOP);asm( NOP);/*请在此处编写TINT1中断服务程序*/return; /*INT0中断服务程序*/interrupt void INT0_ISR() asm( NOP);asm( NOP); traffic_ADDR=0x0f00
19、0;delay(50000);delay(50000);delay(50000);delay(50000);delay(50000);delay(50000);delay(50000);delay(50000);/*请在此处编写INT0中断服务程序*/return; /*INT1中断服务程序*/interrupt void INT1_ISR() asm( NOP);asm( NOP);/*请在此处编写INT1中断服务程序*/return; /*INT2中断服务程序*/interrupt void INT2_ISR() asm( NOP);asm( NOP);key_code=KEY_ADDR;
20、key_code&=0x001f;switch(key_code) case 1: mode=1;break; case 2: mode=2;break; case 3: mode=3;break; case 4: mode=4;break; default : break; if(mode=1) switch(key_code) case 5: bj_derect=0; break; case 6: bj_derect=1;break; /*反转1*/case 7: if(bj_speed=3) bj_speed-;break; /*加速2*/case 8: if(bj_speed=1) d
21、j_speed-;break; /*减速2*/case 8: if(dj_speeddj_period) dj_speed+;break; /*加速3*/ default : break; else if(mode=3) traffic(); else if(mode=4) switch(key_code) case 5: BJ_ADDR=BJ_codebjcode; break; case 6: DJ_ADDR=dj_code; break; /*反转1*/ case 7: traffic();break; /*加速2*/ default : break; /*请在此处编写INT2中断服务程
22、序*/return; /*INT3中断服务程序*/interrupt void INT3_ISR() asm( NOP);asm( NOP);/*请在此处编写INT3中断服务程序*/return; IOport_init.h :/* IOport_init.h */* 定义5402的IO端口 */* IO port Definition */ ioport unsigned int port1008; /*步进电机模块IO口叶址1008h */ioport unsigned int port5008; /*交通灯模块IO口叶5008h */ioport unsigned int port600
23、0; /*液晶显示模块片选1口地址600xh */ioport unsigned int port7000; /*液晶显示模块片选2口地址700xh */ ioport unsigned int portA008; /*键盘模块扫描入口地址A008h */ioport unsigned int portB000; /*数码管显示模块IO口叶址B000h */ioport unsigned int portB007; /*直流电机模块IO口叶址B007h */ #define BJ_ADDR port1008 /*步进电机模块IO口叶址为BJ_ADDR */ #define traffic_AD
24、DR port5008 /*交通灯模块IO口叶址为traffic */ #define LCD1_ADDR port6000 /*液晶显示模块片选1口地址为LCD1_ADDR */ #define LCD2_ADDR port7000 /*液晶显示模块片选2口地址为LCD2_ADDR */ #define KEY_ADDR portA008 /*键盘模块扫描入口地址为KEY_ADDR */ #define LED_ADDR portB000 /*数码管显示模块IO口地址为LED_ADDR */ #define DJ_ADDR portB007 /*直流电机模块IO口叶址为DJ_ADDR */L
25、ED_display_1.h:/* LED_display_1.h */ /* LED显示子程序 */unsigned int LED_code_1=0x0001,0x3F01,0x0601,0x5B01,0x4f01,0x6601,0x6d01,0x7d01,0x0701,0x7f01,0x6f01,0x7701,0x7c01,0x3901,0x5e01,0x7901,0x7101;void display_delay_1(u16 dt);void LED_display_1(u16 keycode) LED_ADDR=LED_code_1keycode; display_delay_1(5
26、); LED_ADDR=0x0001; display_delay_1(1);void display_delay_1(u16 dt) int i,j; for(i=0;idt;i+) for(j=0;j2;j+) LED_display_2.h :/* LED_display_2.h */ /* LED显示子程序 */unsigned int LED_code_2=0x0002,0x3F02,0x0602,0x5B02,0x4f02,0x6602,0x6d02,0x7d02,0x0702,0x7f02,0x6f02,0x7702,0x7c02,0x3902,0x5e02,0x7902,0x7
27、102;void display_delay_2(u16 dt2);void LED_display_2(u16 keycode) LED_ADDR=LED_code_2keycode; display_delay_2(5); LED_ADDR=0x0001+1; display_delay_2(1);void display_delay_2(u16 dt2) int i,j; for(i=0;idt2;i+) for(j=0;j10;j+) LED_display_34.h: /* LED_display_34.h */ /* LED显示子程序 */unsigned int LED_code
28、_34=0x3F01,0x0601,0x5B01,0x4f01,0x6601,0x6d01,0x7d01,0x0701,0x7f01,0x6f01;void display_delay_34(unsigned int dt3);void LED_display_34(unsigned int keycode) unsigned int k3,k4,temp3,show_delay_time3=2,hide_delay_time3=1; k3=keycode/10; LED_ADDR=LED_code_34k3+2; display_delay_34(show_delay_time3); LED
29、_ADDR=0x0001+3; display_delay_34(hide_delay_time3); temp3=keycode-k3*10; k4=temp3; LED_ADDR=LED_code_34k4+3; display_delay_34(show_delay_time3); LED_ADDR=0x0001+4; display_delay_34(hide_delay_time3);void display_delay_34(unsigned int dt3) int i,j; for(i=0;idt3;i+) for(j=0;j1;j+) LED_display_56.h :/*
30、 LED_display_56.h */ /* LED显示子程序 */unsigned int LED_code_56=0x3F01,0x0601,0x5B01,0x4f01,0x6601,0x6d01,0x7d01,0x0701,0x7f01,0x6f01;void display_delay_56(unsigned int dt4);void LED_display_56(unsigned int keycode) unsigned int k5,k6,temp4,show_delay_time4=2,hide_delay_time4=1; k5=keycode/10; LED_ADDR=
31、LED_code_56k5+4; display_delay_56(show_delay_time4); LED_ADDR=0x0001+4; display_delay_56(hide_delay_time4); temp4=keycode-k5*10; k6=temp4; LED_ADDR=LED_code_56k6+5; display_delay_56(show_delay_time4); LED_ADDR=0x0001+5; display_delay_56(hide_delay_time4);void display_delay_56(unsigned int dt4) int i
32、,j; for(i=0;idt4;i+) for(j=0;j1;j+) LED显示子程序:/* LED_display_6.h */ /* LED显示子程序 */unsigned int LED_code_6=0x3F01,0x0601,0x5B01,0x4f01,0x6601,0x6d01,0x7d01,0x0701,0x7f01,0x6f01;void display_delay_6(unsigned int dt);void LED_display_6(unsigned int keycode) unsigned int k1,k2,k3,k4,k5,k6,temp1,temp2,sho
33、w_delay_time=2,hide_delay_time=1; k1=keycode/100000; LED_ADDR=LED_code_6k1+0; display_delay_6(show_delay_time); LED_ADDR=0x0001+0; display_delay_6(hide_delay_time); temp1=keycode-k1*100000; k2=temp1/10000; LED_ADDR=LED_code_6k2+1; display_delay_6(show_delay_time); LED_ADDR=0x0001+1; display_delay_6(
34、hide_delay_time); temp2=temp1-k2*10000; k3=temp2/1000; LED_ADDR=LED_code_6k3+2; display_delay_6(show_delay_time); LED_ADDR=0x0001+2; display_delay_6(hide_delay_time); temp1=temp2-k3*1000; k4=temp1/100; LED_ADDR=LED_code_6k4+3; display_delay_6(show_delay_time); LED_ADDR=0x0001+3; display_delay_6(hide
35、_delay_time); temp2=temp1-k4*100; k5=temp2/10; LED_ADDR=LED_code_6k5+4; display_delay_6(show_delay_time); LED_ADDR=0x0001+4; display_delay_6(hide_delay_time); temp1=temp2-k5*10; k6=temp1; LED_ADDR=LED_code_6k6+5; display_delay_6(show_delay_time); LED_ADDR=0x0001+5; display_delay_6(hide_delay_time);void display_delay_6(unsigned int dt) int i,j; for(i=0;idt;i+) for(j=0;j1;j+) 定时器初始化程序:/* Timer0_init.h */ /* 定时器初始化程序 */*定时器控制寄存器TCR各位的功能*/*| 15-12 | 11 | 10 |9-6| 5 | 4 |3-0 |*/*|Reserved|Soft|free|PSC|TRB
链接地址:https://www.31ppt.com/p-4146444.html