DSP课程设计报告.docx
《DSP课程设计报告.docx》由会员分享,可在线阅读,更多相关《DSP课程设计报告.docx(36页珍藏版)》请在冰豆网上搜索。
DSP课程设计报告
JIUJIANGUNIVERSITY
DSP应用课程设计报告
题目利用按键任意输入一个数值控制的转动角度
院系电子工程学院
专业电子信息工程
姓名
班级1211
学号35
日期2015.5.22
内容提要
步进电机作为一种电脉冲—角位移的转换元件,由于具有价格低廉、易于控制、无积累误差和计算机接口方便等优点,在机械、仪表、工业控制等领域中获得了广泛的应用。
通过DSP对步进电机的控制可以实现系统实时、精确、高效、安全的设计要求,从而实现了自动化生产过程。
作为重要部件的DSP是否实现控制要求是应用系统能否可靠工作的关键。
许多研究机构和电机生产厂家对于用单片机和用功率器件来设计步进电机驱动系统作了大量的研究,如把MCS-51系列的8031单片机、美国Microchip公司的PIC系列的PIC16C5X、各类PLC和VMOS管等功率器件作为控制系统都是比较成熟的。
这些方面的资料和经验对于将更高速的DSP器件用在驱动系统上都是很有帮助的。
现在流行的方法是将一系列外围设备如数模转换器(A/D)、脉宽调制发生器(PWM)和数字信号处理器(DSP)内核集成在一起,就获得一个强大又非常经济的电机控制专用的的DSP。
许多厂家开发出了电机专用的DSP器件和支持各种通用算法的模拟软件。
不仅芯片的运算速度越来越快,且软件中集成和固化在硬件中的算法模块越来越多,使得实现各种功能和进行电机性能研究变得现实和容易,能够实现更加理想的控制要求,随着对步进电机的研究更加深入与芯片价格的降低和功能的增加以及随着半导体工艺,尤其是高密度CMOS工艺的发展和进步,芯片的价格日益下降,而性能却不断提高,软件和开发工具越来越多,越来越好,应用范围日益广泛。
DSP作为一种高速处理器件在驱动系统中的应用也会更加广泛和普及,研究DSP在控制领域中的应用也有着重大现实意义。
一课程设计要求
设计要求:
一、利用开发板上的3*3的矩阵键盘的S1~S6的6个按键实现输入1~360之间任意给定的一个整数,用4位数码管依序显示输入的整数。
二、按键S7表示“退格”键。
按下此键:
若数码管当前显示的数值是两位及以上的数时,删除所显示数据最后的一位;若当前显示的数是一位数时,则显示数据变成0。
三、按键S8表示“+/-”符号键。
按下此键,改变显示数据的符号:
若当前显示的数值是正数时,则在显示的数前加“-”号;若当前显示的数是负数时,则去掉显示的数前的“-”号。
四、按键S9代表“确认”。
按下此键,步进电机根据数码管显示数值进行相应的动作。
规则如下:
1、如果数码管显示的是正数,则步进电机顺时针旋转显示数字的角度。
如:
数码管显示125,则步进电机顺时针转动至与起始位置成125度的位置停下。
步进电机转动完成后,蜂鸣器“嘀-嘀-嘀”响三声。
2、如果数码管显示的是负数,则步进电机逆时针旋转显示数字的角度。
如:
数码管显示-125,则步进电机逆时针转动至与起始位置成125度的位置停下。
步进电机转动完成后,蜂鸣器“嘀-嘀-嘀”响三声。
3、步进电机的转动角度和所设定的角度的误差控制在15度以内,如果误差超过15度,可以利用按键输入一个数值让步进电机再转动一次进行角度修正。
但修正之后的误差要控制在8度以内。
二总体方案
按照设计要求可以把设计分为4个部分。
首先是对按键电路的设计、数码管电路的设计、步进电机的设计、蜂鸣器响应的设计。
下面分别介绍这4个部分的详细方案。
按键电路:
采用3*3的键盘。
S1键为数码管数值+1,S2键为数码管数值+10,S3键为数码管数值+100,S4键为数码管数值-1,S5键为数码管数值-10,S6键为数码管数值-100,S7为退格键,S8为负号键,S9为确定键。
数码管显示电路:
采用共阳极四位七段数码管。
由按键控制显示值,显示值为(0~正负360)。
步进电机:
由按键S9控制。
数码管显示的数值即为电机需要转动的角度,按键按下S9电机转动。
按键S8控制电机正转(正数)或反转(负数)电机所转的角度计算过程:
。
蜂鸣器:
步进电机转完,蜂鸣器响3声。
三硬件系统设计
本设计用到了DSPF28335开发板上的数码管、3*3按键、蜂鸣器还有电机。
1.数码管
本开发板上的数码管采用的是共阳极四位七段数码管。
每个数码管内部共有12个引脚,分别是内部四个数码管共用a~dp这8根数据线(也称段选线)和四个数码管的四个公共端SEG1~SEG4(也称位选线)。
7段数码管是指数码管里有7个小LED发光二极管,通过控制不同的LED的亮灭来显示出不同的字形。
除了7段式以外常用的还有8段式,8段比7段多了一个小数点,其他基本相同。
一个7段或8段数码管称为一位,多个数码管并列在一起可构成多位数码管,如本开发板是4个数码管并在一起,所以叫4位数码管。
图3数码管控制电路
3.按键
1.3*3矩阵键盘的工作原理和扫描确认方式
当键盘中按键数量较多时,为了减少对I/O口的占用,通常将按键排列成矩阵形式,也称为行列键盘。
矩阵式键盘接口如图4所示,它由行线和列线组成,按键位于行、列的交叉点上。
当按键按下时,其交点的行线和列线接通,相应的行线或列线的电平发生变化,DSP通过检测行或列线上的电平变化可以确定哪个按键被按下。
图4F28335键盘接口图
在矩阵键盘的软件接口程序中,经常使用的按键识别方法有行列扫描法和线反转法,本项目采用列扫描法对矩阵键盘进行判别。
图1中GPIO53、GPIO52、GPIO51为3根行线,作为键盘的输入口(工作于输入方式);GPIO50、GPIO49、GPIO48为3根列线,作为输出口(工作于输出方式),由DSP控制其输出的电平值。
按键识别的过程如下。
1)将全部列线GPIO50、GPIO49、GPIO48置低电平输出,然后读GPIO53、GPIO52、GPIO51三根输入行线中有无低电平出现。
只要有低电平出现,则说明有按键按下(实际编程时,还要考虑按键的消抖);如果读到的电平都是高电平,则表示无按键按下。
2)在确认某行有按键按下后,需要确定具体是哪一列的按键按下。
其思路是:
依次将列线置为高电平,并检测行线的输入,如果行线的电平值由低电平变为高电平,则该列对应的按键处于闭合状态。
由此,DSP对矩阵键盘的按键识别是,采用扫描方式控制列线的输出信号和检测行线输入的信号相配合实现。
4.电机
采用的是步进电机。
步进电机是一种将电脉冲转化为角位移的执行机构。
通俗一点讲:
当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。
在非超载情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响。
这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点,使得步进电机在速度、位置等控制领域的控制操作非常简单。
对于步进电机可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达调速的目的。
图步进电机接口
5.蜂鸣器
图蜂鸣器与DSP的硬件连接图
开发板采用三极管来控制峰鸣器的发声,输入的控制信号是DSP的GPIO35管脚,经J23跳线选择。
四软件系统设计
1.软件流程
主程序流程图:
按键设置流程图:
数码管显示流程图
电机流程图:
蜂鸣器响应流程图:
中断流程图:
2.完整程序清单
/********************************************************************
*文件名:
数码管显示程序
*描述:
执行该程序,数码管显示数字从0000~9999递增
**********************************************************************/
/********************************************************************
程序说明:
更换控制平台,仅需更改IO口初始化、宏定义以及spi初始化
********************************************************************/
#include"DSP2833x_Device.h"//DSP2833xHeaderfileIncludeFile
#include"DSP2833x_Examples.h"//DSP2833xExamplesIncludeFile
#defineSET_KY3GpioDataRegs.GPBSET.bit.GPIO48=1//Y3拉高
#defineRST_KY3GpioDataRegs.GPBCLEAR.bit.GPIO48=1//Y3拉低
#defineSET_KY2GpioDataRegs.GPBSET.bit.GPIO49=1//Y2拉高
#defineRST_KY2GpioDataRegs.GPBCLEAR.bit.GPIO49=1//Y2拉低
#defineSET_KY1GpioDataRegs.GPBSET.bit.GPIO50=1//Y1拉高
#defineRST_KY1GpioDataRegs.GPBCLEAR.bit.GPIO50=1//Y1拉低
#defineKX3_STATUSGpioDataRegs.GPBDAT.bit.GPIO51//X3状态
#defineKX2_STATUSGpioDataRegs.GPBDAT.bit.GPIO52//X2状态
#defineKX1_STATUSGpioDataRegs.GPBDAT.bit.GPIO53//X1状态
//数据第3位,SEG1,GPIO16
#defineSET_BIT4GpioDataRegs.GPASET.bit.GPIO16=1
//与外设板8_LEDS端子的IO16对应
#defineRST_BIT4GpioDataRegs.GPACLEAR.bit.GPIO16=1
//与外设板8_LEDS端子的IO16对应
//数据第2位,SEG2,GPIO17
#defineSET_BIT3GpioDataRegs.GPASET.bit.GPIO17=1
//与外设板8_LEDS端子的IO17对应
#defineRST_BIT3GpioDataRegs.GPACLEAR.bit.GPIO17=1
//与外设板8_LEDS端子的IO17对应
//数据第1位,SEG3
#defineSET_BIT2GpioDataRegs.GPBSET.bit.GPIO62=1
//与外设板8_LEDS端子的IO62对应
#defineRST_BIT2GpioDataRegs.GPBCLEAR.bit.GPIO62=1
//与外设板8_LEDS端子的IO62对应
//数据第0位,SEG4
#defineSET_BIT1GpioDataRegs.GPBSET.bit.GPIO63=1
//与外设板8_LEDS端子的IO63对应
#defineRST_BIT1GpioDataRegs.GPBCLEAR.bit.GPIO63=1
//与外设板8_LEDS端子的IO63对应
/*****************电机宏定义*********************/
#definePHA_ONGpioDataRegs.GPASET.bit.GPIO8=1//A相输出高电平
#definePHA_OFFGpioDataRegs.GPACLEAR.bit.GPIO8=1//A相输出低电平
#definePHB_ONGpioDataRegs.GPASET.bit.GPIO10=1//B相输出高电平
#definePHB_OFFGpioDataRegs.GPACLEAR.bit.GPIO10=1//B相输出低电平
#definePHC_ONGpioDataRegs.GPASET.bit.GPIO13=1//C相输出高电平
#definePHC_OFFGpioDataRegs.GPACLEAR.bit.GPIO13=1//C相输出低电平
#definePHD_ONGpioDataRegs.GPASET.bit.GPIO14=1//D相输出高电平
#definePHD_OFFGpioDataRegs.GPACLEAR.bit.GPIO14=1//D相输出低电平
#defineDELAY_TIME100//延时时间
#defineSTEP_TIME15000
/*******************宏定义蜂鸣器相关操作******************/
#defineBUZZ_CLK_GENERGpioDataRegs.GPBTOGGLE.bit.GPIO35=1;/
/蜂鸣器控制IO,IO电平翻转,产生控制脉冲
#defineBUZZ_OFFGpioDataRegs.GPBSET.bit.GPIO35=1;//关闭蜂鸣器
/**********************函数申明************************/
voidDisData_Trans(Uint16data);//4位数拆分为4个数,保存到数组DisData_Trans[4],DisData_Trans[0]为个位
voidSellect_Bit(Uint16i);//数码管位选函数,i为0~3,对应SEG1~4
voidInit_LEDS_Gpio(void);//设置SEG1~4为I/O输出,并初始化为L
voidspi_xmit(Uint16a);//将数据a发送到SPITXBUF
voidspi_fifo_init(void);//使能FIFO发送功能,接收功能未开启
voidspi_init(void);
voiddelay2(Uint32t);
voidMotionControl1(void);
/***********************************************/
/**********************定义相关变量******************/
//unsignedintCount,Flag;
unsignedintk=0;
interruptvoidcpu_timer0_isr(void);
unsignedcharmsg[12]={0xC0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xbf,0xff};//共阳段码:
0~9
unsignedintDisData_Bit[4]={0};//存放拆分后的四位数字
Uint16DisData=0;//显示的数字
Uint16Loop=0;//循环扫描变量
Uint16Loop2=0;
Uint16Keys[3][3]={1,2,3,4,5,6,7,8,9};//数据表,与9个按键对应
Uint16Key=0;//实时按键信息变量
Uint16KX_On=0;
Uint16KY_On=0;
Uint16KX_Tim[4]={0};
Uint16KX_Status[4]={0};
unsignedintCount,Flag;//时钟变量
Uint16alarm_flag=0;
Uint16Flash;
ConstUint16StepMode1[8]={0x0D0A,0x0D0A,0x0A0B,0x0A0B,0x0B0C,0x0B0C,0x0C0D,0x0C0D};
//单四拍时序A-B-C-D-A//电机正反转标志'0'为反转,'1'为正转
constUint16StepMode1_N[8]={0x0C0D,0x0C0D,0x0B0C,0x0B0C,0x0A0B,0x0A0B,0x0D0A,0x0D0A};//单四拍时序A-B-C-D-A
constUint16StepMode3[8]={0x0D0A,0x0DAB,0x0A0B,0x0ABC,0x0B0C,0x0BCD,0x0C0D,0x0CDA};
//八拍时序A-AB-B-BC-C-CD-D-DA-A
constUint16StepMode3_N[8]={0x0CDA,0x0C0D,0x0BCD,0x0B0C,0x0ABC,0x0A0B,0x0DAB,0x0D0A};
voidInit_KeyGpio(void);//初始化按键IO
voidResetAllKY(void);//3列全部输出低电平
voidKX_AllStatus(void);//读取3行IO电平状态
voidRead_KX(Uint16x);//读取按键所在行
voidSet_KY(Uint16x);//设置任意列输出高电平
voidRst_KY(Uint16x);//设置任意列输出低电平
voidRead_KY(Uint16x);//读取按键所在列
voidRead_KY(Uint16x);//读取按键所在列
voidGetKey(void);//读取按键值
voidMotor();//电机
voidshow();//蜂鸣器
//voidstop1();
voidMotionControl1(void);//单四拍正转
voidMotionControl2(void);//单四拍反转
voidMotionControl3(void);//八拍拍正转
voidMotionControl4(void);//八拍拍反转
voidPhaseOff(Uint16i);
voidPhaseOn(Uint16i);
voidInit_LedGpio(void);
voidBuzz_Gpio_Init(void);//蜂鸣器响
interruptvoidcpu_timer0_isr(void);
/*****************3列全部输出低电平****************************/
voidResetAllKY(void)
{
RST_KY3;
RST_KY2;
RST_KY1;
}
/********************读取3行IO电平状态***********************/
voidKX_AllStatus(void)
{
KX_Status[1]=KX1_STATUS;
KX_Status[2]=KX2_STATUS;
KX_Status[3]=KX3_STATUS;
}
/*************************读取按键行位置****************/
voidRead_KX(Uint16x)
{
KX_AllStatus();
if(KX_Status[x]==0)
{
KX_Tim[x]++;
if(KX_Tim[x]>=6000)
{
KX_On=x;
KX_Tim[1]=0;
KX_Tim[2]=0;
KX_Tim[3]=0;
}
}
}
/*******************************指定列输出高电平*******************/
voidSet_KY(Uint16x)
{
if(x==1){SET_KY1;}
if(x==2){SET_KY2;}
if(x==3){SET_KY3;}
}
/*******************************指定列输出低电平******************/
voidRst_KY(Uint16x)
{
if(x==1){RST_KY1;}
if(x==2){RST_KY2;}
if(x==3){RST_KY3;}
}
/****************************读取按键列位置***********************/
voidRead_KY(Uint16x)
{
if(!
KX_Status[KX_On]&&KX_On)
{
Set_KY(x);
delay2(200);
KX_AllStatus();
if(KX_Status[KX_On])
{
KY_On=x;
Key=Keys[KX_On-1][KY_On-1];
KY_On=0;
KX_On=0;
}
Rst_KY(x);
}
}
voidGetKey(void)
{
Read_KX
(1);
Read_KX
(2);
Read_KX(3);
Read_KY
(1);
Read_KY
(2);
Read_KY(3);
}
/*****************按键IO初始化************************************/
voidInit_KeyGpio(void)
{
EALLOW;
//////////////////////////////以下3个IO口设置为输出,作为列扫描////////////////////////////
//KY3:
对应PCB端子KEY_MATRIX:
IO24
GpioCtrlRegs.GPBPUD.bit.GPIO48=0;//EnablepulluponGPIO11
GpioDataRegs.GPBSET.bit.GPIO48=1;//Loadoutputlatch
GpioCtrlRegs.GPBMUX2.bit.GPIO48=0;//GPIO11=GPIO
GpioCtrlRegs.GPBDIR.bit.GPIO48=1;//GPIO11=output
//KY2:
对应PCB端子KEY_MATRIX:
IO25
GpioCtrlRegs.GPBPUD.bit.GPIO49=0;//EnablepulluponGPIO11
GpioDataRegs.GPBSET.bit.GPIO49=1;//Loadoutput