基于dspf2812的交通灯设计.docx
《基于dspf2812的交通灯设计.docx》由会员分享,可在线阅读,更多相关《基于dspf2812的交通灯设计.docx(17页珍藏版)》请在冰豆网上搜索。
基于dspf2812的交通灯设计
电子信息工程专业CDIO三级项目
项目设计说明书
(2011/2012学年第二学期)
项目名称:
DSP应用系统
题目:
DSPICETEK—f2812B控制交通灯
专业班级:
电子信息工程
学生姓名:
学号:
指导教师:
设计周数:
2周
设计成绩:
2012年7月6日
1、项目设计目的
本学期我们主要学习了DSP硬件方面的一些基本原理,对于如何通过软件来控制DSP从而实现我们最终的需求,还不是很了解。
本次设计的目的就是基于TMS320CF2812平台的进行C语言编程,了解软件编程开发的基本流程,以及软硬件是如何共同协调工作从而实现最终的控制的。
熟练掌握TMS320F2812控制交通灯方法,树立正确的设计思想提高分析问题与解决具体问题的能力。
并通过此次项目设计熟练软件CCS的操作和使用,能够实现程序的编译、运行以及烧写。
2、项目设计正文
2.1硬件设计
2.1.1总体方案设计
本次设计过程中主要利用了F2812的通用I/O来实现对东西南北方向红绿黄灯亮灭的控制,以及数码管显示的控制。
而实现定时的操作主要通过通用定时器0的中断调用来实现。
硬件设计的总体框图如图1所示。
图1硬件设计总体框图
2.1.1.1F2812GPIO介绍
TMS320F2812DSP有多达56个通用数字量输入输出端口(GPIO),其中绝大部分是通用I/O和专用功能复用引脚。
数字量I/O端口模块采用一种灵活配置的方法控制服用引脚功能,GPIOMUX寄存器用来选择F2812的引脚操作模式,可以通过该寄存器独立设置每个引脚的功能。
如果选择数字量I/O模式,可以通过GPxDIR寄存器配置数字量I/O的方向,并通过GPxQUAL进一步消除数字量I/O引脚的噪声信号。
此外,处理器提供GPxSET和GPxCLEAR寄存器对数字量进行置位和清零,还可以通过GPxDAT寄存器独立读/写I/O信号。
2.1.1.2定时器0及其中断介绍
F2812器件上有3个32位的CPU定时器(TIMER0/1/2)。
定时器1和2留给实时操作系统DSP/BIOS使用,只有定时器0可以在应用程序中使用。
若处理器采用30MHz的外部时钟经过锁相环10/2倍频之后,系统时钟工作在150MHz,一旦定时器被使能,定时器时钟经过与预定标计数器递减计数,预订标计数器产生下溢之后向定时器的32位计数器借位。
最后定时器产生溢出使定时器想CPU发出中断。
每次预订标计数器产生溢出后使用分频寄存器中的值重新装载,同样32位的周期寄存器为32位的计数器提供重新装载值。
2.1.1.3基于F2812构成的最小系统
F2812构成的最小系统如图2所示。
图2F2812最小系统原理图
F2812芯片的最小系统,由11、12号引脚接外部时钟电路,用30MHz的晶振提供时钟周期。
用1117电平转换芯片将外部寄存的电平+5V转换为F2812能支持的电平+3.3V,接到15号引脚(VDD)给F2812提供电源。
F2812芯片的复位电路由14号引脚接入。
2.1.2数码管驱动显示电路设计
本次设计为了节省F2812的端口的使用采用芯片CD4511来实现数码管的驱动以及显示。
CD4511是一个用于驱动共阴极LED(数码管)显示器的BCD码—七段码译码器,特点如下:
具有BCD转换、消隐和锁存控制、七段译码及驱动功能的CMOS电路能提供较大的拉电流。
可直接驱动LED显示器。
其引脚图如图3所示。
图3CD4511引脚电路图
CD4511引脚功能介绍如下:
BI:
4脚是消隐输入控制端,当BI=0时,不管其它输入端状态如何,七段数码管均处于熄灭(消隐)状态,不显示数字。
LT:
3脚是测试输入端,当BI=1,LT=0时,译码输出全为1,不管输入DCBA状态如何,七段均发亮,显示“8”。
它主要用来检测数码管是否损坏。
LE:
锁定控制端,当LE=0时,允许译码输出。
LE=1时译码器是锁定保持状态,译码器输出被保持在LE=0时的数值。
A1、A2、A3、A4为8421BCD码输入端。
a、b、c、d、e、f、g为译码输出端,输出为高电平1有效。
为了让数码管正常显示,进行引脚的焊接时BI与LT引脚接电源VCC,LE则连接地。
CD4511正常显示时用的真值表如表一:
表一CD4511真值表
输入
输出
LE
BI
LI
A3
A2
A1
A4
a
b
c
d
e
f
g
显示
0
1
1
0
0
0
0
1
1
1
1
1
1
0
0
0
1
1
0
0
0
1
0
1
1
0
0
0
0
1
0
1
1
0
0
1
0
1
1
0
1
1
0
1
2
0
1
1
0
0
1
1
1
1
1
1
0
0
1
3
0
1
1
0
1
0
0
0
1
1
0
0
1
1
4
0
1
1
0
1
0
1
1
0
1
1
0
1
1
5
0
1
1
0
1
1
0
0
0
1
1
1
1
1
6
0
1
1
0
1
1
1
1
1
1
0
0
0
0
7
0
1
1
1
0
0
0
1
1
1
1
1
1
1
8
0
1
1
1
0
0
1
1
1
1
0
0
1
1
9
电路进行连接时CD4511输出引脚a、c、d、e、f、g依次数码管的a、c、d、e、f、g引脚上即可。
另外由于数码管采用共阴的因此本次设计过程中即那个数码管的3脚与8脚接地,从而使数码管正常工作。
数码管的内部原理图以及其封装引脚如图4和图5所示。
图4数码管内部原理图图5数码管封装引脚图
数码管驱动现实的电路图如图6所示。
图6数码管驱动电路图
为了编写程序时与上述真值表相对应,将CD4511与DSPF2812的B口进行连接时,应将其中,芯片CD4511引脚A4接芯片F2812的第13号引脚(GPIOB0/PWM7)、引脚A1接芯片F2812的第14号引脚(GPIOB1/PWM8)、引脚A2接芯片F2812的第15号引脚(GPIOB2/PWM9)、引脚A3接芯片F2812的第16号引脚(GPIOB3/PWM10)。
2.1.3交通灯亮灭控制电路设计
由于F2812的通用I/O口引脚输出高电平时,引脚的电压为3.3V,而开发板上所提供的电源
电压为5V,因此,发光二极管进行连接时只能采用共阴极。
因为当采用共阳极进行连接时,二极管阳极所接的电压为5V,当通用I/O口输出低电平时,发光二极管点亮。
但是,当通用I/O口输出高电平时,电压为3.3V,3.3V与5V存在1.7V的压降,足以使发光二极管点亮。
这样就会造成,无论通用I/O口输出低电平时,还是高电平时,发光二极管都点亮。
采用共阴极则不存在这个问题。
此次设计中为了简化地那路的连接,只将东西方向以及南北方向各一边的灯进行了设计连接。
共利用了6个通用I/O口。
进行连接时,连接在了TMS320F2812DSP的GPIOA的前六个引脚,即GPIOA0/PWM1-GPIOA5/PWM6。
总体硬件电路图如图7所示。
图7总体硬件电路图
实物图调试如图8所示。
图8硬件实物图
2.2项目软件设计
2.2.1软件系统分析
软件的设计主要是通过利用C语言的编程来实现交通灯亮灭的控制,程序的设计包括初始化部分,对系统时钟的初始化、PIE控制寄存器的初始化、中断向量表的初始化、GPIO的初始化、定时器0的初始化。
接着就是对定时器0以及其中断周期进行配置。
最后进行中断程序的设计,中断程序的设计以及定时器中断周期的设置是本次软件设计的两块重要部分。
2.2.2软件系统设计
程序的总体流程图以及中断程序流程图如图9和图10所示。
2.2.3软件系统实施
主程序里面主要实现了对定时器0中断周期的设置,以为计时以秒为单位进行计时的,所以在进行配置时,将定时器的周期配置为1s,在主程序的while
(1)语句中每间隔1s响应一次中断。
进行配置的函数为ConfigCpuTimer(&CpuTimer0,150,1000000),此函数的具体定义在文件DSP281x_CpuTimers.c中进行了具体定义。
中断程序的设计主要是根据i的递减来实现对中断的计数从而进一步实现计时,i的初值为9,当i>2时东西方向的红灯亮,南北方向的绿灯亮(反之也可),保持时间为7s。
但当倒计时的值为2时东西南北的黄灯都亮,保持时间为2s,之后东西方向与南北方向红灯与绿灯相互转换。
程序中区分东西方向与南北方向采用flag的值进行判断。
通用I/O口输出的值不同,各方向灯亮的就不同。
本次软件的实施过程中对通用I/O(GPIO)的操作都是在定时器中断中进行操作的,并且通过实
际调试验证此种方法可行。
软件调试环境
2.2.4软件开发环境的使用
在本次设计中程序的编写是在CCS2.0的环境中用C语言实现其功能的代码,因开始编写程序时没有硬件调试,所以是在该开发环境中的Simulator方式下进行调试的,如图10红色箭头标记处,最终下载到最小系统上需要在Emulator方式下进行下载。
下图为CCS2.0界面的相关介绍,如下图所示:
图11软件设置为Simulator方式
单击图11的“SaveandQuit”,系统将进入程序新建编写界面,如下图12所示
图12软件开发界面
单击图12菜单栏中的“Project”,选择“Open”,选择time.pjt得到如下图13的界面
图13打开项目界面
最终需要将呈程序下载到最小系统上去,选择菜单栏“File”下的“LoadProgram”,如下图14红色标记所示。
选择DEBUG文件夹里面的后缀名为.out文件,最终按“F5”运行程序。
图14下载程序界面
3、项目设计总结
本学期学习了《DSP原理及其应用》这门课程,但只是从宏观上对DSP的各部分的结构以及原理有了一个基本的认识,并没有深入而又具体的对其进行了解。
当涉及到一些具体的应用时,还是感到有些力不从心,而且不知道如何具体通过软件来操作DSP实现具体的功能。
但是通过此次基于DSP交通灯项目的设计和实现,我深入了解了TM320SF2812GPIO和定时器及其中断的具体操作,对其结构和相关寄存器,有了较好的掌握。
同时对与C语言在DSP上进行编程的特点进行了了解,同时锻炼自己的逻辑思维能力。
在此次设计过程中,遇到了许多实际当中没有遇到过的问题,例如进行发光二极管的焊接时,由于没有考虑到DSPGPIO输出的高电平仅为3.3V而不是5V导致焊接完成进行测试时,发光二极管总是亮的,后来在老师的指点下对电路进行了改进,将发光二极管改成了共阴极,才实现了最终的测试结果。
另外由于本次设计是以小组为单位的,而且每个小组都是七个人左右,在设计的过程中大家团结协作,共同应对困难,并且积极交流,最终使得本次CDIO项目设计取得圆满的成功。
在这期间,我学会了如何融入到一个团队中,如何与团队中其他的成员进行有效地沟通,使得自己在人际交往和为人处事方面也有了一定得提高,变得更善于沟通和交流。
DSP作为一种比较超前的科技知识,在此次CDIO项目设计中让我对其产生了浓厚的兴趣,并且自己在完成小组任务的情况下,积极的寻找其他的变成实现方法,并且最终通过自己的努力以及在指导老师的帮助下,自己有利用的新的方法实现了此次设计的任务。
极大的丰富了自己的专业知识,也为以后的工作和进一步学习打下了坚实的基础。
4、参考文献
[1]苏奎峰.TMS320X281xDSP原理及C语言编程.[M]北京航空航天大学出版社.2008
[2]苏奎峰、吕强.TMS320F2812原理与开发.[M]电子工业出版社.2009
[3]清源科技.TMS320C28xDSP应用程序设计教程[M].机械工业出版社,2004.1.
[4]戴明桢.TMS320C54xDSP结构、原理及应用[M].北京航空航天大学出版社,2001.8.
5、附录:
#include"DSP281x_Device.h"
#include"DSP281x_Examples.h"
interruptvoidcpu_timer0_isr(void);//定时器0中断服务程序生声明
unsignedintLED[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
inti=9;
intflag=1;
voidmain(void)
{
//该函数在后面的DSP281x_SysCtrl.c文件中查找
InitSysCtrl();
//初始化GPIO:
该函数在DSP281x_Gpio.c文件中声明,将A,B口初始化位输出状态
InitGpio();
//清除所有终中断并初始化PIE向量表,禁止所有cpu中断
DINT;
//初始化PIE控制寄存器为其默认状态(所有PIE中断被禁止并且标志被清除)
//该函数在DSP281x_PieCtrl.c文件中声明
InitPieCtrl();
//禁止所有cpu中断并清除所有中断标志
IER=0x0000;
IFR=0x0000;
//初始化中断向量表该函数在DSP281x_PieVect.c文件中声明
InitPieVectTable();
//将本程序中用到的中断向量重新映射,使其指向中断服务相应的程序
EALLOW;
PieVectTable.TINT0=&cpu_timer0_isr;
EDIS;
InitCpuTimers();//初始化cpu定时器
//配置CPU-timer0周期为1s,150Mcpu频率,1s的中断周期
ConfigCpuTimer(&CpuTimer0,150,1000000);
StartCpuTimer0();
//使能连接到CPU_Timer0的CPUINT1
IER|=M_INT1;
//使能PIE内的TINT0:
Group1interrupt7
PieCtrlRegs.PIEIER1.bit.INTx7=1;
EINT;//全局中断使能
ERTM;//使能实施调试中断DBGM
//CpuTimer0Regs.TCR.bit.TSS=0;
while
(1)
{
}
}
interruptvoidcpu_timer0_isr(void)
{
//响应中断并允许系统接收更多的中断
PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;
//CpuTimer0.InterruptCount++;
CpuTimer0Regs.TCR.bit.TIF=1;
CpuTimer0Regs.TCR.bit.TRB=1;
if(i<10)
{
GpioDataRegs.GPBDAT.all=LED[i];
if(i>=3)
{
if(flag==1)
{
GpioDataRegs.GPADAT.all=0x0024;//南北方向红灯亮,东西方向绿灯亮
}
else
{
GpioDataRegs.GPADAT.all=0x0009;//南北方向绿灯亮,东西方向红灯亮
}
}
else
{
GpioDataRegs.GPADAT.all=0x0012;//东西南北方向黄灯都亮
if(i==0){flag=0;i=10;}
}
}
i--;
}
文件名:
DSP281x_CpuTimers.c
//功能描述:
DSP281xCPU32位定时器初始化及其相关函数
#include"DSP281x_Device.h"//DSP281xHeaderfileIncludeFile
#include"DSP281x_Examples.h"//DSP281xExamplesIncludeFile
structCPUTIMER_VARSCpuTimer0;
/***************InitCpuTimers:
*****************************/
//将定时器初始化为一个确定状态
voidInitCpuTimers(void)
{
//CPUTimer0
//初始化各自定时器的寄存器指向相应的地址
CpuTimer0.RegsAddr=&CpuTimer0Regs;
//初始化定是周期为最大值
CpuTimer0Regs.PRD.all=0xFFFFFFFF;
//初始化预定标计数器,分频系数为1(时钟:
SYSCLKOUT)
CpuTimer0Regs.TPR.all=0;
CpuTimer0Regs.TPRH.all=0;
//确认计数器处于停止计数状态
CpuTimer0Regs.TCR.bit.TSS=1;
//使用周期寄存器的值装载定时器计数寄存器
CpuTimer0Regs.TCR.bit.TRB=1;
CpuTimer0Regs.TIM.all=0;
//复位中断计数标量
CpuTimer0.InterruptCount=0;
}
/*********ConfigCpuTimer:
配置cpu定时器函数***********/
voidConfigCpuTimer(structCPUTIMER_VARS*Timer,floatFreq,floatPeriod)
{
Uint32temp;
//初始化始终周期
Timer->CPUFreqInMHz=Freq;
Timer->PeriodInUSec=Period;
temp=(long)(Freq*Period);
Timer->RegsAddr->PRD.all=temp;
//设置预定表参数Setpre-scalecountertodivideby1(SYSCLKOUT):
Timer->RegsAddr->TPR.all=0;
Timer->RegsAddr->TPRH.all=0;
//初始化定时器控制寄存器
Timer->RegsAddr->TCR.bit.TSS=1;//1=Stoptimer,0=Start/RestartTimer
Timer->RegsAddr->TCR.bit.TRB=1;//1=reloadtimer
Timer->RegsAddr->TCR.bit.SOFT=1;
Timer->RegsAddr->TCR.bit.FREE=1;//TimerFreeRun
Timer->RegsAddr->TCR.bit.TIE=1;//0=Disable/1=EnableTimerInterrupt
//复位中断计数
Timer->InterruptCount=0;
}
项目设计
评语
项目设计
成绩
指导教师
(签字)
年月日