DSP课设基于键盘的步进电动机控制.docx

上传人:b****4 文档编号:3732903 上传时间:2022-11-25 格式:DOCX 页数:15 大小:33.08KB
下载 相关 举报
DSP课设基于键盘的步进电动机控制.docx_第1页
第1页 / 共15页
DSP课设基于键盘的步进电动机控制.docx_第2页
第2页 / 共15页
DSP课设基于键盘的步进电动机控制.docx_第3页
第3页 / 共15页
DSP课设基于键盘的步进电动机控制.docx_第4页
第4页 / 共15页
DSP课设基于键盘的步进电动机控制.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

DSP课设基于键盘的步进电动机控制.docx

《DSP课设基于键盘的步进电动机控制.docx》由会员分享,可在线阅读,更多相关《DSP课设基于键盘的步进电动机控制.docx(15页珍藏版)》请在冰豆网上搜索。

DSP课设基于键盘的步进电动机控制.docx

DSP课设基于键盘的步进电动机控制

 

DSP技术及应用课程设计报告

 

基于键盘的步进电机控制

学院:

计算机与信息工程学院

专业:

电子科学与技术

学生姓名:

学号:

指导教师:

 

一、设计要求及目标

利用C语言在CCS环境中编写一个直流电机控制程序,并能通过串口实现对电机的转速、转向控制,并通过硬件仿真实现对所编写的程序及其应用性、可行性进行验证。

(1)通过键盘设置有正转、反转、加速、减速;

(2)LCD显示马达的运行状态(正转、反转、停止);

(3)LCD显示转速,显示设计者姓名,时间。

 二、实验设备及实验准备

1. 实验设备:

(1)一台装有CCS软件的计算机;

 

(2) DSP试验箱的TMS320F2812主控板; 

(3) DSP硬件仿真器

2.实验准备:

 将DSP仿真器与计算机连接好;    

三、实验原理 

1系统总体框图

2软件设计原理

步进电机工作原理,给步进脉冲电机就转,不给脉冲电机就不转,步进脉冲的频率越高,步进控制电机就转的越快;改变各相的通电方式可以改变电机的运行方式;改变通电顺序可以控制步进电机的运行方式;改变通电顺序可以控制步进电机的正反转。

设计实现对步进电机调速、定时、定步、正反转以及励磁方式控制,并通过TMS320F2812片内集成ADC模块获取电机电流。

LCD12864结合四个按键以菜单模式选择各项功能。

 

(1)为防止功能的冲突,程序中应用大量标志来记录各种功能状态,同一状态下可有显示标志和功能执行标志。

显示标志用来显示液晶,显示完成后标志立即清零,避免液晶一直刷新影响显示效果;功能执行标志能够保持功能状态信息,等待功能选择,在功能执行完成(一般在返回上级操作时)后清零标志。

(2)利用定时器进行按键实时消抖。

利用定时器可对按键进入和退出都进行实时消抖,这样不需等待按键释放就能保证每次按下按键为单次触发,避免了延时按键消抖占时、要等待的弊端,极大地提高了CPU工作效率,实时性好。

由于按键消抖不需要很高的优先级,故程序中使用EVA通用定时器1进行按键消抖。

同时该定时器也用作时钟计数,这样共用可减少定时器的使用,提高程序的运行效率。

 

(3)CPU定时器0用作步进脉冲延时来控制电机转速。

由于电机转速要求精度高,故使用优先级最高的定时器—CPU定时器0作为步进延时。

 

(4)过采样法进行AD转换。

程序对单一通道多次采样,通过取平均值法提高采样精度,同时可以减慢AD转换结果的变化,有利于LCD12864液晶显示。

 

四、实验代码

1.GPIO的初始化

#include"DSP2833x_Device.h"//DSP2833xHeaderfileIncludeFile

#include"DSP2833x_Examples.h"//DSP2833xExamplesIncludeFile

voidInitGpio(void)

