基于51单片机的步进电机的控制

2020-10-16 10:21发布

前面笔者分享过基于51单片机的两种小车制作,我们利用的是L298N驱动控制电机转动,那么接下来,笔者给大家介绍两种利用51单片机控制步进电机的小程序。


首先我们要如何使电机转动呢,源程序如下:

#include

unsigned char code F_Rotation[4]={0x02,0x04,0x08,0x10}; //正转表格,换算成二进制 0000 0010,0000 0100,0000 1000,0001 0000 

unsigned char code B_Rotation[4]={0x10,0x08,0x04,0x02}; //反转表格,换算成二进制 0001 0000,0000 1000,0000 0100,0000 0010 

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

/* 延时函数 */ 

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

void Delay(unsigned int i)//延时 { while(--i); } 

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

/* 主函数 */ 

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

main() 

 unsigned char i;

while(1

 { for(i=0;i<4;i++) //4相 

 { P1=F_Rotation[i]; //输出对应的相 可以自行换成反转表格 

 Delay(500); //改变这个参数可以调整电机转速 ,数字越小,转速越大 } } 

}

接下来,我们要控制电机的正反转,这个程序主要用于4相步进电机的常规驱动,速度不可调的过快,不然就没有力矩的转动了,按s4可控制电机正反转:

#include

bit Flag;//定义正反转标志位 

 unsigned char code F_Rotation[4]={0xf1,0xf2,0xf4,0xf8}; //正转表格 

unsigned char code B_Rotation[4]={0xf8,0xf4,0xf2,0xf1}; //反转表格 /******************************************************************/ /* 延时函数 */ /******************************************************************/ 

void Delay(unsigned int i)//延时

{ while(--i); } 

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

/* 主函数 */ 

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

main() 

 unsigned char i; 

 EX1=1; //外部中断0开 

 IT1=1; //边沿触发

EA=1; //全局中断开 

while(!Flag)

 { P0=0x71;//显示 F 标示正转 

for(i=0;i<4;i++) //4相 

 { P1=F_Rotation[i]; //输出对应的相 可以自行换成反转表格 

 Delay(500); //改变这个参数可以调整电机转速 ,数字越小,转速越大

} } 

while(Flag) 

 { P0=0x7C;//显示 b 标示反转 

for(i=0;i<4;i++) //4相

{ P1=B_Rotation[i]; //输出对应的相 

Delay(500); //改变这个参数可以调整电机转速 ,数字越小,转速越大 } } 

} /******************************************************************/ 

/* 中断入口函数 */

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

void ISR_Key(void) interrupt 2 using 1

{ Delay(300); Flag=!Flag; //s3按下触发一次,标志位取反 }

最后介绍一下带停机的步进电机正反转的方法:

#include

unsigned char Flag;//定义正反转和停止标志位 

sbit KEY = P3^3

 unsigned char code F_Rotation[4]={0xf1,0xf2,0xf4,0xf8}; //正转表格 

unsigned char code B_Rotation[4]={0xf8,0xf4,0xf2,0xf1}; //反转表格 /******************************************************************/ 

/* 延时函数 */ 

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

void Delay(unsigned int i)//延时

{ while(--i); } 

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

/* 主函数 */ 

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

main() { unsigned char i; EX1=1; //外部中断0开 IT1=1; //边沿触发 EA=1; //全局中断开 while(Flag==0) { P0=0x71;//显示 F 标示正转 for(i=0;i<4;i++) //4相 { P1=F_Rotation[i]; //输出对应的相 可以自行换成反转表格 Delay(500); //改变这个参数可以调整电机转速 ,数字越小,转速越大 } } 

while(Flag==1)

 { P0=0x7C;//显示 b 标示反转 for(i=0;i<4;i++) //4相 

 { P1=B_Rotation[i]; //输出对应的相 

Delay(500); //改变这个参数可以调整电机转速 ,数字越小,转速越大 }

 } 

while(Flag==2) //停止

{ P0=0x6D;// 显示 S P1=0; }

 } 

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

/* 中断入口函数 */ 

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

void ISR_Key(void) interrupt 2 using 1

{ Delay(500);

if(!KEY) 

 { Flag++; //s3按下触发一次 

if(Flag==3) Flag=0

 }

 }



登录 后发表评论
0条评论
还没有人评论过~