基于DSP在电子技术上的应用.docx
《基于DSP在电子技术上的应用.docx》由会员分享,可在线阅读,更多相关《基于DSP在电子技术上的应用.docx(23页珍藏版)》请在冰点文库上搜索。
基于DSP在电子技术上的应用
基于DSP在电子技术上的应用
第一章绪论
1.1系统背景
1.1.1DSP技术的特点以及在电子技术中的应用
DSP一方面是DigitalSignalProcessing的缩写,意思是数字信号处理,就是指数字信号理论研究。
DSP另一方面是DigitalSignalProcessor,意思是数字信号处理器,就是用来完成数字信号处理的器件。
最初的DSP器件只是被设计成用以完成复杂数字信号处理的算法。
DSP器件紧随着数字信号理论的发展而不断发展。
在20世纪60年代,数字信号处理技术才刚刚起步。
60年代中期以后,快速傅里叶算法的出现及大规模集成电路的发展大大促进了DSP技术与器件的飞速发展。
(一)DSP器件的特点
1.高速、高精度运算能力
(1)硬件乘法累加操作,在一个指令周期内可完成一次乘法和一次加法。
(2)哈弗结构和流水线结构。
哈佛结构的主要特点是将程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个相互独立的存储器,每个存储器独立编址,独立访问。
与两个存储器相对应的是系统中设置了程序总线和数据总线,从而使数据的吞吐率提高了一倍。
由于程序和存储器在两个分开的空间中,因此取指和执行能完全重叠。
流水线与哈佛结构相关,DSP芯片广泛采用流水线以减少指令执行的时间,从而增强了处理器的处理能力。
使取指、译码和执行等操作可以重叠执行,处理器可以并行处理二到四条指令,每条指令处于流水线的不同阶段。
(3)硬件循环控制。
大多数的DSP都有专门的硬件,用于零开销循环。
所谓零开销循环是指处理器在执行循环时,不用花时间去检查循环计数器的值、条件转移到循环的顶部、将循环计数器减1。
(4)特殊的寻址模式。
DSP处理器往往都支持专门的寻址模式,它们对通常的信号处理操作和算法是很有用的。
例如,模块(循环)寻址(对实现数字滤波器延时线很有用)、位倒序寻址(对FFT很有用)。
(5)具有丰富的外设。
DSP具有DMA(有一组或多组独立的DMA总线,与CPU的程序、数据总线并行工作,在不影响CPU工作的条件下,DMA速度已达800Mbyte/s以上)、串口、定时器等外设。
2.强大的数据通信能力。
3.灵活的可编程性。
DSP骗内设置RAM和ROM,可以方便地拓展程序、数据及I/O空间,同时允许ROM和RAM直接数据传送。
可编程DSP芯片可使设计人员在开发过程中灵活方便地对软件进行修改和升级
4.低功耗设计。
DSP可以工作在省电状态,节省了能源。
(二)DSP器件的应用
自从DSP芯片诞生以来,DSP芯片得到了飞速的发展。
DSP芯片高速发展,一方面得益于集成电路的发展,另一方面也得益于巨大的市场。
在短短的十多年时间,DSP芯片已经在信号处理、通信、雷达等许多领域得到广泛的应用。
目前,DSP芯片的价格也越来越低,性能价格比日益提高,具有巨大的应用潜力。
DSP芯片的应用主要有:
(1)信号处理--如,数字滤波、自适应滤波、快速傅里叶变换、相关运算、频谱分析、卷积等。
(2)通信--如,调制解调器、自适应均衡、数据加密、数据压缩、回坡抵消、多路复用、传真、扩频通信、纠错编码、波形产生等。
(3)语音--如语音编码、语音合成、语音识别、语音增强、说话人辨认、说话人确认、语音邮件、语音储存等。
(4)图像/图形--如二维和三维图形处理、图像压缩与传输、图像增强、动画、机器人视觉等。
(5)军事--如保密通信、雷达处理、声纳处理、导航等。
(6)仪器仪表--如频谱分析、函数发生、锁相环、地震处理等。
(7)自动控制--如引擎控制、深空、自动驾驶、机器人控制、磁盘控制。
(8)医疗--如助听、超声设备、诊断工具、病人监护等。
(9)家用电器--如高保真音响、音乐合成、音调控制、玩具与游戏、数字电话/电视等
1.1.2本课程设计任务及要求
一、任务:
编程实现在现有实验箱上整合步进电机、直流电机、交通灯等实验项目。
1、三个实验可以通过键盘进行模式选择来切换(1步进电机控制,2直流电机控制,3交通灯控制,4三个实验同时进行),并在LED左数第一位上显示模式。
2、步进电机和直流电机的正反转、加减速在键盘上进行控制,并在LED上显示步进电机和直流电机的运行状态。
3、交通灯控制时应在LED上显示时间的变化。
交通灯东西、南北的时间可通过键盘设定。
4、三个实验同时进行时只显示模式,各实验的参数都可通过键盘设置。
二、要求:
1、上交不少于3000字的设计报告。
报告内容包括:
设计任务、设计要求、设计思路、采取的算法、设计过程、中间结果(调试时编译的结果截图)、设计结果(实现了哪些功能)、设计总结达到了哪些目标、存在哪些问题、对存在的问题进行分析、提出改进设想、参考文献等内容。
2、报告最后附录源代码。
第二章系统电路
2.1直流电机
2.1.1直流电机与DSP的接线用到了16位的地址线(0b007)和16位的数据线,通过向该地址写数据来控制直流电机,如图2.1.1
图2.1.1DSP控制直流电机的接线图
2.1.2直流电机是通过送PWM脉冲来调速的,如图2.1.2所示PWM脉冲的周期不变,高电平的时间长则直流电机加速,低电平的时间长则直流电机减速(动摩擦力)。
图2.1.2直流电机的调速原理
2.1.3直流电机的正反转控制是通过如下电路实现的:
其中T1,T3三极管由B控制,T2,T4三极管由A控制。
控制方式如下:
控制原理如下:
图2.1.3直流电机正反转控制原理
2.2交通灯
2.2.1交通灯在每个方向上都有红绿灯。
其中相对方向上的相同颜色的灯通过同一条线控制。
A0~A15控制译码器使能端,D0~D15输出控制的数据,如图2.2.1所示
图2,2,1交通灯电路原理图
第三章 系统软件设计
3.1软件设计流程图
3.1.1主程序流程图
上面主要是主程序的流程图,程序初始化后,通过键盘上1,2,3,4键的外部中断选择哪一种进入模式,主要有五种模式:
模式一,步进电机控制
模式二,直流电机控制
模式三,交通灯控制
模式四,综合模式(三种同时进行)
模式五,交通灯东西南北红灯时间控制
进入某种模式的同时,还通过LED显示函数(本设计中是voidLED_display_6函数和voidLED_display_1函数),其中模式一到模式四是通过第一个数码管显示,进入调时状态和交通灯时间是通过第三,四,五,六个数码管显示。
3.1.2中断服务程序框图
由上图我们可以看出,本设计主要采用两个中断,INT2外部中断和INT0定时器中断。
其中INT2主要是用于按键控制模式的选择,电机的加减速转向,交通灯时间的设置,采用定时器中断是便于时间的控制,DSP定时中断的周期T=(PRD+1)X(TDDR+1)XCLKOUT,由本设计中TDDR=1001,PRD=6ffff,晶振为16M可以算出周期大约为18ms,因此55个周期大约为1秒,由于本课题对于时间的精确度没有太大的要求,因此采取50个周期为一个时间单位。
3.1.3交通灯程序框图
3.1.4步进电机程序框图
3.1.5直流电机程序图
3.2系统程序设计
3.2.1主程序
/*******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"LED_display_6.h"/*通过LED_display_6(unsignedint显示数据);调用*/
#include"LED_display_1.h"
#include"traffic.h"
#include
intdx_red=30,nb_red=30;
unsignedintBJ_code[]={0x07,0x0b,0x0d,0x0e};
unsignedintbjcode,dj_code;
unsignedcharSTATE=1;
unsignedcharINT2_Flag=0;
#definedtime1000;
voiddelay(unsignedintd_t);
voidKeyprocess(void);
voidBj_keyprocess(void);
voidDj_keyprocess(void);
voidJT_keyprocess(void);
voidTS_keyprocess(void);
voidSet_time(void);
voidtraffic_LED_display(void);
main()
{
system_init();
Timer0_init(0x6fff);/*Tmer0_VAL为TINT0的定时时间常数16.4ms*/
//Timer1_init(0x0ffff);/*Tmer0_VAL为TINT1的定时时间常数*/
while
(1)
{
if(INT2_Flag==1)
{
Keyprocess();
INT2_Flag=0;
}
switch(STATE)
{
case1:
BJ_ADDR=BJ_code[bjcode];delay(100);break;/*不加会不转delay(100);*/
case2:
DJ_ADDR=dj_code;break;
case3:
traffic();traffic_LED_display();break;
case4:
DJ_ADDR=dj_code;BJ_ADDR=BJ_code[bjcode];delay(100);traffic();break;
default:
break;
}
if(STATE==5)
{
LED_display_6(set_time_ew_red/50*100+set_time_sn_red/50);
}
LED_display_1(STATE);
delay(10);
}
}
voidKeyprocess()
{
switch(STATE)
{
case1:
Bj_keyprocess();break;
case2:
Dj_keyprocess();break;
case3:
JT_keyprocess();break;
case4:
ZH_keyprocess();break;
case5:
Set_time();break;
default:
break;
}
}
voidBj_keyprocess()
{
switch(key_code)
{
case1:
STATE=1;break;
case2:
STATE=2;break;
case3:
STATE=3;break;
case4:
STATE=4;break;
case5:
bj_derect=0;break;/*正转0*/
case6:
bj_derect=1;break;/*反转1*/
case7:
if(bj_speed>=3)bj_speed--;break;/*加速2*/
case8:
if(bj_speed<=50)bj_speed++;break;/*减速3*/
default:
break;
}
}
voidDj_keyprocess()
{
switch(key_code)
{
case1:
STATE=1;break;
case2:
STATE=2;break;
case3:
STATE=3;break;
case4:
STATE=4;break;
case5:
dj_derect=0;break;/*正转0*/
case6:
dj_derect=1;break;/*反转1*/
case7:
if(dj_speedcase8:
if(dj_speed>=1)dj_speed--;break;/*减速3*/
default:
break;
}
}
voidJT_keyprocess()
{
switch(key_code)
{
case1:
STATE=1;break;
case2:
STATE=2;break;
case3:
STATE=3;break;
case4:
STATE=4;break;
case9:
STATE=5;break;
default:
break;
}
}
voidZH_keyprocess()
{
switch(key_code)
{
case1:
STATE=1;break;
case2:
STATE=2;break;
case3:
STATE=3;break;
case4:
STATE=4;break;
case5:
bj_derect=0;break;
case6:
bj_derect=1;break;
case7:
if(bj_speed>=3)bj_speed--;break;
case8:
if(bj_speed<=50)bj_speed++;break;
case9:
STATE=5;break;
case11:
dj_derect=0;break;
case12:
dj_derect=1;break;
case13:
if(dj_speedcase14:
if(dj_speed>=1)dj_speed--;break;
default:
break;
}
}
voidSet_time(void)
{
switch(key_code)
{
case5:
set_time_ew_red+=50;break;
case6:
set_time_ew_red-=50;break;
case7:
set_time_sn_red+=50;break;
case8:
set_time_sn_red-=50;break;
case10:
STATE=4;break;
default:
break;
}
if(set_time_ew_red>4950)
set_time_ew_red=4950;
if(set_time_ew_red<0)
set_time_ew_red=0;
if(set_time_sn_red>4950)
set_time_sn_red=4950;
if(set_time_sn_red<0)
set_time_sn_red=0;
}
voidtraffic_LED_display()
{
if(t_trafficLED_display_6((set_time_ew_red-t_traffic)/50*100);
if(t_traffic>=set_time_ew_red&&t_trafficLED_display_6((set_time_ew_red+500-t_traffic)/50*100);
if(t_traffic>=set_time_ew_red+500&&t_trafficLED_display_6((set_time_ew_red+500+set_time_sn_red-t_traffic)/50);
if(t_traffic>=set_time_ew_red+500+set_time_sn_red&&t_trafficLED_display_6((set_time_ew_red+500+set_time_sn_red+500-t_traffic)/50);
}
3.2.2中断子程序
1,定时器Timer0中断服务子程序
/***TINT0中断服务程序***/
interruptvoidTINT0_ISR()
{
asm("NOP");
asm("NOP");
t0_bj++;
t0_dj++;
t_traffic++;
/**BJ_Control**/
if(t0_bj>=bj_speed)
{
t0_bj=0;
t1_bj++;
bjcode=t1_bj%4;
if(bj_derect)bjcode=3-bjcode;
}
/**DJ_Control**/
if(t0_dj{
dj_code=positive;
if(dj_derect)dj_code=negative;
}
if(t0_dj>=dj_speed&&t0_djif(t0_dj>=dj_period)t0_dj=0;
/**JT_Control**/
return;
}
2,INT2按键中断服务子程序
/***INT2中断服务程序***/
interruptvoidINT2_ISR()
{
asm("NOP");
asm("NOP");
key_code=KEY_ADDR;
key_code&=0x001f;
key_code=key_code-1;/*为了键盘上的数字与数码管显示的一一对应*/
INT2_Flag=1;
return;
}
3.2.3交通灯控制程序
交通灯控制函数:
/*******traffic.h*******/
unsignedintt_traffic;
externintset_time_ew_red,set_time_sn_red;
externvoiddelay(unsignedintd_t);
voidtraffic()
{if(t_traffic{traffic_ADDR=0x5a00;/*东西红,南北绿*/
delay(50);
}
if(t_traffic>=set_time_ew_red&&t_traffic{traffic_ADDR=0x5000;/*南北闪烁*/
delay(50);
}
if(t_traffic>=set_time_ew_red+50&&t_traffic{traffic_ADDR=0x5a00;/*南北闪烁*/
delay(50);
}
if(t_traffic>=set_time_ew_red+100&&t_traffic{traffic_ADDR=0x5000;/*南北闪烁*/
delay(50);
}
if(set_time_ew_red+150&&set_time_ew_red+200)
{traffic_ADDR=0x5a00;/*南北闪烁*/
delay(50);
}
if(t_traffic>=set_time_ew_red+200&&set_time_ew_red+250)
{traffic_ADDR=0x5000;/*南北闪烁*/
delay(50);
}
if(t_traffic>=set_time_ew_red+250&&t_traffic{traffic_ADDR=0x0fa00;/*南北黄灯*/
delay(50);
}
if(t_traffic>=set_time_ew_red+500&&t_traffic{traffic_ADDR=0xa500;/*东西绿,南北红*/
delay(50);
}
if(t_traffic>=set_time_ew_red+500+set_time_sn_red&&
t_traffic{traffic_ADDR=0xa000;/*东西闪烁*/
delay(50);
}
if(t_traffic>=set_time_ew_red+500+set_time_sn_red+50&&
t_traffic{traffic_ADDR=0xa500;/*东西闪烁*/
delay(50);
}
if(t_traffic>=set_time_ew_red+500+set_time_sn_red+100&&
t_traffic{traffic_ADDR=0xa000;/*东西闪烁*/
delay(50);
}
if(t_traffic>=set_time_ew_red+500+set_time_sn_red+150&&
t_traffic{traffic_ADDR=0xa500;/*东西闪烁*/
delay(50);
}
if(t_traffic>=set_time_ew_red+500+set_time_sn_red+200&&
t_traffic{traffic_ADDR=0xa000;
delay(50);
}
if(t_traffic>=set_time_ew_red+50