{

EALLOW;

GpioCtrlRegs.GPAMUX1.all=0x0000;//GPIOfunctionalityGPIO0-GPIO15

GpioCtrlRegs.GPAMUX2.all=0x0000;//GPIOfunctionalityGPIO16-GPIO31

GpioCtrlRegs.GPBMUX1.all=0x0000;//GPIOfunctionalityGPIO32-GPIO39

GpioCtrlRegs.GPBMUX2.all=0x0000;//GPIOfunctionalityGPIO48-GPIO63

GpioCtrlRegs.GPCMUX1.all=0x0000;//GPIOfunctionalityGPIO64-GPIO79

GpioCtrlRegs.GPCMUX2.all=0x0000;//GPIOfunctionalityGPIO80-GPIO95

GpioCtrlRegs.GPADIR.all=0x0000;//GPIO0-GPIO31areinputs

GpioCtrlRegs.GPBDIR.all=0x0000;//GPIO32-GPIO63areinputs

GpioCtrlRegs.GPCDIR.all=0x0000;//GPI064-GPIO95areinputs

GpioCtrlRegs.GPAQSEL1.all=0x0000;//GPIO0-GPIO15SynchtoSYSCLKOUT

GpioCtrlRegs.GPAQSEL2.all=0x0000;//GPIO16-GPIO31SynchtoSYSCLKOUT

GpioCtrlRegs.GPBQSEL1.all=0x0000;//GPIO32-GPIO39SynchtoSYSCLKOUT

GpioCtrlRegs.GPBQSEL2.all=0x0000;//GPIO48-GPIO63SynchtoSYSCLKOUT

GpioCtrlRegs.GPAPUD.all=0x0000;//Pullup'senabledGPIO0-GPIO31

GpioCtrlRegs.GPBPUD.all=0x0000;//Pullup'senabledGPIO32-GPIO63

GpioCtrlRegs.GPCPUD.all=0x0000;//Pullup'senabledGPIO64-GPIO79

EDIS;

}

2.主函数

#include"DSP2833x_Device.h"//DSP2833xHeaderfileIncludeFile

#include"DSP2833x_Examples.h"//DSP2833xExamplesIncludeFile

interruptvoidcpu_timer0_isr(void);

voidDelay(unsignedintnTime);

voidGpio_select(void);

voiderror(int);

voidprogram_stop();

voidGpio_PortA(void);

voidGpio_PortB(void);

voidGpio_PortF(void);

voidGpio_PortDEG(void);

charConvertScanToChar(unsignedcharcScanCode);

 

#defineT46uS0x0d40

//KEY

#defineSCANCODE_00x70

#defineSCANCODE_10x69

#defineSCANCODE_20x72

#defineSCANCODE_30x7A

#defineSCANCODE_40x6B

#defineSCANCODE_50x73

#defineSCANCODE_60x74

#defineSCANCODE_70x6C

#defineSCANCODE_80x75

#defineSCANCODE_90x7D

//CTRREG

#defineCTRGR*(int*)0x208000

#defineCTRLCDCMDR*(int*)0x208001

#defineCTRKEY*(int*)0x208001

#defineCTRLCDCR*(int*)0x208002

#defineCTRCLKEY*(int*)0x208002

#defineCTRLCDLCR*(int*)0x208003

#defineCTRLCDRCR*(int*)0x208004

#defineCTRLA*(int*)0x208005

#defineCTRLR*(int*)0x208007

#defineLCDDELAY1

#defineLCDCMDTURNON0x3f

#defineLCDCMDTURNOFF0x3e

#defineLCDCMDSTARTLINE0xc0

#defineLCDCMDPAGE0xb8

#defineLCDCMDVERADDRESS0x40

#defineCTRGR*(int*)0x208000

#defineCTRLCDCMDR*(int*)0x208001

#defineCTRKEY*(int*)0x208001

#defineCTRLCDCR*(int*)0x208002

#defineCTRCLKEY*(int*)0x208002

#defineCTRLCDLCR*(int*)0x208003

#defineCTRLCDRCR*(int*)0x208004

#defineCTRLA*(int*)0x208005

#defineCTRLR*(int*)0x208007

 

unsignedintuWork;

intjishu=0;

unsignedintuWork,nCount;

unsignedintpwm1[8]={0x8e,0x8c,0x8d,0x89,0x8b,0x83,0x87,0x86};

unsignedintpwm2[8]={0x86,0x87,0x83,0x8b,0x89,0x8d,0x8c,0x8e};

intnAddStep,nStep;

voidDelay(unsignedintnTime);//延时子程序

voidTurnOnLCD();//打开显示

voidLCDCLS();

unsignedcharledkey[10][8]=

