您好,欢迎来到九壹网。
搜索
您的当前位置:首页步进电机驱动正转反转

步进电机驱动正转反转

来源:九壹网
 .

/* 文 件 名:main.c

* 功 能:LED显示控制。

* 通过GPIO控制步进电机

* 说 明:将跳线JP14和JP19全部短接。

****************************************************************************/

#include \"config.h\"

#define MOTOA 1<<10 // P0.10

#define MOTOB 1<<11 // P0.11

#define MOTOC 1<<12 // P0.12

#define MOTOD 1<<13 // P0.13

#define key1 1<<16 // A-B-C-D

#define key2 1<<17 // AB-BC-CD-DA-AB

#define key3 1<<18 // A-AB-B-BC-C-CD-D-DA-A

页脚

.

#define key4 1<<19 //反转

#define key5 1<<20 //停止

#define KEYCON 0x001f0000 // LED控制字

#define MOTOCON 0x00003c00 // MOTO控制字

#define GPIOSET(PIN) IO0SET = PIN // 便修改置位端口

#define GPIOCLR(PIN) IO0CLR = PIN // 便修改清位端口

#define RS 1<<9 //P0.9

#define SID 1<<6 //P0.6

#define E 1<<4 //P0.4

#define PSB 1<<2 //P0.2并行或串行,选择低电平串行模式

#define RST 1<<25 //P1.25,复位脚

unsigned char IC_DAT1[]=\"电机运行式组成: A-B-C-D 单四拍 步距角 1.8 \";

页脚

.

unsigned char IC_DAT2[]=\"电机运行式组成: AB-BC-CD-DA 双四拍 步距角 0.9 \";

unsigned char IC_DAT3[]=\"电机运行式组为A-AB-B-BC-C-CD-D 单双八拍 步距角 0.45 \";

unsigned char IC_DAT4[]=\" 电机 \";

unsigned char IC_DAT5[]=\" 电机 \";

unsigned char IC_DAT6[]=\" 自动化0901班 制卢祖起 郭亚楠\";

void TransferCom(unsigned char data0);

void TransferData(unsigned char data1);

void delay(unsigned int m);

void delay_10ms(uint32 n);

void lcd_mesg(unsigned char *adder1);

void DelayNS(uint32 dly);

页脚

反 转 停 止 凯龙 衡海龙步进电机细分控 .

void MOTO_Mode1(uint8 i); // A-B-C-D

void MOTO_Mode10(uint8 i);

void MOTO_Mode2(uint8 i); // AB-BC-CD-DA-AB

void MOTO_Mode20(uint8 i);

void MOTO_Mode3(uint8 i); // A-AB-B-BC-C-CD-D-DA-A

void MOTO_Mode30(uint8 i);

/****************************************************************************

* 名 称:main()

* 功 能:根据表DISP_TAB来控制LED显示。

****************************************************************************/

int main(void)

{

页脚

.

/* PINSEL2使用启动代码的默认配置,切勿任意配置PINSEL2,否则总线会受到干扰 */

PINSEL0=0x00000000;

PINSEL1=0X00000000;

PINSEL2&=~(0x00000006); //设置所有I/O口为普通GPIO口

IO0DIR =MOTOCON; // 配置LED控制I/O向

LCD128_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);

if ((IO0PIN&key2)==0)

MOTO_Mode2(15);

if((IO0PIN&key4)==0)

MOTO_Mode20(20);

if ((IO0PIN&key3)==0)

MOTO_Mode3(8);

页脚

// A-B-C-D

// AB-BC-CD-DA-AB

.

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 延时参数,值越大,延时越久

* 出口参数:无

****************************************************************************/

void DelayNS(uint32 dly)

{ uint32 i;

for(; dly>0; dly--)

{

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

}

}

/****************************************************************************

* 名 称:MOTO_Mode1()

页脚

.

* 功 能:单四拍程序

* 入口参数:uint8 i 延时参数,值越大,延时越久

* 出口参数:无

****************************************************************************/

void MOTO_Mode1(uint8 i) // 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);

}

}

void MOTO_Mode10(uint8 i) // 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()

* 功 能:双四拍程序

* 入口参数:uint8 i 延时参数,值越大,延时越久

* 出口参数:无

****************************************************************************/

void MOTO_Mode2(uint8 i) // 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);

}

页脚

.

}

void MOTO_Mode20(uint8 i) // 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()

* 功 能:单双八拍程序

* 入口参数:uint8 i 延时参数,值越大,延时越久

* 出口参数:无

****************************************************************************/

页脚

.

void MOTO_Mode3(uint8 i) // 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);

}

}

void MOTO_Mode30(uint8 i) {

initinal();

页脚

// A-AB-B-BC-C-CD-D-DA-A

.

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()

* 功能:延时程序

**************************************************************/

void delay(unsigned int m)

{

页脚

.

unsigned int i,j;

for(i=0;ifor(j=0;j<50;j++);

}

/*************************************************************

* 名称:delay_10ms()

* 功能:延时程序

**************************************************************/

void delay_10ms(uint32 n)

{

uint32 i,j;

for(i=0;ifor(j=0;j<2000;j++);

页脚

.

}

/*************************************************************

* 名称:initinal()

* 功能:LCD128字库初始化

**************************************************************/

initinal(void)

{

delay_10ms(4); //大于40ms的延时程序

IO0SET=PSB; //设置为串行工作式

delay(1);

IO1CLR=RST; //复位

页脚

.

delay(1);

IO1SET=RST; //复位置高

delay(10);

TransferCom(0x30); delay(100);

TransferCom(0x0C); delay(100);

TransferCom(0x01); delay_10ms(1);

TransferCom(0x06); delay(100);

页脚

//8bit设置。RE=0.G=0,图片显示关

//D=1,显示开

//清屏

//模式设置,光标从右向左加1位移动

.

}

/****************************************************************

* 名称:lcd_mesg()

* 功能:在LCD128上显示汉字

*****************************************************************/

void lcd_mesg(unsigned char *adder1)

{

unsigned char i;

TransferCom(0x80);

delay(100);

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

{

TransferData(*adder1);

页脚

.

adder1++;

}

TransferCom(0x90);

delay(100);

for(i=16;i<;i++)

{

TransferData(*adder1);

adder1++;

}

}

/******************************************************************

* 名称:SeddByte()

* 功能:发送1字节数据

页脚

.

*******************************************************************/

void SendByte(unsigned char Dbyte)

{

unsigned char i;

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()

* 功能:向LCD128发送命令

****************************************************************/

void TransferCom(unsigned char data0)

{

IO0SET=RS;

SendByte(0xf8); // 11111,RW(0),RS(1),0

SendByte(0xf0&data0); //高4位

SendByte(0xf0&data0<<4); //低4位

页脚

.

IO0CLR=RS;

}

/*************************************************************

* 名称:TransferData()

* 功能:向LCD128发送数据

**************************************************************/

void TransferData(unsigned char data1)

{

IO0SET=RS;

SendByte(0xfa); // 11111,RW(0),RS(1),0

SendByte(0xf0&data1); //高4位

SendByte(0xf0&data1<<4); //低4位

IO0CLR=RS;

页脚

.

}

/***************************************************************************************

* 名称:LCD128_init()

* 功能:LCD128端口初始化函数

*****************************************************************************************/

LCD128_init(void)

{

IO0DIR|=(E|SID|RS); //设置为输出

IO0CLR=(E|SID|RS);

IO1DIR|=RST;

IO1CLR=RST; //复位

delay(1);

页脚

.

IO1SET=RST; //复位置高

}

页脚

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务