步进电机驱动正转反转.docx
《步进电机驱动正转反转.docx》由会员分享,可在线阅读,更多相关《步进电机驱动正转反转.docx(16页珍藏版)》请在冰点文库上搜索。
步进电机驱动正转反转
/*文件名:
main.c
*功能:
LED显示控制。
*通过GPIO控制步进电机
*说明:
将跳线JP14和JP19全部短接。
****************************************************************************/
#include"config.h"
#defineMOTOA1<<10//P0.10
#defineMOTOB1<<11//P0.11
#defineMOTOC1<<12//P0.12
#defineMOTOD1<<13//P0.13
#definekey11<<16//A-B-C-D
#definekey21<<17//AB-BC-CD-DA-AB
#definekey31<<18//A-AB-B-BC-C-CD-D-DA-A
#definekey41<<19//反转
#definekey51<<20//停止
#defineKEYCON0x001f0000//LED控制字
#defineMOTOCON0x00003c00//MOTO控制字
#defineGPIOSET(PIN)IO0SET=PIN//方便修改置位端口
#defineGPIOCLR(PIN)IO0CLR=PIN//方便修改清位端口
#defineRS1<<9//P0.9
#defineSID1<<6//P0.6
#defineE1<<4//P0.4
#definePSB1<<2//P0.2并行或串行,选择低电平串行模式
#defineRST1<<25//P1.25,复位脚
unsignedcharIC_DAT1[64]="电机运行方式组成:
A-B-C-D单四拍步距角1.8";
unsignedcharIC_DAT2[64]="电机运行方式组成:
AB-BC-CD-DA双四拍步距角0.9";
unsignedcharIC_DAT3[64]="电机运行方式组为A-AB-B-BC-C-CD-D单双八拍步距角0.45";
unsignedcharIC_DAT4[64]="电机反转";
unsignedcharIC_DAT5[64]="电机停止";
unsignedcharIC_DAT6[64]="自动化0901班张凯龙衡海龙步进电机细分控制卢祖起郭亚楠";
voidTransferCom(unsignedchardata0);
voidTransferData(unsignedchardata1);
voiddelay(unsignedintm);
voiddelay_10ms(uint32n);
voidlcd_mesg(unsignedchar*adder1);
voidDelayNS(uint32dly);
voidMOTO_Mode1(uint8i);//A-B-C-D
voidMOTO_Mode10(uint8i);
voidMOTO_Mode2(uint8i);//AB-BC-CD-DA-AB
voidMOTO_Mode20(uint8i);
voidMOTO_Mode3(uint8i);//A-AB-B-BC-C-CD-D-DA-A
voidMOTO_Mode30(uint8i);
/****************************************************************************
*名称:
main()
*功能:
根据表DISP_TAB来控制LED显示。
****************************************************************************/
intmain(void)
{
/*PINSEL2使用启动代码的默认配置,切勿任意配置PINSEL2,否则总线会受到干扰*/
PINSEL0=0x00000000;
PINSEL1=0X00000000;
PINSEL2&=~(0x00000006);//设置所有I/O口为普通GPIO口
IO0DIR=MOTOCON;//配置LED控制I/O方向
LCD12864_init();
initinal();//液晶端口初始化
while((IO0PIN&key1)&&(IO0PIN&key2)&&(IO0PIN&key3)&&(IO0PIN&key4)&&(IO0PIN&key5)!
=0)
{
lcd_mesg(IC_DAT6);//显示界面
}
while
(1)
{
if((IO0PIN&key1)==0)
MOTO_Mode1(15);
if((IO0PIN&key4)==0)
MOTO_Mode10(20);
//A-B-C-D
if((IO0PIN&key2)==0)
MOTO_Mode2(15);
if((IO0PIN&key4)==0)
MOTO_Mode20(20);
//AB-BC-CD-DA-AB
if((IO0PIN&key3)==0)
MOTO_Mode3(8);
if((IO0PIN&key4)==0)
MOTO_Mode30(10);//A-AB-B-BC-C-CD-D-DA-A
if((IO0PIN&key5)==0)//停止
{
initinal();
lcd_mesg(IC_DAT5);
IO0CLR=MOTOCON;
};
}
return(0);
}
/****************************************************************************
*名称:
DelayNS()
*功能:
长软件延时
*入口参数:
dly延时参数,值越大,延时越久
*出口参数:
无
****************************************************************************/
voidDelayNS(uint32dly)
{uint32i;
for(;dly>0;dly--)
{
for(i=0;i<5000;i++);
}
}
/****************************************************************************
*名称:
MOTO_Mode1()
*功能:
单四拍程序
*入口参数:
uint8i延时参数,值越大,延时越久
*出口参数:
无
****************************************************************************/
voidMOTO_Mode1(uint8i)//A-B-C-D
{
initinal();
while((IO0PIN&key2)&&(IO0PIN&key3)&&(IO0PIN&key4)&&(IO0PIN&key5)!
=0)
{
lcd_mesg(IC_DAT1);//显示汉字界面1
/*A*/
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOA);
/*B*/
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOB);
/*C*/
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOC);
/*D*/
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOD);
}
}
voidMOTO_Mode10(uint8i)//A-B-C-D
{
initinal();
while((IO0PIN&key1)&&(IO0PIN&key2)&&(IO0PIN&key3)&&(IO0PIN&key5)!
=0)
{
lcd_mesg(IC_DAT4);
/*D*/
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOD);
/*C*/
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOC);
/*B*/
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOB);
/*A*/
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOA);
}
}
/****************************************************************************
*名称:
MOTO_Mode2()
*功能:
双四拍程序
*入口参数:
uint8i延时参数,值越大,延时越久
*出口参数:
无
****************************************************************************/
voidMOTO_Mode2(uint8i)//AB-BC-CD-DA-AB
{
initinal();
while((IO0PIN&key1)&&(IO0PIN&key3)&&(IO0PIN&key4)&&(IO0PIN&key5)!
=0)
{
lcd_mesg(IC_DAT2);//显示汉字界面2
GPIOSET(MOTOA);
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOA);
GPIOCLR(MOTOB);
/*BC*/
GPIOSET(MOTOB);
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOB);
GPIOCLR(MOTOC);
/*CD*/
GPIOSET(MOTOC);
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOC);
GPIOCLR(MOTOD);
/*DA*/
GPIOSET(MOTOD);
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOD);
GPIOCLR(MOTOA);
}
}
voidMOTO_Mode20(uint8i)//AB-BC-CD-DA-AB
{
initinal();
while((IO0PIN&key1)&&(IO0PIN&key2)&&(IO0PIN&key3)&&(IO0PIN&key5)!
=0)
{
lcd_mesg(IC_DAT4);
GPIOSET(MOTOA);
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOA);
GPIOCLR(MOTOD);
/*DC*/
GPIOSET(MOTOD);
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOD);
GPIOCLR(MOTOC);
/*CB*/
GPIOSET(MOTOC);
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOC);
GPIOCLR(MOTOB);
/*BA*/
GPIOSET(MOTOB);
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOB);
GPIOCLR(MOTOA);
}
}
/****************************************************************************
*名称:
MOTO_Mode3()
*功能:
单双八拍程序
*入口参数:
uint8i延时参数,值越大,延时越久
*出口参数:
无
****************************************************************************/
voidMOTO_Mode3(uint8i)//A-AB-B-BC-C-CD-D-DA-A
{
initinal();
while((IO0PIN&key1)&&(IO0PIN&key2)&&(IO0PIN&key4)&&(IO0PIN&key5)!
=0)
{
lcd_mesg(IC_DAT3);
/*A*/
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOA);
/*AB*/
GPIOSET(MOTOA);
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOA);
GPIOCLR(MOTOB);
/*B*/
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOB);
/*BC*/
GPIOSET(MOTOB);
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOB);
GPIOCLR(MOTOC);
/*C*/
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOC);
/*CD*/
GPIOSET(MOTOC);
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOC);
GPIOCLR(MOTOD);
/*D*/
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOD);
/*DA*/
GPIOSET(MOTOD);
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOD);
GPIOCLR(MOTOA);
}
}
voidMOTO_Mode30(uint8i)//A-AB-B-BC-C-CD-D-DA-A
{
initinal();
while((IO0PIN&key1)&&(IO0PIN&key2)&&(IO0PIN&key3)&&(IO0PIN&key5)!
=0)
{
lcd_mesg(IC_DAT4);
/*D*/
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOD);
/*CD*/
GPIOSET(MOTOC);
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOC);
GPIOCLR(MOTOD);
/*C*/
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOC);
/*BC*/
GPIOSET(MOTOB);
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOB);
GPIOCLR(MOTOC);
/*B*/
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOB);
/*AB*/
GPIOSET(MOTOA);
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOA);
GPIOCLR(MOTOB);
/*A*/
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOA);
/*DA*/
GPIOSET(MOTOD);
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOD);
GPIOCLR(MOTOA);
}
}
/*************************************************************
*名称:
delay()
*功能:
延时程序
**************************************************************/
voiddelay(unsignedintm)
{
unsignedinti,j;
for(i=0;ifor(j=0;j<50;j++);
}
/*************************************************************
*名称:
delay_10ms()
*功能:
延时程序
**************************************************************/
voiddelay_10ms(uint32n)
{
uint32i,j;
for(i=0;ifor(j=0;j<2000;j++);
}
/*************************************************************
*名称:
initinal()
*功能:
LCD12864字库初始化
**************************************************************/
initinal(void)
{
delay_10ms(4);//大于40ms的延时程序
IO0SET=PSB;//设置为串行工作方式
delay
(1);
IO1CLR=RST;//复位
delay
(1);
IO1SET=RST;//复位置高
delay(10);
TransferCom(0x30);//8bit设置。
RE=0.G=0,图片显示关
delay(100);
TransferCom(0x0C);//D=1,显示开
delay(100);
TransferCom(0x01);//清屏
delay_10ms
(1);
TransferCom(0x06);//模式设置,光标从右向左加1位移动
delay(100);
}
/****************************************************************
*名称:
lcd_mesg()
*功能:
在LCD12864上显示汉字
*****************************************************************/
voidlcd_mesg(unsignedchar*adder1)
{
unsignedchari;
TransferCom(0x80);
delay(100);
for(i=0;i<32;i++)
{
TransferData(*adder1);
adder1++;
}
TransferCom(0x90);
delay(100);
for(i=16;i<64;i++)
{
TransferData(*adder1);
adder1++;
}
}
/******************************************************************
*名称:
SeddByte()
*功能:
发送1字节数据
*******************************************************************/
voidSendByte(unsignedcharDbyte)
{
unsignedchari;
for(i=0;i<8;i++)
{
IO0CLR=E;
if((Dbyte&0x80)==0x80)
IO0SET=SID;
else
IO0CLR=SID;
Dbyte=Dbyte<<1;//左移一位
IO0SET=E;
IO0CLR=E;
}
}
/***************************************************************
*名称:
TransferCom()
*功能:
向LCD12864发送命令
****************************************************************/
voidTransferCom(unsignedchardata0)
{
IO0SET=RS;
SendByte(0xf8);//11111,RW(0),RS
(1),0
SendByte(0xf0&data0);//高4位
SendByte(0xf0&data0<<4);//低4位
IO0CLR=RS;
}
/*************************************************************
*名称:
TransferData()
*功能:
向LCD12864发送数据
**************************************************************/
voidTransferData(unsignedchardata1)
{
IO0SET=RS;
SendByte(0xfa);//11111,RW(0),RS
(1),0
SendByte(0xf0&data1);//高4位
SendByte(0xf0&data1<<4);//低4位
IO0CLR=RS;
}
/***************************************************************************************
*名称:
LCD12864_init()
*功能:
LCD12864端口初始化函数
*****************************************************************************************/
LCD12864_init(void)
{
IO0DIR|=(E|SID|RS);//设置为输出
IO0CLR=(E|SID|RS);
IO1DIR|=RST;
IO1CLR=RST;//复位
delay
(1);
IO1SET=RST;//复位置高
}