{

{0x00,0x00,0x7C,0x82,0x82,0x82,0x7C,0x00},//0

{0x00,0x00,0x00,0x84,0xFE,0x80,0x00,0x00},//1

{0x00,0x00,0x84,0xC2,0xA2,0x92,0x8C,0x00},//2

{0x00,0x00,0x44,0x92,0x92,0x92,0x6C,0x00},

{0x00,0x00,0x30,0x28,0x24,0xFE,0x20,0x00},

{0x00,0x00,0x4E,0x92,0x92,0x92,0x62,0x00},

{0x00,0x00,0x7C,0x92,0x92,0x92,0x64,0x00},

{0x00,0x00,0x02,0xC2,0x32,0x0A,0x06,0x00},

{0x00,0x00,0x6C,0x92,0x92,0x92,0x6C,0x00},

{0x00,0x00,0x4C,0x92,0x92,0x92,0x7C,0x00}

};

voidmain(void)

{

intnCount=0;

inti,nCount1=0,nBW=0;

charcKey;

unsignedintnScanCode;

 

InitSysCtrl();

InitXintf16Gpio();

CTRGR=0x80;//初始化ICETEK-CTR

Delay(LCDDELAY);

CTRGR=0x0;

Delay(LCDDELAY);

CTRGR=0x80;

Delay(LCDDELAY);

CTRLR=0;//关闭东西方向的交通灯

Delay(LCDDELAY);

CTRLR=0x40;//关闭南北方向的交通灯

Delay(LCDDELAY);

TurnOnLCD();//打开显示

LCDCLS();//清除显示内存

CTRLCDCMDR=LCDCMDSTARTLINE;//设置显示起始行

Delay(LCDDELAY);

CTRLCDCR=0;

Delay(LCDDELAY);

IER=0x0000;

IFR=0x0000;

#if(CPU_FRQ_150MHZ)

//ConfigureCPU-Timer0,1,and2tointerrupteverysecond:

//150MHzCPUFreq,1secondPeriod(inuSeconds)

ConfigCpuTimer(&CpuTimer0,150,1000000);

#endif

#if(CPU_FRQ_100MHZ)

ConfigCpuTimer(&CpuTimer0,100,1000000);

#endif

for(;;)

{

CTRLCDCMDR=LCDCMDPAGE;//设置操作页=0

Delay(LCDDELAY);

CTRLCDCR=0;

Delay(LCDDELAY);

CTRLCDCMDR=LCDCMDVERADDRESS;//起始列=0

Delay(LCDDELAY);

CTRLCDCR=0;

Delay(LCDDELAY);

for(i=0;i<8;i++)

{

CTRLCDLCR=(nBW==0)?

(ledkey[nCount1][i]):

(~ledkey[nCount1][i]);//屏幕左侧第1至8行第i列赋值port8002=0;//(赋值后当前操作列自动加1,所以不需设置)

Delay(LCDDELAY);

CTRLCDCR=0;

Delay(LCDDELAY);

}

Delay(4096);//延时子程序

nCount1++;

if(nCount1==10)

{

nCount1=0;

nBW=1-nBW;

}

}

CpuTimer0Regs.PRD.all=0x8fff;

//Initializepre-scalecountertodivideby1(SYSCLKOUT):

CpuTimer0Regs.TPR.all=0;

CpuTimer0Regs.TIM.all=0;

CpuTimer0Regs.TPRH.all=0;

//Makesuretimerisstopped:

CpuTimer0Regs.TCR.bit.TSS=1;

CpuTimer0Regs.TCR.bit.SOFT=1;

CpuTimer0Regs.TCR.bit.FREE=1;

//Reloadallcounterregisterwithperiodvalue:

CpuTimer0Regs.TCR.bit.TRB=1;

CpuTimer0Regs.TCR.bit.TIE=1;

//Resetinterruptcounters:

CpuTimer0.InterruptCount=0;

CpuTimer0Regs.PRD.all=0xffff;

CpuTimer0Regs.TPR.all=0;

CpuTimer0Regs.TIM.all=0;

CpuTimer0Regs.TPRH.all=0;

CpuTimer0Regs.TCR.bit.TSS=1;

CpuTimer0Regs.TCR.bit.SOFT=1;

CpuTimer0Regs.TCR.bit.FREE=1;

CpuTimer0Regs.TCR.bit.TRB=1;

CpuTimer0Regs.TCR.bit.TIE=1;

CpuTimer0.InterruptCount=0;

StartCpuTimer0();

EINT;//EnableGlobalinterruptINTM

ERTM;//EnableGlobalrealtimeinterruptDBGM

nStep=0;nAddStep=1;

CTRGR=0x80;//初始化ICETEK-CTR

CTRGR=0x0;

CTRGR=0x80;

CTRLR=0;//关闭东西方向的交通灯

CTRLR=0x40;//关闭南北方向的交通灯

CTRLR=0xc2;//开步进电机

uWork=CTRCLKEY;

StartCpuTimer0();

lcd();

while

(1)

{

if(nCount==0)

{

nScanCode=CTRKEY;

nScanCode&=0x0ff;

uWork=CTRCLKEY;

if(nScanCode!

=0)

{

if(nScanCode==9)break;

else

{

cKey=nScanCode;

}

cKey=nScanCode;

if(cKey!

=0)

{

if(cKey==4)nAddStep=1;

elseif(cKey==6)nAddStep=-1;

}

}

}

}

}

