单片机/MCUwilliam hill官网
直播中

白色的蜻蜓

7年用户 6经验值
私信 关注

关于步进电机控制

本帖最后由 白色的蜻蜓 于 2017-4-6 16:52 编辑

  我想用一个51单片机对两个步进电机进行控制,一台是主轴电机,另一台是排线电机。其中once指的是一个中断信号,一旦once==0,那么排线电机就转过相应的角度。
  我目前的情况是,来了中断信号后,排线电机能转过相应的角度,但是在排线电机转的同时,主轴电机就停转了。
  控制主轴电机和排线电机的分别是两个循环,能不能不用模拟多线程,就用编程技巧实现两台电机同时转呢。
  以下是程序片段
void Go(int x)
{
        while(1)
        {         
    PH1 = 0; //主轴电机的脉冲循环
        delay(x);
        PH1 = 1;  
        delay(x);
                if(keystop==0)
                {
                 break;
                }
                if(once==0)
                {                 

                                if(depth==0)
                                  {run(100);}  //排线电机转90°

                                   if(depth==1)
                                  {run(200);}  //排线电机转180°

                                  if(depth==2)
                                 {run(300);}  //排线电机转270°

                             if(depth==3)
                                  {run(400);}  //排线电机转360°
                }
        }                  
}

    1.docx (2017-4-6 16:51 上传)

    13.5 KB, 下载次数: 17

    整个程序

已退回7积分

回帖(5)

lee_st

2017-4-6 16:48:19
不错哦,顶一下啊,
举报

白色的蜻蜓

2017-4-6 16:49:40
#include "reg52.h"
#define speed 2
/*******************定义脉冲及方向管脚****************************/
***it PH1 = P1^0;//主轴输出脉冲
***it zhuzhoucw = P1^1;
***it PH2 =P1^2;//排线输出脉冲
***it paixiancw = P1^3;
***it once =P1^4;
/*******************定义主轴电机控制键管脚****************************/
***it keystart =        P3^0;
***it keystop =        P3^1;
***it key_addspeed =P3^2;
***it key_decspeed =P3^3;
/*******************定义排线电机控制键管脚****************************/
***it keyleft =P3^4;
***it keyright =P3^5;
***it key_adddepth =P3^6;
***it key_decdepth =P3^7;
/*******************定义全局变量及函数****************************/
int num=0; //num为主轴电机挡位计数中的变量
int depth=1; //depth为排线电机宽度函数中的变量
void delay(int time);
void Delay10ms(unsigned int c);
void run(int y);


/******************************************************************/
/*******************主轴电机调用函数说明***************************/                  
/******************************************************************/


/*******************主轴电机转速调节函数说明***************************/
void Go(int x)
{
        while(1)
        {         
    PH1 = 0;  
        delay(x);
        PH1 = 1;  
        delay(x);
                if(keystop==0)
                {
                 break;
                }
                if(once==0)
                {                 

                                if(depth==0)
                                  {run(100);}  //排线电机转90°
  
                                   if(depth==1)
                                  {run(200);}  //排线电机转180°
  
                                  if(depth==2)
                                {run(300);}  //排线电机转270°
  
                             if(depth==3)
                                 {run(400);}  //排线电机转360°
                }
        }                  
}
/*******************主轴电机脉冲延时函数说明***************************/
void delay(int time)
{
  int i,j;
  
  for(j=0; j <= time; j++)
   for(i =0 ; i <= 5; i++);
}
/*******************主轴电机转速挡位计数函数****************************/
void zhuzhounum()
{
        while(1)
        {
                 if(key_addspeed==0)
                 {       
                 Delay10ms(1);
                   if(key_addspeed==0)
                   {                
                          num++;               
                        if(num>=3)
                        {
                        num=3;
                        }
                        while(key_addspeed==0);
                   }
                 }
                 if(key_decspeed==0)
                 {
                        Delay10ms(1);
                     if(key_decspeed==0)
                           {
                            num--;
                          if(num<=0)
                          {
                       num=0;
                             }
                        while(key_decspeed==0);
                       }
                 }
                         if(keystart==0)
                         {
                                  Delay10ms(1);
                                  if(keystart==0)
                                  {break;}
                         }
        }
       
}
/*******************消抖延时函数****************************/
void Delay10ms(unsigned int c)   //误差 0us
{
    unsigned char a, b;

        //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
    for (;c>0;c--)
        {
                for (b=38;b>0;b--)
                {
                        for (a=130;a>0;a--);
                }
           
        }      
}

/******************************************************************/
/*******************排线电机调用函数说明***************************/                  
/******************************************************************/


/***************************************排线电机宽度调节说明**************************************/
void run(int y)
{
        for(y=y;y>0;y--)
        {         
    PH2 = 0;  
        delay(5);
        PH2 = 1;  
        delay(5);
        }                  
}
/*******************排线电机宽度计数函数****************************/
void paixiandepth()
{
        while(1)
        {
                 if(key_adddepth==0)
                 {       
                 Delay10ms(1);
                   if(key_adddepth==0)
                   {                
                          depth++;               
                        if(depth>=3)
                        {
                        depth=3;
                        }
                        while(key_adddepth==0);
                   }
                 }
                 if(key_decdepth==0)
                 {
                        Delay10ms(1);
                     if(key_decdepth==0)
                           {
                            depth--;
                          if(depth<=0)
                          {
                       depth=0;
                             }
                        while(key_decdepth==0);
                       }
                 }
                         if(keystart==0)
                         {
                                  Delay10ms(1);
                                  if(keystart==0)
                                  {break;}
                         }
        }
       
}
/*******************排线电机方向数函数****************************/
  void paixianfangxiang()
  {
          while(1)
        {
                if(keyleft==0)
                {
                break;
                }
                if(keyright==0)
                {paixiancw=0;
                break;
                }
        }
  }
/*******************主函数****************************/
void main()
{
zhuzhounum();
paixianfangxiang();
paixiandepth();
        while(1)
        {

          if(num==0)
          {
                  {Go(5);}  //主轴电机以速度1运行
                  break;
          }
          if(num==1)
          {
                  {Go(10);}  //主轴电机以速度2运行
                  break;
          }
          if(num==2)
          {
                  {Go(15);}  //主轴电机以速度3运行
                  break;
          }
          if(num==3)
          {
                  {Go(20);}  //主轴电机以速度4运行
                  break;
          }

        }

}


















举报

白色的蜻蜓

2017-4-6 16:53:30
引用: lee_st 发表于 2017-4-6 16:48
不错哦,顶一下啊,

有没有思路能
举报

lee_st

2017-4-6 16:54:32
没搞过电机,只能帮你顶
举报

王栋春

2017-4-6 21:26:36
学习一下  如果来些注释会更好
举报

更多回帖

发帖
×
20
完善资料,
赚取积分