实验三步进电机实验.docx
《实验三步进电机实验.docx》由会员分享,可在线阅读,更多相关《实验三步进电机实验.docx(31页珍藏版)》请在冰豆网上搜索。
实验三步进电机实验
步进电机控制及LED显示
【实验目的】
1.了解四相步进电机的工作原理;
2.熟练使用SPI接口,并通过SPI接口控制LED显示;
3.学习使用TMS320C28XDSP的通用I/O端口控制外围设备信息的方法,掌握使用TMS320C28XDSP通用计时器的控制原理及中断服务程序的编程方法。
学会利用DSP的通用I/O口进行步进电机的控制;
【实验要求】
.编程要求:
编写C语言程序,学会步进电机的工作原理和控制方法。
.实现功能:
DSP控制步进电机的启动,停止,正反转和速度控制。
并通过LED显示步进电机的转速、正传(H表示)、反转(L表示)、工作方式(1表示单拍方式;2表示双拍方式;3表示单双拍结合方式)。
【实验设备】
.装有Windows系统和CCS2.3('C2000)集成开发环境的PC机一台、TMS320C28X系列DSP实验箱一个、SEED-XDSusb2.0仿真器一个。
.本实验用到的实验箱硬件模块为:
TMS320C28XDSP核心、四相步进电机模块以及LED显示模块。
【实验原理】
TMS320C28X系列DSP实验箱是一个以TMS320C28XDSP为核心的DSP扩展评估板,它通过扩展接口与实验箱的显示/控制模块连接,可以控制其各种外围设备。
步进电机驱动原理是通过对它每相线圈中的电流顺序切换来使电机做步进式旋转。
本实验中的步进电机是由DSP通用I/O管脚输出直接控制,由ULN2003A驱动。
DSP2812的通用I/O口PWM7控制电机启动,PWM8控制电机停止,PWM9控制电机正转,PWM10控制电机反转,PWM11控制电机加速,PWM12控制电机减速。
驱动电路由脉冲信号来控制,所以调节定时器脉冲信号的频率可以改变步进电机的加速/减速。
步进电机的工作模式是在主函数中修改,同时在LED显示其工作模式。
主程序流程图:
【实验相关知识】
1、步进电机工作原理
该步进电机为一四相步进电机,采用单极性直流电源供电。
只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。
图1是该四相反应式步进电机工作原理示意图。
图1四相步进电机步进示意图
开始时,开关SB接通电源,SA、SC、SD断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。
当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。
而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。
依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。
四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。
单四拍与双四拍的步距角相等,但单四拍的转动力矩小。
八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。
单四拍、双四拍与八拍工作方式的电源通电时序与波形分别如图2.a、b、c所示:
a.单四拍 b.双四拍 c八拍
图2.步进电机工作时序波形图
2、MAX7219驱动芯片
MAX9219典型的应用电路:
MAX7219的时序逻辑:
MAX7219的数据格式:
MAX7219可以显示的数字及字母:
【实验步骤】
1、硬件接线
●SPI_LED显示部分的接线说明:
实验模块(NLED)控制模块(ADSPSECTION)
DSPDIN(J17)SPISIMOA(J34)
DSP/CS(J17)SPITEA(J34)
DSPCLK(J17)SPICLKA(J34)
此外还需要NLED模块的J52对应管脚短接;NLED模块的J18的VCC和DIS_VCC端接;NLED模块供电J61(ADSPSECTION)的GND短接。
●步进电机部分的接线说明:
实验模块(IStepMotor)控制模块(ADSPSECTION)
PA(J22)PWM1(J36)
PB(J22)PWM3(J36)
PC(J22)PWM2(J36)
PD(J22)PWM4(J36)
按键模块(KKEYBOARD)控制模块(ADSPSECTION)说明
K1(J21)PWM7(J35)启动
K2(J21)PWM8(J35)停止
K3(J21)PWM9(J35)正转
K4(J21)PWM10(J35)反转
K5(J21)PWM11(J35)加速
K6(J21)PWM12(J35)减速
2、开启设备
①打开计算机电源,打开实验箱电源开关。
②如使用USB型仿真器用附带的USB电缆连接计算机和仿真器相应接口。
③设置CodeComposerStudio为Emulator方式。
④启动CodeComposerStudio。
3、打开工程并浏览程序。
4、编译并下载程序
5、运行程序,观察结果
①键K1控制电机启动;
②键K2控制电机停止;
③键K3控制电机正转;
④键K4控制电机反转;
⑤键K5控制电机加速;
⑥键K6控制电机减速;
同时在进行上述按键操作中,相应的LED端会有显示。
【试验程序】
.实验主程序;
#include"DSP28_Device.h"
#include"DSP28_Globalprototypes.h"
#definePhase_AGpioDataRegs.GPADAT.bit.GPIOA0//接PWM1,步进电机A相
#definePhase_CGpioDataRegs.GPADAT.bit.GPIOA1//接PWM2,步进电机B相
#definePhase_BGpioDataRegs.GPADAT.bit.GPIOA2//接PWM3,步进电机C相
#definePhase_DGpioDataRegs.GPADAT.bit.GPIOA3//接PWM4,步进电机D相
#defineStartGpioDataRegs.GPBDAT.bit.GPIOB0//接PWM7,启动
#defineStopGpioDataRegs.GPBDAT.bit.GPIOB1//接PWM8,停止
#definePosGpioDataRegs.GPBDAT.bit.GPIOB2//接PWM9,正转
#defineNegGpioDataRegs.GPBDAT.bit.GPIOB3//接PWM10,反转
#defineSpeedUpGpioDataRegs.GPBDAT.bit.GPIOB4//接PWM11,加速
#defineSpeedDownGpioDataRegs.GPBDAT.bit.GPIOB5//接PWM12,减速
#defineON1
#defineOFF0
#defineA1
#defineC2
#defineB3
#defineD4
#defineSTT0x01
#defineSTP0x02
#defineP0x03
#defineN0x04
#defineSUp0x05
#defineSDn0x06
unsignedintflag;
unsignedintssflag;
inttimer;
unsignedintkeytmp;
unsignedintKeyData;
unsignedintStartOrNot=0;
unsignedintNegOrPos=1;
unsignedintshownum;
inttimer1;
//MAX7219的相关变量
unsignedintSpi_VarRx[100];
unsignedinti,j;
externunsignedintInt_Flag;
unsignedintMF11;
unsignedintMF22;
unsignedintMF33;
voidGpio_select(void);//GPIO设置
voidDelay_SM(unsignedintt);//延时
voidStepMotor(intphase,intstatus);//步进电机控制函数
voidstop(void);//停止函数
unsignedcharScanKey(void);//扫描按键值
voidMoDe1(unsignedintMF1,unsignedintt);//步进电机工作模式1函数
voidMoDe2(unsignedintMF2,unsignedintt);//步进电机工作模式2函数
voidMoDe3(unsignedintMF3,unsignedintt);//步进电机工作模式3函数
//MAX7219函数
voidIntensity(intbrightness);
voidScanLimit(intdigits);
voidDisplayTest(void);
voidShutDown(intctrl);
voidDecodeMode(unsignedintw);
unsignedintBIN2BCD(unsignedintbin);
voidShowBCD(unsignedintbcd);
//主函数
voidmain(void)
{
unsignedintkb=0;
InitSysCtrl();
//禁止、清除所有CPU中断
DINT;
IER=0x0000;
IFR=0x0000;
//初始化PIE向量表
InitPieCtrl();
InitPieVectTable();
//MAX7219初始化
InitPeripherals();
Gpio_select();
#ifSpi_Int
EALLOW;
PieVectTable.SPITXINTA=&SPITXINTA_ISR;
PieVectTable.SPIRXINTA=&SPIRXINTA_ISR;
EDIS;
IER|=M_INT6;
#endif
/*开中断*/
EINT;
ERTM;
Intensity(11);
ScanLimit(7);
DisplayTest();
ShutDown(NO);
DecodeMode(0x0ff);
timer=2000;
StartOrNot=0;
NegOrPos=1;
stop();
while
(1)
{
//模式判断
if(MF11==1)
W2MAX7219(0x0701);
if(MF22==1)
W2MAX7219(0x0702);
if(MF33==1)
W2MAX7219(0x0703);
//分隔横线
W2MAX7219(0x050A);
if(StartOrNot==1&&NegOrPos==1)
{
MoDe2(1,timer);
if((Spi_TxReady()==1))
{
timer1=1000000/timer;
shownum=BIN2BCD(timer1);
ShowBCD(shownum);
W2MAX7219(0x060C);
}
}
elseif(StartOrNot==1&&NegOrPos==0)
{
MoDe2(0,timer);
if((Spi_TxReady()==1))
{
timer1=1000000/timer;
shownum=BIN2BCD(timer1);
ShowBCD(shownum);
W2MAX7219(0x060D);
}
}
elsestop();
kb=ScanKey();
switch(kb)
{
caseSTT:
StartOrNot=1;
break;
caseSTP:
StepMotor(A,OFF);
StepMotor(C,OFF);
StepMotor(B,OFF);
StepMotor(D,OFF);
StartOrNot=0;
break;
caseP:
if(StartOrNot==1&&NegOrPos==0)
NegOrPos=1;
break;
caseN:
if(StartOrNot==1&&NegOrPos==1)
NegOrPos=0;
break;
caseSUp:
if(SpeedUp==0)
{
timer=timer-10;
if(timer<100)timer=101;
}
break;
caseSDn:
if(SpeedDown==0)
{
timer=timer+10;
if(timer>10000)timer=9999;
}
break;
default:
break;
}
}
}
voidGpio_select(void)
{
EALLOW;
GpioMuxRegs.GPAMUX.all=0x0000;
GpioMuxRegs.GPADIR.all=0x000F;
GpioMuxRegs.GPAQUAL.all=0x0000;;
GpioMuxRegs.GPBMUX.all=0x0000;
GpioMuxRegs.GPBDIR.all=0x0000;
GpioMuxRegs.GPBQUAL.all=0x0000;
EDIS;
}
voidDelay_SM(unsignedintt)
{
inti,j;
for(i=0;i{for(j=0;j<200;j++);}
}
//单拍方式
voidMoDe1(unsignedintMF1,unsignedintt)
{
if(MF1==1)
{
StepMotor(D,OFF);
StepMotor(A,ON);
Delay_SM(t);
StepMotor(A,OFF);
StepMotor(C,ON);
Delay_SM(t);
StepMotor(C,OFF);
StepMotor(B,ON);
Delay_SM(t);
StepMotor(B,OFF);
StepMotor(D,ON);
Delay_SM(t);
}else
{
StepMotor(C,OFF);
StepMotor(A,ON);
Delay_SM(t);
StepMotor(A,OFF);
StepMotor(D,ON);
Delay_SM(t);
StepMotor(D,OFF);
StepMotor(B,ON);
Delay_SM(t);
StepMotor(B,OFF);
StepMotor(C,ON);
Delay_SM(t);
}
MF11=MF1;
}
//双拍方式
voidMoDe2(unsignedintMF2,unsignedintt)
{
if(MF2==1)
{
StepMotor(D,OFF);
StepMotor(A,ON);
StepMotor(C,ON);
Delay_SM(t);
StepMotor(A,OFF);
StepMotor(C,ON);
StepMotor(B,ON);
Delay_SM(t);
StepMotor(C,OFF);
StepMotor(B,ON);
StepMotor(D,ON);
Delay_SM(t);
StepMotor(B,OFF);
StepMotor(D,ON);
StepMotor(A,ON);
Delay_SM(t);
}else
{
StepMotor(B,OFF);
StepMotor(A,ON);
StepMotor(C,ON);
Delay_SM(t);
StepMotor(C,OFF);
StepMotor(D,ON);
StepMotor(A,ON);
Delay_SM(t);
StepMotor(A,OFF);
StepMotor(B,ON);
StepMotor(D,ON);
Delay_SM(t);
StepMotor(D,OFF);
StepMotor(C,ON);
StepMotor(B,ON);
Delay_SM(t);
}
MF22=MF2;
}
//单双拍结合
voidMoDe3(unsignedintMF3,unsignedintt)
{
if(MF3==1)
{
StepMotor(D,OFF);
StepMotor(A,ON);
Delay_SM(t);
StepMotor(A,ON);
StepMotor(C,ON);
Delay_SM(t);
StepMotor(A,OFF);
StepMotor(C,ON);
Delay_SM(t);
StepMotor(C,ON);
StepMotor(B,ON);
Delay_SM(t);
StepMotor(C,OFF);
StepMotor(B,ON);
Delay_SM(t);
StepMotor(B,ON);
StepMotor(D,ON);
Delay_SM(t);
StepMotor(B,OFF);
StepMotor(D,ON);
Delay_SM(t);
StepMotor(D,ON);
StepMotor(A,ON);
Delay_SM(t);
}else
{
StepMotor(C,OFF);
StepMotor(A,ON);
Delay_SM(t);
StepMotor(D,ON);
StepMotor(A,ON);
Delay_SM(t);
StepMotor(A,OFF);
StepMotor(D,ON);
Delay_SM(t);
StepMotor(B,ON);
StepMotor(D,ON);
Delay_SM(t);
StepMotor(D,OFF);
StepMotor(B,ON);
Delay_SM(t);
StepMotor(C,ON);
StepMotor(B,ON);
Delay_SM(t);
StepMotor(B,OFF);
StepMotor(C,ON);
Delay_SM(t);
StepMotor(A,ON);
StepMotor(C,ON);
Delay_SM(t);
}
MF33=MF3;
}
voidStepMotor(intphase,intstatus)
{
switch(phase)
{
caseA:
if(status==ON)
{
Phase_A=ON;
}else
{
Phase_A=OFF;
}
break;
caseB:
if(status==ON)
{
Phase_B=ON;
}else
{
Phase_B=OFF;
}
break;
caseC:
if(status==ON)
{
Phase_C=ON;
}else
{
Phase_C=OFF;
}
break;
caseD:
if(status==ON)
{
Phase_D=ON;
}else
{
Phase_D=OFF;
}
break;
default:
break;
}
}
voidstop(void)
{
StepMotor(A,OFF);
StepMotor(C,OFF);
StepMotor(B,OFF);
StepMotor(D,OFF);
}
unsignedcharScanKey(void)
{
EALLOW;
GpioMuxRegs.GPBDIR.all=0x0FFFF;
EDIS;
GpioDataRegs.GPBSET.all=0x003F;
GpioDataRegs.GPBCLEAR.all=0x0FFC0;
Delay_SM(1000);
EALLOW;
GpioMuxRegs.GPBDIR.all=0x0000;
EDIS;
Delay_SM(1000);
keytmp=GpioDataRegs.GPBDAT.all;
/*if(keytmp==0x003F)
{
flag=0;
while(flag==0)
{
keytmp=GpioDataRegs.GPBDAT.all&0x003F;
flag=1;
}
}*/
switch(keytmp&0x003F)
{
case0x003E:
KeyData=STT;
break;
case0x003D:
KeyData=STP;
break;
case0x003B:
KeyData=P;
break;
case0x0037:
KeyData=N;
break;
case0x002F:
if(SpeedUp==0)
{
//while(SpeedUp==0);
KeyData=SUp;
}
break;
case0x001F:
KeyData=SDn;
break;
default:
break;
}
return(KeyData);
}
2.MAX7219相关函数程序。
#include"DSP28_Device.h"
unsignedintInt_Flag;
interruptvoidISRTimer2(void)
{
Int_Flag=1;
}
/**********************************