/*voidlcd(void)

{

inti,nCount=0,nBW=0;

InitSysCtrl();

InitXintf16Gpio();

CTRGR=0x80;//初始化ICETEK-CTR

Delay(LCDDELAY);

CTRGR=0x0;

Delay(LCDDELAY);

CTRGR=0x80;

Delay(LCDDELAY);

CTRLR=0;//关闭东西方向的交通灯

Delay(LCDDELAY);

CTRLR=0x40;//关闭南北方向的交通灯

Delay(LCDDELAY);

TurnOnLCD();//打开显示

LCDCLS();//清除显示内存

CTRLCDCMDR=LCDCMDSTARTLINE;//设置显示起始行

Delay(LCDDELAY);

CTRLCDCR=0;

Delay(LCDDELAY);

for(;;)

{

CTRLCDCMDR=LCDCMDPAGE;//设置操作页=0

Delay(LCDDELAY);

CTRLCDCR=0;

Delay(LCDDELAY);

CTRLCDCMDR=LCDCMDVERADDRESS;//起始列=0

Delay(LCDDELAY);

CTRLCDCR=0;

Delay(LCDDELAY);

for(i=0;i<8;i++)

{

CTRLCDLCR=(nBW==0)?

(ledkey[nCount][i]):

(~ledkey[nCount][i]);//屏幕左侧第1至8行第i列赋值port8002=0;//(赋值后当前操作列自动加1,所以不需设置)

Delay(LCDDELAY);

CTRLCDCR=0;

Delay(LCDDELAY);

}

Delay(4096);//延时子程序

nCount++;

if(nCount==10)

{

nCount=0;

nBW=1-nBW;

}

}

}

interruptvoidcpu_timer0_isr(void)

{

CpuTimer0.InterruptCount++;

//Acknowledgethisinterrupttoreceivemoreinterruptsfromgroup1

PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;

CpuTimer0Regs.TCR.bit.TIF=1;

CpuTimer0Regs.TCR.bit.TRB=1;

CTRLR=pwm2[nStep];

nStep+=nAddStep;

if(nStep<0)nStep=7;

elseif(nStep>7)nStep=0;

nCount++;nCount%=64;

StopCpuTimer0();

Delay(6);

*(int*)0x180000^=0x1;

StartCpuTimer0();

}

voidDelay(unsignedintnDelay)

{

intii,jj,kk=0;

for(ii=0;ii

{

for(jj=0;jj<1024;jj++)

{

kk++;

}

}

}

charConvertScanToChar(unsignedcharcScanCode)

{

charcReturn;

cReturn=0;

switch(cScanCode)

{

caseSCANCODE_0:

cReturn='0';break;

caseSCANCODE_1:

cReturn='1';break;

caseSCANCODE_2:

cReturn='2';break;

caseSCANCODE_3:

cReturn='3';break;

caseSCANCODE_4:

cReturn='4';break;

caseSCANCODE_5:

cReturn='5';break;

caseSCANCODE_6:

cReturn='6';break;

caseSCANCODE_7:

cReturn='7';break;

caseSCANCODE_8:

cReturn='8';break;

caseSCANCODE_9:

cReturn='9';break;

}

returncReturn;

}

voidTurnOnLCD()

{

CTRLCDCMDR=LCDCMDTURNON;

Delay(LCDDELAY);

CTRLCDCR=0;

Delay(2048);

CTRLCDCMDR=LCDCMDSTARTLINE;

Delay(LCDDELAY);

CTRLCDCR=0;

Delay(LCDDELAY);

}

voidLCDCLS()

{

inti,j;

CTRLCDCMDR=LCDCMDSTARTLINE;

Delay(LCDDELAY);

CTRLCDCR=0;

Delay(LCDDELAY);

for(i=0;i<8;i++)

{

CTRLCDCMDR=LCDCMDPAGE+i;

Delay(LCDDELAY);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 药学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1