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