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

2020-10-16 10:21发布

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

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


#include <reg52.h>



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 <reg52.h>


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 <reg52.h>


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;

  }

 }